public static SalesRepPartyProductCategoryRevenue AppsFindOrCreateAsDependable(ISession session, SalesInvoiceItem salesInvoiceItem)
        {
            var salesInvoice = salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem;

            var salesRepPartyProductCategoryRevenues = salesInvoiceItem.SalesRep.SalesRepPartyProductCategoryRevenuesWhereSalesRep;
            salesRepPartyProductCategoryRevenues.Filter.AddEquals(SalesRepPartyProductCategoryRevenues.Meta.InternalOrganisation, salesInvoice.BilledFromInternalOrganisation);
            salesRepPartyProductCategoryRevenues.Filter.AddEquals(SalesRepPartyProductCategoryRevenues.Meta.Party, salesInvoice.BillToCustomer);
            salesRepPartyProductCategoryRevenues.Filter.AddEquals(SalesRepPartyProductCategoryRevenues.Meta.Year, salesInvoice.InvoiceDate.Year);
            salesRepPartyProductCategoryRevenues.Filter.AddEquals(SalesRepPartyProductCategoryRevenues.Meta.Month, salesInvoice.InvoiceDate.Month);
            salesRepPartyProductCategoryRevenues.Filter.AddEquals(SalesRepPartyProductCategoryRevenues.Meta.ProductCategory, salesInvoiceItem.Product.PrimaryProductCategory);
            var salesRepPartyProductCategoryRevenue = salesRepPartyProductCategoryRevenues.First
                                                      ?? new SalesRepPartyProductCategoryRevenueBuilder(session)
                                                                .WithInternalOrganisation(salesInvoice.BilledFromInternalOrganisation)
                                                                .WithParty(salesInvoice.BillToCustomer)
                                                                .WithSalesRep(salesInvoiceItem.SalesRep)
                                                                .WithProductCategory(salesInvoiceItem.Product.PrimaryProductCategory)
                                                                .WithYear(salesInvoice.InvoiceDate.Year)
                                                                .WithMonth(salesInvoice.InvoiceDate.Month)
                                                                .WithCurrency(salesInvoice.BilledFromInternalOrganisation.PreferredCurrency)
                                                                .WithRevenue(0M)
                                                                .Build();

            SalesRepProductCategoryRevenues.AppsFindOrCreateAsDependable(session, salesRepPartyProductCategoryRevenue);
            SalesRepPartyRevenues.AppsFindOrCreateAsDependable(session, salesRepPartyProductCategoryRevenue);

            return salesRepPartyProductCategoryRevenue;
        }
Example #2
0
        private static void CreatePackageRevenue(
            ISession session,
            Dictionary<InternalOrganisation, Dictionary<Party, Dictionary<Package, Dictionary<DateTime, PartyPackageRevenue>>>> partyPackageRevenuesByPeriodByPackageByPartyByInternalOrganisation,
            DateTime date,
            HashSet<long> revenues,
            SalesInvoiceItem salesInvoiceItem,
            Package package)
        {
            PartyPackageRevenue partyPackageRevenue;

            Dictionary<Party, Dictionary<Package, Dictionary<DateTime, PartyPackageRevenue>>> partyPackageRevenuesByPeriodByPackageByParty;
            if (!partyPackageRevenuesByPeriodByPackageByPartyByInternalOrganisation.TryGetValue(salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation, out partyPackageRevenuesByPeriodByPackageByParty))
            {
                partyPackageRevenue = CreatePartyPackageRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, package);

                partyPackageRevenuesByPeriodByPackageByParty = new Dictionary<Party, Dictionary<Package, Dictionary<DateTime, PartyPackageRevenue>>>
                        {
                            {
                                salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer,
                                new Dictionary<Package, Dictionary<DateTime, PartyPackageRevenue>>
                                    {
                                        {
                                            package,
                                            new Dictionary<DateTime, PartyPackageRevenue> { { date, partyPackageRevenue } }
                                        }
                                    }
                                }
                        };

                partyPackageRevenuesByPeriodByPackageByPartyByInternalOrganisation[salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation] = partyPackageRevenuesByPeriodByPackageByParty;
            }

            Dictionary<Package, Dictionary<DateTime, PartyPackageRevenue>> partyPackageRevenuesByPeriodByPackage;
            if (!partyPackageRevenuesByPeriodByPackageByParty.TryGetValue(salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer, out partyPackageRevenuesByPeriodByPackage))
            {
                partyPackageRevenue = CreatePartyPackageRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, package);

                partyPackageRevenuesByPeriodByPackage = new Dictionary<Package, Dictionary<DateTime, PartyPackageRevenue>>
                        {
                            {
                                package,
                                new Dictionary<DateTime, PartyPackageRevenue> { { date, partyPackageRevenue } }
                            }
                        };

                partyPackageRevenuesByPeriodByPackageByParty[salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer] = partyPackageRevenuesByPeriodByPackage;
            }

            Dictionary<DateTime, PartyPackageRevenue> partyPackageRevenuesByPeriod;
            if (!partyPackageRevenuesByPeriodByPackage.TryGetValue(package, out partyPackageRevenuesByPeriod))
            {
                partyPackageRevenue = CreatePartyPackageRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, package);

                partyPackageRevenuesByPeriod = new Dictionary<DateTime, PartyPackageRevenue> { { date, partyPackageRevenue } };

                partyPackageRevenuesByPeriodByPackage[package] = partyPackageRevenuesByPeriod;
            }

            if (!partyPackageRevenuesByPeriod.TryGetValue(date, out partyPackageRevenue))
            {
                partyPackageRevenue = CreatePartyPackageRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, package);
                partyPackageRevenuesByPeriod.Add(date, partyPackageRevenue);
            }

            revenues.Add(partyPackageRevenue.Id);
            partyPackageRevenue.Revenue += salesInvoiceItem.TotalExVat;
        }
Example #3
0
 private static ProductRevenue CreateProductRevenue(ISession session, SalesInvoiceItem item)
 {
     return new ProductRevenueBuilder(session)
                 .WithInternalOrganisation(item.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation)
                 .WithProduct(item.Product)
                 .WithYear(item.SalesInvoiceWhereSalesInvoiceItem.InvoiceDate.Year)
                 .WithMonth(item.SalesInvoiceWhereSalesInvoiceItem.InvoiceDate.Month)
                 .WithCurrency(item.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation.PreferredCurrency)
                 .WithRevenue(0M)
                 .Build();
 }
 private static SalesRepPartyProductCategoryRevenue CreateSalesRepPartyProductCategoryRevenue(ISession session, SalesInvoiceItem item, ProductCategory productCategory)
 {
     return new SalesRepPartyProductCategoryRevenueBuilder(session)
                 .WithInternalOrganisation(item.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation)
                 .WithParty(item.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer)
                 .WithSalesRep(item.SalesRep)
                 .WithProductCategory(productCategory)
                 .WithYear(item.SalesInvoiceWhereSalesInvoiceItem.InvoiceDate.Year)
                 .WithMonth(item.SalesInvoiceWhereSalesInvoiceItem.InvoiceDate.Month)
                 .WithCurrency(item.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation.PreferredCurrency)
                 .WithRevenue(0M)
                 .Build();
 }
        private static void CreateProductCategoryRevenue(
            ISession session,
            Dictionary<InternalOrganisation, Dictionary<Party, Dictionary<Party, Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>>>> salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRepByInternalOrganisation,
            ProductCategory productCategory,
            DateTime date,
            SalesInvoiceItem salesInvoiceItem,
            HashSet<long> revenues)
        {
            SalesRepPartyProductCategoryRevenue salesRepPartyProductCategoryRevenue;

            Dictionary<Party, Dictionary<Party, Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>>>
                salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRep;

            if (!salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRepByInternalOrganisation.TryGetValue(salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation, out salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRep))
            {
                salesRepPartyProductCategoryRevenue = CreateSalesRepPartyProductCategoryRevenue(session, salesInvoiceItem, productCategory);

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRep = new Dictionary<Party, Dictionary<Party, Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>>>
                        {
                            {
                                salesInvoiceItem.SalesRep,
                                new Dictionary<Party, Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>>
                                    {
                                        {
                                            salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer,
                                            new Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>
                                                {
                                                    {
                                                        productCategory,
                                                        new Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>
                                                            {
                                                                { date, salesRepPartyProductCategoryRevenue }
                                                            }
                                                        }
                                                }
                                            }
                                    }
                                }
                        };

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRepByInternalOrganisation[salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation] = salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRep;
            }

            Dictionary<Party, Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>> salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByParty;
            if (!salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRep.TryGetValue(salesInvoiceItem.SalesRep, out salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByParty))
            {
                salesRepPartyProductCategoryRevenue = CreateSalesRepPartyProductCategoryRevenue(session, salesInvoiceItem, productCategory);

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByParty = new Dictionary<Party, Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>>
                        {
                            {
                                salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer,
                                new Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>
                                    {
                                        {
                                            productCategory,
                                            new Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>
                                                {
                                                    { date, salesRepPartyProductCategoryRevenue }
                                                }
                                            }
                                    }
                                }
                        };

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRep[salesInvoiceItem.SalesRep] = salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByParty;
            }

            Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>> salesRepPartyProductCategoryRevenuesByPeriodByProductCategory;
            if (!salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByParty.TryGetValue(salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BillToCustomer, out salesRepPartyProductCategoryRevenuesByPeriodByProductCategory))
            {
                salesRepPartyProductCategoryRevenue = CreateSalesRepPartyProductCategoryRevenue(session, salesInvoiceItem, productCategory);

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategory = new Dictionary<ProductCategory, Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>>
                        {
                            {
                                productCategory,
                                new Dictionary<DateTime, SalesRepPartyProductCategoryRevenue>
                                    {
                                        { date, salesRepPartyProductCategoryRevenue }
                                    }
                                }
                        };

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByParty[salesInvoiceItem.SalesRep] = salesRepPartyProductCategoryRevenuesByPeriodByProductCategory;
            }

            Dictionary<DateTime, SalesRepPartyProductCategoryRevenue> salesRepPartyProductCategoryRevenuesByPeriod;
            if (!salesRepPartyProductCategoryRevenuesByPeriodByProductCategory.TryGetValue(productCategory, out salesRepPartyProductCategoryRevenuesByPeriod))
            {
                salesRepPartyProductCategoryRevenue = CreateSalesRepPartyProductCategoryRevenue(session, salesInvoiceItem, productCategory);

                salesRepPartyProductCategoryRevenuesByPeriod = new Dictionary<DateTime, SalesRepPartyProductCategoryRevenue> { { date, salesRepPartyProductCategoryRevenue } };

                salesRepPartyProductCategoryRevenuesByPeriodByProductCategory[productCategory] = salesRepPartyProductCategoryRevenuesByPeriod;
            }

            if (!salesRepPartyProductCategoryRevenuesByPeriod.TryGetValue(date, out salesRepPartyProductCategoryRevenue))
            {
                salesRepPartyProductCategoryRevenue = CreateSalesRepPartyProductCategoryRevenue(session, salesInvoiceItem, productCategory);
                salesRepPartyProductCategoryRevenuesByPeriod.Add(date, salesRepPartyProductCategoryRevenue);
            }

            revenues.Add(salesRepPartyProductCategoryRevenue.Id);
            salesRepPartyProductCategoryRevenue.Revenue += salesInvoiceItem.TotalExVat;

            foreach (ProductCategory parent in productCategory.Parents)
            {
                CreateProductCategoryRevenue(session, salesRepPartyProductCategoryRevenuesByPeriodByProductCategoryByPartyBySalesRepByInternalOrganisation, parent, date, salesInvoiceItem, revenues);
            }
        }
Example #6
0
        public void CalculatePrices(
            IDerivation derivation,
            SalesInvoiceItem salesInvoiceItem,
            PriceComponent[] currentPriceComponents,
            decimal quantityOrdered,
            decimal totalBasePrice)
        {
            var salesInvoiceItemDerivedRoles = (SalesInvoiceItemDerivedRoles)salesInvoiceItem;

            var currentGenericOrProductOrFeaturePriceComponents = new List <PriceComponent>();

            if (salesInvoiceItem.ExistProduct)
            {
                currentGenericOrProductOrFeaturePriceComponents.AddRange(salesInvoiceItem.Product.GetPriceComponents(currentPriceComponents));
            }

            foreach (ProductFeature productFeature in salesInvoiceItem.ProductFeatures)
            {
                currentGenericOrProductOrFeaturePriceComponents.AddRange(productFeature.GetPriceComponents(salesInvoiceItem.Product, currentPriceComponents));
            }

            var priceComponents = currentGenericOrProductOrFeaturePriceComponents.Where(
                v => PriceComponents.BaseIsApplicable(
                    new PriceComponents.IsApplicable
            {
                PriceComponent  = v,
                Customer        = this.BillToCustomer,
                Product         = salesInvoiceItem.Product,
                SalesInvoice    = this,
                QuantityOrdered = quantityOrdered,
                ValueOrdered    = totalBasePrice,
            })).ToArray();

            var unitBasePrice = priceComponents.OfType <BasePrice>().Min(v => v.Price);

            // Calculate Unit Price (with Discounts and Surcharges)
            if (salesInvoiceItem.AssignedUnitPrice.HasValue)
            {
                salesInvoiceItemDerivedRoles.UnitBasePrice = unitBasePrice ?? salesInvoiceItem.AssignedUnitPrice.Value;
                salesInvoiceItemDerivedRoles.UnitDiscount  = 0;
                salesInvoiceItemDerivedRoles.UnitSurcharge = 0;
                salesInvoiceItemDerivedRoles.UnitPrice     = salesInvoiceItem.AssignedUnitPrice.Value;
            }
            else
            {
                if (!unitBasePrice.HasValue)
                {
                    derivation.Validation.AddError(salesInvoiceItem, M.SalesOrderItem.UnitBasePrice, "No BasePrice with a Price");
                    return;
                }

                salesInvoiceItemDerivedRoles.UnitBasePrice = unitBasePrice.Value;

                salesInvoiceItemDerivedRoles.UnitDiscount = priceComponents.OfType <DiscountComponent>().Sum(
                    v => v.Percentage.HasValue
                             ? Math.Round(salesInvoiceItem.UnitBasePrice * v.Percentage.Value / 100, 2)
                             : v.Price ?? 0);

                salesInvoiceItemDerivedRoles.UnitSurcharge = priceComponents.OfType <SurchargeComponent>().Sum(
                    v => v.Percentage.HasValue
                             ? Math.Round(salesInvoiceItem.UnitBasePrice * v.Percentage.Value / 100, 2)
                             : v.Price ?? 0);

                salesInvoiceItemDerivedRoles.UnitPrice = salesInvoiceItem.UnitBasePrice - salesInvoiceItem.UnitDiscount + salesInvoiceItem.UnitSurcharge;

                if (salesInvoiceItem.ExistDiscountAdjustment)
                {
                    salesInvoiceItemDerivedRoles.UnitDiscount += salesInvoiceItem.DiscountAdjustment.Percentage.HasValue ?
                                                                 Math.Round(salesInvoiceItem.UnitPrice * salesInvoiceItem.DiscountAdjustment.Percentage.Value / 100, 2) :
                                                                 salesInvoiceItem.DiscountAdjustment.Amount ?? 0;
                }

                if (salesInvoiceItem.ExistSurchargeAdjustment)
                {
                    salesInvoiceItemDerivedRoles.UnitSurcharge += salesInvoiceItem.SurchargeAdjustment.Percentage.HasValue ?
                                                                  Math.Round(salesInvoiceItem.UnitPrice * salesInvoiceItem.SurchargeAdjustment.Percentage.Value / 100, 2) :
                                                                  salesInvoiceItem.SurchargeAdjustment.Amount ?? 0;
                }

                salesInvoiceItemDerivedRoles.UnitPrice = salesInvoiceItem.UnitBasePrice - salesInvoiceItem.UnitDiscount + salesInvoiceItem.UnitSurcharge;
            }

            salesInvoiceItemDerivedRoles.UnitVat = salesInvoiceItem.ExistVatRate ? Math.Round(salesInvoiceItem.UnitPrice * salesInvoiceItem.VatRate.Rate / 100, 2) : 0;

            // Calculate Totals
            salesInvoiceItemDerivedRoles.TotalBasePrice = salesInvoiceItem.UnitBasePrice * salesInvoiceItem.Quantity;
            salesInvoiceItemDerivedRoles.TotalDiscount  = salesInvoiceItem.UnitDiscount * salesInvoiceItem.Quantity;
            salesInvoiceItemDerivedRoles.TotalSurcharge = salesInvoiceItem.UnitSurcharge * salesInvoiceItem.Quantity;

            if (salesInvoiceItem.TotalBasePrice > 0)
            {
                salesInvoiceItemDerivedRoles.TotalDiscountAsPercentage  = Math.Round(salesInvoiceItem.TotalDiscount / salesInvoiceItem.TotalBasePrice * 100, 2);
                salesInvoiceItemDerivedRoles.TotalSurchargeAsPercentage = Math.Round(salesInvoiceItem.TotalSurcharge / salesInvoiceItem.TotalBasePrice * 100, 2);
            }
            else
            {
                salesInvoiceItemDerivedRoles.TotalDiscountAsPercentage  = 0;
                salesInvoiceItemDerivedRoles.TotalSurchargeAsPercentage = 0;
            }

            salesInvoiceItemDerivedRoles.TotalExVat  = salesInvoiceItem.UnitPrice * salesInvoiceItem.Quantity;
            salesInvoiceItemDerivedRoles.TotalVat    = salesInvoiceItem.UnitVat * salesInvoiceItem.Quantity;
            salesInvoiceItemDerivedRoles.TotalIncVat = salesInvoiceItem.TotalExVat + salesInvoiceItem.TotalVat;
        }
Example #7
0
        private static void CreateProductCategoryRevenue(
            ISession session,
            Dictionary<InternalOrganisation, Dictionary<ProductCategory, Dictionary<DateTime, ProductCategoryRevenue>>> productCategoryRevenuesByPeriodByProductCategoryByInternalOrganisation,
            DateTime date,
            HashSet<long> revenues,
            SalesInvoiceItem salesInvoiceItem,
            ProductCategory productCategory)
        {
            ProductCategoryRevenue productCategoryRevenue;

            Dictionary<ProductCategory, Dictionary<DateTime, ProductCategoryRevenue>> productCategoryRevenuesByPeriodByProductCategory;
            if (!productCategoryRevenuesByPeriodByProductCategoryByInternalOrganisation.TryGetValue(salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation, out productCategoryRevenuesByPeriodByProductCategory))
            {
                productCategoryRevenue = CreateProductCategoryRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, productCategory);

                productCategoryRevenuesByPeriodByProductCategory = new Dictionary<ProductCategory, Dictionary<DateTime, ProductCategoryRevenue>>
                        {
                            {
                                productCategory,
                                new Dictionary<DateTime, ProductCategoryRevenue>
                                    {
                                        { date, productCategoryRevenue }
                                    }
                            }
                        };

                productCategoryRevenuesByPeriodByProductCategoryByInternalOrganisation[salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem.BilledFromInternalOrganisation] = productCategoryRevenuesByPeriodByProductCategory;
            }

            Dictionary<DateTime, ProductCategoryRevenue> productCategoryRevenuesByPeriod;
            if (!productCategoryRevenuesByPeriodByProductCategory.TryGetValue(productCategory, out productCategoryRevenuesByPeriod))
            {
                productCategoryRevenue = CreateProductCategoryRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, productCategory);

                productCategoryRevenuesByPeriod = new Dictionary<DateTime, ProductCategoryRevenue> { { date, productCategoryRevenue } };

                productCategoryRevenuesByPeriodByProductCategory[productCategory] = productCategoryRevenuesByPeriod;
            }

            if (!productCategoryRevenuesByPeriod.TryGetValue(date, out productCategoryRevenue))
            {
                productCategoryRevenue = CreateProductCategoryRevenue(session, salesInvoiceItem.SalesInvoiceWhereSalesInvoiceItem, productCategory);
                productCategoryRevenuesByPeriod.Add(date, productCategoryRevenue);
            }

            revenues.Add(productCategoryRevenue.Id);
            productCategoryRevenue.Revenue += salesInvoiceItem.TotalExVat;

            foreach (ProductCategory parent in productCategory.Parents)
            {
                CreateProductCategoryRevenue(session, productCategoryRevenuesByPeriodByProductCategoryByInternalOrganisation, date, revenues, salesInvoiceItem, parent);
            }
        }