Tuesday, August 19, 2025

Mark customer payment with invoice using x++ d365fo

public boolean markCustInvoicesForSettlement(

    LedgerJournalTrans  _journalTrans,

    CustAccount         _custAccount,     

    RecId               _settlementRecId,  // custtransrecid

    AmountCur           _settlementAmount) 

{

    boolean                     ret;

    InvoiceId                   invoiceId;

    CustTrans                   custTrans;

    CustTable                   custTable;

    CustTransOpen               custTransOpen;

    AmountCur                   settlementAmount;

    CustVendOpenTransManager    settleManager;

    SpecTransManager            specTransManager;


    ret                 = true;

    settleManager       = CustVendOpenTransManager::construct(_journalTrans);

    specTransManager    = settleManager.parmSpecTransManager();


    custTable           = CustTable::find(_custAccount);

    custTrans           = CustTrans::find(_settlementRecId);

    custTransOpen       = CustTransOpen::findRefId(custTrans.RecId);


    settlementAmount    = _settlementAmount;

    invoiceId           = custTrans.Invoice;

    if (custTransOpen.RecId != 0)

    {

        AmountCur unmarkedAmount = specTransManager.findUnmarkedAmountForRef( custTransOpen.AmountCur,  custTransOpen.Company(), 

custTransOpen.TableId,  custTransOpen.RecId);

        if (!settleManager.checkTransFullyMarkedByOtherSpec(custTransOpen))

        {

            settleManager.updateTransMarked(custTransOpen, NoYes::Yes);

            if (abs(settlementAmount) <= abs(unmarkedAmount))

            {

                settleManager.updateSettleAmountPaymCur(custTransOpen, settlementAmount);

            }

            else

            {

                settleManager.updateSettleAmountPaymCur(custTransOpen, unmarkedAmount);

            }

            ttsbegin;

            _journalTrans.selectForUpdate(true);

            if (invoiceId)

            {

                _journalTrans.MarkedInvoice = invoiceId;

            }

            else

            {

                _journalTrans.MarkedInvoice = '*';

            }


            _journalTrans.SettleVoucher = SettlementType::SelectedTransact;

            _journalTrans.update();

            ttscommit;

                TaxWithhold taxWithhold = TaxWithhold::construct(_journalTrans);

                taxWithhold.createAllTaxWithholdTrans();

                TaxWithholdTrans taxWithholdTrans = TaxWithholdTrans::find( _journalTrans.DataAreaId,

                                                        _journalTrans.Voucher,  _journalTrans.TransDate);

                if (taxWithholdTrans.RecId)

                {

                    taxWithholdTrans.selectForUpdate(true);

                    taxWithholdTrans.InvoiceTaxWithholdAmount = abs(20) * -1;

                    taxWithholdTrans.TaxWithholdAmount        = abs(20) * -1;

                    taxWithholdTrans.doUpdate();

                }

        }

    }

    return ret;

}


Call API using x++ D365FO

 System.Net.HttpWebRequest    request; System.Net.HttpWebResponse   response; System.IO.Stream             dataStream; System.IO.StreamReade...