Settle invoices in D365fo x++
Settle invoices in D365fo x++
Code:
public static void settleInvoices(CustAccount _customer, InvoiceId _oldInvoice, InvoiceId _newInvoice)
{
CustTable custTable;
CustTransOpen invCustTransOpen, payCustTransOpen;
CustTrans invCustTrans, payCustTrans;
custTable = CustTable::find(_customer);
try
{
//for invoice
select firstonly invCustTrans
where invCustTrans.AccountNum == custTable.AccountNum
&& invCustTrans.TransType == LedgerTransType::Sales
&& invCustTrans.Invoice == _oldInvoice
join invCustTransOpen
where invCustTransOpen.RefRecId == invCustTrans.RecId;
//for payment
select firstonly payCustTrans
where payCustTrans.AccountNum == custTable.AccountNum
&& payCustTrans.TransType == LedgerTransType::Sales
&& payCustTrans.Invoice == _newInvoice
join payCustTransOpen
where payCustTransOpen.RefRecId == payCustTrans.RecId;
//ttsbegin;
//Mark for settlement
SpecTransExecutionContext specTransExecutionContext = SpecTransExecutionContext::newFromSource(custTable);
SpecTransManager specTransManager = SpecTransManager::newFromSpec(specTransExecutionContext.parmSpecContext());
Amount settleAmount = payCustTrans.AmountCur;
if(settleAmount < 0)
{
settleAmount = -1 * payCustTrans.AmountCur;
}
if(settleAmount > invCustTrans.AmountCur)
{
settleAmount = invCustTrans.AmountCur;
}
specTransManager.insert(invCustTransOpen.dataAreaId, invCustTransOpen.TableId, invCustTransOpen.RecId, settleAmount, invCustTrans.CurrencyCode);
specTransManager.insert(payCustTransOpen.dataAreaId, payCustTransOpen.TableId, payCustTransOpen.RecId, -settleAmount, payCustTrans.CurrencyCode);
//ttscommit;
if(CustTrans::settleTransaction(specTransExecutionContext, CustTransSettleTransactionParameters::construct()))
{
info(strFmt("Settlement completed for Invoice %1, against %2, Amount %3", invCustTrans.Invoice, payCustTrans.Invoice, settleAmount));
}
}
catch
{
error(infolog.text(infologLine()));
error("Settlement failed.");
}
}
Comments
Post a Comment