I’m attempting to extend the out of the box functionality for Prepayment validation to RM behaviour order types. It currently only works for SO behaviour order types.
So far I have overridden the CreatePaymentExt.GetRequiredPrepaymentEnabled function and I’ve overridden the PXFormula attribute for the SOOrder.PrepaymentReqPct field.
That part is working fine, but I’m now hung up on the the following two functions that are implemented as extension methods on the SOOrder DAC class.
public static void SatisfyPrepaymentRequirements(this SOOrder order, PXGraph graph)
{
if (order == null || !(order.Behavior == "SO") || !(order.ARDocType != "UND") || order.Completed != false || order.PrepaymentReqSatisfied != false)
{
return;
}
graph.LiteUpdate(order, delegate (ValueSetter<SOOrder> _)
{
_.Set((SOOrder o) => o.PrepaymentReqSatisfied, true);
});
PXEntityEventBase<SOOrder>.Container<SOOrder.Events>.Select((SOOrder.Events e) => e.PaymentRequirementsSatisfied).FireOn(graph, order);
}
public static void ViolatePrepaymentRequirements(this SOOrder order, PXGraph graph)
{
if (order == null || !(order.Behavior == "SO") || !(order.ARDocType != "UND") || order.Completed != false || order.PrepaymentReqSatisfied != true)
{
return;
}
graph.LiteUpdate(order, delegate (ValueSetter<SOOrder> _)
{
_.Set((SOOrder o) => o.PrepaymentReqSatisfied, false);
});
PXEntityEventBase<SOOrder>.Container<SOOrder.Events>.Select((SOOrder.Events e) => e.PaymentRequirementsViolated).FireOn(graph, order);
}
I don’t believe it’s possilbe in CSharp, to override extension methods, unless there is something specific to the Acumatica framework I’m not aware of.
I was trying to override the AffectedSOOrdersWithPrepaymentRequirementsBase which calls those two extension methods, but I have not yet found a working override. It compiles, but does not seem like it is ever being executed.
Here’s my attempt so far.
namespace PX.Objects.SO.GraphExtensions.SOOrderEntryExt
{
public abstract class AffectedSOOrdersWithPrepaymentRequirementsBaseExt<TSelf, TGraph> : AffectedSOOrdersWithPrepaymentRequirementsBase<TSelf, TGraph>
where TSelf : ProcessAffectedEntitiesInPrimaryGraphBase<TSelf, TGraph, SOOrder, SOOrderEntry>
where TGraph : PXGraph
{
[PXProtectedAccess()]
protected override void ProcessAffectedEntity(SOOrderEntry orderEntry, SOOrder order)
{
if (order.CuryPaymentOverall >= order.CuryPrepaymentReqAmt)
order.SatisfyPrepaymentRequirementsAHS(orderEntry);
else
order.ViolatePrepaymentRequirementsAHS(orderEntry);
}
//public delegate void ProcessAffectedEntityDelegate(SOOrderEntry orderEntry, SOOrder order);
//[PXOverride]
//protected override void ProcessAffectedEntity(SOOrderEntry orderEntry, SOOrder order, ProcessAffectedEntityDelegate baseMethod)
//{
// if (order.CuryPaymentOverall >= order.CuryPrepaymentReqAmt)
// order.SatisfyPrepaymentRequirements(orderEntry);
// else
// order.ViolatePrepaymentRequirements(orderEntry);
//}
}
}
Any ideas on the proper override or a different approach?
Scott