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

Popular posts from this blog

D365FO – AX – X++ –Refresh, Reread, Research, and ExecuteQuery

Create Inventory Journal through Code in D365FO X++

SalesLine Reservation in D365fo x++