Monday, 6 May 2019

Creating General Journals in D365

class INTC_JournalTransCreation
{
    public void CreateJournal()
    {
        #define.initFromJournal('INVTRANS')
        #define.journalName('General Journal')
        #define.AEDCurrency('AED')
        #define.EmptyCurrency('')

        INTC_JournalTransactionDetails      journalDeatils, journalDeatilsUpdate;
        LedgerJournalTable                  journalTable;
        JournalTableData                    journalTableData;
        LedgerJournalTrans                  journalTrans;
        container                           offsetCon , mainAccountCon;
        NumberSeq                           numberSeq;
        Voucher                             voucher;
        LedgerJournalName                   ledgerJournalName;


        select journalDeatils where journalDeatils.UpdateFlag == 1;
        {
            mainAccountCon              =   [journalDeatils.LedgerAccount,journalDeatils.Region,journalDeatils.LOB,journalDeatils.Department,journalDeatils.BIN,journalDeatils.Contract];
            offsetCon                   =   [journalDeatils.OffsetAccount,journalDeatils.Region,journalDeatils.LOB,journalDeatils.Department,journalDeatils.BIN,journalDeatils.Contract];

            ledgerJournalName            =   LedgerJournalName::find(#initFromJournal);
            journalTable.initFromLedgerJournalName(#initFromJournal);
            journalTableData            =   JournalTableData::newTable(journalTable);
            journalTable.JournalNum     =   journalTableData.nextJournalId();
            journalTable.Name           =   #journalName;
            if(journalDeatils.Currency  ==  #EmptyCurrency)
            {
                journalTable.CurrencyCode   =   #AEDCurrency;
            }
            else
            {
                journalTable.CurrencyCode   =   journalDeatils.Currency;
            }

            if (journalTable.validateWrite())
            {
                journalTable.insert();
            }

            numberSeq                           =   NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);
            journalTrans.JournalNum             =   journalTable.JournalNum;
            journalTrans.Voucher                =   numberSeq.voucher();
            journalTrans.TransDate              =   str2Date(journalDeatils.TransactionDate, 123);
            journalTrans.Txt                    =   journalDeatils.Description;
            journalTrans.AccountType            =   LedgerJournalACType::Ledger;
            journalTrans.LedgerDimension        =   this.generateLedgerDimension(mainAccountCon, journalDeatils.LedgerAccount);
            journalTrans.AmountCurDebit         =   journalDeatils.AmountCurDebit;
            journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
            journalTrans.OffsetLedgerDimension  =   this.generateLedgerDimension(offsetCon, journalDeatils.LedgerAccount);
           
            if(journalDeatils.Currency  ==  #EmptyCurrency)
            {
                journalTrans.CurrencyCode   =   #AEDCurrency;;
            }
            else
            {
                journalTrans.CurrencyCode   =   journalDeatils.Currency;
            }
            journalTrans.insert();

            //ttsbegin;
            //select forupdate journalDeatilsUpdate where journalDeatilsUpdate.RecId    == journalDeatils.RecId;
            //journalDeatilsUpdate.UpdateFlag = 1;
            //journalDeatilsUpdate.update();
            //ttscommit;
        }
    }

    public DimensionDynamicAccount   generateLedgerDimension(container    _conData, MainAccountNum  _mainAccountNum)
    {
        int                                 hierarchyCount;
        int                                 hierarchyIdx;
        RecId                               dimAttId_MainAccount;
        LedgerRecId                         ledgerRecId;
        MainAccount                         mainAccount;
        RefRecId                            recordvalue;
        DimensionAttribute                  dimensionAttribute;
        DimensionAttributeValue             dimensionAttributeValue;
        DimensionSetSegmentName             DimensionSet;
        DimensionStorage                    dimStorage;
        LedgerAccountContract               LedgerAccountContract = new LedgerAccountContract();
        DimensionAttributeValueContract     ValueContract;

        List                                valueContracts = new List(Types::Class);
        dimensionAttributeValueCombination  dimensionAttributeValueCombination;
     

        mainAccount     =   MainAccount::findByMainAccountId(_mainAccountNum);
        recordvalue     =   DimensionHierarchy::getAccountStructure(mainAccount.RecId,Ledger::current());
        hierarchyCount  =   DimensionHierarchy::getLevelCount(recordvalue);
        DimensionSet    =   DimensionHierarchyLevel::getDimensionHierarchyLevelNames(recordvalue);

        for(hierarchyIdx = 1;hierarchyIdx<=hierarchyCount;hierarchyIdx++)
        {
            if(hierarchyIdx == 1)
            {
                continue;
            }
            dimensionAttribute = DimensionAttribute::findByLocalizedName(DimensionSet[hierarchyIdx],false,"en-us");

            if(dimensionAttribute)
            {
                dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,conPeek(_conData,hierarchyIdx));

                if(dimensionAttributeValue)
                {
                    ValueContract = new DimensionAttributeValueContract();
                    ValueContract.parmName(dimensionAttribute.Name) ;
                    ValueContract.parmValue(dimensionAttributeValue.CachedDisplayValue);
                    valueContracts.addEnd(ValueContract);
                }
            }
        }
        LedgerAccountContract.parmMainAccount(_mainAccountNum);
        LedgerAccountContract.parmValues(valueContracts);
        dimStorage                          =    DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);
        dimensionAttributeValueCombination  =    DimensionAttributeValueCombination::find(dimStorage.save());
        ledgerRecId                         =    dimensionAttributeValueCombination.RecId;

        return ledgerRecId;
    }

}

Creating batch with serviceController class

Create new class, create a method with your logic and decorate method with sysEntryPointAttribute(false).

Then assign  below properties for menu item
hit menu item and schedule your batch job