public override void Init() { base.Init(); var euro = new Currencies(this.DatabaseSession).FindBy(Currencies.Meta.IsoCode, "EUR"); this.internalOrganisation = new InternalOrganisations(this.DatabaseSession).FindBy(InternalOrganisations.Meta.Name, "internalOrganisation"); this.internalOrganisation.PreferredCurrency = euro; this.supplier = new OrganisationBuilder(this.DatabaseSession).WithName("supplier").Build(); this.vatRate21 = new VatRateBuilder(this.DatabaseSession).WithRate(21).Build(); var mechelen = new CityBuilder(this.DatabaseSession).WithName("Mechelen").Build(); this.kiev = new CityBuilder(this.DatabaseSession).WithName("Kiev").Build(); this.shipToContactMechanismMechelen = new PostalAddressBuilder(this.DatabaseSession).WithGeographicBoundary(mechelen).WithAddress1("Haverwerf 15").Build(); this.shipToContactMechanismKiev = new PostalAddressBuilder(this.DatabaseSession).WithGeographicBoundary(this.kiev).WithAddress1("Dnieper").Build(); this.shipToCustomer = new OrganisationBuilder(this.DatabaseSession).WithName("shipToCustomer").Build(); this.shipToCustomer.AddPartyContactMechanism(new PartyContactMechanismBuilder(this.DatabaseSession) .WithContactMechanism(this.shipToContactMechanismKiev) .WithContactPurpose(new ContactMechanismPurposes(this.DatabaseSession).ShippingAddress) .WithUseAsDefault(true) .Build()); this.billToCustomer = new OrganisationBuilder(this.DatabaseSession) .WithName("billToCustomer") .WithPreferredCurrency(euro) .Build(); this.billToCustomer.AddPartyContactMechanism(new PartyContactMechanismBuilder(this.DatabaseSession) .WithContactMechanism(this.shipToContactMechanismKiev) .WithContactPurpose(new ContactMechanismPurposes(this.DatabaseSession).BillingAddress) .WithUseAsDefault(true) .Build()); this.part = new FinishedGoodBuilder(this.DatabaseSession).WithName("part").Build(); this.ancestorProductCategory = new ProductCategoryBuilder(this.DatabaseSession).WithDescription("ancestor").Build(); this.parentProductCategory = new ProductCategoryBuilder(this.DatabaseSession).WithDescription("parent").WithParent(this.ancestorProductCategory).Build(); this.productCategory = new ProductCategoryBuilder(this.DatabaseSession).WithDescription("gizmo").Build(); this.productCategory.AddParent(this.parentProductCategory); this.good = new GoodBuilder(this.DatabaseSession) .WithSku("10101") .WithVatRate(this.vatRate21) .WithName("good") .WithProductCategory(this.productCategory) .WithFinishedGood(this.part) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); new SupplierRelationshipBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithSupplier(this.supplier) .WithFromDate(DateTime.UtcNow) .Build(); new CustomerRelationshipBuilder(this.DatabaseSession) .WithCustomer(this.billToCustomer) .WithInternalOrganisation(Singleton.Instance(this.DatabaseSession).DefaultInternalOrganisation) .Build(); new CustomerRelationshipBuilder(this.DatabaseSession) .WithCustomer(this.shipToCustomer) .WithInternalOrganisation(Singleton.Instance(this.DatabaseSession).DefaultInternalOrganisation) .Build(); this.partyRevenueHistory = new PartyRevenueHistoryBuilder(this.DatabaseSession) .WithCurrency(euro) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithRevenue(100M) .Build(); this.productCategoryRevenueHistory = new PartyProductCategoryRevenueHistoryBuilder(this.DatabaseSession) .WithCurrency(euro) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithProductCategory(this.productCategory) .WithRevenue(100M) .WithQuantity(10) .Build(); this.parentProductCategoryRevenueHistory = new PartyProductCategoryRevenueHistoryBuilder(this.DatabaseSession) .WithCurrency(euro) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithProductCategory(this.parentProductCategory) .WithRevenue(100M) .WithQuantity(10) .Build(); this.ancestorProductCategoryRevenueHistory = new PartyProductCategoryRevenueHistoryBuilder(this.DatabaseSession) .WithCurrency(euro) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithProductCategory(this.ancestorProductCategory) .WithRevenue(100M) .WithQuantity(10) .Build(); this.variantGood = new GoodBuilder(this.DatabaseSession) .WithSku("v10101") .WithVatRate(this.vatRate21) .WithName("variant good") .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .WithInventoryItemKind(new InventoryItemKinds(this.DatabaseSession).NonSerialized) .Build(); this.variantGood2 = new GoodBuilder(this.DatabaseSession) .WithSku("v10102") .WithVatRate(this.vatRate21) .WithName("variant good2") .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .WithInventoryItemKind(new InventoryItemKinds(this.DatabaseSession).NonSerialized) .Build(); this.virtualGood = new GoodBuilder(this.DatabaseSession) .WithSku("v10103") .WithVatRate(this.vatRate21) .WithName("virtual good") .WithVariant(this.variantGood) .WithVariant(this.variantGood2) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .WithInventoryItemKind(new InventoryItemKinds(this.DatabaseSession).NonSerialized) .Build(); this.goodPurchasePrice = new ProductPurchasePriceBuilder(this.DatabaseSession) .WithCurrency(euro) .WithFromDate(DateTime.UtcNow) .WithPrice(7) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); this.goodSupplierOffering = new SupplierOfferingBuilder(this.DatabaseSession) .WithProduct(this.good) .WithSupplier(this.supplier) .WithFromDate(DateTime.UtcNow) .WithProductPurchasePrice(this.goodPurchasePrice) .Build(); this.virtualGoodPurchasePrice = new ProductPurchasePriceBuilder(this.DatabaseSession) .WithCurrency(euro) .WithFromDate(DateTime.UtcNow) .WithPrice(8) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); this.virtualgoodSupplierOffering = new SupplierOfferingBuilder(this.DatabaseSession) .WithProduct(this.virtualGood) .WithSupplier(this.supplier) .WithFromDate(DateTime.UtcNow) .WithProductPurchasePrice(this.virtualGoodPurchasePrice) .Build(); this.feature1 = new ColourBuilder(this.DatabaseSession) .WithName("white") .WithVatRate(this.vatRate21) .WithLocalisedName(new LocalisedTextBuilder(this.DatabaseSession) .WithText("white") .WithLocale(Singleton.Instance(this.DatabaseSession).DefaultLocale) .Build()) .Build(); this.feature2 = new ColourBuilder(this.DatabaseSession) .WithName("black") .WithLocalisedName(new LocalisedTextBuilder(this.DatabaseSession) .WithText("black") .WithLocale(Singleton.Instance(this.DatabaseSession).DefaultLocale) .Build()) .Build(); this.currentBasePriceGeoBoundary = new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("current BasePriceGeoBoundary ") .WithGeographicBoundary(mechelen) .WithProduct(this.good) .WithPrice(8) .WithFromDate(DateTime.UtcNow) .Build(); // previous basePrice for good new BasePriceBuilder(this.DatabaseSession).WithDescription("previous good") .WithSpecifiedFor(this.internalOrganisation) .WithProduct(this.good) .WithPrice(8) .WithFromDate(DateTime.UtcNow.AddYears(-1)) .WithThroughDate(DateTime.UtcNow.AddDays(-1)) .Build(); // future basePrice for good new BasePriceBuilder(this.DatabaseSession).WithDescription("future good") .WithSpecifiedFor(this.internalOrganisation) .WithProduct(this.good) .WithPrice(11) .WithFromDate(DateTime.UtcNow.AddYears(1)) .Build(); this.currentGoodBasePrice = new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("current good") .WithProduct(this.good) .WithPrice(10) .WithFromDate(DateTime.UtcNow) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); // previous basePrice for feature1 new BasePriceBuilder(this.DatabaseSession).WithDescription("previous feature1") .WithSpecifiedFor(this.internalOrganisation) .WithProductFeature(this.feature1) .WithPrice(0.5M) .WithFromDate(DateTime.UtcNow.AddYears(-1)) .WithThroughDate(DateTime.UtcNow.AddDays(-1)) .Build(); // future basePrice for feature1 new BasePriceBuilder(this.DatabaseSession).WithDescription("future feature1") .WithSpecifiedFor(this.internalOrganisation) .WithProductFeature(this.feature1) .WithPrice(2.5M) .WithFromDate(DateTime.UtcNow.AddYears(1)) .Build(); new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("current feature1") .WithProductFeature(this.feature1) .WithPrice(2) .WithFromDate(DateTime.UtcNow) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); // previous basePrice for feature2 new BasePriceBuilder(this.DatabaseSession).WithDescription("previous feature2") .WithSpecifiedFor(this.internalOrganisation) .WithProductFeature(this.feature2) .WithPrice(2) .WithFromDate(DateTime.UtcNow.AddYears(-1)) .WithThroughDate(DateTime.UtcNow.AddDays(-1)) .Build(); // future basePrice for feature2 new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("future feature2") .WithProductFeature(this.feature2) .WithPrice(4) .WithFromDate(DateTime.UtcNow.AddYears(1)) .Build(); this.currentFeature2BasePrice = new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("current feature2") .WithProductFeature(this.feature2) .WithPrice(3) .WithFromDate(DateTime.UtcNow) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); // previous basePrice for good with feature1 new BasePriceBuilder(this.DatabaseSession).WithDescription("previous good/feature1") .WithSpecifiedFor(this.internalOrganisation) .WithProduct(this.good) .WithProductFeature(this.feature1) .WithPrice(4) .WithFromDate(DateTime.UtcNow.AddYears(-1)) .WithThroughDate(DateTime.UtcNow.AddDays(-1)) .Build(); // future basePrice for good with feature1 new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("future good/feature1") .WithProduct(this.good) .WithProductFeature(this.feature1) .WithPrice(6) .WithFromDate(DateTime.UtcNow.AddYears(1)) .Build(); this.currentGood1Feature1BasePrice = new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("current good/feature1") .WithProduct(this.good) .WithProductFeature(this.feature1) .WithPrice(5) .WithFromDate(DateTime.UtcNow) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("current variant good2") .WithProduct(this.variantGood2) .WithPrice(11) .WithFromDate(DateTime.UtcNow) .Build(); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.order = new SalesOrderBuilder(this.DatabaseSession) .WithShipToCustomer(this.shipToCustomer) .WithBillToCustomer(this.billToCustomer) .WithTakenByInternalOrganisation(this.internalOrganisation) .Build(); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); }
private void InstantiateObjects(ISession session) { this.productCategory = (ProductCategory)session.Instantiate(this.productCategory); this.parentProductCategory = (ProductCategory)session.Instantiate(this.parentProductCategory); this.ancestorProductCategory = (ProductCategory)session.Instantiate(this.ancestorProductCategory); this.part = (FinishedGood)session.Instantiate(this.part); this.good = (Good)session.Instantiate(this.good); this.feature1 = (Colour)session.Instantiate(this.feature1); this.feature2 = (Colour)session.Instantiate(this.feature2); this.internalOrganisation = (InternalOrganisation)session.Instantiate(this.internalOrganisation); this.shipToCustomer = (Organisation)session.Instantiate(this.shipToCustomer); this.billToCustomer = (Organisation)session.Instantiate(this.billToCustomer); this.supplier = (Organisation)session.Instantiate(this.supplier); this.kiev = (City)session.Instantiate(this.kiev); this.shipToContactMechanismMechelen = (PostalAddress)session.Instantiate(this.shipToContactMechanismMechelen); this.shipToContactMechanismKiev = (PostalAddress)session.Instantiate(this.shipToContactMechanismKiev); this.currentBasePriceGeoBoundary = (BasePrice)session.Instantiate(this.currentBasePriceGeoBoundary); this.currentGoodBasePrice = (BasePrice)session.Instantiate(this.currentGoodBasePrice); this.currentGood1Feature1BasePrice = (BasePrice)session.Instantiate(this.currentGood1Feature1BasePrice); this.currentFeature2BasePrice = (BasePrice)session.Instantiate(this.currentFeature2BasePrice); this.goodPurchasePrice = (ProductPurchasePrice)session.Instantiate(this.goodPurchasePrice); this.virtualGoodPurchasePrice = (ProductPurchasePrice)session.Instantiate(this.virtualGoodPurchasePrice); this.currentGoodBasePrice = (BasePrice)session.Instantiate(this.currentGoodBasePrice); this.goodSupplierOffering = (SupplierOffering)session.Instantiate(this.goodSupplierOffering); this.virtualgoodSupplierOffering = (SupplierOffering)session.Instantiate(this.virtualgoodSupplierOffering); this.order = (SalesOrder)session.Instantiate(this.order); this.vatRate21 = (VatRate)session.Instantiate(this.vatRate21); }
private void CalculatePrice(IDerivation derivation, SalesOrder salesOrder, bool useValueOrdered = false) { var sameProductItems = salesOrder.SalesOrderItems .Where(v => v.IsValid && v.ExistProduct && v.Product.Equals(this.Product)) .ToArray(); var quantityOrdered = sameProductItems.Sum(w => w.QuantityOrdered); var valueOrdered = useValueOrdered ? sameProductItems.Sum(w => w.TotalBasePrice) : 0; var orderPriceComponents = new PriceComponents(this.Session()).CurrentPriceComponents(salesOrder.OrderDate); var orderItemPriceComponents = Array.Empty <PriceComponent>(); if (this.ExistProduct) { orderItemPriceComponents = this.Product.GetPriceComponents(orderPriceComponents); } else if (this.ExistProductFeature) { orderItemPriceComponents = this.ProductFeature.GetPriceComponents(this.SalesOrderItemWhereOrderedWithFeature.Product, orderPriceComponents); } var priceComponents = orderItemPriceComponents.Where( v => PriceComponents.BaseIsApplicable( new PriceComponents.IsApplicable { PriceComponent = v, Customer = salesOrder.BillToCustomer, Product = this.Product, SalesOrder = salesOrder, QuantityOrdered = quantityOrdered, ValueOrdered = valueOrdered, })).ToArray(); var unitBasePrice = priceComponents.OfType <BasePrice>().Min(v => v.Price); // Calculate Unit Price (with Discounts and Surcharges) if (this.AssignedUnitPrice.HasValue) { this.UnitBasePrice = unitBasePrice ?? this.AssignedUnitPrice.Value; this.UnitDiscount = 0; this.UnitSurcharge = 0; this.UnitPrice = this.AssignedUnitPrice.Value; } else { if (!unitBasePrice.HasValue) { derivation.Validation.AddError(this, M.SalesOrderItem.UnitBasePrice, "No BasePrice with a Price"); return; } this.UnitBasePrice = unitBasePrice.Value; this.UnitDiscount = priceComponents.OfType <DiscountComponent>().Sum( v => v.Percentage.HasValue ? Math.Round(this.UnitBasePrice * v.Percentage.Value / 100, 2) : v.Price ?? 0); this.UnitSurcharge = priceComponents.OfType <SurchargeComponent>().Sum( v => v.Percentage.HasValue ? Math.Round(this.UnitBasePrice * v.Percentage.Value / 100, 2) : v.Price ?? 0); this.UnitPrice = this.UnitBasePrice - this.UnitDiscount + this.UnitSurcharge; foreach (OrderAdjustment orderAdjustment in this.DiscountAdjustments) { this.UnitDiscount += orderAdjustment.Percentage.HasValue ? Math.Round(this.UnitPrice * orderAdjustment.Percentage.Value / 100, 2) : orderAdjustment.Amount ?? 0; } foreach (OrderAdjustment orderAdjustment in this.SurchargeAdjustments) { this.UnitSurcharge += orderAdjustment.Percentage.HasValue ? Math.Round(this.UnitPrice * orderAdjustment.Percentage.Value / 100, 2) : orderAdjustment.Amount ?? 0; } this.UnitPrice = this.UnitBasePrice - this.UnitDiscount + this.UnitSurcharge; } foreach (SalesOrderItem featureItem in this.OrderedWithFeatures) { this.UnitBasePrice += featureItem.UnitBasePrice; this.UnitPrice += featureItem.UnitPrice; this.UnitDiscount += featureItem.UnitDiscount; this.UnitSurcharge += featureItem.UnitSurcharge; } this.UnitVat = this.ExistVatRate ? this.UnitPrice * this.VatRate.Rate / 100 : 0; this.UnitIrpf = this.ExistIrpfRate ? this.UnitPrice * this.IrpfRate.Rate / 100 : 0; // Calculate Totals this.TotalBasePrice = this.UnitBasePrice * this.QuantityOrdered; this.TotalDiscount = this.UnitDiscount * this.QuantityOrdered; this.TotalSurcharge = this.UnitSurcharge * this.QuantityOrdered; this.TotalOrderAdjustment = this.TotalSurcharge - this.TotalDiscount; if (this.TotalBasePrice > 0) { this.TotalDiscountAsPercentage = Math.Round(this.TotalDiscount / this.TotalBasePrice * 100, 2); this.TotalSurchargeAsPercentage = Math.Round(this.TotalSurcharge / this.TotalBasePrice * 100, 2); } else { this.TotalDiscountAsPercentage = 0; this.TotalSurchargeAsPercentage = 0; } this.TotalExVat = this.UnitPrice * this.QuantityOrdered; this.TotalVat = Math.Round(this.UnitVat * this.QuantityOrdered, 2); this.TotalIncVat = this.TotalExVat + this.TotalVat; this.TotalIrpf = Math.Round(this.UnitIrpf * this.QuantityOrdered, 2); this.GrandTotal = this.TotalIncVat - this.TotalIrpf; }
public void SyncPrices(IDerivation derivation, SalesOrder salesOrder) => this.CalculatePrice(derivation, salesOrder, true);
private static decimal BaseCatalogPrice( SalesOrder salesOrder, SalesInvoice salesInvoice, Product product, DateTime date) { var productBasePrice = 0M; var productDiscount = 0M; var productSurcharge = 0M; var baseprices = new PriceComponent[0]; if (product.ExistBasePrices) { baseprices = product.BasePrices; } var party = salesOrder != null ? salesOrder.ShipToCustomer : salesInvoice?.BillToCustomer; foreach (BasePrice priceComponent in baseprices) { if (priceComponent.FromDate <= date && (!priceComponent.ExistThroughDate || priceComponent.ThroughDate >= date)) { if (PriceComponents.BaseIsApplicable(new PriceComponents.IsApplicable { PriceComponent = priceComponent, Customer = party, Product = product, SalesOrder = salesOrder, SalesInvoice = salesInvoice, })) { if (priceComponent.ExistPrice) { if (productBasePrice == 0 || priceComponent.Price < productBasePrice) { productBasePrice = priceComponent.Price ?? 0; } } } } } var currentPriceComponents = new PriceComponents(product.Strategy.Session).CurrentPriceComponents(date); var priceComponents = product.GetPriceComponents(currentPriceComponents); foreach (var priceComponent in priceComponents) { if (priceComponent.Strategy.Class.Equals(M.DiscountComponent.ObjectType) || priceComponent.Strategy.Class.Equals(M.SurchargeComponent.ObjectType)) { if (PriceComponents.BaseIsApplicable(new PriceComponents.IsApplicable { PriceComponent = priceComponent, Customer = party, Product = product, SalesOrder = salesOrder, SalesInvoice = salesInvoice, })) { if (priceComponent.Strategy.Class.Equals(M.DiscountComponent.ObjectType)) { var discountComponent = (DiscountComponent)priceComponent; decimal discount; if (discountComponent.Price.HasValue) { discount = discountComponent.Price.Value; productDiscount += discount; } else { var percentage = discountComponent.Percentage ?? 0; discount = Rounder.RoundDecimal(productBasePrice * percentage / 100, 2); productDiscount += discount; } } if (priceComponent.Strategy.Class.Equals(M.SurchargeComponent.ObjectType)) { var surchargeComponent = (SurchargeComponent)priceComponent; decimal surcharge; if (surchargeComponent.Price.HasValue) { surcharge = surchargeComponent.Price.Value; productSurcharge += surcharge; } else { var percentage = surchargeComponent.Percentage ?? 0; surcharge = Rounder.RoundDecimal(productBasePrice * percentage / 100, 2); productSurcharge += surcharge; } } } } } return(productBasePrice - productDiscount + productSurcharge); }
private static decimal AppsCatalogPrice( SalesOrder salesOrder, SalesInvoice salesInvoice, Product product, DateTime date) { var productBasePrice = 0M; var productDiscount = 0M; var productSurcharge = 0M; var baseprices = new PriceComponent[0]; if (product.ExistBasePrices) { baseprices = product.BasePrices; } var party = salesOrder != null ? salesOrder.ShipToCustomer : salesInvoice != null ? salesInvoice.BillToCustomer : null; var internalOrganisation = salesOrder != null ? salesOrder.TakenByInternalOrganisation : salesInvoice != null ? salesInvoice.BilledFromInternalOrganisation : null; foreach (BasePrice priceComponent in baseprices) { if (priceComponent.FromDate <= date && (!priceComponent.ExistThroughDate || priceComponent.ThroughDate >= date)) { if (PriceComponents.AppsIsEligible(new PriceComponents.IsEligibleParams { PriceComponent = priceComponent, Customer = party, Product = product, SalesOrder = salesOrder, SalesInvoice = salesInvoice, })) { if (priceComponent.ExistPrice) { if (productBasePrice == 0 || priceComponent.Price < productBasePrice) { productBasePrice = priceComponent.Price; } } } } } var partyRevenueHistories = party.PartyRevenueHistoriesWhereParty; partyRevenueHistories.Filter.AddEquals(PartyRevenueHistories.Meta.InternalOrganisation, internalOrganisation); var partyRevenueHistory = partyRevenueHistories.First; var partyProductCategoryRevenueHistoryByProductCategory = PartyProductCategoryRevenueHistories.PartyProductCategoryRevenueHistoryByProductCategory(internalOrganisation, party); var partyPackageRevenuesHistories = party.PartyPackageRevenueHistoriesWhereParty; partyPackageRevenuesHistories.Filter.AddEquals(PartyPackageRevenueHistories.Meta.InternalOrganisation, internalOrganisation); var priceComponents = GetPriceComponents(internalOrganisation, product, date); var revenueBreakDiscount = 0M; var revenueBreakSurcharge = 0M; foreach (var priceComponent in priceComponents) { if (priceComponent.Strategy.Class.Equals(DiscountComponents.Meta.ObjectType) || priceComponent.Strategy.Class.Equals(SurchargeComponents.Meta.ObjectType)) { if (PriceComponents.AppsIsEligible(new PriceComponents.IsEligibleParams { PriceComponent = priceComponent, Customer = party, Product = product, SalesOrder = salesOrder, SalesInvoice = salesInvoice, PartyPackageRevenueHistoryList = partyPackageRevenuesHistories, PartyRevenueHistory = partyRevenueHistory, PartyProductCategoryRevenueHistoryByProductCategory = partyProductCategoryRevenueHistoryByProductCategory, })) { if (priceComponent.Strategy.Class.Equals(DiscountComponents.Meta.ObjectType)) { var discountComponent = (DiscountComponent)priceComponent; decimal discount; if (discountComponent.Price.HasValue) { discount = discountComponent.Price.Value; productDiscount += discount; } else { var percentage = discountComponent.Percentage.HasValue ? discountComponent.Percentage.Value : 0; discount = decimal.Round(((productBasePrice * percentage) / 100), 2); productDiscount += discount; } ////Revenuebreaks on quantity and value are mutually exclusive. if (priceComponent.ExistRevenueQuantityBreak || priceComponent.ExistRevenueValueBreak) { if (revenueBreakDiscount == 0) { revenueBreakDiscount = discount; } else { ////Apply highest of the two. Revert the other one. if (discount > revenueBreakDiscount) { productDiscount -= revenueBreakDiscount; } else { productDiscount -= discount; } } } } if (priceComponent.Strategy.Class.Equals(SurchargeComponents.Meta.ObjectType)) { var surchargeComponent = (SurchargeComponent)priceComponent; decimal surcharge; if (surchargeComponent.Price.HasValue) { surcharge = surchargeComponent.Price.Value; productSurcharge += surcharge; } else { var percentage = surchargeComponent.Percentage.HasValue ? surchargeComponent.Percentage.Value : 0; surcharge = decimal.Round(((productBasePrice * percentage) / 100), 2); productSurcharge += surcharge; } ////Revenuebreaks on quantity and value are mutually exclusive. if (priceComponent.ExistRevenueQuantityBreak || priceComponent.ExistRevenueValueBreak) { if (revenueBreakSurcharge == 0) { revenueBreakSurcharge = surcharge; } else { ////Apply highest of the two. Revert the other one. if (surcharge > revenueBreakSurcharge) { productSurcharge -= revenueBreakSurcharge; } else { productSurcharge -= surcharge; } } } } } } } return productBasePrice - productDiscount + productSurcharge; }
private static decimal AppsCatalogPrice( SalesOrder salesOrder, SalesInvoice salesInvoice, Product product, DateTime date) { var productBasePrice = 0M; var productDiscount = 0M; var productSurcharge = 0M; var baseprices = new PriceComponent[0]; if (product.ExistBasePrices) { baseprices = product.BasePrices; } var party = salesOrder != null ? salesOrder.ShipToCustomer : salesInvoice != null ? salesInvoice.BillToCustomer : null; foreach (BasePrice priceComponent in baseprices) { if (priceComponent.FromDate <= date && (!priceComponent.ExistThroughDate || priceComponent.ThroughDate >= date)) { if (PriceComponents.AppsIsEligible(new PriceComponents.IsEligibleParams { PriceComponent = priceComponent, Customer = party, Product = product, SalesOrder = salesOrder, SalesInvoice = salesInvoice, })) { if (priceComponent.ExistPrice) { if (productBasePrice == 0 || priceComponent.Price < productBasePrice) { productBasePrice = priceComponent.Price ?? 0; } } } } } var priceComponents = GetPriceComponents(product, date); var revenueBreakDiscount = 0M; var revenueBreakSurcharge = 0M; foreach (var priceComponent in priceComponents) { if (priceComponent.Strategy.Class.Equals(M.DiscountComponent.ObjectType) || priceComponent.Strategy.Class.Equals(M.SurchargeComponent.ObjectType)) { if (PriceComponents.AppsIsEligible(new PriceComponents.IsEligibleParams { PriceComponent = priceComponent, Customer = party, Product = product, SalesOrder = salesOrder, SalesInvoice = salesInvoice, })) { if (priceComponent.Strategy.Class.Equals(M.DiscountComponent.ObjectType)) { var discountComponent = (DiscountComponent)priceComponent; decimal discount; if (discountComponent.Price.HasValue) { discount = discountComponent.Price.Value; productDiscount += discount; } else { var percentage = discountComponent.Percentage.HasValue ? discountComponent.Percentage.Value : 0; discount = Math.Round((productBasePrice * percentage) / 100, 2); productDiscount += discount; } } if (priceComponent.Strategy.Class.Equals(M.SurchargeComponent.ObjectType)) { var surchargeComponent = (SurchargeComponent)priceComponent; decimal surcharge; if (surchargeComponent.Price.HasValue) { surcharge = surchargeComponent.Price.Value; productSurcharge += surcharge; } else { var percentage = surchargeComponent.Percentage.HasValue ? surchargeComponent.Percentage.Value : 0; surcharge = Math.Round((productBasePrice * percentage) / 100, 2); productSurcharge += surcharge; } } } } } return(productBasePrice - productDiscount + productSurcharge); }