예제 #1
0
        public async Task <Unit> Handle(AddBill request, CancellationToken cancellationToken)
        {
            if (request.Purchases.Count() == 0)
            {
                throw new InvalidOperationException();
            }

            var store = storeRepository
                        .Queryable()
                        .FirstOrDefault(s => s.Id.Equals(new StoreId(request.StoreId)));

            var bill = new Bill(request.Date, store);

            var productsIds = request.Purchases
                              .Where(p => p.Product.Id != Guid.Empty)
                              .Select(pu => new ProductId(pu.Product.Id))
                              .ToList();

            var x = productRepository
                    .Queryable()
                    .Where(p => productsIds.Contains(p.Id))
                    .ToList();

            var existingProducts = request.Purchases
                                   .Where(p => p.Product.Id != Guid.Empty)
                                   .Select(
                p => new
            {
                Product = x.FirstOrDefault(pr => pr.Id == new ProductId(p.Product.Id)),
                p.Amount,
                p.Price
            }
                )
                                   .ToList();

            foreach (var product in existingProducts)
            {
                bill.AddPurchaseBasedOnExistingProduct(product.Product, product.Amount, product.Price);
            }

            var categories = categoryRepository.Queryable().ToList();

            var newProducts = request.Purchases
                              .Where(p => p.Product.Id == Guid.Empty)
                              .Select(
                p => new
            {
                p.Product,
                Category = categories.FirstOrDefault(c => c.Id.Value == p.Product.CategoryId),
                p.Amount,
                p.Price
            })
                              .ToList();

            foreach (var product in newProducts)
            {
                var prod        = product.Product;
                var newPurchase = bill.AddPurchaseBasedOnNewProduct(
                    prod.Name,
                    prod.Barcode,
                    product.Category,
                    product.Amount,
                    product.Price
                    );

                var category = categories.FirstOrDefault(cat => cat.Id.Value == prod.CategoryId);

                productRepository.Insert(newPurchase.Product);
            }

            repository.InsertAggregate(bill);

            return(Unit.Value);
        }