예제 #1
0
        public async Task <IActionResult> CreateOrderAsync(SalesOrderForCreate model)
        {
            if (!ModelState.IsValid)
            {
                var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList();
                return(BadRequest(new ErrorResponse(HttpStatusCode.BadRequest, "Validation error", errors)));
            }

            var result = await _salesOrderService.CreateAsync(model);

            return(result.Succeed ? Ok() : BadRequest(new ErrorResponse(HttpStatusCode.BadRequest, "Create fail", result.Errors)));
        }
        public async Task <ProcessResult> CreateAsync(SalesOrderForCreate salesOrder)
        {
            async Task action()
            {
                var now      = DateTime.UtcNow;
                var orders   = new List <SalesOrder>();
                var products = await _repoWrapper.Product.GetProductAsync();

                salesOrder.Details.ToList().ForEach(item =>
                {
                    orders.Add(new SalesOrder
                    {
                        //master
                        AppUserId      = CurrentUser.Id,
                        FirstName      = salesOrder.Order.FirstName,
                        LastName       = salesOrder.Order.LastName,
                        PaymentTypeId  = salesOrder.Order.PaymentTypeId,
                        DeliveryTypeId = salesOrder.Order.DeliveryTypeId,
                        PhoneNumber    = salesOrder.Order.PhoneNumber,
                        PostCode       = salesOrder.Order.PostCode,
                        OrderNote      = salesOrder.Order.OrderNote,
                        StreetAddress  = salesOrder.Order.StreetAddress,
                        OrderDate      = now,
                        City           = salesOrder.Order.City,
                        CompanyName    = salesOrder.Order.CompanyName,
                        Contry         = salesOrder.Order.Contry,
                        OrderStatusId  = 1,
                        //detail
                        ProductId = item.ProductId,
                        Quantity  = item.Quantity,
                        Price     = item.Price,
                        Product   = products.Where(x => x.Id == item.ProductId).FirstOrDefault(),
                        //info
                        CreateBy   = CurrentUser.UserName,
                        CreateDate = now,
                        Status     = true
                    });
                });

                await _repoWrapper.SalesOrder.AddRangeSalesOrderAsync(orders);

                //update stock
                orders.ForEach(x => {
                    if (x.Product.Stock - x.Quantity < 0)
                    {
                        throw new Exception($"Stock invalid, {x.Product.ProductName} - inStock: {x.Product.Stock}");
                    }
                    x.Product.Stock -= x.Quantity;
                });

                //orders.ForEach(async x =>
                //{
                //    var product = await _repoWrapper.Product.FindProductByIdAsync(x.ProductId);
                //    product.Stock -= x.Quantity;
                //    _repoWrapper.Product.Update(product);
                //    await _repoWrapper.SaveAsync();
                //});

                if (await _repoWrapper.SaveAsync() <= 0)
                {
                    throw new Exception("Save fail");
                }
            }

            return(await Process.RunAsync(action));
        }