/// <summary> /// Find and total all multiline discount trade agreements that match the given relations and quantity /// </summary> /// <param name="itemCode">The item code to search by (item group or all)</param> /// <param name="retailTransaction">The transaction context with Id and customer Id</param> /// <param name="discountRow">Current row in multiline discount working table. Will be populated and returned.</param> /// <param name="currencyCode">The currency code to filter by</param> /// <returns>Discount row populated with sums for all discounts found</returns> private DataRow GetMultiLineDiscountLine(PriceDiscItemCode itemCode, RetailTransaction retailTransaction, DataRow discountRow, string currencyCode) { PriceDiscType relation = PriceDiscType.MultiLineDiscSales; //Sales multiline discount - 6 Dimensions dimension = (Dimensions)this.Application.BusinessLogic.Utility.CreateDimension(); bool searchAgain = true; var codes = new PriceDiscAccountCode[] { PriceDiscAccountCode.Table, PriceDiscAccountCode.GroupId, PriceDiscAccountCode.All }; foreach (var accountCode in codes) { // skip to next configuration if this one isn't enabled if (!DiscountParameters.Activation(relation, accountCode, itemCode)) { continue; } // get item relation based on item code string itemRelation = (itemCode == PriceDiscItemCode.GroupId) ? discountRow.Field <string>("MULTILINEGROUP") : string.Empty; itemRelation = itemRelation ?? String.Empty; // get customer relation based on account code string accountRelation = String.Empty; if (accountCode == PriceDiscAccountCode.Table) { accountRelation = retailTransaction.Customer.CustomerId; } else if (accountCode == PriceDiscAccountCode.GroupId) { accountRelation = retailTransaction.Customer.MultiLineDiscountGroup; } accountRelation = accountRelation ?? String.Empty; // if both relations are valid for the given item and account codes, look for trade agreements matching these relations if ((Discount.ValidRelation(accountCode, accountRelation)) && (Discount.ValidRelation(itemCode, itemRelation))) { // get any active multiline discount trade agreement matching relations and quantity decimal quantityAmount = discountRow.Field <decimal>("QUANTITY"); var priceDiscTable = this.DiscountService.GetPriceDiscDataCached( retailTransaction.TransactionId, relation, itemRelation, accountRelation, (int)itemCode, (int)accountCode, quantityAmount, currencyCode, dimension, false); // compute running sum of discount values found foreach (Discount.DiscountAgreementArgs row in priceDiscTable) { discountRow["PERCENT1"] = discountRow.Field <decimal>("PERCENT1"); discountRow["PERCENT1"] = discountRow.Field <decimal>("PERCENT1") + row.Percent1; discountRow["PERCENT2"] = discountRow.Field <decimal>("PERCENT2") + row.Percent2; discountRow["AMOUNT"] = discountRow.Field <decimal>("AMOUNT") + row.Amount; discountRow["MINQTY"] = discountRow.Field <decimal>("MINQTY") + row.QuantityAmountFrom; // stop search when we find a trade agreement set to not find next trade agreement if (!row.SearchAgain) { searchAgain = false; } } } // stop search if we found a discount without "find next" marked if (!searchAgain) { break; } } return(discountRow); }
public bool Activation(PriceDiscType relation, PriceDiscAccountCode accountCode, PriceDiscItemCode itemCode) { switch (accountCode) { case PriceDiscAccountCode.Table: switch (itemCode) { case PriceDiscItemCode.Table: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineAccountItem); default: return(false); } case PriceDiscItemCode.GroupId: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineAccountGroup); case PriceDiscType.MultiLineDiscSales: return(SalesMultiLineAccountGroup); default: return(false); } case PriceDiscItemCode.All: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineAccountAll); case PriceDiscType.MultiLineDiscSales: return(SalesMultiLineAccountAll); case PriceDiscType.EndDiscSales: return(SalesEndAccountAll); default: return(false); } default: NetTracer.Warning("DiscountParameters::Activation: itemCode is out of range: {0}", itemCode); throw new ArgumentOutOfRangeException("itemCode"); } case PriceDiscAccountCode.GroupId: switch (itemCode) { case PriceDiscItemCode.Table: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineGroupItem); default: return(false); } case PriceDiscItemCode.GroupId: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineGroupGroup); case PriceDiscType.MultiLineDiscSales: return(SalesMultiLineGroupGroup); default: return(false); } case PriceDiscItemCode.All: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineGroupAll); case PriceDiscType.MultiLineDiscSales: return(SalesMultiLineGroupAll); case PriceDiscType.EndDiscSales: return(SalesEndGroupAll); default: return(false); } default: NetTracer.Warning("DiscountParameters::Activation: itemCode is out of range: {0}", itemCode); throw new ArgumentOutOfRangeException("itemCode"); } case PriceDiscAccountCode.All: switch (itemCode) { case PriceDiscItemCode.Table: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineAllItem); default: return(false); } case PriceDiscItemCode.GroupId: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineAllGroup); case PriceDiscType.MultiLineDiscSales: return(SalesMultiLineAllGroup); default: return(false); } case PriceDiscItemCode.All: switch (relation) { case PriceDiscType.LineDiscSales: return(SalesLineAllAll); case PriceDiscType.MultiLineDiscSales: return(SalesMultiLineAllAll); case PriceDiscType.EndDiscSales: return(SalesEndAllAll); default: return(false); } default: NetTracer.Warning("DiscountParameters::Activation: itemCode is out of range: {0}", itemCode); throw new ArgumentOutOfRangeException("itemCode"); } default: NetTracer.Warning("DiscountParameters::Activation: accountCode is out of range: {0}", accountCode); throw new ArgumentOutOfRangeException("accountCode"); } }