public async Task <IActionResult> GetChangeAsync([FromBody] RegisterBindings bindings, CancellationToken cancellationToken = default(CancellationToken))
        {
            var order = await this.orderService.GetByIdAsync(bindings.OrderID, cancellationToken);

            var toPay  = order.Total - order.PaidAmount;
            var rate   = order.Currency == bindings.AmountCurrency ? 1 : configuration.GetRate(bindings.AmountCurrency, order.Currency);
            var amount = bindings.Amount * rate;
            var change = amount - toPay;

            return(Ok(ApiModel.AsSuccess(
                          change * configuration.GetRate(order.Currency, bindings.ChangeCurrency)
                          )));
        }
        public async Task <IActionResult> RegisterAsync([FromServices] UserManager userManager, [FromBody] RegisterBindings bindings, CancellationToken cancellationToken = default(CancellationToken))
        {
            var order = await this.orderService.GetByIdAsync(bindings.OrderID, cancellationToken);

            var toPay      = order.Total - order.PaidAmount;
            var rateAmount = order.Currency == bindings.AmountCurrency ? 1 : configuration.GetRate(bindings.AmountCurrency, order.Currency);
            var rateChange = order.Currency == bindings.ChangeCurrency ? 1 : configuration.GetRate(bindings.ChangeCurrency, order.Currency);
            var amount     = bindings.Amount * rateAmount;
            var change     = bindings.Change * rateChange;

            var payment = new Payment()
            {
                Title     = "Cash Payment",
                Provider  = Name,
                Reference = $"{User.Identity.Name}",
                Status    = PaymentStatus.Paid,
                Date      = DateTime.UtcNow,
                Method    = PaymentMethod.Cash,
                Details   = $"Payment Order #{order.Reference}",
                Currency  = bindings.AmountCurrency,
                Amount    = amount - change
            };

            var username = HttpContext.User.Identity.Name;

            if (string.IsNullOrEmpty(username))
            {
                return(Ok(ApiModel.AsError <ChangeResponse>(null, "no user claims in request, did you forget to set the auth header ?")));
            }

            var user = await userManager.FindByNameAsync(username);

            if (user == null)
            {
                return(Ok(ApiModel.AsError <ChangeResponse>(null, $"impossible to find a user with the username '{username}'")));
            }

            await orderService.AddPayment(order, payment, cancellationToken);

            if (bindings.Change != 0)
            {
                await movementService.CreateAsync(new Movement()
                {
                    Currency = bindings.ChangeCurrency,
                    Amount   = -1 * bindings.Change,
                    User     = user.Preview(),
                    UserId   = user.Id,
                    Date     = DateTime.UtcNow,
                    ShopId   = order.ShopId
                },
                                                  cancellationToken);
            }

            if (bindings.Amount != 0)
            {
                await movementService.CreateAsync(new Movement()
                {
                    Currency = bindings.AmountCurrency,
                    Amount   = bindings.Amount,
                    User     = user.Preview(),
                    UserId   = user.Id,
                    Date     = DateTime.UtcNow,
                    ShopId   = order.ShopId
                },
                                                  cancellationToken);
            }


            return(Ok(ApiModel.AsSuccess(
                          payment
                          )));
        }