Create Expense Journals in D365 FO Using X++


Here is the sample code to create project expense journals in D365 FO using X++. In my case, I will retrieve data from a staging table sourced from a third-party system. The job outlined below will use values from the staging table to create the expense journals.

Public  final class CreateExpenseJournalService
{
    DaxExpenseStaging         StagingTrans;
    str                            empId;
    JournalId                      journalId;

    /// <summary>
    /// This method will create the ledger dimension for expense journals
    /// </summary>
    /// <param name = "_conData">DmensionData</param>
    /// <param name = "_mainAccount">MainAccountNum</param>
    /// <returns>DimensionDynamicAccount</returns>
    public DimensionDynamicAccount  generateLedgerDimension(container    _conData, MainAccountNum _mainAccount)
    {
        int                                 hierarchyCount;
        int                                 hierarchyIdx;
        RecId                               dimAttId_MainAccount;
        LedgerRecId                         ledgerRecId;
        MainAccount                         mainAccount;
        RefRecId                            recordvalue;
        DimensionAttribute                  dimensionAttribute;
        DimensionAttributeValue             dimensionAttributeValue;
        DimensionSetSegmentName             DimensionSet;
        DimensionStorage                    dimStorage;
        DimensionAttributeValueContract     ValueContract;
        DimensionAttributeValueCombination  dimensionAttributeValueCombination;
        LedgerAccountContract               LedgerAccountContract = new LedgerAccountContract();

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

        try
        {
            mainAccount         = MainAccount::findByMainAccountId(_mainAccount);
            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) ,false ,false);
                    if(dimensionAttributeValue)
                    {
                        ValueContract = new DimensionAttributeValueContract();
                        ValueContract.parmName(dimensionAttribute.Name) ;
                        ValueContract.parmValue(dimensionAttributeValue.CachedDisplayValue);
                        valueContracts.addEnd(ValueContract);
                    }
                }
            }
            LedgerAccountContract.parmMainAccount(_mainAccount);
            LedgerAccountContract.parmValues(valueContracts);
            dimStorage                         = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);
            dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());
            ledgerRecId                        = dimensionAttributeValueCombination.RecId;
        }
        catch
        {
            throw Exception::error;
        }
        return ledgerRecId;
    }

    /// <summary>
    /// A construct method to create object of this class
    /// </summary>
    /// <param name = "_stagingTrans">DaxExpenseStaging</param>
    /// <returns>CreateExpenseJournalService</returns>
    public static CreateExpenseJournalService construct(DaxExpenseStaging _stagingTrans)
    {
        CreateExpenseJournalService createExpenseExpense =  new CreateExpenseJournalService();
        createExpenseExpense.parmstagingTrans(_stagingTrans);
        return createExpenseExpense;
    }

    /// <summary>
    /// A parm method to return the current staging
    /// </summary>
    /// <param name = "_stagingTrans">DaxExpenseStaging</param>
    /// <returns>DaxExpenseStaging</returns>
    public DaxExpenseStaging parmstagingTrans(DaxExpenseStaging _stagingTrans)
    {
        StagingTrans = _stagingTrans;

        return StagingTrans;

    }

    /// <summary>
    /// Method to create the Journal Header
    /// </summary>
    /// <returns></returns>
    public LedgerJournalTable createJournalHeader()
    {
        LedgerJournalTable                                         ledgerJournalTable,jourTable1;
        ProjParameters                                             projParmeters = ProjParameters::find();

        ledgerJournalTable.initValue();
        ledgerJournalTable.JournalName                               = LedgerJournalName::find(projParmeters.DAXProjExpenseJournal).JournalName;
        ledgerJournalTable.initFromLedgerJournalName();
        ledgerJournalTable.Name                                      = ledgerJournalTable.ledgerJournalName().Name;
        ledgerJournalTable.JournalType                               = ledgerJournalType::Cost;
        ledgerJournalTable.LedgerJournalInclTax                      = NoYes::No;
        ledgerJournalTable.insert();

        return ledgerJournalTable;

    }

    /// <summary>
    /// Method used to create the Journal Lines
    /// </summary>
    /// <param name = "_ledgerJournalTable">LedgerJournalTable</param>
    public void createJournalTrans(LedgerJournalTable       _ledgerJournalTable)
    {
        LedgerJournalTrans                                         ledgerJournalTrans;
        LedgerJournalTrans_Project                                 ledgerJournalTrans_Project;
        ProjJournalCheckPost                                       jourPost;
        ledgerJournalCheckPost                                     ledgerJournalCheckPost;
        ProjTable                                                  projTable;
        NumberSequenceTable                                        numberSequenceTable;
        Voucher                                                    voucher;
        ResourceView                                               resourceView;
        MainAccount                                                mainaccount;
        ProjParameters                                             projParmeters = ProjParameters::find();



        if (_ledgerJournalTable)
        {
            select firstonly projTable
                    where projTable.DaxTransID == StagingTrans.TransID;

            ledgerJournalTrans.clear();
            ledgerJournalTrans.JournalNum            = _ledgerJournalTable.JournalNum;
            ledgerJournalTrans.DefaultDimension      = projTable.DefaultDimension;
            ledgerJournalTrans.AccountType           = LedgerJournalACType::Project;
            numberSequenceTable                      = NumberSequenceTable::find(LedgerJournalName::find(LedgerJournalName::find(projParmeters.DAXProjExpenseJournal).JournalName).NumberSequenceTable);
            voucher                                  = NumberSeq::newGetVoucherFromCode(numberSequenceTable.NumberSequence).voucher();
            ledgerJournalTrans.Voucher               = voucher;
            ledgerJournalTrans.CurrencyCode          = StagingTrans.Currency;
            ledgerJournalTrans.Qty                   = 1;
            ledgerJournalTrans.TransDate             = StagingTrans.JournalDate;
            ledgerJournalTrans.LedgerDimension       = LedgerDynamicAccountHelper::getDynamicAccountFromAccountNumber(projTable.ProjId,LedgerJournalACType::Project);
            ledgerJournalTrans.modifiedField(fieldNum(ledgerJournalTrans ,LedgerDimension ));

            ledgerJournalTrans.OffsetAccountType    = LedgerJournalACType::Ledger;
            ledgerJournalTrans.ExchRate = 100;
            Amount amount = StagingTrans.Costamount;
            if(amount> 0)
            {
                ledgerJournalTrans.AmountCurDebit = amount;
            }
            else
            {
                ledgerJournalTrans.AmountCurCredit = abs(amount);
            }
            ledgerJournalTrans.Company                  = strUpr(curExt());
            ledgerJournalTrans.OffsetCompany            = strUpr(curExt());
            ledgerJournalTrans.DAXstagingTransactionID  = StagingTrans.TransID;

           // mainaccount = MainAccount::find(projParmeters.DAXReimbursableEmpExpensePayAccount);
            str  mainaccountId  = LedgerDimensionFacade::getMainAccountFromLedgerDimension(projParmeters.DAXReimbursableEmpExpensePayAccount).MainAccountId;
            //MainAccount~CostCenter~ProfitCenter~Product_Family~UniqueProductID~Customer~Vendor
            container convalues = [mainaccountId, StagingTrans.Costcenter, projParmeters.DAXProfitCenter,'','','',''];
            refrecid ledgerdim  =  this.generateLedgerDimension(convalues, mainaccountId);

            ledgerJournalTrans.OffsetLedgerDimension    = LedgerDimensionFacade::serviceCreateLedgerDimension(ledgerdim,projTable.DefaultDimension);
            ledgerJournalTrans.modifiedField(fieldNum(ledgerJournalTrans ,OffsetLedgerDimension ));
            ledgerJournalTrans.insert();

            if (ledgerJournalTrans.RecId)
            {
                ledgerJournalTrans_Project.clear();
                ledgerJournalTrans_Project.RefRecId                         = ledgerJournalTrans.RecId;
                ledgerJournalTrans_Project.initValue();
                ledgerJournalTrans_Project.CategoryId                       = StagingTrans.Expensecategory;
                ledgerJournalTrans_Project.ProjId                           = projTable.ProjId;
                ledgerJournalTrans_Project.ProjTransDate                    = StagingTrans.JournalDate;
                ledgerJournalTrans_Project.modifiedField(fieldNum(ledgerJournalTrans_Project, CategoryId));
                ledgerJournalTrans_Project.Qty                              = 1;
                ledgerJournalTrans_Project.SalesCurrencyId                  = ledgerJournalTrans.CurrencyCode;
                ledgerJournalTrans_Project.CostPrice                        = amount;


                //select firstonly resourceView
                //    where resourceView.ResourceId == StagingTrans.EmployeeID;
                //ledgerJournalTrans_Project.Resource                         = resourceView.RecId; // If resource need to be filled uncomment the lines
                ledgerJournalTrans_Project.modifiedField(fieldNum(ledgerJournalTrans_Project, CostPrice));
                ledgerJournalTrans_Project.LinePropertyId = ProjLinePropertySetup::findLinePropertyId( projTable.ProjId,ledgerJournalTrans_Project.CategoryId );

                boolean priceFound;
                CostPrice costPriceMST = ProjCostSalesPrice::costPrice(ledgerJournalTrans,ledgerJournalTrans_Project, false);
                [ledgerJournalTrans_Project.SalesPrice, priceFound] = ProjCostSalesPrice::findCostSalesPrice(ledgerJournalTrans_Project.ProjId,ledgerJournalTrans_Project.Resource,ledgerJournalTrans_Project.CategoryId,costPriceMST,CompanyInfoHelper::standardCurrency(),ledgerJournalTrans_Project.SalesCurrencyId,ledgerJournalTrans_Project.ProjTransDate,ledgerJournalTrans_Project.ProjPriceGroupID,false);

                ledgerJournalTrans_Project.insert();
            }
        }

    }

}


No comments:

Post a Comment