Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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));
        }