Monday, August 19, 2019

How to create Vendor Invoice Journal using x++ in D365 FO

Hi folks ,


Very common requirement these days is to create Vendor Invoice Journal through code.

Here is an example mentioned below in which I am picking the values for Vendor invoice creation from a staging table :-

Class Name :- VendInvoiceJournalCreateBatch

        #define.initFromJournal('VINV')
        #define.AEDCurrency('USD')
        #define.EmptyCurrency('')
       
        int                                                                      i;
        str                                                                      invdate , invfinaldate;
        date                                                                   dateheader , dateheaderval , dateline;
        System.DateTime                                             netDttm;
        real                                                                    amountcr;
        utcdatetime                                                       xppDttm , invdatetime;
        SupplierInvoiceHeaderDetails                         vendInvoiceJourStageHeader,                                                                                                                      vendInvoiceJourStageHeaderUpdate;
        SupplierInvoiceLineDetails                                vendInvoiceJourStageLine
                                                                                    , vendInvoiceJourStageLineds;
        LedgerJournalTable                                            journalTable;
        JournalTableData                                                journalTableData;
        LedgerJournalTrans                                            journalTrans;
        container                                                             offsetCon, offsetConLoc , mainAccountCon;
        NumberSeq                                                         numberSeq;
        Voucher                                                               voucher;
        LedgerJournalName                                            ledgerJournalName;
        AccountNum                                                       vendAccount;
        HcmWorker                                                         hcmWorker;
        DirPerson                                                            dirPerson;
        DirPersonUser                                                    dirPersonUser;
        VendInvoiceJournalCreateBatch                        classVend   =   new                                                                                                                                    VendInvoiceJournalCreateBatch();
        MainAccount                                                      mainAccount;
        Voucher                                                               vch;
        DimensionAttributeValueCombination              dimCombination1;
        String255                                                            tmpOffsetAccount, tmpVoucherNo;
        DimensionAttributeValueCombination              dimCombination, dimCombinationLoc;
        NoYes                                                                 newOffsetLine = NoYes::Yes;
        LedgerJournalId                                                 journalId;
        String10                                                              purchId;
       
        i=0;

        while select vendInvoiceJourStageHeader where vendInvoiceJourStageHeader.UpdateFlag == 0
        {
            try
            {
                ledgerJournalName            =   LedgerJournalName::find(#initFromJournal);
                journalTable.initFromLedgerJournalName(#initFromJournal);
                journalTableData            =   JournalTableData::newTable(journalTable);
                journalTable.JournalNum     =   journalTableData.nextJournalId();
                journalTable.CurrencyCode   =   #AEDCurrency;
                if (journalTable.validateWrite())
                {
                    journalTable.insert();
                }

                journalId = journalTable.JournalNum;

                select count(RecId) from vendInvoiceJourStageLineds where vendInvoiceJourStageLineds.DocumentRef  ==  vendInvoiceJourStageHeader.Docref;

                while select vendInvoiceJourStageLine order by OffsetAccount desc
                    where vendInvoiceJourStageLine.DocumentRef  ==  vendInvoiceJourStageHeader.Docref
                {
                    amountcr= 0.00;
                    tmpOffsetAccount    = vendInvoiceJourStageLine.OffsetAccount;
                    tmpVoucherNo        = vendInvoiceJourStageLine.VoucherNo;

                    select dirPersonUser where dirpersonuser.User==curUserId();

                    select dirPerson where dirPerson.RecId == dirPersonUser.PersonParty;

                    select hcmWorker where hcmWorker.Person == dirPerson.RecId;

                    select  dimCombination where dimCombination.DisplayValue    ==  vendInvoiceJourStageHeader.Vendor;

                    select  dimCombinationLoc where dimCombinationLoc.DisplayValue    ==  vendInvoiceJourStageLine.OffsetAccount;
                   
                    offsetCon                           =   [vendInvoiceJourStageLine.Ledger,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                    offsetConLoc                        =   [vendInvoiceJourStageLine.OffsetAccount,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];

                    numberSeq                           =   NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);

                    if(vendInvoiceJourStageLine.OffsetAccount != '')
                    {
                        select  dimCombination where dimCombination.DisplayValue    ==  vendInvoiceJourStageLine.Ledger;
                        offsetConLoc                           =   [vendInvoiceJourStageLine.OffsetAccount,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];

                        journalTrans.JournalNum             =   journalTable.JournalNum;
                        journalTrans.Voucher                =   numberSeq.voucher();
                        journalTrans.Invoice                =   vendInvoiceJourStageHeader.InvoiceNumber;
                        journalTrans.Txt                    =   vendInvoiceJourStageHeader.InvoiceDescription;
                        invdatetime = DateTimeUtil::anyToDateTime(vendInvoiceJourStageHeader.InvoiceDate);

                        dateheader = DateTimeUtil::date(invdatetime);

                        invdate = date2Str(dateheader,321,DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4);
       
                        dateheaderval = str2Date(invdate,321);

                        journalTrans.INTC_InvDate = dateheaderval;
                        journalTrans.DocumentDate = str2Date(vendInvoiceJourStageHeader.InvoiceReceivedDate,321);
                        journalTrans.TransDate              =   today();//str2Date(journalDeatils.TransactionDate, 123);
                        journalTrans.AccountType            =   LedgerJournalACType::Ledger;
                        //journalTrans.LedgerDimension        =   dimCombination.RecId;
                        journalTrans.LedgerDimension        =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                        //journalTrans.AmountCurCredit        =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurDebit         =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurCredit         = 0.00;
                        journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
                        //journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                        //journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;
                        journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetConLoc, vendInvoiceJourStageLine.OffsetAccount);
                        journalTrans.INTC_DocumentRef       =   vendInvoiceJourStageLine.DocumentRef;

                        if(vendInvoiceJourStageLine.Currency  ==  #EmptyCurrency)
                        {
                            journalTrans.CurrencyCode   =   #AEDCurrency;
                        }
                        else
                        {
                            journalTrans.CurrencyCode   =   vendInvoiceJourStageLine.Currency;
                        }

                        journalTrans.ExchRate = Currency::exchRate1(journalTrans.CurrencyCode, journalTrans.TransDate);
                        journalTrans.Approver = hcmWorker.RecId;
                        journalTrans.Approved =NoYes::Yes;
                        journalTrans.PostingProfile = "General";
                        journalTrans.INTC_PurchId       =   vendInvoiceJourStageLine.PONo;
                        journalTrans.TransactionType = LedgerTransType::Vend;
                        journalTrans.INTC_WorkOrderId   =   vendInvoiceJourStageLine.WorkOrderNo;
                        journalTrans.INTC_Qty           =   vendInvoiceJourStageLine.Qty;
                        journalTrans.Payment = vendInvoiceJourStageLine.PaymentTerms;
                        journalTrans.insert();

                        //======================
                        numberSeq.used();
                        //======================
                    }
                    else
                    {
                        select  dimCombination where dimCombination.DisplayValue    ==  vendInvoiceJourStageLine.Ledger;
                        select  dimCombinationLoc where dimCombinationLoc.DisplayValue    ==  vendInvoiceJourStageLine.OffsetAccount;

                        offsetCon                           =   [vendInvoiceJourStageLine.Ledger,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                        if(vendInvoiceJourStageLine.OffsetAccount != '')
                        {
                            offsetConLoc                           =   [vendInvoiceJourStageLine.OffsetAccount,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                        }
                        journalTrans.JournalNum             =   journalTable.JournalNum;

                        if(newOffsetLine == NoYes::Yes)
                        {
                            numberSeq                   = NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);
                            journalTrans.Voucher        = numberSeq.voucher();
                            vch                         = journalTrans.Voucher;
                            newOffsetLine               = NoYes::No;
                        }
                        else
                        {
                            journalTrans.Voucher        = vch;
                        }

                        purchId = vendInvoiceJourStageLine.POLineNum;

                        amountcr+=vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.Invoice            =   vendInvoiceJourStageHeader.InvoiceNumber;
                        journalTrans.Txt                 =   vendInvoiceJourStageHeader.InvoiceDescription;
                        invdatetime                     = DateTimeUtil::anyToDateTime(vendInvoiceJourStageHeader.InvoiceDate);

                        dateheader = DateTimeUtil::date(invdatetime);

                        invdate = date2Str(dateheader,321,DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4);
       
                        dateheaderval = str2Date(invdate,321);

                        journalTrans.INTC_InvDate = dateheaderval;
                        journalTrans.DocumentDate = str2Date(vendInvoiceJourStageHeader.InvoiceReceivedDate,321);
                        journalTrans.TransDate              =   today();//str2Date(journalDeatils.TransactionDate, 123);
                        journalTrans.AccountType            =   LedgerJournalACType::Ledger;
                        //journalTrans.LedgerDimension        =   dimCombination.RecId;
                        journalTrans.LedgerDimension        =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                        //journalTrans.AmountCurCredit        =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurDebit         =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurCredit         = 0.00;
                        journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
                        //journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);

                        if(vendInvoiceJourStageLine.OffsetAccount == '')
                        {
                            journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;
                        }
                        else
                        {
                            journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetConLoc, vendInvoiceJourStageLine.OffsetAccount);
                        }

                        journalTrans.INTC_DocumentRef       =   vendInvoiceJourStageLine.DocumentRef;
                        if(vendInvoiceJourStageLine.Currency  ==  #EmptyCurrency)
                        {
                            journalTrans.CurrencyCode   =   #AEDCurrency;
                        }
                        else
                        {
                            journalTrans.CurrencyCode   =   vendInvoiceJourStageLine.Currency;
                        }
                        journalTrans.ExchRate = Currency::exchRate1(journalTrans.CurrencyCode, journalTrans.TransDate);
                        journalTrans.Approver = hcmWorker.RecId;
                        journalTrans.Approved =NoYes::Yes;
                        journalTrans.PostingProfile = "General";
                        journalTrans.INTC_PurchId       =   vendInvoiceJourStageLine.PONo;
                        journalTrans.TransactionType = LedgerTransType::Vend;
                        journalTrans.INTC_WorkOrderId   =   vendInvoiceJourStageLine.WorkOrderNo;
                        journalTrans.INTC_Qty           =   vendInvoiceJourStageLine.Qty;
                        journalTrans.Payment = vendInvoiceJourStageLine.PaymentTerms;
                        journalTrans.insert();

                        //======================
                        numberSeq.used();
                        //======================
                    }
                }

                select dirPersonUser where dirpersonuser.User==curUserId();

                select dirPerson where dirPerson.RecId == dirPersonUser.PersonParty;

                select hcmWorker where hcmWorker.Person == dirPerson.RecId;

                select  dimCombination1 where dimCombination1.DisplayValue    ==  vendInvoiceJourStageHeader.Vendor;
                offsetCon                           =   [vendInvoiceJourStageHeader.Vendor,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                numberSeq                           =   NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);

                //journalTrans.JournalNum             =   journalTable.JournalNum;
                journalTrans.JournalNum             =   journalId;

                journalTrans.Voucher                =   vch;

                vch = journalTrans.Voucher;

                journalTrans.Invoice                =   vendInvoiceJourStageHeader.InvoiceNumber;
                journalTrans.Txt                    =   vendInvoiceJourStageHeader.InvoiceDescription;
                invdatetime = DateTimeUtil::anyToDateTime(vendInvoiceJourStageHeader.InvoiceDate);

                dateheader = DateTimeUtil::date(invdatetime);

                invdate = date2Str(dateheader,321,DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4);
       
                dateheaderval = str2Date(invdate,321);

                journalTrans.INTC_InvDate = dateheaderval;
                journalTrans.DocumentDate = str2Date(vendInvoiceJourStageHeader.InvoiceReceivedDate,321);
                journalTrans.TransDate              =   today();//str2Date(journalDeatils.TransactionDate, 123);
                journalTrans.AccountType            =   LedgerJournalACType::Vend;
                journalTrans.LedgerDimension        =   dimCombination1.RecId;
                //journalTrans.LedgerDimension        =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageHeader.Vendor);
                journalTrans.AmountCurDebit         =   0.00;
                journalTrans.AmountCurCredit        =   amountcr;
                journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
                //journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                //journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;

                if(vendInvoiceJourStageLine.OffsetAccount == '')
                {
                    journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;
                }
                else
                {
                    journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetConLoc, vendInvoiceJourStageLine.OffsetAccount);
                }
               
                journalTrans.INTC_DocumentRef       =   vendInvoiceJourStageHeader.Docref;
               
                if(vendInvoiceJourStageLine.Currency  ==  #EmptyCurrency)
                {
                    journalTrans.CurrencyCode   =   #AEDCurrency;
                }
                else
                {
                    journalTrans.CurrencyCode   =   vendInvoiceJourStageLine.Currency;
                }
                journalTrans.ExchRate = Currency::exchRate1(journalTrans.CurrencyCode, journalTrans.TransDate);
                journalTrans.Approver = hcmWorker.RecId;
                journalTrans.Approved =NoYes::Yes;
                journalTrans.PostingProfile = "General";
                journalTrans.INTC_PurchId       =   vendInvoiceJourStageLine.PONo;
                journalTrans.TransactionType = LedgerTransType::Vend;
                journalTrans.INTC_WorkOrderId   =   vendInvoiceJourStageLine.WorkOrderNo;
                journalTrans.INTC_Qty           =   vendInvoiceJourStageLine.Qty;
                journalTrans.Payment = vendInvoiceJourStageLine.PaymentTerms;
                if(amountcr>0)
                {
                    journalTrans.insert();
                }
                ttsbegin;
                select forupdate vendInvoiceJourStageHeaderUpdate where vendInvoiceJourStageHeaderUpdate.RecId    ==    vendInvoiceJourStageHeader.RecId;
                vendInvoiceJourStageHeaderUpdate.UpdateFlag = 1;
                vendInvoiceJourStageHeaderUpdate.update();
                ttscommit;

                //======================
                numberSeq.used();
                //======================
            }
            catch(Exception::Error)
            {
                throw Exception::Error;
            }
        }



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;
    }


Happy Coding !!!!

3 comments:

  1. there is not classes used to create the journals instead of using LedgerJournalTable,LedgerJournalTrans like AXLedgerJournalTable,AXLedgerJournalTrans

    ReplyDelete
  2. there is no classes used to create the journals instead of using LedgerJournalTable,LedgerJournalTrans like AXLedgerJournalTable,AXLedgerJournalTrans ?

    ReplyDelete
  3. BetMGM App, Promo Code and Sign-Up Bonus - JamBase
    BetMGM is 인천광역 출장안마 a great online sports betting site in Arizona. You can 김포 출장안마 get the BetMGM 춘천 출장안마 BetMGM risk-free bet offer and make a deposit for your account  삼척 출장마사지 Rating: 4 강릉 출장마사지 · ‎Review by JT Hub

    ReplyDelete

How to reverse Free Text Invoice Voucher entries without Dialog

 Hey Folks ,  This blog post is in continuation of the previous post for Reversing Free Text Invoice Voucher entries with Dialog. Only diffe...