public async Task CreateOrderAsync(int basketId, Address shippingAddress)
        {
            var basket = await _basketRepository.GetByIdAsync(basketId);

            Guard.Against.NullBasket(basketId, basket);
            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri);
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }
            var order = new Order(basket.BuyerId, shippingAddress, items);

            int currentSecond = DateTime.Now.Second;

            if (currentSecond % 3 == 1)
            {
                order.SetStatusOutForDelivery();
            }
            if (currentSecond % 3 == 2)
            {
                order.SetStatusDelivered();
            }

            await _orderRepository.AddAsync(order);
        }
        public async Task HandleAsync(CreatePurchaseOrderCommand command)
        {
            //Issue: Crossing the boundary context to cut shot the time.
            //This should call the Basket Api and get the details. Not the repository directly.
            var basketSpecification = new BasketWithItemsSpecification(command.BasketId);
            var basket = await _basketAsyncRepository.GetSingleAsync(basketSpecification);

            var items = new List <PurchaseOrderItem>();

            foreach (var basketItem in basket.BasketItems)
            {
                var catalogItem = await _catalogItemAsyncRepository.GetByIdAsync(basketItem.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id,
                                                         (CatalogItemType)catalogItem.CatalogType, catalogItem.Name, catalogItem.PictureUri);
                var orderItem = new PurchaseOrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity);
                items.Add(orderItem);
            }

            var purchaseOrderId = Guid.NewGuid();
            var purchaseOrderIdNumberMapping = new PurchaseOrderIdNumberMapping {
                PurchaseOrderId = purchaseOrderId
            };

            _purchaseOrderIdNumberMappingAsyncRepository.Add(purchaseOrderIdNumberMapping);
            await _unitOfWork.SaveChangesAsync();

            var purchaseOrder = new Domain.PurchaseOrder(purchaseOrderId, purchaseOrderIdNumberMapping.Id, basket.BuyerId, command.Address, items);
            await _shopAggregateRepositoryService.SaveAsync(purchaseOrder);
        }
Esempio n. 3
0
 public CustomizeOrder(string buyerId, string buyerName, string buyerContact, string description, string text, string colors, CatalogItemOrdered itemOrdered, string attachFileName)
 {
     BuyerId        = buyerId;
     BuyerName      = buyerName;
     BuyerContact   = buyerContact;
     Description    = description;
     Text           = text;
     Colors         = colors;
     ItemOrdered    = itemOrdered;
     AttachFileName = attachFileName;
 }
Esempio n. 4
0
        public async Task CreateOrderAsync(int basketId)
        {
            var basket = await _basketRepository.GetByIdAsync(basketId);

            Guard.Against.NullBasket(basketId, basket);
            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);

                catalogItem.UnitsInStock -= item.Quantity;
                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri);
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }


            string connectionString =
                _configuration.GetConnectionString("IdentityConnection");

            using (SqlConnection connection =
                       new SqlConnection(connectionString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.TableMappings.Add("Table", "AspNetUsers");
                connection.Open();
                SqlCommand command = new SqlCommand(
                    $"SELECT * FROM [dbo].[AspNetUsers] WHERE [dbo].[AspNetUsers].[UserName] = '{basket.BuyerId}';",
                    connection);
                command.CommandType   = CommandType.Text;
                adapter.SelectCommand = command;
                DataSet dataSet = new DataSet("AspNetUsers");

                adapter.Fill(dataSet);
                connection.Close();

                DataTable table   = dataSet.Tables["AspNetUsers"];
                string    city    = table.Select()[0]["City"].ToString();
                string    country = table.Select()[0]["Country"].ToString();
                string    street  = table.Select()[0]["Street"].ToString();
                var       hn      = table.Select()[0]["HomeNumber"];
                var       flat    = table.Select()[0]["Flat"];

                var order = new Order(basket.BuyerId, new Address(street, city, hn.ToString(), country, flat.ToString()), items);
                await _orderRepository.AddAsync(order);
            }
        }
Esempio n. 5
0
        public async Task CreateOrderAsync(int basketId, Address shippingAddress)
        {
            var basket = await _basketRepository.GetByIdAsync(basketId);

            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri);
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }
            var order = new Order(basket.BuyerId, shippingAddress, items);

            await _orderRepository.AddAsync(order);
        }
Esempio n. 6
0
        public async Task CreateOrderAsync(int basketId, Address shippingAddress)                                   // @issue@I02
        {
            var basket = await _basketRepository.GetByIdAsync(basketId);                                            // @issue@I02

            Guard.Against.NullBasket(basketId, basket);                                                             // @issue@I02
            var items = new List <OrderItem>();                                                                     // @issue@I02

            foreach (var item in basket.Items)                                                                      // @issue@I02
            {
                var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);                           // @issue@I02

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri); // @issue@I02
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);                        // @issue@I02
                items.Add(orderItem);                                                                               // @issue@I02
            }
            var order = new Order(basket.BuyerId, shippingAddress, items);                                          // @issue@I02

            await _orderRepository.AddAsync(order);                                                                 // @issue@I02
        }
        public async Task CreateOrderAsync(int basketId, Address shippingAddress)
        {
            var basketSpec = new BasketWithItemsSpecification(basketId);
            var basket     = await _basketRepository.FirstOrDefaultAsync(basketSpec);

            Guard.Against.NullBasket(basketId, basket);
            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, _uriComposer.ComposePicUri(catalogItem.PictureUri));
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }
            var order = new Order(basket.BuyerId, shippingAddress, items);

            await _orderRepository.AddAsync(order);
        }
        public async Task CreateOrderAsync(
            int basketId,
            Entities.OrderAggregate.Address shippingAddress,
            PaymentInfo paymentDetails,
            OrderStatus status,
            Purchase purchase,
            PurchaseResponse purchaseResponse)
        {
            var basket = await _basketRepository.GetByIdAsync(basketId);

            if (basket == null)
            {
                throw new BasketNotFoundException(basketId);
            }

            var items = new List <OrderItem>();
            var pricesAndQuantities = new List <Tuple <decimal, int> >();

            foreach (var item in basket.Items)
            {
                var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri);
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
                pricesAndQuantities.Add(new Tuple <decimal, int>(item.UnitPrice, item.Quantity));
            }
            var totals = OrderCalculator.CalculateTotals(pricesAndQuantities);

            var order = new Order(
                basket.BuyerId,
                shippingAddress,
                paymentDetails,
                items,
                status,
                purchase,
                purchaseResponse,
                totals);

            await _orderRepository.AddAsync(order);
        }
Esempio n. 9
0
        public async Task CreateOrderAsync(int cartId)
        {
            var cart = await _context.Carts.FindAsync(cartId);

            EnsureArg.IsNotNull(cart, nameof(cart));

            var items = new List <OrderItem> ();

            foreach (var item in cart.Items)
            {
                var catalogItem = await _context.CatalogItems.FindAsync(item.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.ImageUrl);
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }
            var order = Order.Create(cart.BuyerId, items);

            _context.Orders.Add(order);
            await _context.SaveChangesAsync();
        }
Esempio n. 10
0
        public async Task CreateOrderAsync(int basketId, Address shippingAddress)
        {
            var basketSpec = new BasketWithItemsSpecification(basketId);
            var basket     = await _basketRepository.FirstOrDefaultAsync(basketSpec);

            Guard.Against.NullBasket(basketId, basket);

            var catalogItemsSpecification = new CatalogItemsSpecification(basket.Items.Select(item => item.CatalogItemId).ToArray());
            var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification);

            var items = basket.Items.Select(basketItem =>
            {
                var catalogItem = catalogItems.First(c => c.Id == basketItem.CatalogItemId);
                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, _uriComposer.ComposePicUri(catalogItem.PictureUri));
                var orderItem   = new OrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity);
                return(orderItem);
            }).ToList();

            var order = new Order(basket.BuyerId, shippingAddress, items);

            await _orderRepository.AddAsync(order);
        }
Esempio n. 11
0
        public Order CreateOrder(int basketId, Address shippingAddress)
        {
            var basket = _basketRepository.GetById(basketId);

            if (basket == null)
            {
                throw new BasketNotFoundException(basketId);
            }

            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                var catalogItem = _itemRepository.GetById(item.CatalogItemId);
                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri);
                var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }
            var order = new Order(basket.BuyerId, shippingAddress, items);

            return(_orderRepository.Add(order));
        }
Esempio n. 12
0
        public async Task CreateOrderAsync(int basketId, Address shippingAddress)
        {
            var basket = await _session.LoadAsync <Basket>("Baskets/" + basketId,
                                                           x => x.IncludeDocuments(b => b.Items.Select(i => i.CatalogItem)));

            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                // no server call here
                var catalogItem = await _session.LoadAsync <CatalogItem>(item.CatalogItem);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name,
                                                         _uriComposer.ComposePicUri(catalogItem.PictureUri));
                var orderItem = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity);
                items.Add(orderItem);
            }

            var order = new Order(basket.BuyerId, shippingAddress, items);
            await _session.StoreAsync(order);

            await _session.SaveChangesAsync();
        }
Esempio n. 13
0
        public async Task CreateOrderAsync(int basketId, Address shippingAddress)
        {
            var basketSpec = new BasketWithItemsSpecification(basketId);
            var basket     = await _basketRepository.FirstOrDefaultAsync(basketSpec);

            Guard.Against.NullBasket(basket.id, basket);

            // make an array of catalogItem ids in all basketItem objects and send to CatalogItemsSpecification()
            var catalogItemsSpecification = new CatalogItemsSpecification(basket.Items.Select(item => item.CatalogItemId).ToArray());
            var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification); // list of catalogItems with ids in basket items

            var items = basket.Items.Select(basketItem =>
            {
                // if basketItem's catalog item id matches repo catalogItem id set var
                var catalogItem = catalogItems.First(c => c.id == basketItem.CatalogItemId);
                var itemOrdered = new CatalogItemOrdered(catalogItem.id, catalogItem.Name, catalogItem.PictureUri);
                // make new orderItem by using selected basketItem and catalogItem
                var orderItem = new OrderItem(itemOrdered, catalogItem.Price, basketItem.Quantity);
                return(orderItem); // return the new orderItem and append to items list
            }).ToList();

            var order = new Order(basket.BuyerId, shippingAddress, items);
            await _orderRepository.AddAsync(order); // add the new Order obj to orderRepository
        }
Esempio n. 14
0
 public OrderItem(CatalogItemOrdered itemOrdered, decimal unitPrice, int units)
 {
     ItemOrdered = itemOrdered;
     UnitPrice   = unitPrice;
     Units       = units;
 }
Esempio n. 15
0
 public OrderItem(CatalogItemOrdered itemOrdered, decimal unitPrice, int units)
 {
     this.ItemOrdered = itemOrdered;
     this.UnitPrice   = unitPrice;
     this.Units       = units
 }
Esempio n. 16
0
 public OrderBuilder()
 {
     TestCatalogItemOrdered = new CatalogItemOrdered(TestCatalogItemId, TestProductName, TestPictureUri);
     _order = WithDefaultValues();
 }
Esempio n. 17
0
        public async Task <Order> CreateOrderAsync(int basketId, string phoneNumber, int?taxNumber, Address shippingAddress, Address billingAddress, bool useBillingSameAsShipping, decimal shippingCost, string customerEmail = null, bool registerInvoice = false, PaymentType paymentType = PaymentType.CASH)
        {
            var basketSpec = new BasketWithItemsSpecification(basketId);
            var basket     = (await _basketRepository.ListAsync(basketSpec)).LastOrDefault();

            Guard.Against.NullBasket(basketId, basket);
            var items = new List <OrderItem>();

            foreach (var item in basket.Items)
            {
                if (!item.CatalogTypeId.HasValue)
                {
                    var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId);

                    var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri);
                    var orderItem   = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity, item.CustomizeName);
                    items.Add(orderItem);
                }
                else
                {
                    var catalogType = await _catalogRepository.GetByIdAsync(item.CatalogTypeId.Value);

                    var itemOrdered   = new CatalogItemOrdered(0, null, null);
                    var customizeItem = new CustomizeItemOrdered(
                        item.CatalogTypeId.Value,
                        item.CustomizeDescription,
                        item.CustomizeName,
                        item.CustomizeColors,
                        catalogType.Name,
                        catalogType.PictureUri);

                    var orderItem = new OrderItem(itemOrdered, 0, item.Quantity);

                    items.Add(orderItem);
                }
            }
            var order      = new Order(basket.BuyerId, phoneNumber, taxNumber, shippingAddress, billingAddress, useBillingSameAsShipping, items, shippingCost, null, customerEmail);
            var savedOrder = await _orderRepository.AddAsync(order);

            if (registerInvoice)
            {
                savedOrder.OrderState = OrderStateType.SUBMITTED;
                SageResponseDTO response;
                //From sales rename product name

                foreach (var item in savedOrder.OrderItems.Where(x => x.ItemOrdered.CatalogItemId == -1).ToList())
                {
                    item.ItemOrdered.Rename(item.CustomizeName);
                }

                try
                {
                    response = await _invoiceService.RegisterInvoiceAsync(SageApplicationType.SALESWEB, savedOrder);
                }
                catch (Exception ex)
                {
                    throw new RegisterInvoiceException(ex.ToString());
                }

                if (response.InvoiceId.HasValue)
                {
                    savedOrder.SalesInvoiceId     = response.InvoiceId.Value;
                    savedOrder.SalesInvoiceNumber = response.InvoiceNumber;

                    await _orderRepository.UpdateAsync(savedOrder);

                    //Generate Payment
                    try
                    {
                        var responsePayment = await _invoiceService.RegisterPaymentAsync(SageApplicationType.SALESWEB, savedOrder.SalesInvoiceId.Value, savedOrder.Total(), paymentType);

                        if (responsePayment.PaymentId.HasValue)
                        {
                            savedOrder.SalesPaymentId = responsePayment.PaymentId.Value;
                            await _orderRepository.UpdateAsync(savedOrder);
                        }
                        else
                        {
                            throw new RegisterInvoiceException($"Fatura gerada com sucesso mas com erro de pagamento: {responsePayment?.Message}");
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new RegisterInvoiceException($"Fatura gerada com sucesso mas com erro de pagamento: {ex}");
                    }
                }
                else //Something wrong
                {
                    throw new RegisterInvoiceException(response.Message);
                }
            }

            return(savedOrder);
        }
Esempio n. 18
0
 public static OrderItem Create(CatalogItemOrdered itemOrdered, decimal unitPrice, int units)
 {
     return(new OrderItem(itemOrdered, unitPrice, units));
 }