Report 1497 Trans. Bank Rec. to Gen. Jnl., source in 29

Source29

src/Layers/W1/BaseApp/Bank/Reconciliation/TransBankRectoGenJnl.Report.al232 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.Reconciliation;

using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.NoSeries;

/// <summary>
/// Report for transferring bank reconciliation lines to general journal.
/// Converts reconciliation discrepancies into journal entries for posting.
/// </summary>
report 1497 "Trans. Bank Rec. to Gen. Jnl."
{
    Caption = 'Trans. Bank Rec. to Gen. Jnl.';
    ProcessingOnly = true;

    dataset
    {
        dataitem("Bank Acc. Reconciliation"; "Bank Acc. Reconciliation")
        {
            DataItemTableView = sorting("Bank Account No.", "Statement No.") where("Statement Type" = const("Bank Reconciliation"));
            dataitem("Bank Acc. Reconciliation Line"; "Bank Acc. Reconciliation Line")
            {
                DataItemLink = "Bank Account No." = field("Bank Account No."), "Statement No." = field("Statement No.");
                DataItemTableView = sorting("Bank Account No.", "Statement No.", "Statement Line No.");

                trigger OnAfterGetRecord()
                var
                    SourceCodeSetup: Record "Source Code Setup";
                    MatchBankRecLines: Codeunit "Match Bank Rec. Lines";
                begin
                    if Difference = 0 then
                        CurrReport.Skip();
                    if not TempBankAccReconciliationLine.IsEmpty() then
                        if not TempBankAccReconciliationLine.get(
                            "Bank Acc. Reconciliation Line"."Statement Type",
                            "Bank Acc. Reconciliation Line"."Bank Account No.",
                            "Bank Acc. Reconciliation Line"."Statement No.",
                            "Bank Acc. Reconciliation Line"."Statement Line No.") then
                            CurrReport.Skip();

                    GenJnlLine.Init();
                    OnAfterGenJnlLineInit(GenJnlLine, "Bank Acc. Reconciliation Line");
                    GenJnlLine."Line No." := GenJnlLine."Line No." + 10000;
                    GenJnlLine.Validate("Posting Date", "Transaction Date");
                    SourceCodeSetup.Get();
                    case
                        GenJnlTemplate.Type of
                        GenJnlTemplate.Type::General:
                            GenJnlLine."Source Code" := SourceCodeSetup."General Journal";
                        GenJnlTemplate.Type::Purchases:
                            GenJnlLine."Source Code" := SourceCodeSetup."Purchase Journal";
                        GenJnlTemplate.Type::Sales:
                            GenJnlLine."Source Code" := SourceCodeSetup."Sales Journal";
                        else
                            GenJnlLine."Source Code" := SourceCodeSetup."Trans. Bank Rec. to Gen. Jnl.";
                    end;
                    if "Document No." <> '' then
                        GenJnlLine."Document No." := "Document No."
                    else
                        if GenJnlBatch."No. Series" <> '' then
                            GenJnlLine."Document No." := NoSeriesBatch.GetNextNo(GenJnlBatch."No. Series", "Transaction Date");
                    GenJnlLine."Posting No. Series" := GenJnlBatch."Posting No. Series";

                    if (GenJnlBatch."Bal. Account No." <> '') and
                       ((GenJnlBatch."Bal. Account Type" <> GenJnlBatch."Bal. Account Type"::"Bank Account") or
                        (GenJnlBatch."Bal. Account No." <> "Bank Acc. Reconciliation"."Bank Account No."))
                    then begin
                        GenJnlLine.Validate("Bal. Account Type", GenJnlBatch."Bal. Account Type");
                        GenJnlLine.Validate("Bal. Account No.", GenJnlBatch."Bal. Account No.");
                        GenJnlLine.Validate(Amount, Difference);
                    end else begin
                        GenJnlLine.Validate("Bal. Account Type", GenJnlLine."Account Type"::"Bank Account");
                        GenJnlLine.Validate("Bal. Account No.", "Bank Acc. Reconciliation"."Bank Account No.");
                        GenJnlLine.Validate(Amount, -Difference);
                    end;

                    GenJnlLine.Description := Description;
                    GenJnlLine."Keep Description" := true;
                    OnBeforeGenJnlLineInsert(GenJnlLine, "Bank Acc. Reconciliation Line");
                    if not MatchBankRecLines.BankReconciliationLineInManyToOne("Bank Acc. Reconciliation Line") then begin
                        GenJnlLine."Linked Table ID" := Database::"Bank Acc. Reconciliation Line";
                        GenJnlLine."Linked System ID" := "Bank Acc. Reconciliation Line".SystemId;
                    end;
                    GenJnlLine.Insert();
                end;

                trigger OnPreDataItem()
                begin
                    GenJnlTemplate.Get(GenJnlLine."Journal Template Name");
                    GenJnlBatch.Get(GenJnlLine."Journal Template Name", GenJnlLine."Journal Batch Name");
                    GenJnlLine.SetRange("Journal Template Name", GenJnlBatch."Journal Template Name");
                    if GenJnlBatch.Name <> '' then
                        GenJnlLine.SetRange("Journal Batch Name", GenJnlBatch.Name)
                    else
                        GenJnlLine.SetRange("Journal Batch Name", '');

                    GenJnlLine.LockTable();
                    if GenJnlLine.FindLast() then;
                end;
            }

            trigger OnPreDataItem()
            begin
                SetRange("Statement Type", BankAccRecon."Statement Type");
                SetRange("Bank Account No.", BankAccRecon."Bank Account No.");
                SetRange("Statement No.", BankAccRecon."Statement No.");
            end;
        }
    }

    requestpage
    {
        SaveValues = true;

        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
#pragma warning disable AA0100
                    field("GenJnlLine.""Journal Template Name"""; GenJnlLine."Journal Template Name")
#pragma warning restore AA0100
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Gen. Journal Template';
                        NotBlank = true;
                        TableRelation = "Gen. Journal Template";
                        ToolTip = 'Specifies the general journal template that the entries are placed in.';
                    }
#pragma warning disable AA0100
                    field("GenJnlLine.""Journal Batch Name"""; GenJnlLine."Journal Batch Name")
#pragma warning restore AA0100
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Gen. Journal Batch';
                        Lookup = true;
                        NotBlank = true;
                        ToolTip = 'Specifies the general journal batch that the entries are placed in.';

                        trigger OnLookup(var Text: Text): Boolean
                        begin
                            GenJnlLine.TestField("Journal Template Name");
                            GenJnlTemplate.Get(GenJnlLine."Journal Template Name");
                            GenJnlBatch.FilterGroup(2);
                            GenJnlBatch.SetRange("Journal Template Name", GenJnlLine."Journal Template Name");
                            GenJnlBatch.FilterGroup(0);
                            GenJnlBatch.Name := GenJnlLine."Journal Batch Name";
                            if GenJnlBatch.Find('=><') then;
                            if PAGE.RunModal(0, GenJnlBatch) = ACTION::LookupOK then begin
                                Text := GenJnlBatch.Name;
                                exit(true);
                            end;
                        end;

                        trigger OnValidate()
                        begin
                            GenJnlLine.TestField("Journal Template Name");
                            GenJnlBatch.Get(GenJnlLine."Journal Template Name", GenJnlLine."Journal Batch Name");
                        end;
                    }
                }
            }
        }

        actions
        {
        }
    }

    labels
    {
    }
    var
        TempBankAccReconciliationLine: Record "Bank Acc. Reconciliation Line" temporary;

    trigger OnPostReport()
    begin
        GenJnlManagement.TemplateSelectionFromBatch(GenJnlBatch);
    end;

    var
        GenJnlTemplate: Record "Gen. Journal Template";
        GenJnlBatch: Record "Gen. Journal Batch";
        GenJnlLine: Record "Gen. Journal Line";
        BankAccRecon: Record "Bank Acc. Reconciliation";
        GenJnlManagement: Codeunit GenJnlManagement;
        NoSeriesBatch: Codeunit "No. Series - Batch";

    procedure SetBankAccRecon(var UseBankAccRecon: Record "Bank Acc. Reconciliation")
    begin
        BankAccRecon := UseBankAccRecon;
    end;

    procedure SetBankAccReconLine(var UsetempBankAccReconciliationLine: Record "Bank Acc. Reconciliation Line" temporary)
    begin
        if UsetempBankAccReconciliationLine.FindSet() then
            repeat
                TempBankAccReconciliationLine := UseTempBankAccReconciliationLine;
                TempBankAccReconciliationLine.Insert();
            until UsetempBankAccReconciliationLine.Next() = 0;
    end;

    procedure InitializeRequest(GenJnlTemplateName: Code[10]; GenJnlBatchName: Code[10])
    begin
        GenJnlLine."Journal Template Name" := GenJnlTemplateName;
        GenJnlLine."Journal Batch Name" := GenJnlBatchName;
    end;

    /// <summary>
    /// Raised after the General Journal Line is initialized, before the document number and balance account are assigned.
    /// Use this event to populate custom fields on the journal line.
    /// </summary>
    /// <param name="GenJournalLine">The General Journal Line that was initialized.</param>
    /// <param name="BankAccReconciliationLine">The Bank Account Reconciliation Line being transferred.</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterGenJnlLineInit(var GenJournalLine: Record "Gen. Journal Line"; BankAccReconciliationLine: Record "Bank Acc. Reconciliation Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGenJnlLineInsert(var GenJournalLine: Record "Gen. Journal Line"; BankAccReconciliationLine: Record "Bank Acc. Reconciliation Line")
    begin
    end;
}