protected virtual decimal CalcDiscountAmount(PXCache sender, string lineDiscountTarget, AmountLineFields lineAmountsFields, DiscountLineFields lineDiscountFields) { if (lineDiscountTarget == AP.LineDiscountTargetType.SalesPrice && lineAmountsFields.CuryUnitPrice != 0 && lineAmountsFields.Quantity != 0) // If sales price is available. { decimal extPrice = PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * (lineAmountsFields.CuryUnitPrice ?? 0m), CMPrecision.TRANCURY); decimal lineAmt = PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * ((lineAmountsFields.CuryUnitPrice ?? 0m) - PXDBPriceCostAttribute.Round((lineAmountsFields.CuryUnitPrice ?? 0m) * (lineDiscountFields.DiscPct ?? 0m) * 0.01m)), CMPrecision.TRANCURY); return(extPrice - lineAmt); } else { return((lineAmountsFields.CuryExtPrice ?? 0m) * (lineDiscountFields.DiscPct ?? 0m) * 0.01m); } }
public virtual void RowUpdated(PXCache sender, PXRowUpdatedEventArgs e) { AmountLineFields lineAmountsFields = GetDiscountDocumentLine(sender, e.Row); if (lineAmountsFields.FreezeManualDisc == true) { lineAmountsFields.FreezeManualDisc = false; return; } DiscountLineFields lineDiscountFields = GetDiscountedLine(sender, e.Row); if (lineDiscountFields.LineType == SOLineType.Discount) { return; } AmountLineFields oldLineAmountsFields = GetDiscountDocumentLine(sender, e.OldRow); DiscountLineFields oldLineDiscountFields = GetDiscountedLine(sender, e.OldRow); LineEntitiesFields lineEntities = LineEntitiesFields.GetMapFor(e.Row, sender); LineEntitiesFields oldLineEntities = LineEntitiesFields.GetMapFor(e.OldRow, sender); bool manualMode = false; //by default AutoMode. bool useDiscPct = false; //by default value in DiscAmt has higher priority than DiscPct when both are modified. bool keepDiscountID = true; //should be set to true if user changes discount code code manually bool manualDiscUnchecked = false; //Force Auto Mode if (lineDiscountFields.ManualDisc == false && oldLineDiscountFields.ManualDisc == true) { manualMode = false; manualDiscUnchecked = true; } //Change to Manual Mode based on fields changed: if (lineDiscountFields.ManualDisc == true || sender.Graph.IsCopyPasteContext) { manualMode = true; } //if (row.IsFree == true && oldRow.IsFree != true) // manualMode = true; if (lineDiscountFields.DiscPct != oldLineDiscountFields.DiscPct && lineEntities.InventoryID == oldLineEntities.InventoryID) { manualMode = true; useDiscPct = true; } //use DiscPct when only Quantity/CuryUnitPrice/CuryExtPrice was changed if (lineDiscountFields.DiscPct == oldLineDiscountFields.DiscPct && lineDiscountFields.CuryDiscAmt == oldLineDiscountFields.CuryDiscAmt && (lineAmountsFields.Quantity != oldLineAmountsFields.Quantity || lineAmountsFields.CuryUnitPrice != oldLineAmountsFields.CuryUnitPrice || lineAmountsFields.CuryExtPrice != oldLineAmountsFields.CuryExtPrice)) { useDiscPct = true; } if (lineDiscountFields.CuryDiscAmt != oldLineDiscountFields.CuryDiscAmt && lineAmountsFields.Quantity == oldLineAmountsFields.Quantity && lineAmountsFields.CuryUnitPrice == oldLineAmountsFields.CuryUnitPrice) { manualMode = true; useDiscPct = false; } if (e.ExternalCall && (((Math.Abs((lineDiscountFields.CuryDiscAmt ?? 0m) - (oldLineDiscountFields.CuryDiscAmt ?? 0m)) > 0.0000005m) || (Math.Abs((lineDiscountFields.DiscPct ?? 0m) - (oldLineDiscountFields.DiscPct ?? 0m)) > 0.0000005m)) && lineDiscountFields.DiscountID == oldLineDiscountFields.DiscountID)) { keepDiscountID = false; } //if only CuryLineAmt (Ext.Price) was changed for a line with DiscoutAmt<>0 //for Contracts Qty * UnitPrice * Prorate(<>1) = ExtPrice if (lineAmountsFields.CuryLineAmount != oldLineAmountsFields.CuryLineAmount && lineAmountsFields.Quantity == oldLineAmountsFields.Quantity && lineAmountsFields.CuryUnitPrice == oldLineAmountsFields.CuryUnitPrice && lineAmountsFields.CuryExtPrice == oldLineAmountsFields.CuryExtPrice && lineDiscountFields.DiscPct == oldLineDiscountFields.DiscPct && lineDiscountFields.CuryDiscAmt == oldLineDiscountFields.CuryDiscAmt && lineDiscountFields.CuryDiscAmt != 0) { manualMode = true; } decimal?validLineAmtRaw; decimal?validLineAmt = null; if (lineAmountsFields.CuryLineAmount != oldLineAmountsFields.CuryLineAmount) { if (useDiscPct) { decimal val = lineAmountsFields.CuryExtPrice ?? 0; decimal disctAmt; if (GetLineDiscountTarget(sender, lineEntities) == LineDiscountTargetType.SalesPrice) { disctAmt = PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * (lineAmountsFields.CuryUnitPrice ?? 0m), CMPrecision.TRANCURY) - PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * PXDBPriceCostAttribute.Round((lineAmountsFields.CuryUnitPrice ?? 0m) * (1 - (lineDiscountFields.DiscPct ?? 0m) * 0.01m)), CMPrecision.TRANCURY); } else { disctAmt = val * (lineDiscountFields.DiscPct ?? 0m) * 0.01m; disctAmt = PXCurrencyAttribute.Round(sender, lineDiscountFields, disctAmt, CMPrecision.TRANCURY); } validLineAmtRaw = lineAmountsFields.CuryExtPrice - disctAmt; validLineAmt = PXCurrencyAttribute.Round(sender, lineAmountsFields, validLineAmtRaw ?? 0, CMPrecision.TRANCURY); } else { if (lineDiscountFields.CuryDiscAmt > lineAmountsFields.CuryExtPrice) { validLineAmtRaw = lineAmountsFields.CuryExtPrice; } else { validLineAmtRaw = lineAmountsFields.CuryExtPrice - lineDiscountFields.CuryDiscAmt; } validLineAmt = PXCurrencyAttribute.Round(sender, lineAmountsFields, validLineAmtRaw ?? 0, CMPrecision.TRANCURY); } if (lineAmountsFields.CuryLineAmount != validLineAmt && lineDiscountFields.DiscPct != oldLineDiscountFields.DiscPct) { manualMode = true; } } sender.SetValue(e.Row, this.FieldName, manualMode); //Process only Manual Mode: if (manualMode || sender.Graph.IsCopyPasteContext) { if (manualMode && !keepDiscountID && !sender.Graph.IsImport) { lineDiscountFields.DiscountID = null; lineDiscountFields.DiscountSequenceID = null; } //Update related fields: if (lineAmountsFields.Quantity == 0 && oldLineAmountsFields.Quantity != 0) { sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), 0m); sender.SetValueExt(e.Row, sender.GetField(typeof(discPct)), 0m); } else if (lineAmountsFields.CuryLineAmount != oldLineAmountsFields.CuryLineAmount && !useDiscPct) { decimal?extAmt = lineAmountsFields.CuryExtPrice ?? 0; decimal?lineAmt = lineAmountsFields.CuryLineAmount ?? 0; if (extAmt - lineAmountsFields.CuryLineAmount >= 0) { if (lineDiscountFields.CuryDiscAmt > Math.Abs(extAmt ?? 0m)) { sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), lineAmountsFields.CuryExtPrice); PXUIFieldAttribute.SetWarning <DiscountLineFields.curyDiscAmt>(sender, e.Row, PXMessages.LocalizeFormatNoPrefix(AR.Messages.LineDiscountAmtMayNotBeGreaterExtPrice, lineAmountsFields.ExtPriceDisplayName)); } else { sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), extAmt - lineAmountsFields.CuryLineAmount); } if (extAmt != 0 && !sender.Graph.IsCopyPasteContext) { decimal?pct = 100 * lineDiscountFields.CuryDiscAmt / extAmt; sender.SetValueExt(e.Row, sender.GetField(typeof(discPct)), pct); } } else if (extAmt != 0 && !sender.Graph.IsCopyPasteContext) { if (lineDiscountFields.CuryDiscAmt != oldLineDiscountFields.CuryDiscAmt) { decimal?pct = 100 * lineDiscountFields.CuryDiscAmt / extAmt; sender.SetValueExt(e.Row, sender.GetField(typeof(discPct)), (pct ?? 0m) < -100m ? -100m : pct); if ((pct ?? 0m) < -100m) { sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), -lineAmountsFields.CuryExtPrice); PXUIFieldAttribute.SetWarning <DiscountLineFields.curyDiscAmt>(sender, e.Row, PXMessages.LocalizeFormatNoPrefix(AR.Messages.LineDiscountAmtMayNotBeGreaterExtPrice, lineAmountsFields.ExtPriceDisplayName)); } } else { sender.SetValueExt(e.Row, sender.GetField(typeof(discPct)), 0m); sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), 0m); sender.SetValueExt(e.Row, sender.GetField(typeof(curyLineAmt)), lineAmt); } } } else if (lineDiscountFields.CuryDiscAmt != oldLineDiscountFields.CuryDiscAmt) { if (lineAmountsFields.CuryExtPrice != 0 && !sender.Graph.IsCopyPasteContext) { if (lineAmountsFields.CuryExtPrice != 0 && !sender.Graph.IsCopyPasteContext) { decimal?pct = (lineDiscountFields.CuryDiscAmt ?? 0) * 100 / lineAmountsFields.CuryExtPrice; sender.SetValueExt(e.Row, sender.GetField(typeof(discPct)), pct); } } } else if (lineDiscountFields.DiscPct != oldLineDiscountFields.DiscPct) { decimal val = lineAmountsFields.CuryExtPrice ?? 0; decimal amt; if (GetLineDiscountTarget(sender, lineEntities) == LineDiscountTargetType.SalesPrice) { if (lineAmountsFields.CuryUnitPrice != 0 && lineAmountsFields.Quantity != 0)//if sales price is available { amt = PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * (lineAmountsFields.CuryUnitPrice ?? 0m), CMPrecision.TRANCURY) - PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * PXDBPriceCostAttribute.Round((lineAmountsFields.CuryUnitPrice ?? 0m) * (1 - (lineDiscountFields.DiscPct ?? 0m) * 0.01m)), CMPrecision.TRANCURY); } else { amt = val * (lineDiscountFields.DiscPct ?? 0m) * 0.01m; } } else { amt = val * (lineDiscountFields.DiscPct ?? 0m) * 0.01m; } sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), amt); } else if (validLineAmt != null && lineAmountsFields.CuryLineAmount != validLineAmt) { decimal val = lineAmountsFields.CuryExtPrice ?? 0; decimal amt; if (GetLineDiscountTarget(sender, lineEntities) == LineDiscountTargetType.SalesPrice) { if (lineAmountsFields.CuryUnitPrice != 0 && lineAmountsFields.Quantity != 0)//if sales price is available { amt = PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * (lineAmountsFields.CuryUnitPrice ?? 0m), CMPrecision.TRANCURY) - PXCurrencyAttribute.Round(sender, lineAmountsFields, (lineAmountsFields.Quantity ?? 0m) * PXDBPriceCostAttribute.Round((lineAmountsFields.CuryUnitPrice ?? 0m) * (1 - (lineDiscountFields.DiscPct ?? 0m) * 0.01m)), CMPrecision.TRANCURY); } else { amt = val * (lineDiscountFields.DiscPct ?? 0m) * 0.01m; } } else { amt = val * (lineDiscountFields.DiscPct ?? 0m) * 0.01m; } sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), amt); } } else if (manualDiscUnchecked && lineDiscountFields.DiscountID == null) { sender.SetValueExt(e.Row, sender.GetField(typeof(discPct)), 0m); sender.SetValueExt(e.Row, sender.GetField(typeof(curyDiscAmt)), 0m); } }
protected virtual void DefaultUnitCost(PXCache sender, PXFieldUpdatedEventArgs e) { if (adjustment.Current != null && adjustment.Current.OrigModule == INRegister.origModule.PI) { return; } object UnitCost = null; InventoryItem item = (InventoryItem)PXSelectorAttribute.Select <INTran.inventoryID>(sender, e.Row); if (item.ValMethod == INValMethod.Specific && string.IsNullOrEmpty(((INTran)e.Row).LotSerialNbr) == false) { INCostStatus status = PXSelectJoin <INCostStatus, LeftJoin <INLocation, On <INLocation.locationID, Equal <Current <INTran.locationID> > >, InnerJoin <INCostSubItemXRef, On <INCostSubItemXRef.costSubItemID, Equal <INCostStatus.costSubItemID> > > >, Where <INCostStatus.inventoryID, Equal <Current <INTran.inventoryID> >, And2 <Where <INLocation.isCosted, Equal <boolFalse>, And <INCostStatus.costSiteID, Equal <Current <INTran.siteID> >, Or <INCostStatus.costSiteID, Equal <Current <INTran.locationID> > > > >, And <INCostSubItemXRef.subItemID, Equal <Current <INTran.subItemID> >, And <INCostStatus.lotSerialNbr, Equal <Current <INTran.lotSerialNbr> > > > > > > .SelectSingleBound(this, new object[] { e.Row }); if (status != null && status.QtyOnHand != 0m) { UnitCost = PXDBPriceCostAttribute.Round((decimal)(status.TotalCost / status.QtyOnHand)); } } else if (item.ValMethod == INValMethod.FIFO && string.IsNullOrEmpty(((INTran)e.Row).OrigRefNbr) == false) { INCostStatus status = PXSelectJoin <INCostStatus, LeftJoin <INLocation, On <INLocation.locationID, Equal <Current <INTran.locationID> > >, InnerJoin <INCostSubItemXRef, On <INCostSubItemXRef.costSubItemID, Equal <INCostStatus.costSubItemID> > > >, Where <INCostStatus.inventoryID, Equal <Current <INTran.inventoryID> >, And2 <Where <INLocation.isCosted, Equal <boolFalse>, And <INCostStatus.costSiteID, Equal <Current <INTran.siteID> >, Or <INCostStatus.costSiteID, Equal <Current <INTran.locationID> > > > >, And <INCostSubItemXRef.subItemID, Equal <Current <INTran.subItemID> >, And <INCostStatus.receiptNbr, Equal <Current <INTran.origRefNbr> > > > > > > .SelectSingleBound(this, new object[] { e.Row }); if (status != null && status.QtyOnHand != 0m) { UnitCost = PXDBPriceCostAttribute.Round((decimal)(status.TotalCost / status.QtyOnHand)); } } else { if (item.ValMethod == INValMethod.Average) { sender.RaiseFieldDefaulting <INTran.avgCost>(e.Row, out UnitCost); } if (UnitCost == null || (decimal)UnitCost == 0m) { sender.RaiseFieldDefaulting <INTran.unitCost>(e.Row, out UnitCost); } } decimal?qty = (decimal?)sender.GetValue <INTran.qty>(e.Row); if (UnitCost != null && ((decimal)UnitCost != 0m || qty < 0m)) { if ((decimal)UnitCost < 0m) { sender.RaiseFieldDefaulting <INTran.unitCost>(e.Row, out UnitCost); } decimal?unitcost = INUnitAttribute.ConvertToBase <INTran.inventoryID>(sender, e.Row, ((INTran)e.Row).UOM, (decimal)UnitCost, INPrecision.UNITCOST); //suppress trancost recalculation for cost only adjustments if (qty == 0m) { sender.SetValue <INTran.unitCost>(e.Row, unitcost); } else { sender.SetValueExt <INTran.unitCost>(e.Row, unitcost); } } }