/// <summary> /// Helper class to reverse project invoice voucher transactions and match those, which relates to customer /// </summary> class VKProjectInvoicePostingHelper { LedgerJournalTrans paymLedgerJournalTrans; /// <summary> /// Entry point to execute reversal and matching process /// </summary> /// <param name = "_projProposalJour">ProjProposalJour record</param> public void reverseTranasctions(ProjProposalJour _projProposalJour) { if (_projProposalJour && _projProposalJour.ProjInvoiceId) { ProjInvoiceJour projInvoiceJour = ProjInvoiceJour::find(_projProposalJour.ProjInvoiceId, _projProposalJour.InvoiceDate); LedgerJournalTable ledgerJournalTable = this.createJournal(projInvoiceJour); if (ledgerJournalTable) { info(strFmt("General journal number %1", ledgerJournalTable.JournalNum)); this.postGeneralJournal(ledgerJournalTable); } } } /// <summary> /// Creates general journal based on project invoice voucher transactions /// </summary> /// <param name = "_projInvoiceJour">ProjInvoiceJour record</param> /// <returns>LedgerJournalTable record</returns> public LedgerJournalTable createJournal(ProjInvoiceJour _projInvoiceJour) { GeneralJournalEntry generalJournalEntry; GeneralJournalAccountEntry generalJournalAccountEntry; LedgerJournalTable ledgerJournalTable; LedgerJournalTrans ledgerJournalTrans; while select generalJournalEntry where generalJournalEntry.SubledgerVoucher == _projInvoiceJour.LedgerVoucher join generalJournalAccountEntry where generalJournalAccountEntry.GeneralJournalEntry == generalJournalEntry.RecId { if (!ledgerJournalTable) { ledgerJournalTable = this.createJournalHeader(_projInvoiceJour); } ledgerJournalTrans.clear(); ledgerJournalTrans.JournalNum = ledgerJournalTable.JournalNum; ledgerJournalTrans.TransDate = _projInvoiceJour.InvoiceDate; if (LedgerPostingType::CustBalance == generalJournalAccountEntry.PostingType) { ledgerJournalTrans.AccountType = LedgerJournalACType::Cust; ledgerJournalTrans.LedgerDimension = LedgerDynamicAccountHelper::getDynamicAccountFromAccountNumber(_projInvoiceJour.InvoiceAccount, ledgerJournalTrans.AccountType); ledgerJournalTrans.DefaultDimension = LedgerDimensionFacade::getDefaultDimensionFromLedgerDimension(generalJournalAccountEntry.LedgerDimension); } else { ledgerJournalTrans.AccountType = LedgerJournalACType::Ledger; ledgerJournalTrans.LedgerDimension = generalJournalAccountEntry.LedgerDimension; } if (LedgerPostingType::Tax == generalJournalAccountEntry.PostingType) { TaxTrans taxTrans; select firstonly taxTrans where taxTrans.Voucher == _projInvoiceJour.LedgerVoucher &&taxTrans.TransDate == generalJournalEntry.AccountingDate &&taxTrans.SourceCurrencyCode == generalJournalAccountEntry.TransactionCurrencyCode &&taxTrans.SourceTaxAmountCur == generalJournalAccountEntry.TransactionCurrencyAmount; if (taxTrans) { ledgerJournalTrans.TaxGroup = taxTrans.TaxGroup; ledgerJournalTrans.TaxItemGroup = taxTrans.TaxItemGroup; ledgerJournalTrans.TaxCode = taxTrans.TaxCode; } } //ledgerJournalTrans.OffsetAccountType = ledgerJournalTransOrig.OffsetAccountType; //ledgerJournalTrans.OffsetLedgerDimension = ledgerJournalTransOrig.OffsetLedgerDimension; //ledgerJournalTrans.OffsetDefaultDimension = ledgerJournalTransOrig.OffsetDefaultDimension; ledgerJournalTrans.CurrencyCode = _projInvoiceJour.CurrencyId; if (generalJournalAccountEntry.IsCredit) { ledgerJournalTrans.AmountCurDebit = abs(generalJournalAccountEntry.AccountingCurrencyAmount); } else { ledgerJournalTrans.AmountCurCredit = abs(generalJournalAccountEntry.AccountingCurrencyAmount); } //addition fields //ledgerJournalTrans.Approver = HcmWorker::userId2Worker(curuserid()); //ledgerJournalTrans.Approved = NoYes::Yes; ledgerJournalTrans.Txt = strFmt("Reverse invoice %1", _projInvoiceJour.ProjInvoiceId); ledgerJournalTrans.SkipBlockedForManualEntryCheck = true; ledgerJournalTrans.defaultRow(); ledgerJournalTrans.insert(); if (LedgerPostingType::CustBalance == generalJournalAccountEntry.PostingType) { paymledgerJournalTrans.data(ledgerJournalTrans); } } return ledgerJournalTable; } /// <summary> /// Creates general journal header /// </summary> /// <param name = "_projInvoiceJour">ProjInvoiceJour record</param> /// <returns>LedgerJournalTable record</returns> public LedgerJournalTable createJournalHeader(ProjInvoiceJour _projInvoiceJour) { ProjParameters projParameters = ProjParameters::find(); LedgerJournalTable ledgerJournalTable; if (!projParameters.VKJournalName) { throw Error("Please specify journal name"); } ledgerJournalTable.clear(); ledgerJournalTable.initValue(); ledgerJournalTable.JournalNum = JournalTableData::newTable(ledgerJournalTable).nextJournalId(); ledgerJournalTable.initFromLedgerJournalName(projParameters.VKJournalName); // journal description, should be after initFromLedgerJournalName ledgerJournalTable.Name = strFmt("Some journal name %1", _projInvoiceJour.ProjInvoiceId); ledgerJournalTable.CurrencyCode = _projInvoiceJour.CurrencyId; ledgerJournalTable.insert(); return ledgerJournalTable; } /// <summary> /// Posts general journal /// </summary> /// <param name = "_ledgerJournalTable">LedgerJournalTable record</param> void postGeneralJournal(LedgerJournalTable _ledgerJournalTable) { LedgerJournalCheckPost ledgerJournalCheckPost; ledgerJournalCheckPost = ledgerJournalCheckPost::newLedgerJournalTable(_ledgerJournalTable, NoYes::Yes); ledgerJournalCheckPost.runOperation(); } }
DaxOnline.org is free platform that allows you to quickly store and reuse snippets, notes, articles related to Dynamics AX.
Authors are allowed to set their own AdSense units.
Join us.