Exemple #1
0
        public async Task <long> Handle(AllocateWeightedCostAverageCommand request, CancellationToken cancellationToken)
        {
            _logger.Information("Request AllocateWeightedCostAverageCommand: {@Request}", request);

            decimal costToAllocate = request.PurchaseDetail.FinalCost;

            _logger.Information("Cost To Allocate: {@costToAllocate}", costToAllocate);

            decimal costAllocated = 0;

            Application.Model.Procurment.PurchaseDetail maxPurchaseDetail = null;

            foreach (
                var purchaseDetail in _context.PurchaseDetail.Where(
                    q => (q.PurchaseId == request.Purchase.Id)
                    )
                )
            {
                decimal addAmount = 0;

                addAmount = Decimal.Floor(purchaseDetail.CostCalculatedEqu / request.Purchase.TotalCostInvoicedEqu * costToAllocate * 100) / 100;
                purchaseDetail.AddCost   = purchaseDetail.AddCost + addAmount;
                purchaseDetail.FinalCost = purchaseDetail.CostCalculatedEqu + purchaseDetail.AddCost;

                costAllocated = costAllocated + addAmount;

                var purchaseAllocationResult = new Application.Model.Procurment.PurchaseAllocationResult
                {
                    PurchaseAllocationSourceId = request.PurchaseAllocationSourceId,
                    PurchaseDetailId           = purchaseDetail.Id,
                    Amount = addAmount
                };

                await _context.PurchaseAllocationResult.AddAsync(purchaseAllocationResult);

                _logger.Information("Purchase Allocation Result Added: {@purchaseAllocationResult}", purchaseAllocationResult);

                if (maxPurchaseDetail == null)
                {
                    maxPurchaseDetail = purchaseDetail;
                }
                else
                {
                    if (purchaseDetail.CostCalculatedEqu > maxPurchaseDetail.CostCalculatedEqu)
                    {
                        maxPurchaseDetail = purchaseDetail;
                    }
                }

                _context.PurchaseDetail.Update(purchaseDetail);
            }

            if (costAllocated != costToAllocate)
            {
                if (maxPurchaseDetail != null)
                {
                    var _residual = costToAllocate - costAllocated;

                    maxPurchaseDetail.AddCost   = maxPurchaseDetail.AddCost + costToAllocate - costAllocated;
                    maxPurchaseDetail.FinalCost = maxPurchaseDetail.CostCalculatedEqu + maxPurchaseDetail.AddCost;
                    _context.PurchaseDetail.Update(maxPurchaseDetail);

                    _logger.Information("Added Rounding difference {@residual} value to {@maxPurchaseDetail}", _residual, maxPurchaseDetail);
                }
            }

            return(request.Purchase.Id);
        }
        private async void doMakeSeeding()
        {
            _dbContext.Currency.AddRange(
                new[]
            {
                new Application.Model.Core.Currency {
                    CurrencyCode = "GEL", CurrencyDescrip = "Georgian Lari"
                },
                new Application.Model.Core.Currency {
                    CurrencyCode = "USD", CurrencyDescrip = "US Dollar"
                },
                new Application.Model.Core.Currency {
                    CurrencyCode = "EUR", CurrencyDescrip = "Euro"
                },
                new Application.Model.Core.Currency {
                    CurrencyCode = "GBP", CurrencyDescrip = "British Pound"
                }
            }
                );

            _dbContext.Country.AddRange(
                new[]
            {
                new Application.Model.Core.Country {
                    Code = "GEO", Name = "Republic of Georgia"
                },
                new Application.Model.Core.Country {
                    Code = "USA", Name = "United States Of America"
                },
                new Application.Model.Core.Country {
                    Code = "GER", Name = "Germany"
                },
                new Application.Model.Core.Country {
                    Code = "AZE", Name = "Azerbaijan"
                },
                new Application.Model.Core.Country {
                    Code = "ARM", Name = "Armenia"
                },
                new Application.Model.Core.Country {
                    Code = "TUR", Name = "Turkey"
                }
            }
                );

            /*
             * _dbContext.User.AddRange(
             *  new[]
             *  {
             *      new Core.User{ Username="******", Password="******", Firstname="Irakli", Lastname="Nadiradze"}
             *  }
             * );
             */

            // Clients Schema

            // Products Schema
            _dbContext.ProductUnit.AddRange(
                new[]
            {
                new Application.Model.Product.ProductUnit {
                    ProductUnitName = "ცალი"
                },
                new Application.Model.Product.ProductUnit {
                    ProductUnitName = "კილოგრამი"
                },
                new Application.Model.Product.ProductUnit {
                    ProductUnitName = "გრამი"
                },
                new Application.Model.Product.ProductUnit {
                    ProductUnitName = "მეტრი"
                },
                new Application.Model.Product.ProductUnit {
                    ProductUnitName = "სანტიმეტრი"
                },
                new Application.Model.Product.ProductUnit {
                    ProductUnitName = "მილიმეტრი"
                }
            }
                );


            // Inventory Schema
            _dbContext.InventoryChangeType.AddRange(
                new[]
            {
                new Application.Model.Inventory.InventoryChangeType {
                    ChangeCode = "PRC", ChangeName = "შესყიდვა", IsFinRelated = true, IsQtyRelated = false
                },
                new Application.Model.Inventory.InventoryChangeType {
                    ChangeCode = "MVM", ChangeName = "გადაზიდვა", IsFinRelated = true, IsQtyRelated = false
                },
                new Application.Model.Inventory.InventoryChangeType {
                    ChangeCode = "SAL", ChangeName = "გაყიდვა", IsFinRelated = true, IsQtyRelated = false
                },
                new Application.Model.Inventory.InventoryChangeType {
                    ChangeCode = "WRO", ChangeName = "ჩამოწერა", IsFinRelated = true, IsQtyRelated = false
                },
                new Application.Model.Inventory.InventoryChangeType {
                    ChangeCode = "PRD", ChangeName = "ტრანსფორმაცია", IsFinRelated = true, IsQtyRelated = false
                }
            }
                );

            await _dbContext.SaveChangesAsync(CancellationToken.None);

            // Location Seeding
            Application.Model.Inventory.Location location1 =
                new Application.Model.Inventory.Location
            {
                Name = "Location 1"
            };

            Application.Model.Inventory.Location location2 =
                new Application.Model.Inventory.Location
            {
                Name = "Location 2"
            };

            Application.Model.Inventory.Location location3 =
                new Application.Model.Inventory.Location
            {
                Name = "Location 3"
            };

            _dbContext.Location.AddRange(location1, location2, location3);


            await _dbContext.SaveChangesAsync(CancellationToken.None);;

            // Product Category Seeding
            Application.Model.Product.ProductCategory productCategory1 = new Application.Model.Product.ProductCategory
            {
                ProductCategoryName = "ProductCategory1"
            };

            Application.Model.Product.ProductCategory productCategory2 = new Application.Model.Product.ProductCategory
            {
                ProductCategoryName = "ProductCategory2"
            };

            Application.Model.Product.ProductCategory productCategory3 = new Application.Model.Product.ProductCategory
            {
                ProductCategoryName = "ProductCategory3"
            };

            _dbContext.ProductCategory.AddRange(productCategory1, productCategory2, productCategory3);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;



            // Product Group Seeding
            Application.Model.Product.ProductGroup productGroup1_1 = new Application.Model.Product.ProductGroup
            {
                ProductGroupName  = "ProductGroup1_1",
                ProductCategoryId = productCategory1.Id
            };

            Application.Model.Product.ProductGroup productGroup1_2 = new Application.Model.Product.ProductGroup
            {
                ProductGroupName  = "ProductGroup1_2",
                ProductCategoryId = productCategory1.Id
            };

            Application.Model.Product.ProductGroup productGroup1_3 = new Application.Model.Product.ProductGroup
            {
                ProductGroupName  = "ProductGroup1_3",
                ProductCategoryId = productCategory1.Id
            };

            Application.Model.Product.ProductGroup productGroup2_1 = new Application.Model.Product.ProductGroup
            {
                ProductGroupName  = "ProductGroup2_1",
                ProductCategoryId = productCategory2.Id
            };

            Application.Model.Product.ProductGroup productGroup2_2 = new Application.Model.Product.ProductGroup
            {
                ProductGroupName  = "ProductGroup2_2",
                ProductCategoryId = productCategory2.Id
            };

            Application.Model.Product.ProductGroup productGroup3_1 = new Application.Model.Product.ProductGroup
            {
                ProductGroupName  = "ProductGroup3_1",
                ProductCategoryId = productCategory3.Id
            };

            _dbContext.ProductGroup.AddRange(productGroup1_1, productGroup1_2, productGroup1_3, productGroup2_1, productGroup2_2, productGroup3_1);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;



            // Product Brand Seeding
            Application.Model.Product.Brand brand1 = new Application.Model.Product.Brand
            {
                BrandName = "Brand1"
            };

            Application.Model.Product.Brand brand2 = new Application.Model.Product.Brand
            {
                BrandName = "Brand2"
            };

            _dbContext.Brand.AddRange(brand1, brand2);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;



            // Product Label Seeding
            Application.Model.Product.ProductLabel productlabel1 = new Application.Model.Product.ProductLabel
            {
                ProductLabelName = "ProductLabel1",
                BrandId          = brand1.Id
            };

            Application.Model.Product.ProductLabel productlabel2 = new Application.Model.Product.ProductLabel
            {
                ProductLabelName = "ProductLabel2",
                BrandId          = brand1.Id
            };

            Application.Model.Product.ProductLabel productlabel3 = new Application.Model.Product.ProductLabel
            {
                ProductLabelName = "ProductLabel3",
                BrandId          = brand1.Id
            };

            Application.Model.Product.ProductLabel productlabel4 = new Application.Model.Product.ProductLabel
            {
                ProductLabelName = "ProductLabel4",
                BrandId          = brand2.Id
            };

            _dbContext.ProductLabel.AddRange(productlabel1, productlabel2, productlabel3, productlabel4);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;



            // Product Seeding
            Application.Model.Product.Product product1 =
                new Application.Model.Product.Product
            {
                ProductCode     = "13245654654",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 1",
                ProductGroupId  = productGroup1_1.Id
            };

            Application.Model.Product.Product product2 =
                new Application.Model.Product.Product
            {
                ProductCode     = "783457438834",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 2",
                ProductGroupId  = productGroup1_1.Id
            };

            Application.Model.Product.Product product3 =
                new Application.Model.Product.Product
            {
                ProductCode     = "798734234232",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 3",
                ProductGroupId  = productGroup1_2.Id
            };

            Application.Model.Product.Product product4 =
                new Application.Model.Product.Product
            {
                ProductCode     = "25632342322",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 4",
                ProductGroupId  = productGroup1_2.Id
            };

            Application.Model.Product.Product product5 =
                new Application.Model.Product.Product
            {
                ProductCode     = "2344447890",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 5",
                ProductGroupId  = productGroup1_2.Id
            };


            Application.Model.Product.Product product6 =
                new Application.Model.Product.Product
            {
                ProductCode     = "23444473433",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 6",
                ProductGroupId  = productGroup1_2.Id
            };

            Application.Model.Product.Product product7 =
                new Application.Model.Product.Product
            {
                ProductCode     = "23443435345",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 7",
                ProductGroupId  = productGroup1_3.Id
            };

            Application.Model.Product.Product product8 =
                new Application.Model.Product.Product
            {
                ProductCode     = "7420029999333",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 8",
                ProductGroupId  = productGroup1_3.Id
            };

            Application.Model.Product.Product product9 =
                new Application.Model.Product.Product
            {
                ProductCode     = "234566544344",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 9",
                ProductGroupId  = productGroup1_3.Id
            };

            Application.Model.Product.Product product10 =
                new Application.Model.Product.Product
            {
                ProductCode     = "57753222233",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 10",
                ProductGroupId  = productGroup2_2.Id
            };

            Application.Model.Product.Product product11 =
                new Application.Model.Product.Product
            {
                ProductCode     = "3485858543",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 11",
                ProductGroupId  = productGroup2_2.Id
            };

            Application.Model.Product.Product product12 =
                new Application.Model.Product.Product
            {
                ProductCode     = "2348838383",
                ProductUnitId   = _dbContext.ProductUnit.Where(x => x.ProductUnitName == "ცალი").FirstOrDefault().Id,
                IsSingle        = false,
                IsTangible      = true,
                IsWholeQuantity = true,
                ProductLabelId  = productlabel1.Id,
                ProductName     = "Product 12",
                ProductGroupId  = productGroup2_2.Id
            };

            _dbContext.Product.AddRange(product1, product2, product3, product4, product5, product6, product7,
                                        product8, product9, product10, product11, product12);

            await _dbContext.SaveChangesAsync(CancellationToken.None);;


            // Client Seeding
            Application.Model.Client.Client client1 =
                new Application.Model.Client.Client
            {
                IsCustomer = false,
                IsBank     = false,
                IsPerson   = false,
                IsEmployee = false,
                IsSupplier = true,

                Name = "Vendro 1"
            };

            _dbContext.Client.Add(client1);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;


            // Legal Entity

            Application.Model.Client.LegalEntity legal_entity1 =
                new Application.Model.Client.LegalEntity
            {
                Id = client1.Id,
                LegalEntityName       = "LTD vendor1",
                Email                 = "*****@*****.**",
                LegalAddress          = "1 downingstreet , TownCity",
                OfficeAddress         = "1 downingstreet , TownCity",
                Mobile                = "+1-321-232-344",
                RegistrationCountryID = _dbContext.Country.Where(x => x.Code == "GEO").FirstOrDefault().Id,
                TaxCode               = "1235563313",
                TaxRegDate            = new DateTime(2017, 05, 27)
            };

            _dbContext.LegalEntity.Add(legal_entity1);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;


            // Purchase Seeding
            Application.Model.Procurment.Purchase purchase1 =
                new Application.Model.Procurment.Purchase
            {
                TransDate       = new DateTime(2021, 5, 1),
                CurrencyId      = _dbContext.Currency.Where(x => x.CurrencyCode == "GEL").FirstOrDefault().Id,
                ClientId        = client1.Id,
                InvoiceNumber   = "INV-001",
                Note            = $"Purchase 1 from vendor:{client1.Name} ",
                PurchaseName    = $"Delivery of Ordered Purchase: Order Number1",
                xrate           = 1,
                CostPosted      = false,
                QtyPosted       = false,
                Allocated       = false,
                FinPostStarted  = false,
                QtyPostStarted  = false,
                ProcInInventory = false,
                Posted          = false
            };

            _dbContext.Purchase.AddRange(purchase1);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;

            // Purchase Detail Seeding
            Application.Model.Procurment.PurchaseDetail purchaseDetail1 =
                new Application.Model.Procurment.PurchaseDetail
            {
                PurchaseId    = purchase1.Id,
                LocationId    = location1.Id,
                InventoryCode = "",
                ProjectId     = 0,
                AddCost       = 0,
                ProductId     = product1.Id,

                QtyInvoiced   = 10,
                QtyCalculated = 10,
                FinalQty      = 10,

                CostInvoiced           = 2000,
                CostCalculated         = 2000,
                FinalCost              = 2000,
                CostCalculatedEqu      = 2000,
                CostInvoicedEqu        = 2000,
                CostInvoicedWithoutVat = 2000,

                QtyPosted  = false,
                CostPosted = false,

                Allocated = false,

                Posted      = false,
                VatInvoiced = 0,

                PurchaseDetailPostTypeId = 1,
                PurchaseDraftId          = 0
            };

            Application.Model.Procurment.PurchaseDetail purchaseDetail2 =
                new Application.Model.Procurment.PurchaseDetail
            {
                PurchaseId    = purchase1.Id,
                LocationId    = location1.Id,
                InventoryCode = "",
                ProjectId     = 0,
                AddCost       = 0,
                ProductId     = product2.Id,

                QtyInvoiced   = 21,
                QtyCalculated = 21,
                FinalQty      = 21,

                CostInvoiced           = 3200,
                CostCalculated         = 3200,
                FinalCost              = 3200,
                CostCalculatedEqu      = 3200,
                CostInvoicedEqu        = 3200,
                CostInvoicedWithoutVat = 3200,

                QtyPosted  = false,
                CostPosted = false,

                Allocated = false,

                Posted      = false,
                VatInvoiced = 0,

                PurchaseDetailPostTypeId = 1,
                PurchaseDraftId          = 0
            };

            Application.Model.Procurment.PurchaseDetail purchaseDetail3 =
                new Application.Model.Procurment.PurchaseDetail
            {
                PurchaseId    = purchase1.Id,
                LocationId    = location1.Id,
                InventoryCode = "",
                ProjectId     = 0,
                AddCost       = 0,
                ProductId     = product3.Id,

                QtyInvoiced   = 15,
                QtyCalculated = 15,
                FinalQty      = 15,

                CostInvoiced           = 2200,
                CostCalculated         = 2200,
                FinalCost              = 2200,
                CostCalculatedEqu      = 2200,
                CostInvoicedEqu        = 2200,
                CostInvoicedWithoutVat = 2200,

                QtyPosted  = false,
                CostPosted = false,

                Allocated = false,

                Posted      = false,
                VatInvoiced = 0,

                PurchaseDetailPostTypeId = 1,
                PurchaseDraftId          = 0
            };

            Application.Model.Procurment.PurchaseDetail purchaseDetail4 =
                new Application.Model.Procurment.PurchaseDetail
            {
                PurchaseId    = purchase1.Id,
                LocationId    = location1.Id,
                InventoryCode = "",
                ProjectId     = 0,
                AddCost       = 0,
                ProductId     = product4.Id,

                QtyInvoiced   = 33,
                QtyCalculated = 33,
                FinalQty      = 33,

                CostInvoiced           = 6600,
                CostCalculated         = 6600,
                FinalCost              = 6600,
                CostCalculatedEqu      = 6600,
                CostInvoicedEqu        = 6600,
                CostInvoicedWithoutVat = 6600,

                QtyPosted  = false,
                CostPosted = false,

                Allocated = false,

                Posted      = false,
                VatInvoiced = 0,

                PurchaseDetailPostTypeId = 1,
                PurchaseDraftId          = 0
            };

            Application.Model.Procurment.PurchaseDetail purchaseDetail5 =
                new Application.Model.Procurment.PurchaseDetail
            {
                PurchaseId    = purchase1.Id,
                LocationId    = location1.Id,
                InventoryCode = "",
                ProjectId     = 0,
                AddCost       = 0,
                ProductId     = product5.Id,

                QtyInvoiced   = 14,
                QtyCalculated = 14,
                FinalQty      = 14,

                CostInvoiced           = 28000,
                CostCalculated         = 28000,
                FinalCost              = 28000,
                CostCalculatedEqu      = 28000,
                CostInvoicedEqu        = 28000,
                CostInvoicedWithoutVat = 28000,

                QtyPosted  = false,
                CostPosted = false,

                Allocated = false,

                Posted      = false,
                VatInvoiced = 0,

                PurchaseDetailPostTypeId = 1,
                PurchaseDraftId          = 0
            };

            Application.Model.Procurment.PurchaseDetail purchaseDetail6 =
                new Application.Model.Procurment.PurchaseDetail
            {
                PurchaseId    = purchase1.Id,
                LocationId    = location1.Id,
                InventoryCode = "",
                ProjectId     = 0,
                AddCost       = 0,
                ProductId     = product6.Id,

                QtyInvoiced   = 25,
                QtyCalculated = 25,
                FinalQty      = 25,

                CostInvoiced           = 13700,
                CostCalculated         = 13700,
                FinalCost              = 13700,
                CostCalculatedEqu      = 13700,
                CostInvoicedEqu        = 13700,
                CostInvoicedWithoutVat = 13700,

                QtyPosted  = false,
                CostPosted = false,

                Allocated = false,

                Posted      = false,
                VatInvoiced = 0,

                PurchaseDetailPostTypeId = 1,
                PurchaseDraftId          = 0
            };

            _dbContext.PurchaseDetail.AddRange(purchaseDetail1, purchaseDetail2, purchaseDetail3, purchaseDetail4, purchaseDetail5, purchaseDetail6);
            await _dbContext.SaveChangesAsync(CancellationToken.None);;
        }