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; }
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; }
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); } }
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; }
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); } }