public async Task <IHttpActionResult> SetOrder([FromBody] SetOrderRequest request) { try { var response = await _orderService.SetOrder(request); return(new CreateResult(response)); } catch (Exception e) { var response = new Response <OrderResponse>(ResponseStatus.InternalError, null, e.Message); return(new CreateResult(response)); } }
public async Task <Response <OrderResponse> > SetOrder(SetOrderRequest request) { OrderModel order = new OrderModel(); UserModel user = null; // if user is logged if (request.RequestIdentity.IsAuthentificated) { user = await _uow.Users.FindAsync(new Guid(request.RequestIdentity.UserId)); var latestOrder = await _uow.Orders.GetLastUserOrderInProgress(user.Id.ToString()); // if user has order in progress, use the exist order if (latestOrder != null) { order = latestOrder; } } else { // create user if user is not logged and email is not already exist var userEmailExist = await _uow.Users.FindManyAsync(x => x.Email == request.Customer.Personal.Contact.Email); if (userEmailExist.Count > 0) { user = userEmailExist.FirstOrDefault(); } else { user = await _userSharedService.Add(request.Customer?.Personal?.Contact?.Email, Guid.NewGuid().ToString()); } } // if user with this email already exist if (user == null) { return(new Response <OrderResponse>(ResponseStatus.BadRequest, null, ResponseMessagesConstans.CannotAssignOrderToCustomer)); } if (request.CalculateOrder != null) { var calculatedData = await CalculateOrder(request.CalculateOrder.Products, request.CalculateOrder?.TransportId, request.CalculateOrder?.PaymentId); order.CalculatedData = calculatedData; order.State = OrderState.CalculateReady; if (calculatedData.HasTransport()) { order.State = OrderState.TransportReady; } if (calculatedData.HasPayment()) { order.State = OrderState.PaymentReady; } } if (request.Customer != null) { // assign customer data order.Customer = new OrderCustomer { UserId = user.Id.ToString(), Personal = new UserPersonal { Address = request.Customer.Personal.Address, Contact = request.Customer.Personal.Contact, Firstname = request.Customer.Personal.Firstname, Lastname = request.Customer.Personal.Lastname, }, Company = request.Customer.Company != null ? new UserCompany { Address = request.Customer.Company.Address != null ? request.Customer.Company.Address : request.Customer.Personal.Address, CompanyId = request.Customer.Company.CompanyId, CompanyName = request.Customer.Company.CompanyName, CompanyVat = request.Customer.Company.CompanyVat } : null, }; order.State = OrderState.CustomerReady; } // if order still doest not exist, create new one if (order.Id == Guid.Empty) { order.OrderNumber = await _uow.Orders.GetNextOrderNumber(); order.OrderNumberFormatted = order.GetForrmattedOrderNumber(); order = await _uow.Orders.InsertAsync(order); } // if order exist, update it else { order = await _uow.Orders.FindAndReplaceAsync(order.Id, order); } // confirm order if (order.IsReadyToConfirm()) { // deduct product count var productsInOrder = order.CalculatedData.Products.Where(p => p.Product.Type == ProductType.Buy || p.Product.Type == ProductType.Deposit).ToList(); var productsInOrderId = productsInOrder.Select(p => p.Product.Id.ToString()).ToList(); var products = await _productSharedService.GetSelected(productsInOrderId); var productUpdatedTask = new List <Task>(); foreach (var product in products) { int orderedCount = productsInOrder.FirstOrDefault(po => po.Product.Id == product.Id).Count; var requestProduct = request.CalculateOrder.Products.FirstOrDefault(p => p.ProductId == product.Id.ToString()); if ((product.Stock.Count < orderedCount && product.Stock.Count > 0) || requestProduct.Count != orderedCount) { return(new Response <OrderResponse>(ResponseStatus.BadRequest, null, $"{ResponseMessagesConstans.MissingGoodsInStock} Product: {product.Name} available: {product.Stock.Count} requested: {orderedCount}")); } product.Stock.Count -= orderedCount; productUpdatedTask.Add(_productSharedService.Update(product)); } await Task.WhenAll(productUpdatedTask); order.State = OrderState.Confirmed; order = await _uow.Orders.FindAndReplaceAsync(order.Id, order); // TODO: Fix generating invoice on Azure // string basePath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; // var invoice = _documentInvoiceRepository.GenerateInvoice(order, basePath); // await _mailingLibrary.SendConfirmedOrderEmail(order, invoice); await _mailingLibrary.SendConfirmedOrderEmail(order, user, null); } var response = _mapService.MapOrder(order); return(new Response <OrderResponse>(ResponseStatus.Ok, response)); }