Excel Import into D365 using x++ code

 using System.IO;

using OfficeOpenXml;

using OfficeOpenXml.Style;

using OfficeOpenXml.Table;

using OfficeOpenXml.ExcelRange;

using OfficeOpenXml.ExcelPackage;


/// <summary>

/// Customer invoice journal excel import

/// </summary>

class CustInvoiceJournalExcelImport 

{

    int currentRow              = 1;

    int coloumn                 = 1;

    ExcelWorksheets             worksheets;

    ExcelWorksheet              worksheet;

    OfficeOpenXml.ExcelRange    cells;

    OfficeOpenXml.ExcelRange    cell;

    #OCCRetryCount


    CustInvoiceTable         CustInvoiceTable;

    CustInvoiceLineImport    CustInvoiceLineImport;

               

    public static void main(Args _args)

    {

        FormRun     formRun = _args.caller();

        CustInvoiceJournalExcelImport    custInvoiceJournalExcelImport = new CustInvoiceJournalExcelImport();

        custInvoiceJournalExcelImport.importExcel();

        formRun.dataSource().research(true);

        formRun.dataSource().refresh();

    }


    /// <summary>

    /// Assigning posting profile

    /// </summary>

    /// <param name = "custTable">

    /// custTable buffer

    /// </param>

    /// <param name = "billingType">

    /// billingType

    /// </param>

    public void populatePostingProfile(CustTable custTable, BillingType billingType)

    {

        PostingRulesForDebtorAccnts  postingRulesForDebtorAccnts;


        select firstonly PostingProfile from postingRulesForDebtorAccnts

            where postingRulesForDebtorAccnts.AccountType == custTable.AccountType

            && ((postingRulesForDebtorAccnts.SubType      == custTable.SubType)

            || (postingRulesForDebtorAccnts.SubType       == SubType::None))

            && postingRulesForDebtorAccnts.BillingType    == billingType

            && ((postingRulesForDebtorAccnts.AccountNum   == custTable.AccountNum)

            || (postingRulesForDebtorAccnts.AccountNum    == ''));


        CustInvoiceLineImport.PostingProfile = postingRulesForDebtorAccnts.PostingProfile;

    }


    /// <summary>

    /// Assigning default values based on TCAccount

    /// </summary>

    /// <param name = "tCAccountId">

    ///  Account id

    /// </param>

    /// <param name = "custTable">

    /// custTable buffer

    /// </param>

    public void populatetCAccountRelatedFields(TCAccountId tCAccountId,CustTable custTable)

    {

        PropertyUnit                 propertyUnit;

        BillingUsageType             BillingUsageType;

        BillingUsageClass            BillingUsageClass;       


        propertyUnit                                = PropertyUnit::findBySchemaAccount(CustInvoiceLineImport.TCAccountId,false);

        CustInvoiceLineImport.AccountType        = custTable.AccountType;

        CustInvoiceLineImport.PaymTermId         = custTable.PaymTermId;

        CustInvoiceLineImport.SubType            = custTable.SubType;

        CustInvoiceLineImport.SchemeAccNo        = propertyUnit.SchemeAccountId;

        //CustInvoiceLineImport.DefaultDimension   = custTable.DefaultDimension;


        select firstonly Number from BillingUsageType

            where BillingUsageType.RecId == propertyUnit.UsageType;

        if (BillingUsageType.Number)

        {

            CustInvoiceLineImport.UsageType  = BillingUsageType.Number;

        }

        select firstonly Number from BillingUsageClass

            where BillingUsageClass.RecId == propertyUnit.UsageClassR;

        if (BillingUsageClass.Number)

        {

            CustInvoiceLineImport.UsageClass = BillingUsageClass.Number;

        }

    }


    /// <summary>

    /// Assigning default values based on Billing classification

    /// </summary>

    /// <param name = "billingClassification">

    /// BillingClassification

    /// </param>

    /// <param name = "itemGSTGroup">

    /// itemGSTGroup

    /// </param>

    /// <param name = "custTable">

    /// custTable buffer

    /// </param>

    public void populateBillingClassificationDetails(BillingClassification billingClassification, TaxItemGroup itemGSTGroup, CustTable custTable)

    {

        CustBillingClassification       custBillingClassification;

        CustBillingClassificationCode   custBillingClassificationCode;

        CustBillingCode                 custBillingCode;

        CustBillingCodeVersion          custBillingCodeVersion;

        CustBillingCodeLedgerAccount    custBillingCodeLedgerAccount;


        custBillingClassification = CustBillingClassification::findByBillingClassification(billingClassification);

        CustInvoiceLineImport.BillingType    = custBillingClassification.BillingType;


        select firstonly CustBillingCode from custBillingClassificationCode

            where custBillingClassificationCode.CustBillingClassification == custBillingClassification.RecId

        join BillingCode,Description,RecId from custBillingCode

            where custBillingCode.RecId == custBillingClassificationCode.CustBillingCode

        join RecId,TaxItemGroupHeading from custBillingCodeVersion

            where custBillingCodeVersion.CustBillingCode == custBillingCode.RecId

        join LedgerDimension, RecId from custBillingCodeLedgerAccount

            order by custBillingCodeLedgerAccount.RecId

            where custBillingCodeLedgerAccount.CustBillingCodeVersion == custBillingCodeVersion.RecId;


        if (custBillingCodeLedgerAccount.RecId)

        {            

            CustInvoiceLineImport.ItemGSTGroup       = itemGSTGroup ? itemGSTGroup : custBillingCodeVersion.TaxItemGroupHeading;

            this.populatePostingProfile(custTable,CustInvoiceLineImport.BillingType);

        }

        if (!CustInvoiceLineImport.ItemGSTGroup)

                CustInvoiceLineImport.ItemGSTGroup       = itemGSTGroup;


        if (!CustInvoiceLineImport.BillingCode && (CustInvoiceLineImport.AccountType == AccountType::SCC ||

                CustInvoiceLineImport.AccountType == AccountType::Void))

        {

            this.populateBillingCode(CustInvoiceLineImport);

        }


    }


    /// <summary>

    /// Assigning default values based on BillingCode

    /// </summary>

    /// <param name = "billingCode">

    /// BillingCode

    /// </param>

    /// <param name = "itemGSTGroup">

    ///  itemGSTGroup

    /// </param>

    /// <param name = "custTable">

    /// custTable buffer

    /// </param>

    public void populateBillingCodeDetails(BillingCode billingCode, TaxItemGroup itemGSTGroup, CustTable custTable)

    {

        CustBillingClassification       custBillingClassification;

        CustBillingClassificationCode   custBillingClassificationCode;

        CustBillingCode                 custBillingCode;

        CustBillingCodeVersion          custBillingCodeVersion;

        CustBillingCodeLedgerAccount    custBillingCodeLedgerAccount;


        custBillingCode = CustBillingCode::findBillingCode(billingCode);


        select firstonly CustBillingClassification from custBillingClassificationCode

            where custBillingClassificationCode.CustBillingCode == custBillingCode.RecId

        join BillingClassification,Billingtype from custBillingClassification

            where  CustBillingClassification.RecId == custBillingClassificationCode.CustBillingClassification

        join TaxItemGroupHeading from custBillingCodeVersion

            where custBillingCodeVersion.CustBillingCode == custBillingCode.RecId

        join firstonly LedgerDimension, RecId from custBillingCodeLedgerAccount

            order by custBillingCodeLedgerAccount.RecId

            where custBillingCodeLedgerAccount.CustBillingCodeVersion == custBillingCodeVersion.RecId;


        if (custBillingCodeLedgerAccount.RecId)

        {

            CustInvoiceLineImport.LedgerDimension        = LedgerDefaultAccountHelper::getDefaultAccountFromLedgerDimension(custBillingCodeLedgerAccount.LedgerDimension);

            if (CustInvoiceLineImport.BillingClassification == "")

                    CustInvoiceLineImport.BillingClassification  = custBillingClassification.BillingClassification;


            if (CustInvoiceLineImport.BillingType == "")

                    CustInvoiceLineImport.BillingType            = custBillingClassification.BillingType;


            if (CustInvoiceLineImport.ItemGSTGroup == "")

                    CustInvoiceLineImport.ItemGSTGroup           = itemGSTGroup ? itemGSTGroup : custBillingCodeVersion.TaxItemGroupHeading;


            if (CustInvoiceLineImport.PostingProfile == "")

            {

                this.populatePostingProfile(custTable,CustInvoiceLineImport.BillingType);

            }          

            CustInvoiceLineImport.Description            = custBillingCode.Description;            

            this.setBillingCodeDefaults(custBillingCode,custTable,CustInvoiceLineImport);

            

        }

    }


    public void populateBillingCode(CustInvoiceLineImport invoiceLineImport)

    {

        SCCMasterRatesParameters     sccMasterRatesParameters;

        SCCRecoveredRatesParameters  sccRecoveredRatesParameters;


        sccMasterRatesParameters = SCCMasterRatesParameters::find(BillingUsageClass::findNumber(invoiceLineImport.UsageClass,false).RecId,BillingUsageType::findTCNumber(invoiceLineImport.UsageType,false).RecId);

        if (sccMasterRatesParameters)

        {

            if (sccMasterRatesParameters && invoiceLineImport.SubType == SubType::Rented || invoiceLineImport.SubType == SubType::HDBRented || invoiceLineImport.SubType == SubType::NEARented)

            {

                CustInvoiceLineImport.BillingCode = sccMasterRatesParameters.AdjForRentalUnits;

                CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));

            }

            else if (sccMasterRatesParameters && invoiceLineImport.SubType == SubType::Sold || invoiceLineImport.SubType == SubType::HDBSold || invoiceLineImport.SubType == SubType::NEASold)

            {

                CustInvoiceLineImport.BillingCode = sccMasterRatesParameters.AdjForSoldUnits;

                CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));

            }

        }

        else

        {

            sccRecoveredRatesParameters = SCCRecoveredRatesParameters::find(BillingUsageClass::findNumber(invoiceLineImport.UsageClass,false).RecId,BillingUsageType::findTCNumber(invoiceLineImport.UsageType,false).RecId);

            if (sccRecoveredRatesParameters && invoiceLineImport.SubType == SubType::Rented || invoiceLineImport.SubType == SubType::HDBRented || invoiceLineImport.SubType == SubType::NEARented)

            {

                CustInvoiceLineImport.BillingCode = sccRecoveredRatesParameters.AdjForRentalUnits;

                CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));

            }

            else if (sccRecoveredRatesParameters && invoiceLineImport.SubType == SubType::Sold || invoiceLineImport.SubType == SubType::HDBSold || invoiceLineImport.SubType == SubType::NEASold)

            {

                CustInvoiceLineImport.BillingCode = sccRecoveredRatesParameters.AdjForSoldUnits;

                CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));

            }

        }

    }


    public static void validateInvoiceLines(CustInvoiceJourBatchId custInvoiceJourBatchId)

    {

        CustInvoiceLineImport    CustInvoiceLineImport;

        BillingTypeMaster        billingTypeMaster;

        Query                       query;

        QueryRun                    queryRun;

        QueryBuildDataSource        custInvoiceLineImportQbds;


        query = new Query();


        custInvoiceLineImportQbds = query.addDataSource(tableNum(CustInvoiceLineImport));        

        custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, CustInvoiceJourBatchId)).value(queryValue(custInvoiceJourBatchId));     

        custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, IsValidated)).value(Sysquery::value(NoYes::No));


        queryRun = new QueryRun(query);

        while (queryRun.next())

        {

            CustInvoiceLineImport = queryRun.get(tableNum(CustInvoiceLineImport));

            if (!CustInvoiceLineImport.TransDate || !CustInvoiceLineImport.BillingPeriodDate)

            {

                CustInvoiceLineImport.Log += "@S:ValidateInvoiceDate";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum; 

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!CustTable::exist(CustInvoiceLineImport.TCAccountId))

            {

                CustInvoiceLineImport.Log += "@S:ValidateTCAccount";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!CustInvoiceLineImport.BillingClassification)

            {

                CustInvoiceLineImport.Log += "@S:ValidateBillingClassification";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum; 

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (CustInvoiceLineImport.BillingClassification && !CustBillingClassification::findBillingClassification(CustInvoiceLineImport.BillingClassification).AllowedInCustInvJour)

            {                               

                CustInvoiceLineImport.Log += strFmt("@S:BillingClassificationIsNotAllowed",CustInvoiceLineImport.BillingClassification);

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;                                

            }

            if (!CustInvoiceLineImport.BillingType)

            {

                CustInvoiceLineImport.Log += "@S:BillingType";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;     

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!CustInvoiceLineImport.BillingCode || !CustInvoiceLineImport.Description)

            {

                CustInvoiceLineImport.Log += "@S:ValidateBillingCode";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;     

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!CustInvoiceLineImport.LedgerDimension)

            {

                CustInvoiceLineImport.Log += "@S:ValidateMainAccount";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;  

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!CustInvoiceLineImport.DefaultDimension)

            {

                CustInvoiceLineImport.Log += "@S:ValidateFinDimensions";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum; 

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!CustInvoiceLineImport.AmountCurDebit)

            {

                CustInvoiceLineImport.Log += "@S:ValidateCreditDebitAmount";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;   

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }           

            if (!CustInvoiceLineImport.ItemGSTGroup || !CustInvoiceLineImport.PostingProfile)

            {

                CustInvoiceLineImport.Log += "@S:ValidateItemGSTAndPostingProfile";

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;      

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (!TaxItemGroupHeading::find(CustInvoiceLineImport.ItemGSTGroup))

            {

                CustInvoiceLineImport.Log += strFmt("@Payroll:TheValue1InField2IsNotFoundInTheRelatedTable3", CustInvoiceLineImport.ItemGSTGroup, "@S:ItemGSTGroup", tableId2pname(tableNum(TaxItemGroupHeading)));

                CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;

                CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

            }

            if (CustInvoiceLineImport.BillingType && CustInvoiceLineImport.AccountType)

            {

                if(CustInvoiceLineImport.AccountType == AccountType::SCC || CustInvoiceLineImport.AccountType == AccountType::Void || 

                        CustInvoiceLineImport.AccountType == AccountType::TOL || CustInvoiceLineImport.AccountType == AccountType::LUCS || 

                            CustInvoiceLineImport.AccountType == AccountType::OtherDebitors)

                {

                    select firstonly billingTypeMaster

                        where billingTypeMaster.BillingType     == CustInvoiceLineImport.BillingType

                        && billingTypeMaster.AllowedAccountType == AllowedAccountType::Blank;

                    if (billingTypeMaster)

                    {

                        CustInvoiceLineImport.Log += strFmt("@S:BlankAllowedAccountTypeValidation",AllowedAccountType::Blank);

                        CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;      

                        CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

                    }

                }

                else if(CustInvoiceLineImport.AccountType == AccountType::SCC || CustInvoiceLineImport.AccountType == AccountType::Void ||

                            CustInvoiceLineImport.AccountType == AccountType::TOL)

                {

                    select firstonly billingTypeMaster

                        where billingTypeMaster.BillingType     == CustInvoiceLineImport.BillingType

                        && billingTypeMaster.AllowedAccountType == AllowedAccountType::SCCVoidTOL;

                    if (billingTypeMaster)

                    {

                        CustInvoiceLineImport.Log += strFmt("@S:AllowedAccountTypeValidation",AllowedAccountType::SCCVoidTOL);

                        CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;

                        CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

                        

                    }

                }

                else if(CustInvoiceLineImport.AccountType == AccountType::LUCS)

                {

                    select firstonly billingTypeMaster

                        where billingTypeMaster.BillingType     == CustInvoiceLineImport.BillingType

                        && billingTypeMaster.AllowedAccountType == AllowedAccountType::LUCS;

                    if (billingTypeMaster)

                    {

                        CustInvoiceLineImport.Log += strFmt("@S:AllowedAccountTypeValidation",AllowedAccountType::LUCS);

                        CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;

                        CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

                        

                    }

                }

                else if(CustInvoiceLineImport.AccountType == AccountType::OtherDebitors)

                {

                    select firstonly billingTypeMaster

                        where billingTypeMaster.BillingType     == CustInvoiceLineImport.BillingType

                        && billingTypeMaster.AllowedAccountType == AllowedAccountType::OtherDebtors;

                    if (billingTypeMaster)

                    {

                        CustInvoiceLineImport.Log += strFmt("@S:AllowedAccountTypeValidation",AllowedAccountType::OtherDebtors);

                        CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;  

                        CustInvoiceLineImport.ImportStatus = ImportStatus::Error;

                    }

                }

                

            }          

            CustInvoiceLineImport.selectForUpdate(true);    

            if (!CustInvoiceLineImport.Log)

            {

                CustInvoiceLineImport.IsValidated = NoYes::Yes;

            }

            else

            {

                CustInvoiceLineImport.IsValidated = NoYes::No;

            }

            CustInvoiceLineImport.doUpdate();   


        }

    }


    public static void createInvoiceLines(CustInvoiceJourBatchId custInvoiceJourBatchId)

    {

        CustInvoiceLineImport    CustInvoiceLineImport,updCustInvoiceLineImport;

        CustInvoiceLine          CustInvoiceLine;

        Query                       query;

        QueryRun                    queryRun;

        QueryBuildDataSource        custInvoiceLineImportQbds;


        RecordInsertList            recordInsertListInvoiceLine = null;

        recordInsertListInvoiceLine = new RecordInsertList(tableNum(CustInvoiceLine));


        query = new Query();


        custInvoiceLineImportQbds = query.addDataSource(tableNum(CustInvoiceLineImport));

        custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, CustInvoiceJourBatchId)).value(queryValue(custInvoiceJourBatchId));

        custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, IsValidated)).value(Sysquery::value(NoYes::Yes));

        custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, ImportStatus)).value(SysQuery::value(ImportStatus::Success));

        custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, IsLineCreated)).value(Sysquery::value(NoYes::No));


        queryRun = new QueryRun(query);

        while (queryRun.next())

        {

            CustInvoiceLine = null;

            CustInvoiceLineImport = queryRun.get(tableNum(CustInvoiceLineImport));

            CustInvoiceLine.initValue();

            CustInvoiceLine.initFromCustInvoiceTable(CustInvoiceTable::find(custInvoiceJourBatchId,false));

            CustInvoiceLine.TransDate                = CustInvoiceLineImport.TransDate;

            CustInvoiceLine.BillingPeriodDate        = CustInvoiceLineImport.BillingPeriodDate;

            CustInvoiceLine.AccountType              = CustInvoiceLineImport.AccountType;

            CustInvoiceLine.TCAccountId              = CustInvoiceLineImport.TCAccountId;

            CustInvoiceLine.BillingType              = CustInvoiceLineImport.BillingType;

            CustInvoiceLine.BillingCode              = CustInvoiceLineImport.BillingCode;

            CustInvoiceLine.BillingClassification    = CustInvoiceLineImport.BillingClassification;

            CustInvoiceLine.Description              = CustInvoiceLineImport.Description;            

            CustInvoiceLine.AmountCurDebit           = CustInvoiceLineImport.AmountCurDebit;

            CustInvoiceLine.GSTGroup                 = CustInvoiceLineImport.GSTGroup;

            CustInvoiceLine.GSTAmount                = CustInvoiceLineImport.GSTAmount;

            CustInvoiceLine.TotalAmount              = CustInvoiceLineImport.TotalAmount;

            CustInvoiceLine.InvoiceId                = CustInvoiceLineImport.InvoiceId;

            CustInvoiceLine.PaymTermId               = CustInvoiceLineImport.PaymTermId;

            CustInvoiceLine.DefaultDimension         = CustInvoiceLineImport.DefaultDimension;

            CustInvoiceLine.PostingProfile           = CustInvoiceLineImport.PostingProfile;

            CustInvoiceLine.LedgerDimension          = CustInvoiceLineImport.LedgerDimension;

            CustInvoiceLine.ItemGSTGroup             = CustInvoiceLineImport.ItemGSTGroup;

            CustInvoiceLine.LineNum                  = CustInvoiceLineImport.LineNum;

            CustInvoiceLine.Log                      = CustInvoiceLineImport.Log;

            CustInvoiceLine.SourceDocumentLine       = CustInvoiceLineImport.SourceDocumentLine;

            CustInvoiceLine.SourceDocumentHeader     = CustInvoiceLineImport.SourceDocumentHeader;

            CustInvoiceLine.SchemeAccNo              = CustInvoiceLineImport.SchemeAccNo;

            CustInvoiceLine.SubType                  = CustInvoiceLineImport.SubType;

            CustInvoiceLine.UsageType                = CustInvoiceLineImport.UsageClass;

            CustInvoiceLine.UsageClass               = CustInvoiceLineImport.UsageClass;            

            recordInsertListInvoiceLine.add(CustInvoiceLine);

                        

            update_recordset updCustInvoiceLineImport 

                setting IsLineCreated = NoYes::Yes

                where updCustInvoiceLineImport.CustInvoiceJourBatchId == CustInvoiceLineImport.CustInvoiceJourBatchId

                &&    updCustInvoiceLineImport.LineNum                == CustInvoiceLineImport.LineNum;

        }

        recordInsertListInvoiceLine.insertDatabase();

    }


    /// <summary>

    /// To Genearte the default financial dimension from individual display value.

    /// _activity, _division, _fund, _precinct, _project, _property

    /// </summary>

    /// <param name = "_fund">Fund</param>

    /// <param name = "_division">Division</param>

    /// <param name = "_precinct">Precinct</param>

    /// <param name = "_property">Property</param>

    /// <param name = "_activity">Activity</param>

    /// <param name = "_project">Project</param>

    /// <returns>DimensionDefault</returns>

    public static DimensionDefault createDefaultDimension( DimensionValue  _fund,

                                                           DimensionValue  _division,

                                                           DimensionValue  _precinct,

                                                           DimensionValue  _property,

                                                           DimensionValue  _activity,

                                                           DimensionValue  _project)

    {

        DimensionAttributeValueSetStorage   valueSetStorage = new DimensionAttributeValueSetStorage();

        DimensionDefault                    result;

        int                                 i;

        DimensionAttribute                  dimensionAttribute;

        DimensionAttributeValue             dimensionAttributeValue;

       

        container               conAttr     =   LedgerDimensionHelper::getDimensionNameTID();

        container               conValue    =   [_activity, _division, _fund, _precinct, _project, _property];

        str                     dimValue;

    

        for (i = 1; i <= conLen(conAttr); i++)

        {

            dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));

            if (dimensionAttribute.RecId == 0)

            {

                continue;

            }

            dimValue = conPeek(conValue,i);

            if (dimValue != "")

            {

                dimensionAttributeValue = dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,true);

                valueSetStorage.addItem(dimensionAttributeValue);

            }

        }

        //It reutrns the value of type DimensionDefault

        result = valueSetStorage.save();

  

        return result;

    }


    /// <summary>

    /// Read the excel file

    /// </summary>    

    protected void importExcel()

    {

        try

        {

            this.readData();

        }


        catch (Exception::Deadlock)

        {

            if (xSession::currentRetryCount() >= #RetryNum)

            {

                throw Exception::Deadlock;

            }

            else

            {

                retry;

            }

        }


        catch (Exception::UpdateConflict)

        {

            if (appl.ttsLevel() == 0)

            {

                if (xSession::currentRetryCount() >= #RetryNum)

                {

                    throw Exception::UpdateConflictNotRecovered;

                }

                else

                {

                    retry;

                }

            }

            else

            {

                throw Exception::UpdateConflict;

            }

        }


        catch (Exception::CLRError)

        {

            this.logCLRException();

        }


        catch (Exception::Error)

        {

            throw error(infolog.text());

        }                                     

    }


    private void logCLRException()

    {

        System.Exception ex = ClrInterop::getLastException();


        if (ex != null)

        {

            ApplicationUnhandledExceptionLogger::logCLRException(ex);


            str errorMessage = ex.Message;


            // If an inner exception exists, display this error message as it is the original exception message

            // which is more useful

            if (ex.InnerException != null)

            {

                errorMessage = ex.InnerException.Message;

            }


            throw error(errorMessage);

        }

    }


    /// <summary>

    /// Reads the excel data and insert into staging

    /// </summary>

    protected void readData()

    {

        System.IO.Stream                stream;

        DialogGroup                     dlgUploadGroup;

        FileUploadBuild                 fileUploadBuild;

        FormBuildControl                formBuildControl;

        

        TransDate                       invoiceDate;

        BillingPeriodDate            billingPeriodDate;

        Description                     description;

        TCAccountId                  tcAccountId;

        BillingClassification           billingClassification;

        BillingCode                     billingCode;

        AmountCurDebit                  amountCurDebit;   

        Amount                          totalAmount;

        TaxItemGroup                    itemGSTGroup;

        str                             fund,division,precinct,property,activity,project;


        NumberSeq                       numberSeq;        

        CustTable                       custTable;

        boolean                         header = true;

     

        int                             insertedRecord = 0;

        real                            lineNum = 1.00;

        Dialog                          dialog =    new Dialog("@S:ImportCustInvoiceJour");


        dlgUploadGroup                  = dialog.addGroup("@SYS54759");

        formBuildControl                = dialog.formBuildDesign().control(dlgUploadGroup.name());

        fileUploadBuild                 = formBuildControl.addControlEx(classstr(FileUpload), 'Upload');


        fileUploadBuild.style(FileUploadStyle::MinimalWithFilename);

        fileUploadBuild.fileTypesAccepted('.xlsx');


        RecordInsertList                            recordInsertListCustInvoiceLineImport = null;

        recordInsertListCustInvoiceLineImport    = new RecordInsertList(tableNum(CustInvoiceLineImport));


        if (dialog.run() && dialog.closedOk())

        {

            FileUpload                          fileUploadControl;

            FileUploadTemporaryStorageResult    fileUploadResult;

    

            fileUploadControl = dialog.formRun().control(dialog.formRun().controlId('Upload'));

            fileUploadResult  = fileUploadControl.getFileUploadResult();

    

            if (fileUploadResult != null && fileUploadResult.getUploadStatus())

            {

                stream = fileUploadResult.openResult();

                using (ExcelPackage Package = new ExcelPackage(stream))

                {

                    int rowCount, i,columncount;

                    Package.Load(stream);

                    worksheet   = package.get_Workbook().get_Worksheets().get_Item(1);

                    OfficeOpenXml.ExcelRange    range   = worksheet.Cells;

                    rowCount    = (worksheet.Dimension.End.Row) - (worksheet.Dimension.Start.Row)  + 1;

                    columncount = (worksheet.Dimension.End.Column);


                    try

                    {

                        ttsbegin;

                        for (i = 2; i<= rowCount; i++)

                        {

                            invoiceDate             = range.get_Item(i, 1).value;

                            billingPeriodDate       = range.get_Item(i, 2).value;                                                        

                            description             = range.get_Item(i, 3).value;

                            tcAccountId             = range.get_Item(i, 4).value;

                            billingClassification   = range.get_Item(i, 5).value;

                            billingCode             = range.get_Item(i, 6).value;

                            amountCurDebit          = range.get_Item(i, 7).value;

                            totalAmount             = range.get_Item(i, 8).value;

                            itemGSTGroup            = range.get_Item(i, 9).value;

                            fund                    = range.get_Item(i, 10).value;

                            division                = range.get_Item(i, 11).value;

                            precinct                = range.get_Item(i, 12).value;

                            property                = range.get_Item(i, 13).value;

                            activity                = range.get_Item(i, 14).value;

                            project                 = range.get_Item(i, 15).value;

                            

                            if (header)

                            {

                                CustInvoiceTable = null;

                                CustInvoiceTable.initValue();

                                ttsbegin;

                                numberSeq = NumberSeq::newGetNum(CustInvoiceTable::numRefCustInvJourBatchId());

                                CustInvoiceTable.CustInvoiceJourBatchId = numberSeq.num();

                                numberSeq.used();

                                ttscommit;

                                CustInvoiceTable.Description = description;

                                CustInvoiceTable.insert();

                                header = false;

                            }


                            CustInvoiceLineImport = null;

                            CustInvoiceLineImport.initValue();

                            CustInvoiceLineImport.initFromCustInvoiceTable(CustInvoiceTable);

                            CustInvoiceLineImport.TransDate          = invoiceDate;                            

                            CustInvoiceLineImport.BillingPeriodDate  = billingPeriodDate ? billingPeriodDate : CustInvoiceLineImport.TransDate;

                            lineNum++;

                            CustInvoiceLineImport.LineNum            = lineNum;

                            custTable                                   = CustTable::find(tcAccountId,false);

                            if (custTable)

                            {

                                CustInvoiceLineImport.TCAccountId = tcAccountId;

                                if (fund || division || precinct || property || activity || project)

                                {

                                    CustInvoiceLineImport.DefaultDimension = FERHelper::createDefaultDimension(fund,division,precinct,property,activity,project);                                    

                                }

                                this.populatetCAccountRelatedFields(CustInvoiceLineImport.TCAccountId,custTable);                                

                            }

                            if (billingClassification)

                            {

                                CustInvoiceLineImport.BillingClassification = billingClassification;

                                this.populateBillingClassificationDetails(CustInvoiceLineImport.BillingClassification,itemGSTGroup,custTable);                                

                            }

                            if (billingCode)

                            {

                                CustInvoiceLineImport.BillingCode = billingCode;

                                this.populateBillingCodeDetails(CustInvoiceLineImport.BillingCode,itemGSTGroup,custTable);                                

                            }

                            if (!totalAmount && amountCurDebit)

                            {

                                CustInvoiceLineImport.AmountCurDebit =   amountCurDebit;

                                CustInvoiceLineImport.GSTAmount      =   decRound(CustInvoiceLineImport.AmountCurDebit * (TownCouncil::TaxPercentValue(CustInvoiceLineImport.GSTGroup,CustInvoiceLineImport.ItemGSTGroup,CustInvoiceLineImport.TransDate)/100),2);

                                CustInvoiceLineImport.TotalAmount    =   decRound(CustInvoiceLineImport.AmountCurDebit + CustInvoiceLineImport.GSTAmount,2);

                            }

                            if (totalAmount && (amountCurDebit || !amountCurDebit))

                            {

                                CustInvoiceLineImport.TotalAmount    =   totalAmount;

                                real    gstValue                        = TownCouncil::TaxPercentValue(CustInvoiceLineImport.GSTGroup,CustInvoiceLineImport.ItemGSTGroup,CustInvoiceLineImport.TransDate);

                                CustInvoiceLineImport.AmountCurDebit = decRound((100/(100+gstValue))*CustInvoiceLineImport.TotalAmount,2);

                                CustInvoiceLineImport.GSTAmount      = decRound(CustInvoiceLineImport.TotalAmount - CustInvoiceLineImport.AmountCurDebit,2);

                            }

                            recordInsertListCustInvoiceLineImport.add(CustInvoiceLineImport);                            

                            insertedRecord++;

                        }

                        recordInsertListCustInvoiceLineImport.insertDatabase();

                        ttscommit;

                    }

                    catch (Exception::CLRError)

                    {

                        //checkFailed(strfmt("@S:CommunicationImportValidation",customerNumber,i));

                    }


                    Args            args = new Args(formStr(CustInvoiceLineImport));

                    FormRun         formRun;

                    FormDataSource  formDataSource = new FormDataSource();


                    formRun = ClassFactory.formRunClass(args);

                    formRun.init();

                    formDataSource = formRun.dataSource();

                    formRun.run();

                    formDataSource.filter(fieldNum(CustInvoiceLineImport,CustInvoiceJourBatchId),CustInvoiceTable.CustInvoiceJourBatchId);

                    formRun.detach();

                    info(strFmt("@S:CustomerInvoiceJourImportText",insertedRecord, CustInvoiceTable.CustInvoiceJourBatchId));                                   

                }

            }


            else

            {

                error("@S:FBSErrorReadingExcelFile");

            }

        }

    }


    public void setBillingCodeDefaults(CustBillingCode _custBillingCode, CustTable _custTable, CustInvoiceLineImport invoiceLineImport)

    {

        CustBillingCodeLedgerAccount    custBillingCodeLedgerAccount;

        CustBillingCodeVersion          custBillingCodeVersion;


        custBillingCodeVersion = CustBillingCodeVersion::findByDate(_custBillingCode.RecId, invoiceLineImport.TransDate);


        custBillingCodeLedgerAccount = this.getCustBillingCodeLedgerAccount(custBillingCodeVersion);


        if ( custBillingCodeLedgerAccount.RecId )

        {

            //if (custBillingCodeVersion.UseDimensionsFromLine && invoiceLineImport.DefaultDimension == 0)

            if (custBillingCodeVersion.UseDimensionsFromLine)

            {

                invoiceLineImport.DefaultDimension = LedgerDimensionDefaultFacade::serviceMergeDefaultDimensions(

                    LedgerDimensionFacade::getDefaultDimensionFromLedgerDimension(custBillingCodeLedgerAccount.LedgerDimension),

                    invoiceLineImport.DefaultDimension,

                    _custTable.DefaultDimension);

            }            

        }    

    }


    protected CustBillingCodeLedgerAccount getCustBillingCodeLedgerAccount(CustBillingCodeVersion _custBillingCodeVersion)

    {

        CustBillingCodeLedgerAccount custBillingCodeLedgerAccount;


        select firstonly custBillingCodeLedgerAccount

            order by custBillingCodeLedgerAccount.RecId

            where custBillingCodeLedgerAccount.CustBillingCodeVersion == _custBillingCodeVersion.RecId;


        return custBillingCodeLedgerAccount;

    }


}

Comments

Popular posts from this blog

Create ledger journals in D365FO using X++ + LedgerDimensionACType

Sales invoice report