/// <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);
        }
Beispiel #2
0
        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");
            }
        }