private async Task AddDealConditionMetAsync(int orderLineNumber, string conditionID) { try { this.LogDebug("== :AddDealConditionMet - Start: " + orderLineNumber + " => " + conditionID); // Use to get the DC header and later use it to get the type IList <string> conditionIDs = new List <string>() { conditionID }; if (!dealConditionsMetList.ContainsKey(conditionID)) { this.LogDebug("== :AddDealConditionMet before FindDealConditionHeader"); var result = await DealConditionDAL.FindDealConditionHeadersByDealConditionIDWithoutDateCheckAsync(conditionIDs).ConfigureAwait(false); if (result != null) { if (result.Count > 0) { this.LogDebug("== :AddDealConditionMet result found - add then"); dealConditionsMetList.Add(conditionID, result[0]); } } } this.LogDebug("== :AddDealConditionMet add to lineItemConditionMet. "); if (!lineItemConditionMet.ContainsKey(orderLineNumber)) { lineItemConditionMet.Add(orderLineNumber, conditionID); } this.LogDebug("== :AddDealConditionMet Met Exit. "); } catch (Exception all) { this.LogDebug("== :AddDealConditionMet " + all.Message); this.LogError(all); } }
/* * // this method is used for loading data asynchronously * public async override Task InitializeAsync() * { * // load data from base InvoiceReport * await base.InitializeAsync(); * } */ public async override Task <PricingResultEntity> PriceOrderAsync(VisitEntity visit, ActivityEntity activity, OrderEntity order, IList <OrderItemEntity> orderItems, IList <DocumentCondBO> conditions) { // init conditions met and message for every order been priced. WarningMessage = "Se han aplicado más de una promoción sobre los materiales:"; warningMet = false; if (dealConditionsMetList != null) { dealConditionsMetList.Clear(); lineItemConditionMet.Clear(); } else { dealConditionsMetList = new Dictionary <string, DealConditionHeaderBO>(); lineItemConditionMet = new Dictionary <int, string>(); } // First add item level: if (conditions != null) { foreach (DocumentCondBO conditionBO in conditions) { var item = orderItems.FirstOrDefault(it => it.DocumentItemNumber == conditionBO.ItemNumber); if (item != null && item.ActualQuantity > 0) { this.LogDebug("* ZPricingManager:PriceOrderAsync:ConditionItemLevel " + conditionBO.ItemNumber + "-" + conditionBO.DealConditionNumber); await AddDealConditionMetAsync(item.DocumentItemNumber, conditionBO.DealConditionNumber); } } } if (orderItems != null) { // Then add conditions met because of free goods: foreach (OrderItemEntity orderItem in orderItems) { if (orderItem.IsPromotionResult && orderItem.ActualQuantity > 0) { this.LogDebug("* ZPricingManager:PriceOrderAsync:PromotionResultFG " + orderItem.DocumentItemNumber + "-" + orderItem.PromotionNumber); await AddDealConditionMetAsync(orderItem.DocumentItemNumber, orderItem.PromotionNumber); } } // Now lets check preconditions IEnumerator <OrderItemEntity> itemEnum = orderItems.GetEnumerator(); // VALIDATION: Check if multiple DC were met because of same material using preconditions try { this.LogDebug("* ZPricingManager:Check Pre-conditions for DC"); if (itemEnum != null) { while (itemEnum.MoveNext()) { OrderItemEntity currentItem = itemEnum.Current; int count = 0; // count conditions met if (!currentItem.IsPromotionResult && currentItem.ActualQuantity > 0) { this.LogDebug("* ZPricingManager:PriceOrderAsync:CheckPre-Cond. " + currentItem.DocumentItemNumber + "-" + currentItem.MaterialNumber); foreach (string conditionID in dealConditionsMetList.Keys) { // Get Preconditions for DC IList <DealConditionPreconditionBO> preConditions = await DealConditionDAL.FindDealConditionPreconditionsByDealConditionIDAsync(conditionID); if (preConditions.Count > 0) { foreach (DealConditionPreconditionBO preCondition in preConditions) { this.LogDebug("*** DC:PreCondMaterial " + preCondition.MaterialNumber); // Precondition material is the same as current item if (currentItem.MaterialNumber.Equals(preCondition.MaterialNumber)) { await AddDealConditionMetAsync(currentItem.DocumentItemNumber, conditionID); count++; } } } } // A warning is present for current item don't procee more items if (count > 1) { this.LogDebug("*** :ERROR - Material met more than once in a DC pre-conditions"); //throw new PricingException("No es permitido mas de una condición de ventas activa para el producto [" + currentItem.MaterialNumber + "]"); WarningMessage = WarningMessage + "\n" + currentItem.MaterialNumber + " - (" + count + ")"; warningMet = true; } } } } } finally { if (itemEnum != null) { itemEnum.Dispose(); } } } return(await base.PriceOrderAsync(visit, activity, order, orderItems, conditions)); }