import MT_940 file create new bank statement

 internal final class BankstatmentRunnableClass

{

    // Define constants for tag names

    #define.Tag20(":20:")

    #define.Tag25(":25:")

    #define.Tag28C(":28C:")

    #define.Tag60F(":60F:")

    #define.Tag60M(":60M:")

    #define.Tag61(":61:")

    #define.Tag62F(":62F:")

    #define.Tag62M(":62M:")

    #define.Tag64(":64:")

    #define.Tag65(":65:")

    #define.Tag86(":86:")


    private static utcdatetime ExtractDateline( str dateStr)

    {

        utcdatetime statementdate;


        

        // Extract date

        

        int year = 2000 + str2Int(subStr(dateStr, 1, 2)); // 24 → 2024

        int month = str2Int(subStr(dateStr, 3, 2));       // 12

        int day = str2Int(subStr(dateStr, 5, 2));         // 01


        date d = mkDate(day, month, year);

        timeOfDay t = str2Time("00:00:00"); // default time



        statementdate = DateTimeUtil::newDateTime(d, t);



        return statementdate;

    }


       private static utcdatetime ExtractDate(str _line)

    {

        utcdatetime statementdate;


        

        // Extract date 

        str dateStr = subStr(_line, 2, 6);

        

        int year = 2000 + str2Int(subStr(dateStr, 1, 2)); // 24 → 2024

        int month = str2Int(subStr(dateStr, 3, 2));       // 12

        int day = str2Int(subStr(dateStr, 5, 2));         // 01


        date d = mkDate(day, month, year);

        timeOfDay t = str2Time("00:00:00"); // default time



        statementdate = DateTimeUtil::newDateTime(d, t);



        return statementdate;

    }


    private static BankStmtISOCurrencyCode ExtractCurrency(str _line)

    {

        BankStmtISOCurrencyCode statementCurrency;


        statementCurrency = subStr(_line, 8, 3);


        return statementCurrency;

    }


    private static Amount ExtractOpeningBalance(str _line)

    {

        Amount statementOpening;


        str dcIndicator = subStr(_line, 1, 1);


        str amountStr = strReplace(subStr(_line, 11, strLen(_line) - 10), ",", ".");

        statementOpening = str2Num(amountStr);


        if(dcIndicator == "C")

            statementOpening = statementOpening * -1;


        return statementOpening;

    }


    private  static BankStmtISODocument createBankISODocument()

    {

        //#define.MT940Auto('MT940 Auto')

        NumberSeq                   numISOGrp;

        BankStmtISODocument         bankISODocument;

        BankStmtISOGroupHeader      bankISOGrpHeader;


 

        bankISOGrpHeader.initValue();

        numISOGrp = NumberSeq::newGetNum(BankParameters::numRefBankStatementDownloadId());

        bankISOGrpHeader.MessageIdentification = numISOGrp.num();

        numISOGrp.used();

        bankISOGrpHeader.insert();

 

        bankISOdocument.initValue();

        //bankISOdocument.FormatName = #MT940Auto;

        bankISOdocument.GroupHeader = bankISOGrpHeader.RecId;

        bankISOdocument.insert();

 

        return bankISODocument;

    }


    public static boolean validateAccountNumber(AccountNum _accountNum)

    {

        BankAccountTable _BankAccountTable;


        select count(RecId) from _BankAccountTable

            where _BankAccountTable.AccountNum == _accountNum

            && _BankAccountTable.BankReconciliationEnabled == NoYes::Yes;


        if(_BankAccountTable.RecId > 1)

        {

            error('account numbers should be unique within a bank');

            return false;

        }


        if(_BankAccountTable)

            return true;

        else

            return false;


    }


    public static NoYes ValidateBankReconciliationEnabled(AccountNum _accountNum)

    {

        BankAccountTable _BankAccountTable;


        select firstonly _BankAccountTable

            where _BankAccountTable.AccountNum == _accountNum;


        

        return _BankAccountTable.BankReconciliationEnabled;


    }


    private static void insertTransaction(int i, container currentLine, Recid _ParentRecId)

    {

        BankStmtISOReportEntry BankStmtISOReportEntry;

        

        BankStmtISOPartyIdentification BankStmtISOPartyIdentification;

        


        while(i <= conLen(currentLine) - 2)

        {

            int StrtRefNoLen;

            int AmountLen;

            str line = strReplace(strFmt("%1",conPeek(currentLine, i)),':61:','');

            str datestr = subStr(line, 1, 6);

           

            BankStmtISOReportEntry.BankStmtISOAccountStatement  = _ParentRecId;

            BankStmtISOReportEntry.BookingDateTime = BankstatmentRunnableClass::ExtractDateline(datestr);


            str Indicator = subStr(line, 11, 1);


            AmountLen = strFind(line,"N",1, strLen(line));

            StrtRefNoLen = strFind(line,"//",1, strLen(line));

            str Amount = subStr(line, 13, AmountLen - 13);

            Amount LAmount = str2Num( strReplace(Amount, ",", "."));

            

             BankStmtISOPartyIdentification.Name = subStr(line, amountlen + 4, StrtRefNoLen - (amountlen + 4) );

           

            BankStmtISOPartyIdentification.insert();


            if(Indicator == "C")

            {

                BankStmtISOReportEntry.Amount = LAmount;


                BankStmtISOReportEntry.AmountCreditDebitIndicator = DebitCredit::Credit;

            }

            else

            {

                BankStmtISOReportEntry.Amount = LAmount;


                BankStmtISOReportEntry.AmountCreditDebitIndicator = DebitCredit::Debit;

            }


            BankStmtISOReportEntry.ProprietaryBankTransactionCode = subStr(line,  AmountLen + 1, 4);


           

            BankStmtISOReportEntry.ReferenceNumber = strReplace(subStr(line,  StrtRefNoLen, strLen(line)-StrtRefNoLen + 1),"//","");


            BankStmtISOReportEntry.TradingParty = BankStmtISOPartyIdentification.RecId;

            //description 86

            BankStmtISOReportEntry.AdditionalEntryInformation = strReplace(strFmt("%1",conPeek(currentLine, i+1)),':86:','');

            BankStmtISOReportEntry.insert();


            


            //BankStmtISOPartyIdentification.Name = 

            //BankStmtISOPartyIdentification.insert();


            //BankStmtISOReportEntry.BankStmtISOAccountStatement = _ParentRecId;

            //BankStmtISOReportEntry.TradingParty = BankStmtISOPartyIdentification.RecId;

            //BankStmtISOReportEntry.insert();


           i = i+2;

        }

    }


    /// <summary>

    /// Class entry point. The system will call this method when a designated menu 

    /// is selected or when execution starts and this class is set as the startup class.

    /// </summary>

    /// <param name = "_args">The specified arguments.</param>

    public static void main(Args _args)

    {

        #File;

        BankStmtISOAccountStatement BankStmtISOAccountStatement;

        BankStmtISOCashBalance      BankStmtISOCashBalance;


        


       System.IO.Stream            stream;

        FileUploadBuild             fileUpload;

        DialogGroup                 dlgUploadGroup;

        FileUploadBuild             fileUploadBuild;

        FormBuildControl            formBuildControl;

        Dialog                      dialog = new Dialog("Import the data from File");

 

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

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

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

        fileUploadBuild.style(FileUploadStyle::MinimalWithFilename);

        //fileUploadBuild.fileTypesAccepted('.txt');

        fileUploadBuild.fileTypesAccepted('.MT940');

 

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

        {

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

            FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult();

 

            if (fileUploadResult && fileUploadResult.getUploadStatus())

            {

               

               

                CommaTextStreamIo textStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(fileUploadResult.getDownloadUrl()));


                textStream.inFieldDelimiter('\n');

                textStream.inRecordDelimiter(#delimiterCRLF);



               //  First line might have header information

                //container line = textStream.read();


                container currentLine = textStream.read();

                int i = 1;


                while (i <= conLen(currentLine))

                {

                    if(strStartsWith(strFmt("%1",conPeek(currentLine, i)), ":20:"))

                    {

                        str _accountnum =  strReplace(strFmt("%1",conPeek(currentLine, i+1)),':25:','');

                            //subStr(strFmt("%1",conPeek(currentLine, i)), 5, strLen(strFmt("%1",conPeek(currentLine, i))));


                        if(!BankstatmentRunnableClass::validateAccountNumber(_accountnum))

                            error('Account Number is not valid or Bank Reconciliation is not enabled');

                        //else if(BankstatmentRunnableClass::ValidateBankReconciliationEnabled(_accountnum) == NoYes::no)

                        //    error('Bank Reconciliation is not enabled');

                        else

                        {

                            str line60F, line62F;

                            BankAccountTable _BankAccountTable;


                            select firstonly _BankAccountTable

                                where _BankAccountTable.AccountNum == _accountNum

                                && _BankAccountTable.BankReconciliationEnabled == NoYes::Yes;;


                            BankStmtISOAccountStatement.BankAccountTable = _BankAccountTable.AccountID;

                            BankStmtISOAccountStatement.AccountIdOtherId = _accountNum;

                            

                            BankStmtISOAccountStatement.Identification = subStr(strFmt("%1",conPeek(currentLine, i)), 5, strLen(strFmt("%1",conPeek(currentLine, i))));

                                //strReplace(strFmt("%1",conPeek(currentLine, i)),':25:','');

                            i = i+1;

                            BankStmtISOAccountStatement.BankStatementType = BankStatementType::Reconciliation;

                            BankStmtISOAccountStatement.Status              = BankStatementStatus::Open;

                            BankStmtISOAccountStatement.BankStmtISODocument = BankstatmentRunnableClass::createBankISODocument().RecId;


                            i = i+2;

                            line60F = strReplace(strFmt("%1",conPeek(currentLine, i)),':60F:','');

                            line62F = strReplace(strFmt("%1",conPeek(currentLine, conLen(currentLine)-1)),':62F:','');


                            BankStmtISOAccountStatement.AccountCurrency = BankstatmentRunnableClass::ExtractCurrency(line60F);

                            BankStmtISOAccountStatement.FromDateTime        = BankstatmentRunnableClass::ExtractDate(line60F);

                            BankStmtISOAccountStatement.ToDateTime = BankstatmentRunnableClass::ExtractDate(line62F);


                            BankStmtISOAccountStatement.insert();


                            //Opening

                            BankStmtISOCashBalance.clear();

                            amount OBAmount = BankstatmentRunnableClass::ExtractOpeningBalance(line60F);

                            BankStmtISOCashBalance.BankStmtISOAccountStatement  = BankStmtISOAccountStatement.RecId;

                           


                            if (OBAmount < 0)

                            {

                                BankStmtISOCashBalance.CashBalanceAmount            = OBAmount * -1;

                                BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Credit;

                            }

                            else

                            {

                                BankStmtISOCashBalance.CashBalanceAmount            = OBAmount;

                                BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Debit;

                            }


                            BankStmtISOCashBalance.BankStatementBalanceType     = BankStatementBalanceType::Opening;

                            BankStmtISOCashBalance.insert();


                            //closing

                            BankStmtISOCashBalance.clear();

                            Amount EBAmount = BankstatmentRunnableClass::ExtractOpeningBalance(line62F);

                            BankStmtISOCashBalance.CashBalanceAmount            = EBAmount * -1;


                            BankStmtISOCashBalance.BankStmtISOAccountStatement  = BankStmtISOAccountStatement.RecId;


                            if (EBAmount < 0)

                            {

                                BankStmtISOCashBalance.CashBalanceAmount            = EBAmount * -1;

                                BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Credit;

                            }

                            else

                            {

                                BankStmtISOCashBalance.CashBalanceAmount            = EBAmount;

                                BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Debit;

                            }


                            BankStmtISOCashBalance.BankStatementBalanceType     =  BankStatementBalanceType::Closing;

                            BankStmtISOCashBalance.insert();


                            BankstatmentRunnableClass::insertTransaction(i+1, currentLine, BankStmtISOAccountStatement.RecId);



                        }



                    }


                    i++;

                }






            }

        }

    }


}



////batch

using System.IO;

using OfficeOpenXml;

using OfficeOpenXml.ExcelPackage;

using OfficeOpenXml.ExcelRange;

 

class BI_ImportMT940BankStatement extends RunBaseBatch

{

    Filename        ItemFileName;

    Filename        filename;

    DialogField     dialogFilename;

 

    System.IO.Stream    stream;

    FileUploadTemporaryStorageResult fileUploadResult;

    OfficeOpenXml.ExcelRange    range;

    CommaTextStreamIo   commaIo;

    RecordInsertList    rsl;

    boolean             newIteration;

    int                 line,

                        lineimported,lineerror, lineskipped;

    Counter             loop;

    FileUploadBuild     dialogFileUpload;

    FileUpload          fileUpload;

    DialogRunbase       dialog;


    BankStmtISOAccountStatement BankStmtISOAccountStatement;

    BankStmtISOCashBalance      BankStmtISOCashBalance;

    BankAccountTable            BankAccountTable;

    real                        OBAmount , EBAmount;

    utcdatetime                 OBDate, EBDate;


    DialogField                 Bankaccount;

    CompanyBankAccountID        bankAccountID;


 

 

 

    #define.CurrentVersion(1)

    #define.Version1(1)

    #localmacro.CurrentList

        fileName,bankAccountID

    #endmacro

 

    /*void create(int row)

    {


        real OB , TransacionAmount , EB;

        date OBDate , TransactionDate , EBDaet


        /*str                         itemId;

        price                       inventPrice;

        InventTableModule           inventTableModule;

 

        itemId = range.get_Item(row, 1).Value;

        inventPrice = range.get_Item(row, 2).Value;*/


        if(row == 2)

        {

            BankStmtISOAccountStatement.clear();


            BankStmtISOAccountStatement.BankAccountTable = BankAccountTable.AccountID;


            //BankStmtISOAccountStatement.insert();

        }


 

        /*try

        {

            ttsbegin;


            select forUpdate inventTableModule

            where inventTableModule.ItemId  == ItemId

            && inventTableModule.ModuleType == ModuleInventPurchSales::Invent;

 

            if (!inventTableModule)

            {

                inventTableModule.clear();

            }

            inventTableModule.Price             = inventPrice;

            if (!inventTableModule)

            {

                inventTableModule.insert();

            }

            else

            {

                inventTableModule.update();

            }

            lineimported ++;

            ttscommit;

        }

        catch

        {

            lineerror ++;

            ttsAbort;

        }*/

    }*/


    void GetHeaderData(int row)

    {


        anytype datestr;

        str Amountstr;


        str type = range.get_Item(row, 1).Value;


        if(type == 'OB')

        {

            datestr    = range.get_Item(row,2).value; //get_Value();   //Value;

            OBDate     = DateTimeUtil::removeTimeZoneOffset (datestr,DateTimeUtil::getUserPreferredTimeZone()); //str2DateDMY(datestr);



            Amountstr  = range.get_Item(row, 3).Value;

            OBAmount   = str2Num(Amountstr);

        }


        if(type == 'EB')

        {

            datestr    = range.get_Item(row, 2).Value;

            EBDate     = DateTimeUtil::removeTimeZoneOffset(datestr,DateTimeUtil::getUserPreferredTimeZone()); //str2DateDMY(datestr);


            Amountstr  = range.get_Item(row, 3).Value;

            EBAmount   = str2Num(Amountstr);

        }

        

    }


    /*try

        {

            ttsbegin;


            select forUpdate inventTableModule

            where inventTableModule.ItemId  == ItemId

            && inventTableModule.ModuleType == ModuleInventPurchSales::Invent;

 

            if (!inventTableModule)

            {

                inventTableModule.clear();

            }

            inventTableModule.Price             = inventPrice;

            if (!inventTableModule)

            {

                inventTableModule.insert();

            }

            else

            {

                inventTableModule.update();

            }

            lineimported ++;

            ttscommit;

        }

        catch

        {

            lineerror ++;

            ttsAbort;

        }

    }*/



    void createLine(int row)

    {

        anytype datestr;

        str     Amountstr;

        real    amountReal;

        utcdatetime    Tdate;



        BankStmtISOReportEntry reportEntryLoc;

        

        int                     currencyStr;

        int positionSlash = 0;


        str type = range.get_Item(row, 1).Value;


        if(type == 'Transaction')

        {


            datestr = range.get_Item(row, 2).Value;

            Tdate   = DateTimeUtil::removeTimeZoneOffset(datestr,DateTimeUtil::getUserPreferredTimeZone());//str2DateDMY(datestr);


            Amountstr   = range.get_Item(row, 3).Value;

            amountReal  = str2Num(Amountstr);


            reportEntryLoc.clear();

            reportEntryLoc.BankStmtISOAccountStatement  = BankStmtISOAccountStatement.RecId;

        

            if(amountReal < 0 )

            {

                reportEntryLoc.AmountCreditDebitIndicator   = DebitCredit::Credit;

                reportEntryLoc.Amount                       = amountReal * -1;

            }

            else

            {

                reportEntryLoc.AmountCreditDebitIndicator   = DebitCredit::Debit;

                reportEntryLoc.Amount                       = amountReal;

            }


            reportEntryLoc.BankStatementLineStatus = BankStatementLineStatus::Booked;

            reportEntryLoc.BookingDateTime = Tdate;//DateTimeUtil::newDateTime(Tdate,0);

            reportEntryLoc.insert();


            /*if(subStr(_statementLineVal, 11, 1) == 'D')

            {

                reportEntryLoc.AmountCreditDebitIndicator = DebitCredit::Credit;

                amountReal = str2Num(strReplace(subStr(_statementLineVal, 12, strLen(_statementLineVal)), ",", "."));

                reportEntryLoc.ProprietaryBankTransactionCode = subStr(_statementLineVal, 12 + strLen(num2Str(amountReal,1,2,1,0)), 4);

            }

            else if(subStr(_statementLineVal, 11, 1) == 'C')

            {

                reportEntryLoc.AmountCreditDebitIndicator = DebitCredit::Debit;

                amountReal = str2Num(strReplace(subStr(_statementLineVal, 12, strLen(_statementLineVal)), ",", "."));

                reportEntryLoc.ProprietaryBankTransactionCode = subStr(_statementLineVal, 12 + strLen(num2Str(amountReal,1,2,1,0)), 4);

            }

            else

            {

                reportEntryLoc.ReversalIndicator = NoYes::Yes;

                if(subStr(_statementLineVal, 12, 1) == 'D')

                {

                    reportEntryLoc.AmountCreditDebitIndicator = DebitCredit::Debit;

                }

                else

                {

                    reportEntryLoc.AmountCreditDebitIndicator = DebitCredit::Credit;

                }

                amountReal = str2Num(strReplace(subStr(_statementLineVal, 13, strLen(_statementLineVal)), ",", "."));

                reportEntryLoc.ProprietaryBankTransactionCode = subStr(_statementLineVal, 13 + strLen(num2Str(amountReal,1,2,1,0)), 4);

            }

            reportEntryLoc.Amount = amountReal;

            

            currencyStr = strScan(_statementLineVal, Ledger::accountingCurrency(CompanyInfo::current()), 1, strLen(_statementLineVal));

            if(currencyStr)

            {

                reportEntryLoc.BankStatementCounterCurrency = Ledger::accountingCurrency(CompanyInfo::current());

                reportEntryLoc.BankStatementCounterCurrencyAmount = amountReal;

            }

            else

            {

                reportEntryLoc.BankStatementCounterCurrency = "";

                reportEntryLoc.BankStatementCounterCurrencyAmount = 0;

            }

         

            reportEntryLoc.BankStatementLineStatus = BankStatementLineStatus::Booked;

            reportEntryLoc.BookingDateTime = _bankStmtHeader.ToDateTime;

            reportEntryLoc.ReferenceNumber = subStr(_statementLineVal,

                                                12 + strLen(num2Str(amountReal,1,2,1,0)) + 4,

                                                strScan(_statementLineVal, "//", 1, strLen(_statementLineVal)) - (12 + strLen(num2Str(amountReal,1,2,1,0)) + 4));

        positionSlash = strScan(_statementLineVal, "//", 1, strLen(_statementLineVal)) + 2;

        reportEntryLoc.BankDocumentNumber = subStr(_statementLineVal,

                                                   positionSlash,

                                                   strLen(_statementLineVal));

            reportEntryLoc.insert();

            ttsCommit;*/

        }



        /*str                         itemId;

        price                       inventPrice;

        InventTableModule           inventTableModule;

 

        itemId = range.get_Item(row, 1).Value;

        inventPrice = range.get_Item(row, 2).Value;*/


        /*if(row == 2)

        {

            BankStmtISOAccountStatement.clear();


            BankStmtISOAccountStatement.BankAccountTable = BankAccountTable.AccountID;


            //BankStmtISOAccountStatement.insert();

        }*/


 

        /*try

        {

            ttsbegin;


            select forUpdate inventTableModule

            where inventTableModule.ItemId  == ItemId

            && inventTableModule.ModuleType == ModuleInventPurchSales::Invent;

 

            if (!inventTableModule)

            {

                inventTableModule.clear();

            }

            inventTableModule.Price             = inventPrice;

            if (!inventTableModule)

            {

                inventTableModule.insert();

            }

            else

            {

                inventTableModule.update();

            }

            lineimported ++;

            ttscommit;

        }

        catch

        {

            lineerror ++;

            ttsAbort;

        }*/

    }


    private BankStmtISODocument createBankISODocument()

    {

        //#define.MT940Auto('MT940 Auto')

        NumberSeq                   numISOGrp;

        BankStmtISODocument         bankISODocument;

        BankStmtISOGroupHeader      bankISOGrpHeader;

 

        bankISOGrpHeader.initValue();

        numISOGrp = NumberSeq::newGetNum(BankParameters::numRefBankStatementDownloadId());

        bankISOGrpHeader.MessageIdentification = numISOGrp.num();

        numISOGrp.used();

        bankISOGrpHeader.insert();

 

        bankISOdocument.initValue();

        //bankISOdocument.FormatName = #MT940Auto;

        bankISOdocument.GroupHeader = bankISOGrpHeader.RecId;

        bankISOdocument.insert();

 

        return bankISODocument;

    }


    void createHeader()

    {

        if(!OBDate)

            throw Error('Opening balance date does not exists');


        if(!EBDate)

            throw Error('Ending balance date does not exists');



        NumberSeq                   NumberSeq;


        BankStmtISOAccountStatement.clear();


        BankStmtISOAccountStatement.initValue();


        BankStmtISOAccountStatement.BankAccountTable    = BankAccountTable.AccountID;

        BankStmtISOAccountStatement.AccountCurrency     = bankAccountTable.CurrencyCode;

        BankStmtISOAccountStatement.AccountIdOtherId    = bankAccountTable.AccountNum;

        BankStmtISOAccountStatement.BankStatementType   = BankStatementType::Reconciliation;

        BankStmtISOAccountStatement.IBAN                = bankAccountTable.IBAN;


        NumberSeq = NumberSeq::newGetNum(BankParameters::numRefBankStatementId());

        BankStmtISOAccountStatement.Identification      = NumberSeq.num();;

        NumberSeq.used();


        BankStmtISOAccountStatement.FromDateTime        = OBDate;//DateTimeUtil::newDateTime( OBDate,0);// DateTimeUtil::removeTimeZoneOffset(DateTimeUtil::newDateTime( OBDate,0),Timezone::GMTPLUS0200CAIRO)));

        BankStmtISOAccountStatement.ToDateTime          = EBDate;//DateTimeUtil::newDateTime( EBDate,str2Time('11:59:59'));

        BankStmtISOAccountStatement.Status              = BankStatementStatus::Open;

        BankStmtISOAccountStatement.BankStmtISODocument = this.createBankISODocument().RecId;


        BankStmtISOAccountStatement.insert();


        //Opening 

        BankStmtISOCashBalance.clear();

        BankStmtISOCashBalance.BankStmtISOAccountStatement  = BankStmtISOAccountStatement.RecId;

        if (OBAmount < 0)

        {

            BankStmtISOCashBalance.CashBalanceAmount            = OBAmount * -1;

            BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Credit;

        }

        else

        {

            BankStmtISOCashBalance.CashBalanceAmount            = OBAmount;

            BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Debit;

        }

        BankStmtISOCashBalance.BankStatementBalanceType     = BankStatementBalanceType::Opening;

        BankStmtISOCashBalance.insert();



        //Ending

        BankStmtISOCashBalance.clear();

        BankStmtISOCashBalance.BankStmtISOAccountStatement  = BankStmtISOAccountStatement.RecId;


        if (EBAmount < 0)

        {

            BankStmtISOCashBalance.CashBalanceAmount            = EBAmount * -1;

            BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Credit;

        }

        else

        {

            BankStmtISOCashBalance.CashBalanceAmount            = EBAmount;

            BankStmtISOCashBalance.AmountCreditDebitIndicator   = DebitCredit::Debit;

        }


        BankStmtISOCashBalance.BankStatementBalanceType     =  BankStatementBalanceType::Closing;

        BankStmtISOCashBalance.insert();



        //Net Amount

        BankStmtISOCashBalance.clear();

        BankStmtISOCashBalance.BankStmtISOAccountStatement  = BankStmtISOAccountStatement.RecId;

        BankStmtISOCashBalance.CashBalanceAmount            = 0;

        BankStmtISOCashBalance.AmountCreditDebitIndicator   =  DebitCredit::Debit;

        BankStmtISOCashBalance.BankStatementBalanceType     =   BankStatementBalanceType::NetAmount;

        BankStmtISOCashBalance.insert();



    }


    void import()

    {

        Container               con;

        InventTable             inventTable;

         

        ;

        setPrefix("Import ");

         

        if (this.openFile())

        {

            

            

                FileIOPermission perm;

                TextIO textIo;

            FileName filePath = filename;

           // Update with your actual file path

                str lines, mt940Data = "";


                // Grant permission to read the file

                perm = new FileIOPermission(filePath, 'r');

                perm.assert();


                // Open the file

                textIo = new TextIO(filePath, 'r');

                if (!textIo)

                {

                    error("Failed to open the file.");

                    return;

                }


                // Read each line and append to the variable

                //while (textIo.status() == IO_Status::Ok)

               // {

               //     lines = textIo.read();

               //     if (lines)

               //     {

               //         mt940Data += lines + '\n';

               //     }

               // }


                CodeAccessPermission::revertAssert();


                // Output or use the data

                info("MT-940 data loaded into variable.");

                info(mt940Data); // Optional: display the data

         


            //using (ExcelPackage Package = new ExcelPackage(stream))

            //{

            //    int                         rowCount, i, endRow, startRow;

            //    Package.Load(stream);

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

            //    range       = worksheet.Cells;

            //    endRow      = worksheet.Dimension.End.Row;

            //    startRow    = worksheet.Dimension.Start.Row;

            //    rowCount    = endRow - startRow + 1;


            //    try

            //    {

            //        ttsbegin;

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

            //        {

            //            setPrefix(strFmt("Line %1", i));

            //            this.GetHeaderData(i);



            //        }

            //        this.createHeader();


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

            //        {

            //            setPrefix(strFmt("Line %1", i));

            //            this.createLine(i);

            //        }

            //        ttscommit;

            //    }

            //    catch

            //    {

            //        throw error("Error - Import template");

            //    }

           // }

        }

 

        //info(strfmt("%1 record(s) imported", lineimported));

        //info(strfmt("%1 record(s) fail", lineerror));

    }


    boolean openFile()

        {

            boolean ret = false;

 

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

            {

                stream = fileUploadResult.openResult();

                ret = true;

            }

            else

            {

                throw error(strfmt("@SYS62207",filename));

            }

 

            return ret;

        }


    public Object dialog()

    {

        dialog = super();

        

        FormbuildStringControl   control;


        DialogGroup dialogGroup = dialog.addGroup('Upload file');

 

        FormBuildControl formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());

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

        dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);

        dialogFileUpload.fileNameLabel("@SYS308842");

        dialogFileUpload.fileTypesAccepted(".MT940");


        Bankaccount = dialog.addField( extendedTypeStr(CompanyBankAccountId));


        control = Bankaccount.control();


        //control.


        control.registerOverrideMethod(methodStr(FormStringControl,lookup),


        methodStr(BI_ImportBankStatement,bankaccountLookup),this);

         


        return dialog;

    }


    private void bankaccountLookup(FormStringControl _control)

    {

        SysTableLookup sysTableLookup;

        QueryBuildDataSource qbds;


        Query query = new Query();

        qbds = Query.addDataSource(tableNum(BankAccountTable));


        sysTableLookup = SysTableLookup::newParameters(tableNum(BankAccountTable), _control,true);

        sysTableLookup.addLookupfield(fieldNum(BankAccountTable, ACCOUNTID), true);

        //sysTableLookup.addLookupfield(fieldNum(BankAccountTable, Name), true);



        qbds.addRange(fieldNum(BankAccountTable , BankReconciliationEnabled)).value(enum2Str(NoYes::Yes));


        sysTableLookup.parmQuery(query);

        sysTableLookup.performFormLookup();


    }


    /// <summary>

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

        /// </summary>

        /// <param name="_dialog">The <c>Runbase</c> dialog object.</param>

        public void dialogPostRun(DialogRunbase _dialog)

        {

            fileUpload = _dialog.formRun().control(_dialog.formRun().controlId('FileUpload'));

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

            this.setDialogOkButtonEnabled(_dialog, false);

        }


    /// <summary>

        /// After the file has been uploaded, the Ok button is enabled.

        /// </summary>

        public void uploadCompleted()

        {

            filename = fileUpload.fileName();

 

            this.setDialogOkButtonEnabled(dialog, true);

         

            fileUploadResult = fileUpload.getFileUploadResult();

 

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

        }


    /// <summary>

        /// Enables or disables the dialog Ok button.

        /// </summary>

        /// <param name = "_dialog">The <c>Runbase</c> dialog object.</param>

        /// <param name = "_isEnabled">Indicates to enable or disable the Ok button.</param>

        protected void setDialogOkButtonEnabled(DialogRunbase _dialog, boolean _isEnabled)

        {

            FormControl okButtonControl = _dialog.formRun().control(_dialog.formRun().controlId('OkButton'));

 

            if (okButtonControl)

            {

                okButtonControl.enabled(_isEnabled);

            }

        }


    public container pack()

        {

            return [#CurrentVersion,#CurrentList];

        }


    public boolean unpack(container packedClass)

        {

            Version version = runbase::getVersion(packedClass);

            ;

            switch (version)

            {

                case #CurrentVersion:

                    [version,#CurrentList] = packedClass;

                    break;

                default:

                    return false;

            }

            return true;

        }


    public void run()

    {

        if(bankAccountID)

        {

            BankAccountTable = BankAccountTable::find(bankAccountID);


            if(!BankAccountTable)

            {

                Error (strfmt('Bank account %1 does not exists',bankAccountID));

            }

            else if(BankAccountTable.BankReconciliationEnabled)

            {

                this.import();

            }

            else if(!BankAccountTable.BankReconciliationEnabled)

            {

                Error (strfmt('Bank account %1 does not enabled for automatic reconciliation',bankAccountID));

            }

        }

        else

        {

            Error (strfmt('Bank account does not exists',bankAccountID));

        }

        


        //this.import();

        super();

    }


    static void main(Args _args)

        {

            BI_ImportBankStatement   import;

            FormRun formRun;

            Args    args;

 

 

            ;

            import = new BI_ImportBankStatement();

            if (import.prompt())

            {

                import.run();

            }

        }


    public ClassDescription caption()

        {

            return 'Import Bank Statement';

        }


    /// <summary>

    ///

    /// </summary>

    /// <returns></returns>

    public boolean getFromDialog()

    {

        boolean ret;

    


        bankAccountID = Bankaccount.value();


        ret = super();

    

        return ret;

    }


}

Comments

Popular posts from this blog

update or create finical dimension on purchline