Step 5: Firing the Event
As you learned in Step 3: Exploring the MYOB Acumatica Source Code,
you need to override the UpdateBalances
method to fire the event
that triggers the transition from the PendingPayment
state to the
ReadyForAssignment
state. However, you should first calculate
the prepaid percentage value based on the values of the
Balance and Amount boxes of an
invoice on the Invoices (SO303000) form.
These values have been calculated in the base UpdateBalances
method.
ARRegister adjddoc
parameter
instead of selecting the corresponding ARInvoice
parameter because
ARRegister
is the base class for the ARInvoice
class and contains the same essential fields.The ARRegister
entity has been modified in the base method and its
value has been updated in PXCache. But the value passed as the
parameter to the overridden method has not been updated. Thus, in the overridden
method, you should use the cached value. To get the cached value of the entity, you
need to use the Locate(Object)
method of PXCache<TNode>.
Firing the Event
To fire the event that triggers the transition between states, add the following code to theARReleaseProcess_Extension
class of the PhoneRepairShop_Code
project. public delegate void UpdateBalancesDelegate(ARAdjust adj,
ARRegister adjddoc, ARTran adjdtran);
[PXOverride]
public virtual void UpdateBalances(ARAdjust adj,
ARRegister adjddoc, ARTran adjdtran,
UpdateBalancesDelegate baseMethod)
{
baseMethod(adj, adjddoc, adjdtran);
ARRegister ardoc = adjddoc;
ARRegister cached = (ARRegister)Base.ARDocument.Cache.Locate(ardoc);
if (cached != null)
{
ardoc = cached;
}
RSSVWorkOrder order = SelectFrom<RSSVWorkOrder>.
Where<RSSVWorkOrder.invoiceNbr.
IsEqual<ARRegister.refNbr.FromCurrent>>
.View.SelectSingleBound(Base, new[] { ardoc });
if (order != null &&
order.Status == WorkOrderStatusConstants.PendingPayment)
{
var payment = SelectFrom<ARPayment>.
Where<ARPayment.docType.
IsEqual<ARAdjust.adjgDocType.FromCurrent>.
And<ARPayment.refNbr.
IsEqual<ARAdjust.adjgRefNbr.FromCurrent>>>
.View.SelectSingleBound(Base, new[] { ardoc });
if (payment != null)
{
var paidPercent = (ardoc.CuryOrigDocAmt - ardoc.CuryDocBal) * 100
/ ardoc.CuryOrigDocAmt;
var paymentExt = PXCache<ARPayment>.
GetExtension<ARPaymentExt>(payment);
if (paidPercent >= paymentExt.UsrPrepaymentPercent)
{
RSSVWorkOrder.MyEvents
.Select(e => e.InvoiceGotPrepaid)
.FireOn(Base, ardoc);
// No need to call the Persist method.
}
}
}
}
In
the code above, first you have called the base method, and then you have obtained
the cached value of the invoice. You have selected the repair work order with the
same invoice number as the invoice passed as a parameter. Then you have selected the
prepayment and its extension (which contains the prepayment percent) and calculated
the prepaid percentage for the invoice. If the prepaid percentage is greater than
the required percentage, you have fired the InvoiceGotPrepaid
event.
At the end of the method,
there is no need to call the Persist
method, because it is called
at the end of the release process.