Untitled

 avatar
unknown
plain_text
a year ago
17 kB
2
Indexable
report 50096 "SEPA - Maksekeskus Import"
{
    ProcessingOnly = true;

    dataset
    {
    }

    requestpage
    {
        SaveValues = true;

        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
                    field(FileName; FileName)
                    {
                        Caption = 'File Name';

                        trigger OnAssistEdit()
                        begin
                            //FileName := CommonDialogMgt.OpenFile('',FileName,5,'',0);
                            FileName := CommonDialogMgt.OpenFileDialog('', FileName, '');
                        end;
                    }
                    field(CheckUnique; CheckUnique)
                    {
                        Caption = 'Check Unique';
                    }
                }
            }
        }

        actions
        {
        }
    }

    labels
    {
    }

    trigger OnInitReport()
    begin
        //194-387
        CheckUnique := TRUE;
        //
    end;

    trigger OnPostReport()
    var
        ok: Boolean;
    begin
        OptimeraSetup.GET;
        ok := FALSE;
        FileNameNew := FileName;
        REPEAT
            IF STRPOS(FileNameNew, '\') > 0 THEN BEGIN
                FileNameNew := COPYSTR(FileNameNew, STRPOS(FileNameNew, '\') + 1);
            END ELSE
                ok := TRUE;
        UNTIL ok;
        FileMgt.MoveFile(FileName, OptimeraSetup."Cash Receipt Imported Folder" + FileNameNew);
        //194-578
        //MESSAGE('Algus %1 - LÍpp %2',StartTime,CURRENTDATETIME);
    end;

    trigger OnPreReport()
    var
        CurrNode: Automation;
        ReturnedNode: Automation;
        NodeList: Automation;
        i: Integer;
    begin
        //194-578,kvääk
        StartTime := CURRENTDATETIME;
        //
        CREATE(XMLDomDoc, TRUE, TRUE);
        XMLDomDoc.load(FileName);
        //pangaväljavÍtete lugemine
        FOR i := 1 TO 2 DO BEGIN                                            //kahe formaadi tugi
            IF i = 1 THEN
                FindNodes(XMLDomDoc, 'Document/BkToCstmrAcctRpt/Rpt', NodeList)   //camt.052 - ajaloo väljavÍte
            ELSE
                FindNodes(XMLDomDoc, 'Document/BkToCstmrStmt/Stmt', NodeList);    //camt.053 - jooskva päeva väljavÍte
            NodeList.reset();
            CurrNode := NodeList.nextNode();
            WHILE NOT ISCLEAR(CurrNode) DO BEGIN
                //pangakonto tuvastamine
                BankAccount.SETRANGE(IBAN, FindNodeText(CurrNode, 'Acct/Id/IBAN', TRUE));
                BankAccount.SETRANGE("Currency Code", Ccy2NAVCcy(FindNodeText(CurrNode, 'Acct/Ccy', TRUE)));
                IF BankAccount.COUNT <> 1 THEN
                    ERROR(BankAccNotFoundError, BankAccount.GETFILTERS);
                BankAccount.FINDFIRST;
                //väljavÍtte kannete lugemine
                ReadStmtEntries(CurrNode);

                CurrNode := NodeList.nextNode();
            END;
        END;
    end;

    var
        GLSetup: Record "General Ledger Setup";
        GenJnlBatch: Record "Gen. Journal Batch";
        GenJnlLine: Record "Gen. Journal Line";
        BankAccount: Record "Bank Account";
        XMLDomDoc: Automation;
        CommonDialogMgt: Codeunit "File Management";
        NoSeriesMgt: Codeunit NoSeriesManagement;
        FileName: Text[250];
        StartDocNo: Code[20];
        LineNo: Integer;
        FldLen: Integer;
        CdtDbtInd: Code[10];
        BookgDt: Date;
        ElementRequiredError: Label 'Element %1 is required.';
        BankAccNotFoundError: Label 'Statement bank account was not found.\\Filters: %1';
        FileMgt: Codeunit "File Management";
        FileNameNew: Text;
        OptimeraSetup: Record "Optimera Setup";
        CheckUnique: Boolean;
        TransactionReference: Code[50];
        StartTime: DateTime;

    [Scope('OnPrem')]
    procedure ReadStmtEntries(CurrNode: Automation)
    var
        ReturnedNode: Automation;
        NodeList: Automation;
        OK: Boolean;
    begin
        FindNodes(CurrNode, 'Ntry', NodeList);
        NodeList.reset();
        CurrNode := NodeList.nextNode();
        WHILE NOT ISCLEAR(CurrNode) DO BEGIN
            //Kande tasemelt vajalik info
            //194-387
            TransactionReference := FindNodeText(CurrNode, 'AcctSvcrRef', TRUE);
            //
            CdtDbtInd := FindNodeText(CurrNode, 'CdtDbtInd', TRUE);              //CRDT vÍi DBIT
                                                                                 //IF CdtDbtInd = 'CRDT' THEN BEGIN                                   //vaikimisi laekumised, kuid selle tingimuse vÍib ära jätta
            BookgDt := Txt2Date(FindNodeText(CurrNode, 'BookgDt/DtTm', TRUE));
            //Kande tehingute info lugemine
            //194-387
            IF CheckUnique THEN
                OK := CheckEntryNotImported(TransactionReference)
            ELSE
                OK := TRUE;
            //      IF TransactionReference='968850F8-722A-4C59-9ACC-E5FA359D63CA' THEN
            //      MESSAGE('%1',OK);
            IF OK THEN
                //
                ReadTranDetails(CurrNode);
            //END;
            CurrNode := NodeList.nextNode();
        END;
    end;

    [Scope('OnPrem')]
    procedure ReadTranDetails(CurrNode: Automation)
    var
        Customer: Record Customer;
        Vendor: Record Vendor;
        CustBankAcc: Record "Customer Bank Account";
        VendBankAcc: Record "Vendor Bank Account";
        ReturnedNode: Automation;
        NodeList: Automation;
        RltdPtiesRegNo: Code[20];
        RltdPtiesIBAN: Code[50];
        RefNo: Code[30];
    begin
        FindNodes(CurrNode, 'NtryDtls/TxDtls', NodeList);
        NodeList.reset();
        CurrNode := NodeList.nextNode();
        WHILE NOT ISCLEAR(CurrNode) DO BEGIN
            GenJnlLine.INIT;
            GenJnlLine."Journal Template Name" := GenJnlBatch."Journal Template Name";
            GenJnlLine."Journal Batch Name" := GenJnlBatch.Name;
            LineNo += 10000;
            GenJnlLine."Line No." := LineNo;
            //  GenJnlLine.Description:=FindNodeText(CurrNode,'RmtInf/Ustrd',FALSE);
            //  IF GenJnlLine.Description='REFUND' THEN
            //    GenJnlLine.VALIDATE("Document Type",GenJnlLine."Document Type"::Refund)
            //  else
            GenJnlLine.VALIDATE("Document Type", GenJnlLine."Document Type"::Payment);
            GenJnlLine."Document No." := StartDocNo;
            GenJnlLine.VALIDATE("Posting Date", BookgDt);
            //194-387
            GenJnlLine."EE Bank Transaction Reference" := TransactionReference;
            //
            GenJnlLine.INSERT;

            //makse id
            IF FindNodeText(CurrNode, 'Refs/EndToEndId', FALSE) <> '' THEN
                GenJnlLine."External Document No." := COPYSTR(FindNodeText(CurrNode, 'Refs/EndToEndId', FALSE), 1, 20)
            ELSE
                GenJnlLine."External Document No." := COPYSTR(FindNodeText(CurrNode, 'Refs/InstrId', FALSE), 1, 20);

            //struktueeritud selgituste lugemine (viitenumber)
            RefNo := FindNodeText(CurrNode, 'Refs/EndToEndId', FALSE);
            GenJnlLine."EE Reference No." := RefNo;
            ReadRmtInfStrd(CurrNode, RefNo);

            //mittestruktueeritud selgituste lugemine
            ReadRmtInfUstrd(CurrNode);

            //püüa leida maksja juhul, kui seda eespool viitenumbri pÍhjal ei ole leitud
            IF (GenJnlLine."Account No." = '') AND (CdtDbtInd = 'CRDT') THEN BEGIN
                //otsi reg nr. pÍhjal
                RltdPtiesRegNo := FindNodeText(CurrNode, 'RltdPties/Dbtr/Id/OrgId/Othr/Id', FALSE);
                GenJnlLine."EE Bank Tran. Debitor ID" := RltdPtiesRegNo;

            END;
            GenJnlLine."Payer Information" := FindNodeText(CurrNode, 'RltdPties/Dbtr/Nm', FALSE);
            //korr. konto (väljavÍtte pangakonto)
            GenJnlLine.VALIDATE("Bal. Account Type", GenJnlLine."Bal. Account Type"::"Bank Account");
            GenJnlLine.VALIDATE("Bal. Account No.", BankAccount."No.");

            //summa ja valuuta
            IF NOT FindNode(CurrNode, 'AmtDtls/TxAmt/Amt', ReturnedNode, FALSE) THEN           //TransactionAmount
                IF NOT FindNode(CurrNode, 'AmtDtls/InstdAmt/Amt', ReturnedNode, FALSE) THEN      //InstructedAmount
                    FindNode(CurrNode, 'AmtDtls/TxAmt/Amt', ReturnedNode, TRUE);                   //kuvab veateate
            IF CdtDbtInd = 'CRDT' THEN
                GenJnlLine.VALIDATE(Amount, -Txt2Dec(ReturnedNode.text))
            ELSE
                GenJnlLine.VALIDATE(Amount, Txt2Dec(ReturnedNode.text));
            GenJnlLine.VALIDATE("Currency Code", Ccy2NAVCcy(ReturnedNode.attributes.getNamedItem('Ccy').text));

            //siin on saadaval konv kurss ja konv valuuta
            //FindNode(CurrNode,'AmtDtls/TxAmt/CcyXchg',ReturnedNode,FALSE);


            //66488
            //GenJnlLine.Description:=FindNodeText(CurrNode,'RmtInf/Ustrd',FALSE);
            //  IF STRPOS(GenJnlLine.Description,'VAT')>0 THEN
            //    GenJnlLine.Description:='VAT';
            //GenJnlLine."EE Payment Description":=GenJnlLine.Description;
            GenJnlLine."EE Payment Description" := FindNodeText(CurrNode, 'RmtInf/Ustrd', FALSE);
            GenJnlLine.Description := COPYSTR(GenJnlLine.Comment, 1, MAXSTRLEN(GenJnlLine.Description));
            //
            GenJnlLine.MODIFY;
            StartDocNo := INCSTR(StartDocNo);
            CurrNode := NodeList.nextNode();
        END;
    end;

    [Scope('OnPrem')]
    procedure ReadRmtInfStrd(CurrNode: Automation; RefNo: Code[30])
    var
        CustLedgEntry: Record "Cust. Ledger Entry";
        CustLedgEntry2: Record "Cust. Ledger Entry";
        ReturnedNode: Automation;
        NodeList: Automation;
    begin
        FindNodes(CurrNode, 'RmtInf/Strd', NodeList);
        NodeList.reset();
        CurrNode := NodeList.nextNode();
        WHILE NOT ISCLEAR(CurrNode) DO BEGIN
            //RefNo := FindNodeText(CurrNode,'CdtrRefInf/Ref',FALSE);
            //Igal maksel on toetatud üks viitenumber (pangapoolne piirang) ja sidumine
            IF (RefNo <> '') AND (CdtDbtInd = 'CRDT') AND (GenJnlLine."Applies-to Doc. No." = '') THEN BEGIN
                //194-578 kvääk see eelmine open vÍis suunduda hoopis indeksile Open, Due date
                CustLedgEntry.SETCURRENTKEY(Open, "EE Reference No.");//NEW
                                                                      //CustLedgEntry.SETCURRENTKEY(Open); //ORIG
                                                                      //
                CustLedgEntry.SETRANGE(Open, TRUE);
                CustLedgEntry.SETRANGE("EE Reference No.", RefNo);
                IF CustLedgEntry.FINDFIRST THEN BEGIN
                    //kui selle viitenumbriga esineb ainult ühe kliendi kandeid, siis kasuta seda klienti
                    CustLedgEntry2.COPY(CustLedgEntry);
                    CustLedgEntry2.SETFILTER("Customer No.", '<>%1', CustLedgEntry."Customer No.");
                    IF NOT CustLedgEntry2.FINDFIRST THEN BEGIN
                        GenJnlLine.VALIDATE("Account Type", GenJnlLine."Account Type"::Customer);
                        GenJnlLine.VALIDATE("Account No.", CustLedgEntry."Customer No.");
                    END;
                    //kui selle viitenumbriga leitakse üks kanne, siis kasuta seda kannet


                    //194-387
                    IF CustLedgEntry."Posting Date" <= GenJnlLine."Posting Date" THEN//
                        IF CustLedgEntry.COUNT = 1 THEN BEGIN
                            GenJnlLine.VALIDATE("Applies-to Doc. Type", CustLedgEntry."Document Type");
                            GenJnlLine.VALIDATE("Applies-to Doc. No.", CustLedgEntry."Document No.");
                        END;
                END;
            END;
            CurrNode := NodeList.nextNode();
        END;
    end;

    [Scope('OnPrem')]
    procedure ReadRmtInfUstrd(CurrNode: Automation)
    var
        ReturnedNode: Automation;
        NodeList: Automation;
    begin
        FindNodes(CurrNode, 'RmtInf/Ustrd', NodeList);
        NodeList.reset();
        CurrNode := NodeList.nextNode();
        WHILE NOT ISCLEAR(CurrNode) DO BEGIN
            //VV oli Details of Order
            FldLen := MAXSTRLEN(GenJnlLine.Comment);
            IF GenJnlLine.Comment = '' THEN
                GenJnlLine.Comment := COPYSTR(CurrNode.text, 1, FldLen)
            ELSE
                GenJnlLine.Comment += COPYSTR('; ' + CurrNode.text, 1, FldLen);
            CurrNode := NodeList.nextNode();
        END;
        //66488
        GenJnlLine.Description := COPYSTR(GenJnlLine.Comment, 1, MAXSTRLEN(GenJnlLine.Description));
        //
    end;

    [Scope('OnPrem')]
    procedure SetInitialValue(CashReceiptTemplateName: Code[10]; CashReceiptBatchName: Code[10])
    begin
        GenJnlBatch.GET(CashReceiptTemplateName, CashReceiptBatchName);
        GenJnlLine.SETRANGE("Journal Template Name", CashReceiptTemplateName);
        GenJnlLine.SETRANGE("Journal Batch Name", CashReceiptBatchName);
        IF GenJnlLine.FINDLAST THEN BEGIN
            LineNo := GenJnlLine."Line No.";
            StartDocNo := INCSTR(GenJnlLine."Document No.");
        END ELSE
            StartDocNo := NoSeriesMgt.TryGetNextNo(GenJnlBatch."No. Series", WORKDATE);
    end;

    [Scope('OnPrem')]
    procedure FindNode(XMLRootNode: Automation; NodePath: Text[250]; var FoundXMLNode: Automation; Required: Boolean): Boolean
    begin
        FoundXMLNode := XMLRootNode.selectSingleNode(NodePath);
        IF ISCLEAR(FoundXMLNode) THEN
            IF Required THEN
                ERROR(ElementRequiredError, NodePath)
            ELSE
                EXIT(FALSE)
        ELSE
            EXIT(TRUE);
    end;

    [Scope('OnPrem')]
    procedure FindNodeText(XMLRootNode: Automation; NodePath: Text[250]; Required: Boolean): Text[260]
    var
        FoundXMLNode: Automation;
    begin
        FoundXMLNode := XMLRootNode.selectSingleNode(NodePath);
        IF ISCLEAR(FoundXMLNode) THEN BEGIN
            IF Required THEN
                ERROR(ElementRequiredError, NodePath);
            EXIT('');
        END ELSE
            EXIT(FoundXMLNode.text);
    end;

    [Scope('OnPrem')]
    procedure FindNodes(XMLRootNode: Automation; NodePath: Text[250]; var ReturnedXMLNodeList: Automation): Boolean
    begin
        ReturnedXMLNodeList := XMLRootNode.selectNodes(NodePath);
        IF ISCLEAR(ReturnedXMLNodeList) THEN
            EXIT(FALSE)
        ELSE
            EXIT(TRUE);
    end;

    [Scope('OnPrem')]
    procedure Txt2Date(txtBookgDt: Text[30]) dateBookgDt: Date
    var
        Year: Integer;
        Month: Integer;
        Day: Integer;
    begin
        EVALUATE(Year, COPYSTR(txtBookgDt, 1, 4));
        EVALUATE(Month, COPYSTR(txtBookgDt, 6, 2));
        EVALUATE(Day, COPYSTR(txtBookgDt, 9, 2));
        dateBookgDt := DMY2DATE(Day, Month, Year);
    end;

    [Scope('OnPrem')]
    procedure Txt2Dec(txtAmount: Text[30]) decAmount: Decimal
    begin
        EVALUATE(decAmount, CONVERTSTR(txtAmount, '.', ','));
    end;

    [Scope('OnPrem')]
    procedure Ccy2NAVCcy(CurrencyCode: Code[10]): Code[10]
    begin
        IF CurrencyCode = 'EUR' THEN
            EXIT('')
        ELSE
            EXIT(CurrencyCode);
    end;

    local procedure CheckEntryNotImported(TransRef: Code[50]): Boolean
    var
        GenJnlLineX: Record "Gen. Journal Line";
        BankLedgEntry: Record "Bank Account Ledger Entry";
    begin
        //194-387
        // GenJnlLine.RESET;
        // GenJnlLine.SETRANGE("EE Bank Transaction Reference",TransRef);
        // IF GenJnlLine.FINDFIRST THEN
        //  EXIT(FALSE);
        BankLedgEntry.RESET;
        //194-578
        BankLedgEntry.SETCURRENTKEY("EE Bank Transaction Reference");//NEW
        //
        BankLedgEntry.SETRANGE("EE Bank Transaction Reference", TransRef);
        IF BankLedgEntry.FINDFIRST THEN
            EXIT(FALSE);
        EXIT(TRUE);
    end;
}

Editor is loading...
Leave a Comment