DEV Community

Rohith_Veerapalli
Rohith_Veerapalli

Posted on

Create Free text invoice based on Deferral subscription lines

class AT_DeferralLinesImportService extends SysOperationServiceBase
{
    LedgerJournalTable LedgerjournalTable;
    str errorMsg;
    Voucher  voucher;
    int infologStartLine;
    LedgerDimensionAccount ledgerDimension;
    CustInvoiceJour     custInvoiceJour;
    CustInvoiceTable custInvoiceTable;
    RecordInsertList transInsertList  = new RecordInsertList(tableNum(LedgerJournalTrans));
    public void process()
    {
        AT_DeferralLinesImport deferral, deferralUpdate;
        voucher ='';
        this.CreateJournal();
        while select deferral
            where deferral.Status == AT_DeferralStatus::Created
            && deferral.Type == 'Ledger'
        {
            infologStartLine = infologLine();
            try
            {

                this.createvoucher(deferral);

                update_recordset deferralUpdate setting Status = AT_DeferralStatus::Processed,ErrorMessage ='',
                    JournalNum = ledgerjournalTable.JournalNum, Voucher =voucher
                    where deferralUpdate.Account == deferral.Account
                     && deferralUpdate.RecId == deferral.RecId;
            }
            catch
            {
                this.addErrorMsg(this.getInfologStr(infologStartLine));
                update_recordset deferralUpdate setting Status = AT_DeferralStatus::Failed,
                    ErrorMessage = strFmt("Process failed for Account-%1--%2",deferralUpdate.Account, errorMsg)
                     where deferralUpdate.Account == deferral.Account
                     && deferralUpdate.RecId == deferral.RecId;
                continue;
            }
        }
        while select deferral
            where deferral.Status == AT_DeferralStatus::Created
            && deferral.Type == 'Customer'
        {
            infologStartLine = infologLine();
            try
            {

                this.createFreeTextInvoice(deferral);

                update_recordset deferralUpdate setting Status = AT_DeferralStatus::Processed,ErrorMessage ='',
                    JournalNum = int642Str (custInvoiceTable.Recid)
                    where deferralUpdate.Account == deferral.Account
                    && deferralUpdate.RecId == deferral.RecId;
            }
            catch
            {
                this.addErrorMsg(this.getInfologStr(infologStartLine));
                update_recordset deferralUpdate setting Status = AT_DeferralStatus::Failed,
                    ErrorMessage = strFmt("Process failed for Account-%1--%2",deferralUpdate.Account, errorMsg)
                     where deferralUpdate.Account == deferral.Account
                     && deferralUpdate.RecId == deferral.RecId;
                continue;
            }
        }
    }

    public void createFreeTextInvoice(AT_DeferralLinesImport Deferral)
    {
        custInvoiceTable.clear();
        CustInvoiceTrans    custInvoiceTrans;
        CustPostInvoice     custPostInvoice;
        CustInvoiceLine     custInvoiceLine;
        RecordInsertList    invoiceLineList;
        LedgerJournalTrans  journalTransData;
        CustTable           custTable       =   CustTable::find(conPeek(list2Con(strSplit(Deferral.Account, "-")),1));
        //InvoiceId           invoice;
        //MainAccountRecId    mainAccount;
        ledgerDimension =0;
        //Creation of Invoice header and lines from sales invoice.
        custInvoiceTable.initFromCustTable(custTable);
        custInvoiceTable.InvoiceDate = Deferral.TransactionDate;
        custInvoiceTable.DefaultDimension = this.updateDimension(Deferral.Account);
        CustInvoiceTable.ESSupplyType = ESSupplyType::B2B;
        custInvoiceTable.insert();

        custInvoiceLine.initValue();
        custInvoiceLine.initFromCustInvoiceTable(custInvoiceTable);

        custInvoiceLine.Description         = strFmt(' Deferral journal has been created against account%1',Deferral.Account);
        custInvoiceLine.TaxGroup            = custTable.TaxGroup;
        // custInvoiceLine.TaxItemGroup        = salesLine.TaxItemGroup;

        custInvoiceLine.Quantity            = 1;
        custInvoiceLine.AmountCur           = Deferral.Amount;
        custInvoiceLine.ParentRecId         = custInvoiceTable.RecId;
        custInvoiceLine.DefaultDimension    = this.getDefaultDimension(Deferral.OffsetAccount);
        custInvoiceLine.LedgerDimension     = AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.OffsetAccount);
        custInvoiceLine.lineNum             = CustInvoiceLine::lastLineNum_W(custInvoiceLine.ParentRecId);
        custInvoiceLine.insert();

       /*
        custPostInvoice = new CustPostInvoice(custInvoiceTable);
        custPostInvoice.run();
        custInvoiceTable = custPostInvoice.parmCustInvoiceTable();
        */
        this.updateDeferralData(Deferral,journalTransData,custInvoiceTrans,custInvoiceLine.SourceDocumentLine);
    }

    public void updateDeferralData(AT_DeferralLinesImport Deferral, LedgerJournalTrans journalTrans, CustInvoiceTrans custInvoiceLine,int64 SourceDocumentLine =0)
    {
        SubBillDeferralTransactionLineDeferral deferralTable;
        AccountingDistribution AccountingDistribution;

        if(journalTrans)
        {
            deferralTable = SubBillDeferralTransactionLineDeferral::findByLedgerJournalTrans(journalTrans.RecId, true);
        }
        else if(SourceDocumentLine)
        {
            select firstonly  AccountingDistribution
                where AccountingDistribution.SourceDocumentLine == SourceDocumentLine;

            deferralTable = SubBillDeferralTransactionLineDeferral::findByTransRecId(AccountingDistribution.RecId,SubBillDeferralSourceRecType::AccountingDistribution, true);
        }
        if(deferralTable)
        {
            ttsbegin;
            deferralTable.SubBillDeferralScheduleFromTemplate = Deferral.SubBillDeferralScheduleFromTemplate;
            deferralTable.SubBillDeferralStartDate = Deferral.StartDate;
            deferralTable.SubBillDeferralEndDate = Deferral.EndDate;
            if(Deferral.RecognitionAccount !='')
            {
                deferralTable.SubBillDeferralRecognitionAccount = AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.RecognitionAccount);
                deferralTable.SubBillDeferralInitialRecAcct = deferralTable.SubBillDeferralRecognitionAccount;
                deferralTable.SubBillDeferralRecOffAcct = deferralTable.SubBillDeferralRecognitionAccount;
            }
            else
            {
                deferralTable.SubBillDeferralRecognitionAccount =0;
            }
            deferralTable.update();
            ttscommit;
        }
    }

    private str getInfologStr(int _infologStartLine)
    {
        SysInfologEnumerator    enumerator;
        SysInfologMessageStruct msgStruct;
        str                     error;
        container               infologData;

        int infologCurrentLine = infologLine();

        if (infologCurrentLine > _infologStartLine)
        {
            infologData = infolog.copy(_infologStartLine + 1, infologCurrentLine);
        }

        if (infologData)
        {
            enumerator = SysInfologEnumerator::newData(infologData);

            while (enumerator.moveNext())
            {
                msgStruct = new SysInfologMessageStruct(enumerator.currentMessage());
                error = strfmt("@SYS324543", error, msgStruct.message());
            }
        }
        return error;
    }

    private void addErrorMsg(str _errorMsg)
    {
        errorMsg += _errorMsg;
    }

    void CreateJournal()
    {
        select firstonly LedgerjournalTable
            where LedgerjournalTable.AT_IsFromIntegration == NoYes::Yes
            && LedgerjournalTable.Posted == NoYes::No;
        if(!LedgerjournalTable)
        {
            ttsBegin;
            LedgerJournalName journalName ;

            select firstonly journalName
            where journalName.Name =='General Journal';

            LedgerjournalTable.JournalName =  'GenJrn';//HKGMarketPlaceSetup::find(custAccount).CustPaymentJournalNameId;
            ledgerjournalTable.initFromLedgerJournalName();

            ledgerjournalTable.JournalType  = LedgerJournalType::Daily;//Added daily journal type
            ledgerjournalTable.JournalNum   =  JournalTableData::newTable(ledgerjournalTable).nextJournalId();
            JournalTableData::newTable(LedgerjournalTable).nextJournalId();
            LedgerjournalTable.AT_IsFromIntegration = NoYes::Yes;
            ledgerjournalTable.insert();
            ttscommit;
        }
    }

    void createvoucher(AT_DeferralLinesImport Deferral)
    {
        CustInvoiceTrans     custInvoiceLine;
        LedgerJournalTrans  ledgerJournalTrans;
        NumberSeq numberSeq;
        numberSeq =  NumberSeq::newGetVoucherFromId(LedgerjournalName::find(ledgerjournalTable.JournalName).NumberSequenceTable);
        ledgerjournalTrans.initValue();
        ledgerDimension =0;
        ledgerjournalTrans.Voucher      = numberSeq.voucher();
        voucher                         = ledgerjournalTrans.Voucher;
        ledgerjournalTrans.JournalNum   = ledgerjournalTable.JournalNum;
        ledgerjournalTrans.AccountType  = LedgerJournalACType::Ledger;
        ledgerjournalTrans.Company      = curext();
        ledgerjournalTrans.TransDate    = Deferral.TransactionDate; //DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());//today();
        if(Deferral.Type == 'Customer')
        {
            ledgerjournalTrans.AccountType  = LedgerJournalACType::Cust;
            ledgerjournalTrans.DefaultDimension = this.updateDimension(Deferral.Account);

            ledgerjournalTrans.LedgerDimension = ledgerDimension;
        }
        else
        {
            ledgerjournalTrans.LedgerDimension = AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.Account);
        }
        // ledgerjournalTrans.parmAccount(custAccount,LedgerjournalTrans.AccountType);

        // ledgerjournalTrans.DefaultDimension         = CustTable::find(custAccount).DefaultDimension;
        ledgerjournalTrans.AmountCurCredit          = Deferral.Amount;//Commented InvoiceAmount
        // ledgerjournalTrans.MarkedInvoice            = _CustInvoiceJour.InvoiceId;//Added
        // ledgerJournalTrans.PostingProfile           = CustParameters::find().HKG_MarketPalcePostingProfile;//HKGMarketPlaceSetup::find(custAccount).CustPostingProfile;
        ledgerjournalTrans.OffsetAccountType        = LedgerJournalACType::Ledger;//Added
        ledgerjournalTrans.OffsetLedgerDimension    =AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.OffsetAccount);
        // ledgerjournalTrans.OffsetLedgerDimension    = LedgerJournalName::find(ledgerjournalTable.JournalName).OffsetLedgerDimension;//Added
        ledgerjournalTrans.Txt                      = strFmt(' Deferral journal has been created against account%1',Deferral.Account);
        ledgerJournalTrans.insert();
        // transInsertList.add(ledgerjournalTrans);
        this.updateDeferralData(Deferral, ledgerJournalTrans,custInvoiceLine);
        /*
        Select firstonly custtrans
                   where custTrans.Invoice == _CustInvoiceJour.InvoiceId;

        Select firstonly custtransopen
                   where custTransOpen.RefRecId == custtrans.RecId
                      && custTransOpen.AccountNum == custTrans.AccountNum;
        if(Custtransopen.RecId)
        {
            manager = CustVendOpenTransManager::construct(ledgerJournalTrans);
            manager.updateTransMarked(custTransOpen,true);
            manager.updateSettleAmount(custTransOpen,_CustInvoiceJour.InvoiceAmount);

            ledgerJournalTransSettle.data(ledgerJournalTrans);
            ledgerJournalTransSettle.selectForUpdate(true);
            ledgerJournalTransSettle.SettleVoucher =  SettlementType::SelectedTransact;
            ledgerJournalTransSettle.update();
        }
        */
    }

    public static DimensionDynamicAccount resolveLedgerDimFromDisplay(str _displayValue)
    {
        LedgerAccountDimensionResolver resolver;
        DimensionDynamicAccount        ledgerDimension;

        // Build resolver from the display string (system will parse according to account structure)
        resolver = LedgerAccountDimensionResolver::newResolver(_displayValue);

        // Resolve and save
        ledgerDimension = resolver.resolve();

        if (!ledgerDimension)
        {
            throw error(strFmt("Invalid account string: %1", _displayValue));
        }

        return ledgerDimension; // This is the LedgerDimension (RecId in DimensionAttributeValueCombination)
    }

    public recid updateDimension(str newValue)
    {
        DimensionAttributeValueSetStorage davss;
        DimensionAttribute dimAttr;
        DimensionAttributeValue dimValue;
        container splitResult;
        str mainAccount, costCenter, department, document, location, SBU, SBU1;

        // Split string
        splitResult  = list2Con(strSplit(newValue, "-"));
        mainAccount  = conPeek(splitResult, 1);
        costCenter   = conPeek(splitResult, 2);
        department   = conPeek(splitResult, 3);
        document     = conPeek(splitResult, 4);
        location     = conPeek(splitResult, 5);
        SBU          = conPeek(splitResult, 6);
        SBU1         = conPeek(splitResult, 7);
        davss = new DimensionAttributeValueSetStorage();

        // CostCenter
        dimAttr  = DimensionAttribute::findByName("CostCategory");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, costCenter, true, true);
        davss.addItem(dimValue);

        // Department
        dimAttr  = DimensionAttribute::findByName("Department");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, department, true, true);
        davss.addItem(dimValue);

        // Document
        dimAttr  = DimensionAttribute::findByName("Document_Type");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, document, true, true);
        davss.addItem(dimValue);

        // Location
        dimAttr  = DimensionAttribute::findByName("Org_Location");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, location, true, true);
        davss.addItem(dimValue);

        // SBU
        dimAttr  = DimensionAttribute::findByName("SBU");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU, true, true);
        davss.addItem(dimValue);

        // SBU1
        dimAttr  = DimensionAttribute::findByName("SBU1");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU1, true, true);
        davss.addItem(dimValue);
        EnumName accountTypeEnumType ='LedgerJournalACType';
        DimensionAttributeValueCombination davc;
        // Save and return DefaultDimension (without MainAccount)
        LedgerDimensionAccount defaultDimension = davss.save();
        ledgerDimension = LedgerDynamicAccountHelper::getDynamicAccountFromAccountNumberEnumModule(mainAccount, 1, enumName2Id(accountTypeEnumType), ModuleInventCustVend::Cust);
        davc = DimensionAttributeValueCombination::find(ledgerDimension);
        ledgerDimension =davc.RecId;
        return defaultDimension;
    }

    public recid getDefaultDimension(str newValue)
    {
        DimensionAttributeValueSetStorage davss;
        DimensionAttribute dimAttr;
        DimensionAttributeValue dimValue;
        container splitResult;
        str mainAccount, costCenter, department, document, location, SBU, SBU1;

        // Split string
        splitResult  = list2Con(strSplit(newValue, "-"));
        mainAccount  = conPeek(splitResult, 1);
        costCenter   = conPeek(splitResult, 2);
        department   = conPeek(splitResult, 3);
        document     = conPeek(splitResult, 4);
        location     = conPeek(splitResult, 5);
        SBU          = conPeek(splitResult, 6);
        SBU1         = conPeek(splitResult, 7);
        davss = new DimensionAttributeValueSetStorage();

        // CostCenter
        dimAttr  = DimensionAttribute::findByName("CostCategory");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, costCenter, true, true);
        davss.addItem(dimValue);

        // Department
        dimAttr  = DimensionAttribute::findByName("Department");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, department, true, true);
        davss.addItem(dimValue);

        // Document
        dimAttr  = DimensionAttribute::findByName("Document_Type");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, document, true, true);
        davss.addItem(dimValue);

        // Location
        dimAttr  = DimensionAttribute::findByName("Org_Location");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, location, true, true);
        davss.addItem(dimValue);

        // SBU
        dimAttr  = DimensionAttribute::findByName("SBU");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU, true, true);
        davss.addItem(dimValue);

        // SBU1
        dimAttr  = DimensionAttribute::findByName("SBU1");
        dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU1, true, true);
        davss.addItem(dimValue);
        EnumName accountTypeEnumType ='LedgerJournalACType';
        DimensionAttributeValueCombination davc;
        // Save and return DefaultDimension (without MainAccount)
        LedgerDimensionAccount defaultDimension = davss.save();
        return defaultDimension;
    }

}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)