Concur import for General Ledger post by Pipe delimited

Contract Class
[DataContractAttribute,SysOperationContractProcessingAttribute(classstr(KGSPMIManualFileReadCSVUIBuilder))]
class KGSPMIManualFileReadCSVContract
{
//This code is not used
/// <summary>
/// Gets or sets the value of the datacontract parameter File.
/// </summary>
/// <param name="_fileName">
/// The new value of the datacontract parameter filename; optional.
/// </param>
/// <returns>
/// The current value of datacontract parameter filename
/// </returns>
private System.IO.Stream stream;
private Filename filename;
private boolean readDataFromBlob;
public System.IO.Stream parmStream(System.IO.Stream _stream = stream)
{
stream = _stream;
return stream;
}
public Filename parmFilename(Filename _fileName = fileName)
{
fileName = _fileName;
return fileName;
}
}

UIBuilderClass

class KGSPMIManualFileReadCSVUIBuilder extends SysOperationAutomaticUIBuilder
{
private const str fileUploadName = "Upload";


private const str okButtonName = "OK";

DialogGroup dialogGroup;

FormBuildControl formBuildControl;

FileUploadBuild dialogFileUpload;

   
public void build() {
 

super();

dialogGroup = dialog.addGroup("@SYS319541");
formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());

dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);

dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);

dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));

dialogFileUpload.fileTypesAccepted(".csv");

dialogFileUpload.fileNameLabel("@SYS308842");
}

 

protected void setDialogOkButtonEnabled(FormRun _formRun, boolean _isEnabled)
{
FormControl okButtonControl = _formRun.control(_formRun.controlId(OkButtonName));
if (okButtonControl)
{
okButtonControl.enabled(_isEnabled);
}

}

 

private void uploadStarted()
{
var formRun = this.dialog().dialogForm().formRun();
this.setDialogOkButtonEnabled(formRun, false);
}

 

/// <summary>

/// Notify file upload status.

/// </summary>

protected void uploadCompleted()
{
var formRun = this.dialog().dialogForm().formRun();
FileUpload fileUpload = formRun.control(formRun.controlId(FileUploadName));

this.dataContractObject().parmStream(fileUpload.getUploadedFile(true));

this.dataContractObject().parmFilename(fileUpload.fileName());

fileUpload.notifyUploadCompleted -= eventhandler(this.UploadCompleted);

this.setDialogOkButtonEnabled(formRun, true);
}

 

/// <summary>

// Disables the dialog Ok button until the file upload is complete.

/// </summary>

public void postRun()
{
super();
var formRun = this.dialog().dialogForm().formRun();

FileUpload fileUpload = formRun.control(formRun.controlId(FileUploadName));

fileUpload.notifyUploadCompleted += eventhandler(this.uploadCompleted);

this.setDialogOkButtonEnabled(formRun, false);

}

}

Service Class

/// <summary>
///    The <c>KGSPMIConcurExpenseManualService</c> class acts as the service for the
///    <c>ConcurExpenseManual</c> class.
/// </summary>
class KGSPMIConcurExpenseManualService extends SysOperationServiceBase
{
    container                               conRecord;
    KGSPMIIntegrationParameters             integrationParameters;
    int                                     journalLinescnt;
    LedgerJournalName                       ledgerJournalName;
    LedgerJournalTable                      ledgerJournalTableLoc, ledgerJournalTablePost;
    KGSPMIPostConcur                        postConcur;
    LedgerJournalCheckPost                  ledgerJournalCheckPost;
    MainAccount                             mainAccount;
    LedgerJournalTrans_Project              ledgerJournalTrans_Project;
    ProjId                                  projId;
    KGSPMIConcurExpenseParameterCredit      concurExpenseParameterCredit;
    str          glDescription;
    LedgerJournalEngine      ledgerJournalEngine =  new LedgerJournalEngine();
   
    #Define.ReportCustom14(55)
    #Define.ReportCustom15(56)
    #Define.ReportID(19)
    #Define.BatchID(2)
    #Define.AmountDueEmployee(319)
    #Define.AmountDueCompanyCard(320)
    #Define.JournalAccountCode(167)
    #Define.JournalDebitorCredit(168)
    #Define.NetTaxAmount(247)
    #Define.ReimbursementCurrencyAlphaISE(22)
    #Define.EmployeeFirstName(7)
    #Define.ReportPaymentProcessingDate(26)
    #Define.ReportOrgUnit2(36)
    #Define.ReportOrgUnit3(37)
    #Define.ReportOrgUnit4(38)
    #Define.ReportEntryDescription(69)
    #Define.EmployeeID(5)
    #Define.CreditCardTransactionReferenceNumber(133)
    #Define.MiddleInitial(8)
    #Define.EmployeeLastName(6)
    /// <summary>
    ///    The <c>initiateProcess</c> Method acts as the Contract method for the
    ///    <c>ConcurExpenseManual</c> class.
    /// </summary>
    public void initiateProcess(KGSPMIManualFileReadCSVContract _contract)
    {
        System.IO.StreamReader          streamReader;
        str                             strRecord, firstRecord;
        LedgerJournalTrans              ledgerJournalTransReportID;
        integrationParameters = KGSPMIIntegrationParameters::find();
        delete_from postConcur;
        conRecord       = conNull();
        streamReader    = new System.IO.StreamReader(_contract.parmStream());
        firstRecord     = streamReader.ReadLine();//Skip first record header
        try
        {
            ttsbegin;
            if(!integrationParameters.ConcurExpensePerfectLedgerJournalNameId)//Checking the parameter field
            {
                throw Error("@KGSPMI:KGSPMIConcurExpenseParamValidationTxt");
            }
            strRecord           = streamReader.ReadLine();
            ledgerJournalName   =   LedgerJournalName::find(integrationParameters.ConcurExpensePerfectLedgerJournalNameId);
            while(!System.String::IsNullOrEmpty(strRecord))
            {
                conRecord = str2con(strRecord,'|');
                if (conRecord)
                {
                    if(conPeek(conRecord, #EmployeeFirstName))
                    {
                        glDescription = strFmt("%1", conPeek(conRecord, #EmployeeFirstName));
                    }
                    if(conPeek(conRecord, #MiddleInitial))
                    {
                        glDescription += strFmt(" %1", conPeek(conRecord, #MiddleInitial));
                    }
                    if(conPeek(conRecord, #EmployeeLastName))
                    {
                        glDescription += strFmt(" %1", conPeek(conRecord, #EmployeeLastName));
                    }
                   
     select count(RecId) from ledgerJournalTransReportID
      where ledgerJournalTransReportID.Invoice == conPeek(conRecord, #ReportID); //find the existing invoice
                    if(ledgerJournalTransReportID.RecId == 0)
                    {
                        if(conPeek(conRecord, #ReportCustom14))//Finding ProjectID
                        {
                            if(this.validateProjID(conPeek(conRecord, #ReportCustom14)))
                            {
                                this.createLedgerJournalHeader(ledgerJournalName);
                                this.createLedgerJournalLines(ledgerJournalName, ledgerJournalTableLoc.JournalNum);
                                postConcur = KGSPMIPostConcur::find(ledgerJournalTableLoc.JournalNum);
                                if(!postConcur)
                                {
                                    postConcur.JournalNum   =   ledgerJournalTableLoc.JournalNum;
                                    postConcur.insert();
                                }
                            }
       else
                            {
                                throw Error(strFmt("@KGSPMI:KGSPMIProjectIDValidate", conPeek(conRecord, #ReportCustom14)));
                            }
                        }
      else
                        {
                            this.createLedgerJournalHeader(ledgerJournalName);
                            this.createLedgerJournalLines(ledgerJournalName, ledgerJournalTableLoc.JournalNum);
                            postConcur = KGSPMIPostConcur::find(ledgerJournalTableLoc.JournalNum);
                            if(!postConcur)
                            {
                                postConcur.JournalNum   =   ledgerJournalTableLoc.JournalNum;
                                postConcur.insert();
                            }
                        }
                    }
                    else
                    {
                        select firstonly ledgerJournalTransReportID
       where ledgerJournalTransReportID.Invoice == conPeek(conRecord, #ReportID);
                        this.createLedgerJournalLines(ledgerJournalName, ledgerJournalTransReportID.JournalNum);
                    }
                }
                strRecord = streamReader.ReadLine();
            }
            ttscommit;
            while select JournalNum from postConcur
            {
                ledgerJournalTablePost  =   LedgerJournalTable::find(postConcur.JournalNum);
                ledgerJournalCheckPost  =   LedgerJournalCheckPost::newLedgerJournalTable(ledgerJournalTablePost, NoYes::Yes);
                ledgerJournalCheckPost.runOperation();
            }
            info(strFmt("@KGSPMI:KGSPMINumberOfJouLinesInserted", journalLinescnt));
        }
        catch
        {
            error(strFmt("@KGSPMI:KGSPMIConcurExpenseCreationErrorTxt", ledgerJournalTableLoc.JournalNum));
        }
    }
    /// <summary>
    /// Validates the Project Table record for ProjectID.
    /// </summary>
    /// <param name="_ProjID">
    /// The Project Table record which is to be validated.
    /// </param>
    /// <returns>
    /// true if the Project Table record is valid; otherwise, false.
    /// </returns>
    Public boolean validateProjID(str  _ProjID)
    {
        boolean  ret = true;
        ProjTable projTableLoc;
        select firstonly projTableLoc
   where projTableLoc.ProjId == _ProjID;
        if(projTableLoc)
        {
            ret = true;
        }
  else
        {
            ret = false;
        }
        return ret;
    }
 //Validate Project Status
    //Public boolean validateProjStatus(container  _con)
    //{
    //    boolean  ret = true;
    //    ProjTable projTableLoc;
    //    select firstonly projTableLoc where projTableLoc.ProjId == conPeek(_con, #ReportCustom14);
    //    if(projTableLoc.Status != ProjStatus::Completed)
    //        ret = true;
    //    else
    //        ret = false;
    //    return ret;
    //}
    /// <summary>
    /// Validates the VendTable record for Vendor On Hold.
    /// </summary>
    /// <param name="_vendID">
    /// The VendTable record which is to be validated.
    /// </param>
    /// <returns>
    /// true if the VendTable record is valid; otherwise, false.
    /// </returns>
    Public boolean validateVendorOnHold(str  _vendID)
    {
        boolean  ret = true;
        VendTable vendTable;
        select firstonly vendTable
   where vendTable.AccountNum == _vendID;
        if(vendTable.Blocked == CustVendorBlocked::No)
        {
            ret = true;
        }
        else
        {
            ret = false;
        }
        return ret;
    }
    /// <summary>
    /// Validates the VendTable record for VendorID.
    /// </summary>
    /// <param name="_vendID">
    /// The VendTable record which is to be validated.
    /// </param>
    /// <returns>
    /// true if the VendTable record is valid; otherwise, false.
    /// </returns>
    Public boolean validateVendorID(str _vendID)
    {
        boolean  ret = true;
        VendTable vendTable;
        select firstonly vendTable
   where vendTable.AccountNum == _vendID;
        if(vendTable)
        {
            ret = true;
        }
        else
        {
            ret = false;
        }
        return ret;
    }
    /// <summary>
    /// Creates LedgerJournalHeader records in <c>ledgerJournalTable</c>.
    /// </summary>
    /// <param name="_ledgerJournalName">
    /// The <c>LedgerJournalName</c> record.
    /// </param>
    public void createLedgerJournalHeader(LedgerJournalName   _ledgerJournalName)
    {
        ledgerJournalTableLoc.clear();
        ledgerJournalTableLoc.initValue();
        ledgerJournalTableLoc.initFromLedgerJournalName(_ledgerJournalName.JournalName);
        ledgerJournalTableLoc.JournalName   =   _ledgerJournalName.JournalName;
        ledgerJournalTableLoc.Name          =   strFmt("%1-%2-%3",conPeek(conRecord, #ReportID), conPeek(conRecord, #BatchID), glDescription);
        ledgerJournalTableLoc.JournalNum    =   NumberSeq::newGetNum(LedgerParameters::numRefJournalNum()).num();
        if(ledgerJournalTableLoc.validateWrite())
        {
            ledgerJournalTableLoc.insert();
        }
        else
        {
            Throw Exception::Error;
        }
    }
    /// <summary>
    /// Creates LedgerJournalTrans_Project records in <c>LedgerJournalTrans_Project</c>.
    /// </summary>
    /// <param name="_ledgerJournalTrans">
    /// The <c>LedgerJournalTrans</c> record.
    /// </param>
    /// /// <param name="_projCategoryID">
    /// The <c>str</c> record.
    /// </param>
    /// /// <param name="_projID">
    /// The <c>ProjId</c> record.
    /// </param>
    public  void createLedgerJournalTrans_Project(LedgerJournalTrans  _ledgerJournalTrans, str  _projCategoryID, ProjId  _projID)
    {
        DimensionAttributeValueCombination          dimensionAttributeValueCombination;
        TrvCostType                                 costType;
        CategoryTable                               categoryTable;
        ProjLineProperty       projLineProperty;
        ProjTable         projTableLoc;
        select firstonly LinePropertyId from projLineProperty;
        select firstonly projTableLoc
   where projTableLoc.ProjId == _projID;
        select firstonly ledgerJournalTrans_Project
   where ledgerJournalTrans_Project.RefRecId == _ledgerJournalTrans.RecId;
        if(!ledgerJournalTrans_Project)
        {
            select firstonly mainAccount
    where mainAccount.MainAccountId == _projCategoryID;
            if(mainAccount)
            {
                select firstonly dimensionAttributeValueCombination
     where dimensionAttributeValueCombination.DisplayValue == mainAccount.MainAccountId;
                if(dimensionAttributeValueCombination)
                {
                    select firstonly costType
      where costType.LedgerDimension      == dimensionAttributeValueCombination.RecId;
                    select firstonly categoryTable
      where categoryTable.CategoryId == costType.CostType;
                }
            }
            // Set the project specific journal fields.
            ledgerJournalTrans_Project.clear();
            ledgerJournalTrans_Project.RefRecId      = _ledgerJournalTrans.RecId;
            ledgerJournalTrans_Project.ProjId      = _ledgerJournalTrans.parmAccount();
            ledgerJournalTrans_Project.CategoryId     = categoryTable.CategoryId;
            ledgerJournalTrans_Project.Module      =   ModuleAxapta::Project;
            ledgerJournalTrans_Project.LinePropertyId    = projLineProperty.LinePropertyId;
            ledgerJournalTrans_Project.SalesCurrencyId    = ProjInvoiceTable::find(projTableLoc.ProjInvoiceProjId).CurrencyId;
            ledgerJournalTrans_Project.ProjTransDate    = _ledgerJournalTrans.TransDate;
            ledgerJournalTrans_Project.Qty       = 1;
            if (!ledgerJournalTrans_Project.SalesCurrencyId)
            {
                if (projTableLoc.CustAccount)
                {
                    ledgerJournalTrans_Project.SalesCurrencyId  = CustTable::find(projTableLoc.CustAccount).Currency;
                }
                else
                {
                    ledgerJournalTrans_Project.SalesCurrencyId  = CompanyInfoHelper::standardCurrency();
                }
            }
            ledgerJournalTrans_Project.CostPrice     = _ledgerJournalTrans.AmountCurDebit;
            ledgerJournalTrans_Project.TaxGroupSales    = _ledgerJournalTrans.TaxGroup;
            ledgerJournalTrans_Project.TaxItemGroupSales   = _ledgerJournalTrans.TaxItemGroup;
            ledgerJournalTrans_Project.insert();
        }
    }
    /// <summary>
    /// Creates LedgerJournalTrans lines records in <c>LedgerJournalTrans</c>.
    /// </summary>
    /// <param name="_ledgerJournalName">
    /// The <c>LedgerJournalName</c> record.
    /// </param>
    /// /// <param name="_ledgerJournalId">
    /// The <c>LedgerJournalId</c> record.
    /// </param>
    public void createLedgerJournalLines(LedgerJournalName   _ledgerJournalName, LedgerJournalId   _ledgerJournalId)
    {
        LedgerJournalTrans      ledgerJournalTrans;
        NumberSeq               numberSeq;
        NumberSequenceTable     numberSeqTable;
        Voucher                 voucher;
        container               acctPattern, acctPatternOffset;
        ProjTable               projTable;
        str                     defaultDimensionDisplayValue, projCategoryID, creditCardReferenceValue, mainAccountName;
        str                     creditCardReference = conPeek(conRecord, #CreditCardTransactionReferenceNumber);
        VendTable    vendTable;
        str      offsetDepartment, offsetAmex, offsetPcard;
        str      AirfareCaptial = 'Airfare';
        str      airfareSmall = 'airfare';
        str      amex   = 'Amex';
        str      debitValue  = 'DR';
        str      offsetDepartmentValue = '0000';
        //Lines
        projCategoryID    =   conPeek(conRecord, #ReportCustom15);
        creditCardReferenceValue    =   subStr(creditCardReference, strLen(creditCardReference) -3, 4);
        vendTable     = VendTable::find(conPeek(conRecord, #EmployeeID));
        if(conPeek(conRecord, #JournalAccountCode))
        {
            defaultDimensionDisplayValue     =   strFmt("%1", conPeek(conRecord, #JournalAccountCode));
        }
        if (conPeek(conRecord, #ReportOrgUnit2) != 0)
        {
            defaultDimensionDisplayValue += strFmt("-%1", conPeek(conRecord, #ReportOrgUnit2));
        }
        if (conPeek(conRecord, #ReportOrgUnit3) != 0)
        {
            defaultDimensionDisplayValue += strFmt("-%1", conPeek(conRecord, #ReportOrgUnit3));
        }
        if (conPeek(conRecord, #ReportOrgUnit4) != 0)
        {
            defaultDimensionDisplayValue += strFmt("-%1", conPeek(conRecord, #ReportOrgUnit4));
        }
        if (conPeek(conRecord, #ReportOrgUnit2) != 0)
        {
            offsetDepartment = strFmt("%1", conPeek(conRecord, #ReportOrgUnit2));
        }
  else
        {
            offsetDepartment = offsetDepartmentValue;
        }
        //checking projectID based on ReportCustom14
        select firstonly projTable
   where projTable.ProjId == conPeek(conRecord, #ReportCustom14);
        if(projTable)
        {
            //Checking CorporateCard
            if(conPeek(conRecord, #AmountDueCompanyCard))
            {
                //Checking AmexCard
                mainAccount = MainAccount::findByMainAccountId(conPeek(conRecord, #JournalAccountCode));
                mainAccountName = mainAccount.Name;
                if(strScan(mainAccountName, AirfareCaptial, 1, strLen(mainAccountName)) || strScan(mainAccountName, airfareSmall, 1, strLen(mainAccountName)))
                {
                    ledgerJournalTrans.clear();
                    ledgerJournalTrans.initValue();
                    ledgerJournalTrans.JournalNum               =   _ledgerJournalId;
                    ledgerJournalTrans.TransDate                =   str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    select firstonly numberSeqTable
      where numberSeqTable.RecId == _ledgerJournalName.NumberSequenceTable;
                    if(numberSeqTable && !voucher)
                    {
                        numberSeq   =   NumberSeq::newGetVoucherFromCode(numberSeqTable.NumberSequence);
                        voucher     =   numberSeq.voucher();
                    }
                    ledgerJournalTrans.Voucher                  =   voucher;
                    ledgerJournalTrans.AccountType              =   LedgerJournalACType::Ledger;
                    acctPattern                                 =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(defaultDimensionDisplayValue);
                    ledgerJournalTrans.LedgerDimension          =   KGSPMIDimensionUtility::generateLedgerDimension(acctPattern);
                   
     if(creditCardReferenceValue)
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("@KGSPMI:KGSPMIAmexString", conPeek(conRecord, #ReportID), glDescription, creditCardReferenceValue);
                    }
                    else
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("%1-%2", conPeek(conRecord, #ReportID), glDescription);
                    }
                    if(conPeek(conRecord, #JournalDebitorCredit) == debitValue)
                    {
                        ledgerJournalTrans.AmountCurDebit       =   conPeek(conRecord, #NetTaxAmount);
                        ledgerJournalTrans.AmountCurCredit      =   0;
                    }
                    else
                    {
                        ledgerJournalTrans.AmountCurDebit       =   0;
                        ledgerJournalTrans.AmountCurCredit      =   conPeek(conRecord, #NetTaxAmount);
                    }
                    ledgerJournalTrans.OffsetAccountType        =   LedgerJournalACType::Ledger;
                    select firstonly concurExpenseParameterCredit
                        where concurExpenseParameterCredit.PaymentMode == amex;
                    offsetAmex         = strFmt("%1-%2", concurExpenseParameterCredit.AccountNumber, offsetDepartment);
                    acctPatternOffset                           =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(offsetAmex);
                    ledgerJournalTrans.OffsetLedgerDimension    =   KGSPMIDimensionUtility::generateLedgerDimension(acctPatternOffset);
                    ledgerJournalTrans.CurrencyCode             =   conPeek(conRecord,#ReimbursementCurrencyAlphaISE);
                    ledgerJournalEngine.accountNumModified(ledgerJournalTrans);
                    ledgerJournalEngine.accountModified(ledgerJournalTrans);
                    ledgerJournalTrans.Invoice                  =   conPeek(conRecord, #ReportID);
                    ledgerJournalTrans.Due      = str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    ledgerJournalTrans.TransactionType   = LedgerTransType::GeneralJournal;
                    if(ledgerJournalTrans.validateWrite())
                    {
                        ledgerJournalTrans.insert();
                        journalLinescnt++;
                    }
                    else
                    {
                        Throw Exception::Error;
                    }
                }
                //Pcard
                else
                {
                    ledgerJournalTrans.clear();
                    ledgerJournalTrans.initValue();
                    ledgerJournalTrans.JournalNum               =   _ledgerJournalId;
                    ledgerJournalTrans.TransDate                =   str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    select firstonly numberSeqTable
      where numberSeqTable.RecId == _ledgerJournalName.NumberSequenceTable;
                    if(numberSeqTable && !voucher)
                    {
                        numberSeq   =   NumberSeq::newGetVoucherFromCode(numberSeqTable.NumberSequence);
                        voucher     =   numberSeq.voucher();
                    }
                    ledgerJournalTrans.Voucher                  =   voucher;
                    ledgerJournalTrans.AccountType              =   LedgerJournalACType::Ledger;
                    acctPattern                                 =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(defaultDimensionDisplayValue);
                    ledgerJournalTrans.LedgerDimension          =   KGSPMIDimensionUtility::generateLedgerDimension(acctPattern);
                    if(creditCardReferenceValue)
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("@KGSPMI:KGSPMIPCardString", conPeek(conRecord, #ReportID), glDescription, creditCardReferenceValue);
                    }
                    else
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("%1-%2", conPeek(conRecord, #ReportID), glDescription);
                    }
                    if(conPeek(conRecord, #JournalDebitorCredit) == debitValue)
                    {
                        ledgerJournalTrans.AmountCurDebit       =   conPeek(conRecord, #NetTaxAmount);
                        ledgerJournalTrans.AmountCurCredit      =   0;
                    }
                    else
                    {
                        ledgerJournalTrans.AmountCurDebit       =   0;
                        ledgerJournalTrans.AmountCurCredit      =   conPeek(conRecord, #NetTaxAmount);
                    }
                    ledgerJournalTrans.OffsetAccountType        =   LedgerJournalACType::Ledger;
                    select firstonly concurExpenseParameterCredit
                        where concurExpenseParameterCredit.PaymentMode != amex;
                    offsetPcard         = strFmt("%1-%2", concurExpenseParameterCredit.AccountNumber, offsetDepartment);
                    acctPatternOffset                           =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(offsetPcard);
                    ledgerJournalTrans.OffsetLedgerDimension    =   KGSPMIDimensionUtility::generateLedgerDimension(acctPatternOffset);
                    ledgerJournalTrans.CurrencyCode             =   conPeek(conRecord,#ReimbursementCurrencyAlphaISE);
                    ledgerJournalEngine.accountNumModified(ledgerJournalTrans);
                    ledgerJournalEngine.accountModified(ledgerJournalTrans);
                    ledgerJournalTrans.Invoice                  =   conPeek(conRecord, #ReportID);
                    ledgerJournalTrans.Due      = str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    ledgerJournalTrans.TransactionType   = LedgerTransType::GeneralJournal;
                    if(ledgerJournalTrans.validateWrite())
                    {
                        ledgerJournalTrans.insert();
                        journalLinescnt++;
                    }
                    else
                    {
                        Throw Exception::Error;
                    }
                }
            }
            //Vendor
            else
            {
                if(this.validateVendorID(conPeek(conRecord, #EmployeeID)))
                {
                    if(this.validateVendorOnHold(conPeek(conRecord, #EmployeeID)))
                    {
                        ledgerJournalTrans.clear();
                        ledgerJournalTrans.initValue();
                        ledgerJournalTrans.JournalNum                   =   _ledgerJournalId;
                        ledgerJournalTrans.TransDate                    =   str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                        select firstonly numberSeqTable
                            where numberSeqTable.RecId == _ledgerJournalName.NumberSequenceTable;
                        if(numberSeqTable && !voucher)
                        {
                            numberSeq   =   NumberSeq::newGetVoucherFromCode(numberSeqTable.NumberSequence);
                            voucher     =   numberSeq.voucher();
                        }
                        ledgerJournalTrans.Voucher                      =   voucher;
                        ledgerJournalTrans.AccountType                  =   LedgerJournalACType::Project;
                        projId                                          =   conPeek(conRecord, #ReportCustom14);
                        ledgerJournalTrans.LedgerDimension              =   KGSPMIDimensionUtility::generateDynamicAccount(LedgerJournalACType::Project, projId);
                        ledgerJournalTrans.DefaultDimension             =   projTable.DefaultDimension;
                        if(creditCardReferenceValue)
                        {
                            ledgerJournalTrans.Txt      =   strFmt("%1-%2-%3", conPeek(conRecord, #ReportID), glDescription, creditCardReferenceValue);
                        }
                        else
                        {
                            ledgerJournalTrans.Txt      =   strFmt("%1-%2", conPeek(conRecord, #ReportID), glDescription);
                        }
                        if(conPeek(conRecord, #JournalDebitorCredit) == debitValue)
                        {
                            ledgerJournalTrans.AmountCurDebit           =   conPeek(conRecord, #NetTaxAmount);
                            ledgerJournalTrans.AmountCurCredit          =   0;
                        }
                        else
                        {
                            ledgerJournalTrans.AmountCurDebit           =   0;
                            ledgerJournalTrans.AmountCurCredit          =   conPeek(conRecord, #NetTaxAmount);
                        }
                        ledgerJournalTrans.OffsetAccountType            =   LedgerJournalACType::Vend;
                        ledgerJournalTrans.OffsetLedgerDimension        =   KGSPMIDimensionUtility::generateDynamicAccount(LedgerJournalACType::Vend, vendTable.AccountNum);
                        ledgerJournalTrans.OffsetDefaultDimension  = vendTable.DefaultDimension;
                        ledgerJournalTrans.CurrencyCode                 =   conPeek(conRecord,#ReimbursementCurrencyAlphaISE);
                        ledgerJournalEngine.accountNumModified(ledgerJournalTrans);
                        ledgerJournalEngine.accountModified(ledgerJournalTrans);
                        ledgerJournalTrans.TaxGroup      = vendTable.TaxGroup;
                        ledgerJournalTrans.PaymMode      = vendTable.PaymMode;
                        ledgerJournalTrans.Invoice                      =   conPeek(conRecord, #ReportID);
                        ledgerJournalTrans.Due       = str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                        ledgerJournalTrans.TransactionType    = LedgerTransType::GeneralJournal;
                        ledgerJournalTrans.Approved      = NoYes::Yes;
                        if(ledgerJournalTrans.validateWrite())
                        {
                            ledgerJournalTrans.insert();
                            this.createLedgerJournalTrans_Project(ledgerJournalTrans, projCategoryID,projId);
                            journalLinescnt++;
                        }
                        else
                        {
                            Throw Exception::Error;
                        }
                    }
     else
                    {
                        throw Error(strFmt("@KGSPMI:KGSPMIVendorIDonHold",conPeek(conRecord, #EmployeeID)));
                    }
                }
    else
                {
                    throw Error(strFmt("@KGSPMI:KGSPMIVendorIDValidate",conPeek(conRecord, #EmployeeID)));
                }
            }
        }
        //Not a ProjectID
        else
        {
            //Checking CorporateCard
            if(conPeek(conRecord, #AmountDueCompanyCard))
            {
                mainAccount =   MainAccount::findByMainAccountId(conPeek(conRecord, #JournalAccountCode));
                mainAccountName = mainAccount.Name;
                if(strScan(mainAccountName, AirfareCaptial, 1, strLen(mainAccountName)) || strScan(mainAccountName, airfareSmall, 1, strLen(mainAccountName)))
                {
                    ledgerJournalTrans.clear();
                    ledgerJournalTrans.initValue();
                    ledgerJournalTrans.JournalNum               =   _ledgerJournalId;
                    ledgerJournalTrans.TransDate                =   str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    select firstonly numberSeqTable
      where numberSeqTable.RecId == _ledgerJournalName.NumberSequenceTable;
                    if(numberSeqTable && !voucher)
                    {
                        numberSeq   =   NumberSeq::newGetVoucherFromCode(numberSeqTable.NumberSequence);
                        voucher     =   numberSeq.voucher();
                    }
                    ledgerJournalTrans.Voucher                  =   voucher;
                    ledgerJournalTrans.AccountType              =   LedgerJournalACType::Ledger;
                    acctPattern                                 =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(defaultDimensionDisplayValue);
                    ledgerJournalTrans.LedgerDimension          =   KGSPMIDimensionUtility::generateLedgerDimension(acctPattern);
                    if(creditCardReferenceValue)
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("@KGSPMI:KGSPMIAmexString", conPeek(conRecord, #ReportID), glDescription, creditCardReferenceValue);
                    }
                    else
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("%1-%2", conPeek(conRecord, #ReportID), glDescription);
                    }
                    if(conPeek(conRecord, #JournalDebitorCredit) == debitValue)
                    {
                        ledgerJournalTrans.AmountCurDebit       =   conPeek(conRecord, #NetTaxAmount);
                        ledgerJournalTrans.AmountCurCredit      =   0;
                    }
                    else
                    {
                        ledgerJournalTrans.AmountCurDebit       =   0;
                        ledgerJournalTrans.AmountCurCredit      =   conPeek(conRecord, #NetTaxAmount);
                    }
                    ledgerJournalTrans.OffsetAccountType        =   LedgerJournalACType::Ledger;
                    select firstonly concurExpenseParameterCredit
                        where concurExpenseParameterCredit.PaymentMode == amex;
                    offsetAmex                                 = strFmt("%1-%2", concurExpenseParameterCredit.AccountNumber, offsetDepartment);
                    acctPatternOffset                           =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(offsetAmex);
                    ledgerJournalTrans.OffsetLedgerDimension    =   KGSPMIDimensionUtility::generateLedgerDimension(acctPatternOffset);
                    ledgerJournalTrans.CurrencyCode             =   conPeek(conRecord,#ReimbursementCurrencyAlphaISE);
                    ledgerJournalEngine.accountNumModified(ledgerJournalTrans);
                    ledgerJournalEngine.accountModified(ledgerJournalTrans);
                    ledgerJournalTrans.Invoice                  =   conPeek(conRecord, #ReportID);
                    ledgerJournalTrans.Due      = str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    ledgerJournalTrans.TransactionType   = LedgerTransType::GeneralJournal;
                    if(ledgerJournalTrans.validateWrite())
                    {
                        ledgerJournalTrans.insert();
                        journalLinescnt++;
                    }
                    else
                    {
                        Throw Exception::Error;
                    }
                }
                //Pcard
                else
                {
                    ledgerJournalTrans.clear();
                    ledgerJournalTrans.initValue();
                    ledgerJournalTrans.JournalNum               =   _ledgerJournalId;
                    ledgerJournalTrans.TransDate                =   str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    select firstonly numberSeqTable
      where numberSeqTable.RecId == _ledgerJournalName.NumberSequenceTable;
                    if(numberSeqTable && !voucher)
                    {
                        numberSeq   =   NumberSeq::newGetVoucherFromCode(numberSeqTable.NumberSequence);
                        voucher     =   numberSeq.voucher();
                    }
                    ledgerJournalTrans.Voucher                  =   voucher;
                    ledgerJournalTrans.AccountType              =   LedgerJournalACType::Ledger;
                    acctPattern                                 =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(defaultDimensionDisplayValue);
                    ledgerJournalTrans.LedgerDimension          =   KGSPMIDimensionUtility::generateLedgerDimension(acctPattern);
                    if(creditCardReferenceValue)
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("@KGSPMI:KGSPMIPCardString", conPeek(conRecord, #ReportID), glDescription, creditCardReferenceValue);
                    }
                    else
                    {
                        ledgerJournalTrans.Txt                  =   strFmt("%1-%2", conPeek(conRecord, #ReportID), glDescription);
                    }
                    if(conPeek(conRecord, #JournalDebitorCredit) == debitValue)
                    {
                        ledgerJournalTrans.AmountCurDebit       =   conPeek(conRecord, #NetTaxAmount);
                        ledgerJournalTrans.AmountCurCredit      =   0;
                    }
                    else
                    {
                        ledgerJournalTrans.AmountCurDebit       =   0;
                        ledgerJournalTrans.AmountCurCredit      =   conPeek(conRecord, #NetTaxAmount);
                    }
                    ledgerJournalTrans.OffsetAccountType        =   LedgerJournalACType::Ledger;
                    select firstonly concurExpenseParameterCredit
                        where concurExpenseParameterCredit.PaymentMode != amex;
                    offsetPcard         = strFmt("%1-%2", concurExpenseParameterCredit.AccountNumber, offsetDepartment);
                    acctPatternOffset                           =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(offsetPcard);
                    ledgerJournalTrans.OffsetLedgerDimension    =   KGSPMIDimensionUtility::generateLedgerDimension(acctPatternOffset);
                    ledgerJournalTrans.CurrencyCode             =   conPeek(conRecord,#ReimbursementCurrencyAlphaISE);
                    ledgerJournalEngine.accountNumModified(ledgerJournalTrans);
                    ledgerJournalEngine.accountModified(ledgerJournalTrans);
                    ledgerJournalTrans.Invoice                  =   conPeek(conRecord, #ReportID);
                    ledgerJournalTrans.Due      = str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                    ledgerJournalTrans.TransactionType   = LedgerTransType::GeneralJournal;
                    if(ledgerJournalTrans.validateWrite())
                    {
                        ledgerJournalTrans.insert();
                        journalLinescnt++;
                    }
                    else
                    {
                        Throw Exception::Error;
                    }
                }
            }
            //Vendor
            else
            {
                if(this.validateVendorID(conPeek(conRecord, #EmployeeID)))
                {
                    if(this.validateVendorOnHold(conPeek(conRecord, #EmployeeID)))
                    {
                        ledgerJournalTrans.clear();
                        ledgerJournalTrans.initValue();
                        ledgerJournalTrans.JournalNum                   =   _ledgerJournalId;
                        ledgerJournalTrans.TransDate                    =   str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                        select firstonly numberSeqTable
       where numberSeqTable.RecId == _ledgerJournalName.NumberSequenceTable;
                        if(numberSeqTable && !voucher)
                        {
                            numberSeq   =   NumberSeq::newGetVoucherFromCode(numberSeqTable.NumberSequence);
                            voucher     =   numberSeq.voucher();
                        }
                        ledgerJournalTrans.Voucher                      =   voucher;
                        ledgerJournalTrans.AccountType                  =   LedgerJournalACType::Ledger;
                        acctPattern          =   KGSPMIDimensionUtility::getLedgerDimContainerFromLedgerFormat(defaultDimensionDisplayValue);
                        ledgerJournalTrans.LedgerDimension    =   KGSPMIDimensionUtility::generateLedgerDimension(acctPattern);
                        if(creditCardReferenceValue)
                        {
                            ledgerJournalTrans.Txt      =   strFmt("%1-%2-%3", conPeek(conRecord, #ReportID), glDescription, creditCardReferenceValue);
                        }
                        else
                        {
                            ledgerJournalTrans.Txt      =   strFmt("%1-%2", conPeek(conRecord, #ReportID), glDescription);
                        }
                        if(conPeek(conRecord, #JournalDebitorCredit) == debitValue)
                        {
                            ledgerJournalTrans.AmountCurDebit           =   conPeek(conRecord, #NetTaxAmount);
                            ledgerJournalTrans.AmountCurCredit          =   0;
                        }
                        else
                        {
                            ledgerJournalTrans.AmountCurDebit           =   0;
                            ledgerJournalTrans.AmountCurCredit          =   conPeek(conRecord, #NetTaxAmount);
                        }
                        ledgerJournalTrans.OffsetAccountType            =   LedgerJournalACType::Vend;
                        vendTable          = VendTable::find(conPeek(conRecord, #EmployeeID));
                        ledgerJournalTrans.OffsetLedgerDimension        =   KGSPMIDimensionUtility::generateDynamicAccount(LedgerJournalACType::Vend, vendTable.AccountNum);
                        ledgerJournalTrans.OffsetDefaultDimension  = vendTable.DefaultDimension;
                        ledgerJournalTrans.CurrencyCode                 =   conPeek(conRecord,#ReimbursementCurrencyAlphaISE);
                        ledgerJournalEngine.accountNumModified(ledgerJournalTrans);
                        ledgerJournalEngine.accountModified(ledgerJournalTrans);
                        ledgerJournalTrans.TaxGroup      = vendTable.TaxGroup;
                        ledgerJournalTrans.PaymMode      = vendTable.PaymMode;
                        ledgerJournalTrans.Invoice                      =   conPeek(conRecord, #ReportID);
                        ledgerJournalTrans.Due       = str2Date(conPeek(conRecord, #ReportPaymentProcessingDate), 213);
                        ledgerJournalTrans.TransactionType    = LedgerTransType::GeneralJournal;
                        ledgerJournalTrans.Approved      = NoYes::Yes;
                        if(ledgerJournalTrans.validateWrite())
                        {
                            ledgerJournalTrans.insert();
                            this.createLedgerJournalTrans_Project(ledgerJournalTrans, projCategoryID,projId);
                            journalLinescnt++;
                        }
                        else
                        {
                            Throw Exception::Error;
                        }
                    }
                    else
                    {
                        throw Error(strFmt("@KGSPMI:KGSPMIVendorIDonHold",conPeek(conRecord, #EmployeeID)));
                    }
                }
                else
                {
                    throw Error(strFmt("@KGSPMI:KGSPMIVendorIDValidate",conPeek(conRecord, #EmployeeID)));
                }
            }
        }
    }
}


Controller Class


/// <summary>
/// The <c>KGSPMIConcurExpenseManualController</c> class acts as the controller for the
/// <c>KGSPMIConcurExpenseManual</c> class.
/// </summary>
class KGSPMIConcurExpenseManualController extends SysOperationServiceController
{
/// <summary>


/// Initializes a new instance of the <c>KGSPMIConcurExpenseManualController</c> class.

/// </summary>

/// <remarks>

/// The <c>SysOperationServiceController.initializeFromArgs</c> method can also be used to initialize a

/// controller. If those options for initialization are used the default values can be used in the

/// constructor.

/// </remarks>

protected void new()
{
super(classstr(KGSPMIConcurExpenseManualService),methodStr(KGSPMIConcurExpenseManualService, initiateProcess), SysOperationExecutionMode::Synchronous); }


/// <summary>

/// Gets a caption for a record based on the title fields of the record.

/// </summary>

/// <returns>

/// A caption for the specified record.

/// </returns>

public ClassDescription caption()
{ return "@KGSPMI:KGSPMIConcurExpenseImportCaption"; }



/// <summary>

/// Gets a default caption for a record based on the title fields of the record.

/// </summary>

/// <returns>

/// A caption for the specified record.

/// </returns>

protected ClassDescription defaultCaption() {

return "@KGSPMI:KGSPMIConcurExpenseImportDescription"; }
 

/// <summary>

/// Initailzes the controller, assigns parameter values and runs the SRS report.

/// </summary>

/// <param name="_args">

/// The <c>Args</c> object.

/// </param>

public static void main(Args _args) {
KGSPMIConcurExpenseManualController controller;


controller = new KGSPMIConcurExpenseManualController();

controller.startOperation(); }

}


KGSPMIIntegrationDataImportExportSettings

/// <summary>
/// Extract settings for PMI integration based on integration type.
/// </summary>
class KGSPMIIntegrationDataImportExportSettings
{
    str     outfilePath, inFilePath, successFilePath, errorFilePath;
   
    public static boolean isPMIIntegration(DMFEntityName _entity)
    {
        boolean ret;
        switch(_entity)
        {
            case tableId2PName(tableNum(KGSPMIConcurVendorsEntity)):
                ret = true;
                break;
            case tableId2PName(tableNum(KGSPMIProdMasterPriceTrackerEntity)):
                ret = true;
                break;
            case tableId2PName(tableNum(KGSPMIPriceDiscAdm)):
                ret = true;
                break;
            //Concur dimension
            case tableId2PName(tableNum(KGSPmiDimensionAttributeValueEntity)):
                ret = true;
                break;
        }
        return ret;
    }
    public static KGSPMIIntegrationType getIntegrationTypeFromDataEntity(DMFEntityName _entity)
    {
        KGSPMIIntegrationType integrationType;
        switch(_entity)
        {
            case tableId2PName(tableNum(KGSPMIConcurVendorsEntity)):
                integrationType = KGSPMIIntegrationType::ConcurVendor;
                break;
            case tableId2PName(tableNum(KGSPMIProdMasterPriceTrackerEntity)):
                integrationType = KGSPMIIntegrationType::MagentoProduct;
                break;
            case tableId2PName(tableNum(KGSPMIPriceDiscAdm)):
                integrationType = KGSPMIIntegrationType::MagentoPrice;
                break;
            //Concur dimension
            case tableId2PName(tableNum(KGSPmiDimensionAttributeValueEntity)):
                integrationType = KGSPMIIntegrationType::ConcurDimension;
                break;
            default:
                throw error(strFmt("@KGSPMI:KGSPMIIntegrationTypeNotFoundForEntity",_entity));
        }
        return integrationType;
    }
    public static KGSPMIIntegrationDataImportExportSettings construct(KGSPMIIntegrationType _integrationType)
    {
       
        KGSPMIIntegrationDataImportExportSettings  integrationDataImportExportSettings;
        integrationDataImportExportSettings         = new KGSPMIIntegrationDataImportExportSettings();
       
        switch(_integrationType)
        {
            case KGSPMIIntegrationType::CRMInvoice:
                integrationDataImportExportSettings.validateAndConstructCRMInvoiceSettings();
                break;
            case KGSPMIIntegrationType::ConcurVendor:
                integrationDataImportExportSettings.validateAndConstructConcurVendorSettings();
                break;
            case KGSPMIIntegrationType::MagentoProduct:
                integrationDataImportExportSettings.validateAndConstructMagentoProductSettings();
                break;
            case KGSPMIIntegrationType::UltiproHRM:
                integrationDataImportExportSettings.validateAndConstructUltiproHRMSettings();
                break;
            case KGSPMIIntegrationType::MagentoPrice:
                integrationDataImportExportSettings.validateAndConstructMagentoPriceSettings();
                break;
            case KGSPMIIntegrationType::UltiproGLPayroll:
                integrationDataImportExportSettings.validateAndConstructUltiproGLSettings();
                break;
            case KGSPMIIntegrationType::DonorPerfectGL:
                integrationDataImportExportSettings.validateAndConstructDonorPerfectGLSettings();
                break;
            case KGSPMIIntegrationType::CRMPayment:
                integrationDataImportExportSettings.validateAndConstructCRMPaymentSettings();
                break;
            //Concur Dimension
            case KGSPMIIntegrationType::ConcurDimension:
                integrationDataImportExportSettings.validateAndConstructconcurDimensions();
                break;
            //concur Dimension
           

            case KGSPMIIntegrationType::ConcurExpenseGL:
                integrationDataImportExportSettings.validateAndConstructConcurExpenseGLSettings();
                break;
            case KGSPMIIntegrationType::CRMRevenueRecognition:
                integrationDataImportExportSettings.validateAndConstructCRMRevenueRecognitionGLSettings();
                break;

            default:
                throw error(strFmt("@KGSPMI:KGSPMIUnableToFetchIntegrationSetup",enum2Str(_integrationType)));
        }
        return integrationDataImportExportSettings;
    }
    public str parmOutFilePath(str _outfilePath = outfilePath)
    {
        outfilePath = _outfilePath;
        return outfilePath;
    }
    public str parmInFilePath(str _inFilePath = inFilePath)
    {
        inFilePath = _inFilePath;
        return inFilePath;
    }
    public str parmSuccessFilePath(str _successFilePath = successFilePath)
    {
        successFilePath = _successFilePath;
        return successFilePath;
    }
    public str parmErrorFilePath(str _errorFilePath = errorFilePath)
    {
        errorFilePath = _errorFilePath;
        return errorFilePath;
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for CRMInvoiceSettings File,Success and Error.
    /// </summary>
    public void validateAndConstructCRMInvoiceSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.CRMInFilePath || !integrationParametersLoc.CRMSuccessFilePath || !integrationParametersLoc.CRMErrorFilePath)
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::CRMInvoice)));
        }
        this.parmInFilePath(integrationParametersLoc.CRMInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.CRMSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.CRMErrorFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for ConcurVendorSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructConcurVendorSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.ConcurVendorOutFilePath )
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::ConcurVendor)));
        }
        this.parmOutFilePath(integrationParametersLoc.ConcurVendorOutFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for MagentoProductSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructMagentoProductSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.MagentoProdMasterOutputFilePath )
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::MagentoProduct)));
        }
        this.parmOutFilePath(integrationParametersLoc.MagentoProdMasterOutputFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for UltiproHRMSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructUltiproHRMSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.UltiproHRInFilePath || !integrationParametersLoc.UltiproHRSuccessFilePath || !integrationParametersLoc.UltiproHRErrorFilePath)
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::UltiproHRM)));
        }
        this.parmInFilePath(integrationParametersLoc.UltiproHRInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.UltiproHRSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.UltiproHRErrorFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for MagentoPriceSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructMagentoPriceSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.MagentoPriceAgreementOutputFilePath )
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::MagentoPrice)));
        }
        this.parmOutFilePath(integrationParametersLoc.MagentoPriceAgreementOutputFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for UltiproGLSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructUltiproGLSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.UltiproGLInFilePath || !integrationParametersLoc.UltiproGLSuccessFilePath || !integrationParametersLoc.UltiproGLErrorFilePath)
        {
            throw Error("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::UltiproGLPayroll));
        }
        this.parmInFilePath(integrationParametersLoc.UltiproGLInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.UltiproGLSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.UltiproGLErrorFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for DonorPerfectGLSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructDonorPerfectGLSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.DonorPerfectGLInFilePath || !integrationParametersLoc.DonorPerfectGLSuccessFilePath || !integrationParametersLoc.DonorPerfectGLErrorFilePath)
        {
            throw Error("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::DonorPerfectGL));
        }
        this.parmInFilePath(integrationParametersLoc.DonorPerfectGLInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.DonorPerfectGLSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.DonorPerfectGLErrorFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for CRMPaymentSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructCRMPaymentSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.CRMPaymentInFilePath || !integrationParametersLoc.CRMPaymentSuccessFilePath || !integrationParametersLoc.CRMPaymentErrorFilePath)
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::CRMPayment)));
        }
        this.parmInFilePath(integrationParametersLoc.CRMPaymentInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.CRMPaymentSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.CRMPaymentErrorFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for concurDimensions File,Success,Error.
    /// </summary>
    public void validateAndConstructconcurDimensions()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.ConcurDimensionOutputFilePath )
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::ConcurDimension)));
        }
        this.parmOutFilePath(integrationParametersLoc.ConcurDimensionOutputFilePath);
    }
    /// <summary>
    /// Validates the KGSPMIIntegrationParameters Table record for ConcurExpenseGLSettings File,Success,Error.
    /// </summary>
    public void validateAndConstructConcurExpenseGLSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if(!integrationParametersLoc.ConcurExpensePerfectGLInFilePath || !integrationParametersLoc.ConcurExpensePerfectGLSuccessFilePath || !integrationParametersLoc.ConcurExpenseGLErrorFilePath)
        {
            throw Error(strFmt("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::ConcurExpenseGL)));
        }
        this.parmInFilePath(integrationParametersLoc.ConcurExpensePerfectGLInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.ConcurExpensePerfectGLSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.ConcurExpenseGLErrorFilePath);
    }
    /// <summary>
    /// To validate CRM revenue recognition parameter setup
    /// </summary>
    public void validateAndConstructCRMRevenueRecognitionGLSettings()
    {
        KGSPMIIntegrationParameters     integrationParametersLoc = KGSPMIIntegrationParameters::find();
        if (!integrationParametersLoc.CRMRevenueRecognitionGLInFilePath || !integrationParametersLoc.CRMRevenueRecognitionGLSuccessFilePath || !integrationParametersLoc.CRMRevenueRecognitionGLErrorFilePath)
        {
            throw Error("@KGSPMI:KGSPMIIntegrationParameterMissingTxt", enum2Str(KGSPMIIntegrationType::CRMRevenueRecognition));
        }
        this.parmInFilePath(integrationParametersLoc.CRMRevenueRecognitionGLInFilePath);
        this.parmSuccessFilePath(integrationParametersLoc.CRMRevenueRecognitionGLSuccessFilePath);
        this.parmErrorFilePath(integrationParametersLoc.CRMRevenueRecognitionGLErrorFilePath);
    }
}

KGSPMIDimensionUtility

/// <summary>
/// Utility class for Dimensions.
/// </summary>
 
class KGSPMIDimensionUtility{
public static RefRecId generateDynamicAccount(LedgerJournalACType _type, str _account)


{


DimensionDynamicAccountServiceProvider dimensionDynamicAccountServiceProvider;DimensionAttributeValueContract ledgerContract;
DimensionStorageResult dimensionStorageResult;


DimensionDynamicAccountContract contract;


contract = new DimensionDynamicAccountContract();
contract.parmAccountType(_type);
contract.parmCompany(curExt());


ledgerContract = DimensionAttributeValueContract::construct(enum2Str(_type), _account);
contract.parmPrimaryDimensionAttributeValue(ledgerContract);
dimensionDynamicAccountServiceProvider = DimensionDynamicAccountServiceProvider::newForDynamicAccountContract(contract);

dimensionStorageResult = dimensionDynamicAccountServiceProvider.resolve();


return dimensionStorageResult.parmSavedRecId();
}


public static RefRecId generateLedgerDimension(container _con)
{


LedgerAccountContract LedgerAccountContract = new LedgerAccountContract();
DimensionAttributeValueContract ValueContract;
List valueContracts = new List(Types::Class);
dimensionAttributeValueCombination dimensionAttributeValueCombination;
int counter = 1;
LedgerRecId ledgerRecId;
DimensionStorage dimStorage;
LedgerAccountContract.parmMainAccount(conPeek(_con, counter));
counter++;


while(counter <= conlen(_con))
{
ValueContract = new DimensionAttributeValueContract();

//Add to list only when dimension value is available

if(conPeek(_con, (counter + 1)))
{
ValueContract.parmName(conPeek(_con, counter));
counter++;
ValueContract.parmValue(conPeek(_con, counter));
counter++;
valueContracts.addEnd(ValueContract);
}
}
LedgerAccountContract.parmValues(valueContracts);
dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);

dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());
ledgerRecId = dimensionAttributeValueCombination.RecId;

return ledgerRecId;
}
 

public static RefRecId generateDefaultDimension(container _con)
{
DimensionNameValueListContract dimensionNameValueListContract;

DimensionAttributeValueContract dimensionAttributeValueContract;
DimensionStorageResult dimensionStorageResult;
DimensionNameValueListServiceProvider dimensionNameValueListServiceProvider;
int counter = 1;
str name, value;
dimensionNameValueListContract = new DimensionNameValueListContract();
dimensionNameValueListContract.parmValues(new List(Types::Class));
while(counter <= conlen(_con)) {
name = conpeek(_con,counter);
counter++;
value = conpeek(_con,counter);
counter++;
dimensionAttributeValueContract = DimensionAttributeValueContract::construct(name, value); dimensionNameValueListContract.parmValues().addEnd(dimensionAttributeValueContract);
}



//resolve the dimension
dimensionNameValueListServiceProvider = DimensionNameValueListServiceProvider::newForDimensionNameValueListContract(dimensionNameValueListContract); dimensionStorageResult = dimensionNameValueListServiceProvider.resolve();
   
return dimensionStorageResult.parmSavedRecId(); }



public static str getDimensionDisplayValue(RefRecId _dimRecId) {
str displayValue;

DimensionAttributeValueSetItem dimSetItem;
while select DisplayValue from dimSetItem
order by dimSetItem.RecId
where dimSetItem.DimensionAttributeValueSet == _dimRecId {
displayValue += dimSetItem.DisplayValue + '-'; }
        return displayValue;


}
 

public static String255 getDimensionvalue(RefRecId _dimension, Name _dimName)
{
DimensionAttributeValueSetStorage dimStorage; dimStorage = DimensionAttributeValueSetStorage::find(_dimension);
return dimStorage.getDisplayValueByDimensionAttribute(DimensionAttribute::findByName(_dimName).RecId); }


public static container getLedgerDimContainerFromLedgerFormat(str _dispalyValue, DimensionDataEntityStructureType _dimensionDataEntityStructureType = DimensionDataEntityStructureType::DataEntityLedgerDimensionFormat) {
List dimensionNames;

ListEnumerator lstEnumdimensionNames;
container acctPattern, dimension;
int counter = 1;
dimensionNames = DimensionResolver::splitByDimensionIntegrationDelimiter(DimensionHierarchy::getDisplayStringDimensionIntegrationStructure(_dimensionDataEntityStructureType));
dimension = str2con_RU(_dispalyValue, '-'); acctPattern = conNull();
lstEnumdimensionNames = dimensionNames.getEnumerator();
while(lstEnumdimensionNames.moveNext()) {


if( lstEnumdimensionNames.current() == "@KGSPMI:KGSPMIMainAccount") {
acctPattern = conIns(acctPattern, 1, conPeek(dimension, counter));

}
else

{
if(conPeek(dimension, counter)) {
acctPattern = conIns(acctPattern, (conLen(acctPattern) + 1), lstEnumdimensionNames.current());


acctPattern = conIns(acctPattern, (conLen(acctPattern) + 1), conPeek(dimension, counter)); }
}
counter++;
}
return acctPattern;            }



public static boolean validateLedgerDimContainerFromLedgerFormat(str _dispalyValue, DimensionDataEntityStructureType _dimensionDataEntityStructureType = DimensionDataEntityStructureType::DataEntityLedgerDimensionFormat) {
List dimensionNames;

ListEnumerator lstEnumdimensionNames;
container dimension;
int counter = 1;
str dimensionValue;
boolean ret = true;
dimensionNames = DimensionResolver::splitByDimensionIntegrationDelimiter(DimensionHierarchy::getDisplayStringDimensionIntegrationStructure(_dimensionDataEntityStructureType));
dimension = str2con_RU(_dispalyValue, '-'); lstEnumdimensionNames = dimensionNames.getEnumerator();
while(lstEnumdimensionNames.moveNext()) {
dimensionValue = conPeek(dimension, counter);
            if(lstEnumdimensionNames.current() == "@KGSPMI:KGSPMIMainAccount")


{
if(!MainAccount::findByMainAccountId(dimensionValue)) {
                    ret = checkFailed(strfmt("@KGSPMI:KGSPMIMainAccountNotAvailable", dimensionValue)); }
}



else
{
if(conPeek(dimension, counter)) {
                    if(!DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(lstEnumdimensionNames.current()), dimensionValue)) {
                        ret = checkFailed(strfmt("@KGSPMI:KGSPMIDimensionNotInSystem", lstEnumdimensionNames.current(), dimensionValue)); }
}
}
counter++;
}
        return ret;




}
}
 
















Comments

Popular posts from this blog

Event handlers and post handlers in D365

Magento Integration Specification ERP Trade Agreement - Product Pricing & Discounts Extract

How to Extend Sales Order Update Functionality to Custom Fields in D365 Finance and Operations