public async Task <ActionResult <CreateOrderResponseModel> > CreateOrderAsync([FromBody][Required] CreateOrderModel order)
        {
            if (order is null)
            {
                throw new ArgumentNullException(nameof(order));
            }

            var primaryOrganisationId = User.GetPrimaryOrganisationId();

            if (primaryOrganisationId != order.OrganisationId)
            {
                return(Forbid());
            }

            var result = await _createOrderService.CreateAsync(new CreateOrderRequest
            {
                LastUpdatedByName = User.GetUserName(),
                LastUpdatedById   = User.GetUserId(),
                Description       = order.Description,
                OrganisationId    = order.OrganisationId,
            });

            var createOrderResponse = new CreateOrderResponseModel();

            if (result.IsSuccess)
            {
                createOrderResponse.OrderId = result.Value;
                return(CreatedAtAction(nameof(CreateOrderAsync).TrimAsync(), null, new { orderId = result.Value }, createOrderResponse));
            }

            createOrderResponse.Errors = result.Errors.Select(x => new ErrorModel(x.Id, x.Field));
            return(BadRequest(createOrderResponse));
        }
        public async Task <CreateOrderResponseModel> CreateOrder([FromBody] CreateOrderRequestModel model)
        {
            var response = new CreateOrderResponseModel
            {
                Result = false,
            };

            Voucher voucher = null;

            if (model.VoucherCode != null)
            {
                voucher =
                    _voucherService.GetAll()
                    .Where(x => x.VoucherCode == model.VoucherCode && x.IsDeleted == 0 && x.IsUsed == 0)
                    .FirstOrDefault();


                if (voucher != null)
                {
                    if (voucher.StartDate <= DateTime.Now && voucher.EndDate >= DateTime.Now)
                    {
                    }
                    else
                    {
                        voucher = null;
                    }
                }
            }

            var order = new Order
            {
                ContactName     = model.ContactName,
                Email           = model.Email,
                Phone           = model.Phone,
                Address         = model.Address,
                PaymentMethodId = PaymentMethodEnum.PAYMENT_AT_STORE,
                OrderStatusId   = OrderStatusEnum.WAIT,
                Discount        = 0,
                TotalAmount     = 0,
                TotalPrice      = 0,
                Note            = model.Note,
                OrderDetails    = new List <OrderDetail>(),
            };

            if (voucher != null)
            {
                order.VoucherId = voucher.VoucherId;
                order.Discount  = (double)voucher.Price;
            }

            //if(model.VoucherCode != null)
            //{
            //    var voucher = GetById from DB;

            //    order.Discount = voucher.Value;
            //}

            var currentUser = CurrentUser;

            if (currentUser != null)
            {
                order.CustomerId = currentUser.Id;
            }

            ApplyUserCreateEntity(order);


            double total = 0;

            foreach (var detail in model.OrderDetails)
            {
                var product = await _productService.GetByIdWithoutInclude(detail.ProductId);

                total += (double)product.Price * detail.Quantity;

                var orderDetail = new OrderDetail
                {
                    ColorId   = detail.ColorId,
                    ProductId = detail.ProductId,
                    Quantity  = detail.Quantity,
                    Price     = (double)product.Price,
                };

                ApplyUserCreateEntity(orderDetail);

                order.OrderDetails.Add(orderDetail);
            }

            order.TotalAmount = total;
            order.TotalPrice  = total - order.Discount;

            order.OrderCode = DateTime.Now.ToString("yyyyMMddHHmmss");

            response.Result = await _orderService.Insert(order);

            //response.Messages.Add(response.Result ? SuccessMessage : FailMessage);

            if (response.Result == true)
            {
                response.Messages.Add(SuccessMessage);

                // Send Email
                var subject  = "Đặt hàng thành công";
                var bodyHtml = await _viewRenderService.RenderToStringAsync <Order>("EmailTemplates/OrderEmailTemplate", order);

                var alias = "";
                await _emailService.Send(subject, bodyHtml, alias, new List <string>() { order.Email });

                if (voucher != null)
                {
                    voucher.IsUsed = 1;
                    await _voucherService.Update(voucher);
                }
            }
            else
            {
                response.Messages.Add(FailMessage);
            }

            if (response.Result)
            {
                response.OrderId   = order.OrderId;
                response.OrderCode = order.OrderCode;
            }

            return(response);
        }