Codeunit 1247 Process Gen. Journal Lines

App
Base Application
Namespace
Microsoft.Bank.Statement
Versions
17-28

Procedures, 3Events, 5Obsolete, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Bank/Statement/ProcessGenJournalLines.Codeunit.al202 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Bank.Statement;

using Microsoft.Bank.BankAccount;
using Microsoft.Bank.Setup;
using Microsoft.Finance.GeneralLedger.Journal;
using System.IO;

/// <summary>
/// Processes bank statement imports into general journal lines through data exchange framework.
/// Handles the conversion of imported bank statement data into general journal entries for posting.
/// </summary>
/// <remarks>
/// Integrates with Data Exchange Framework for bank statement file processing.
/// Creates general journal lines from imported bank transactions with proper document numbering.
/// Supports various bank account configurations and import formats through Bank Export/Import Setup.
/// </remarks>
codeunit 1247 "Process Gen. Journal  Lines"
{
    Permissions = TableData "Data Exch." = rimd;
    TableNo = "Gen. Journal Line";

    trigger OnRun()
    var
        DataExch: Record "Data Exch.";
        ProcessDataExch: Codeunit "Process Data Exch.";
        RecRef: RecordRef;
    begin
        DataExch.Get(Rec."Data Exch. Entry No.");
        RecRef.GetTable(Rec);
        ProcessDataExch.ProcessAllLinesColumnMapping(DataExch, RecRef);
    end;

    var
        ProgressWindowMsg: Label 'Please wait while the operation is being completed.';

    /// <summary>
    /// Imports a bank statement from a file into general journal lines.
    /// Processes the data exchange format and creates new journal lines based on the imported bank transactions.
    /// </summary>
    /// <param name="GenJnlLine">The general journal line that contains the import configuration and target batch.</param>
    procedure ImportBankStatement(GenJnlLine: Record "Gen. Journal Line")
    var
        GenJnlBatch: Record "Gen. Journal Batch";
        BankAcc: Record "Bank Account";
        BankExportImportSetup: Record "Bank Export/Import Setup";
        DataExchDef: Record "Data Exch. Def";
        DataExchMapping: Record "Data Exch. Mapping";
        DataExchLineDef: Record "Data Exch. Line Def";
        DataExch: Record "Data Exch.";
        GenJnlLineTemplate: Record "Gen. Journal Line";
        ProgressWindow: Dialog;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeImportBankStatement(GenJnlLine, IsHandled);
        if IsHandled then
            exit;

        GenJnlBatch.Get(GenJnlLine."Journal Template Name", GenJnlLine."Journal Batch Name");

        case GenJnlBatch."Bal. Account Type" of
            GenJnlBatch."Bal. Account Type"::"Bank Account":
                begin
                    GenJnlBatch.TestField("Bal. Account No.");
                    BankAcc.Get(GenJnlBatch."Bal. Account No.");
                    BankAcc.GetDataExchDef(DataExchDef);
                end;
            GenJnlBatch."Bal. Account Type"::"G/L Account":
                begin
                    GenJnlBatch.TestField("Bank Statement Import Format");
                    BankExportImportSetup.Get(GenJnlBatch."Bank Statement Import Format");
                    BankExportImportSetup.TestField("Data Exch. Def. Code");
                    DataExchDef.Get(BankExportImportSetup."Data Exch. Def. Code");
                    DataExchDef.TestField(Type, DataExchDef.Type::"Bank Statement Import");
                end;
            else
                GenJnlBatch.FieldError("Bal. Account Type");
        end;
        CreateGeneralJournalLineTemplate(GenJnlLineTemplate, GenJnlLine);

        if not DataExch.ImportToDataExch(DataExchDef) then
            exit;

        GenJnlLineTemplate."Data Exch. Entry No." := DataExch."Entry No.";

        ProgressWindow.Open(ProgressWindowMsg);

        DataExchLineDef.SetRange("Data Exch. Def Code", DataExchDef.Code);
        DataExchLineDef.FindFirst();

        DataExchMapping.Get(DataExchDef.Code, DataExchLineDef.Code, DATABASE::"Gen. Journal Line");
        DataExchMapping.TestField("Mapping Codeunit");
        CODEUNIT.Run(DataExchMapping."Mapping Codeunit", GenJnlLineTemplate);

        UpdateGenJournalLines(GenJnlLineTemplate);

        ProgressWindow.Close();

        OnAfterImportBankStatement(GenJnlLine, GenJnlLineTemplate);
    end;

    /// <summary>
    /// Creates a template for general journal lines that will be used during bank statement import.
    /// Sets up the basic fields and document numbering for imported transactions.
    /// </summary>
    /// <param name="GenJournalLineTemplate">The template record that will be created and configured.</param>
    /// <param name="GenJournalLine">The source general journal line containing the batch and template information.</param>
    procedure CreateGeneralJournalLineTemplate(var GenJournalLineTemplate: Record "Gen. Journal Line"; GenJournalLine: Record "Gen. Journal Line")
    begin
        GenJournalLineTemplate."Journal Template Name" := GenJournalLine."Journal Template Name";
        GenJournalLineTemplate."Journal Batch Name" := GenJournalLine."Journal Batch Name";
        GenJournalLineTemplate.SetUpNewLine(GenJournalLine, GenJournalLine."Balance (LCY)", true);
        GenJournalLineTemplate."Account Type" := GenJournalLineTemplate."Account Type"::"G/L Account";

        GenJournalLine.SetRange("Journal Template Name", GenJournalLine."Journal Template Name");
        GenJournalLine.SetRange("Journal Batch Name", GenJournalLine."Journal Batch Name");
        if GenJournalLine.FindLast() then begin
            GenJournalLineTemplate."Line No." := GenJournalLine."Line No.";
            GenJournalLineTemplate."Document No." := IncStr(GenJournalLine."Document No.");
        end else
            GenJournalLineTemplate."Document No." := GenJournalLine."Document No.";

        OnAfterCreateGeneralJournalLineTemplate(GenJournalLineTemplate, GenJournalLine);
    end;

    /// <summary>
    /// Updates document numbers for general journal lines after importing a bank statement.
    /// Ensures sequential document numbering for the imported transactions.
    /// </summary>
    /// <param name="GenJournalLineTemplate">The template record containing the starting document number and batch information.</param>
    procedure UpdateGenJournalLines(var GenJournalLineTemplate: Record "Gen. Journal Line")
    var
        GenJournalLine: Record "Gen. Journal Line";
        DocNo: Code[20];
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateGenJnlLinesProcedure(GenJournalLineTemplate, IsHandled);
        if IsHandled then
            exit;

        GenJournalLine.SetRange("Journal Template Name", GenJournalLineTemplate."Journal Template Name");
        GenJournalLine.SetRange("Journal Batch Name", GenJournalLineTemplate."Journal Batch Name");
        GenJournalLine.SetFilter("Line No.", '>%1', GenJournalLineTemplate."Line No.");
        if GenJournalLine.FindSet() then begin
            DocNo := GenJournalLineTemplate."Document No.";
            repeat
                GenJournalLine.Validate("Document No.", DocNo);
                GenJournalLine.Modify(true);
                DocNo := IncStr(DocNo);
            until GenJournalLine.Next() = 0;
        end;
    end;

    /// <summary>
    /// Integration event raised after creating a general journal line template during bank statement import.
    /// </summary>
    /// <param name="GenJournalLineTemplate">The template record that was created.</param>
    /// <param name="GenJournalLine">The source general journal line.</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateGeneralJournalLineTemplate(var GenJournalLineTemplate: Record "Gen. Journal Line"; GenJournalLine: Record "Gen. Journal Line");
    begin
    end;

    /// <summary>
    /// Integration event raised after completing the bank statement import process.
    /// </summary>
    /// <param name="GenJournalLine">The original general journal line used for import.</param>
    /// <param name="GenJournalLineTemplate">The template record used during import.</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterImportBankStatement(var GenJournalLine: Record "Gen. Journal Line"; GenJournalLineTemplate: Record "Gen. Journal Line")
    begin
    end;

    /// <summary>
    /// Integration event raised before starting the bank statement import process.
    /// Allows custom handling of the import operation.
    /// </summary>
    /// <param name="GenJournalLine">The general journal line containing import configuration.</param>
    /// <param name="IsHandled">Set to true to skip the default import processing.</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeImportBankStatement(var GenJournalLine: Record "Gen. Journal Line"; var IsHandled: Boolean)
    begin
    end;

    /// <summary>
    /// Integration event raised before updating general journal line document numbers.
    /// Allows custom handling of the document number update process.
    /// </summary>
    /// <param name="GenJournalLineTemplate">The template record containing the batch and numbering information.</param>
    /// <param name="IsHandled">Set to true to skip the default update processing.</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateGenJnlLinesProcedure(var GenJournalLineTemplate: Record "Gen. Journal Line"; var IsHandled: Boolean)
    begin
    end;
}