Monday, August 18, 2025

Create customer payment journal using x++ d365fo

// Table buffers

LedgerJournalTable   journalTable;

LedgerJournalName    journalName  = LedgerJournalName::find("custPaym");

CustTable            custTable    = CustTable::find('Test001');

CustPaymModeTable    paymModeTable = CustPaymModeTable::find('Test');

LedgerJournalTrans   journalTrans;

NumberSeq            numberSeq;

DimensionDefault     defDimension  = 0;

ExchangeRateHelper   exchangeRateHelper;

LedgerRecId          ledgerRecIdLocal;

ExchangeRateHelper   exchangeRateHelperRep;


// Generate Journal ID

JournalNum journalNum = JournalTableData::newTable(journalTable).nextJournalId();

// Initialize Journal header

journalTable.clear();

journalTable.JournalNum  = journalNum;

journalTable.JournalName = "custPaym";

// Populate from journal name setup

journalTable.initFromLedgerJournalName(journalTable.JournalName);

journalTable.Name = journalName.Name;

// Insert Journal header

if (journalTable.validateWrite())

{

    journalTable.doInsert();

}

// Prepare NumberSeq for voucher

numberSeq = NumberSeq::newGetVoucherFromId(journalName.NumberSequenceTable);

// Initialize Journal line

journalTrans.initValue();

journalTrans.initFromLedgerJournalTable_LT(journalTable);

journalTrans.JournalNum   = journalTable.JournalNum;

journalTrans.Voucher      = numberSeq.voucher();

numberSeq.used();

journalTrans.AccountType      = LedgerJournalACType::Cust;

journalTrans.TransactionType  = LedgerTransType::Payment;

// Customer dynamic account (ledger dimension)

DimensionDynamicAccount dynAccount = LedgerDynamicAccountHelper::getDynamicAccountFromAccountNumber(

                                        custTable.AccountNum,

                                        journalTrans.AccountType);

journalTrans.LedgerDimension  = DimensionAttributeValueCombination::find(dynAccount).RecId;

journalTrans.initFromCustTable(custTable, false);

// Default dimensions merge

journalTrans.DefaultDimension = DimensionDefaultFacade::serviceMergeDefaultDimensions(

                                    defDimension,

                                    custTable.DefaultDimension);

// Dates

journalTrans.TransDate     = str2Date('09/01/2025', 123);   // Date in system format

journalTrans.DocumentDate  = str2Date('09/01/2025', 123);

journalTrans.Due           = journalTrans.TransDate;

// Document details

journalTrans.DocumentNum   = 'Test1';

journalTrans.AmountCurCredit = 200;

journalTrans.AmountCurDebit  = 0;

journalTrans.CurrencyCode    = 'USD';

journalTrans.Company         = 'USMF';

journalTrans.Txt             = "testing01";

// Approval details

journalTrans.AcknowledgementDate = DateTimeUtil::date(DateTimeUtil::getSystemDateTime());

journalTrans.PaymMode            = paymModeTable.PaymMode;

journalTrans.PaymReference       = 'Test123';

journalTrans.Approved            = NoYes::Yes;

journalTrans.Approver            = HcmWorker::userId2Worker(curUserId());

// Offset account

journalTrans.OffsetAccountType     = LedgerJournalACType::Ledger;

journalTrans.OffsetLedgerDimension = LedgerDimensionFacade::serviceCreateLedgerDimension(

                                         paymModeTable.PaymentLedgerDimension,

                                         journalTrans.DefaultDimension);

// Line number

journalTrans.LineNum = LedgerJournalTrans::lastLineNum(journalTrans.JournalNum) + 1;

// Exchange rate

exchangeRateHelper = ExchangeRateHelper::newCurrency(

                         Ledger::primaryLedger(CompanyInfo::findDataArea(journalTrans.Company).RecId),

                         journalTrans.CurrencyCode);

journalTrans.ExchRate = ExchangeRateHelper::exchRate(

                            journalTrans.CurrencyCode,

                            journalTrans.TransDate);

// Ledger dimension name

journalTrans.LedgerDimensionName = LedgerJournalTransLedgerDimensionNameHelper::findName(

                                       journalTrans.Company,

                                       journalTrans.AccountType,

                                       journalTrans.LedgerDimension);

// Tax withholding check

if (TaxThaiGovCertificationFeatureChecker::isTaxWithholdEnabled())

{

    journalTrans.TaxWithholdGroup = custTable.getTaxWithholdGroup();

}

else

{

    journalTrans.TaxWithholdGroup = custTable.TaxWithholdGroup_TH;

}

journalTrans.TaxWithholdCalculate_TH = custTable.TaxWithholdCalculate_TH;

// Reporting currency exchange rate

ledgerRecIdLocal = Ledger::primaryLedger(CompanyInfo::findDataArea(journalTrans.company()).RecId);

exchangeRateHelperRep = ExchangeRateHelper::newExchangeDate(

                            ledgerRecIdLocal,

                            journalTrans.CurrencyCode,

                            journalTrans.TransDate);

exchangeRateHelperRep.parmToCurrency(Ledger::reportingCurrency());

exchangeRateHelperRep.parmExchangeRateTypeRecId(Ledger::reportingCurrencyExchangeRateType());

journalTrans.ReportingCurrencyExchRate          = exchangeRateHelperRep.getExchangeRate1();

journalTrans.ReportingCurrencyExchRateSecondary = exchangeRateHelperRep.getExchangeRate2();

// Final insert

if (journalTrans.validateWrite())

{

    journalTrans.doInsert();

}


Call API using x++ D365FO

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