Codeunit 1253 Change Bank Rec. Statement No., source in 29

Source29

src/Layers/W1/BaseApp/Bank/Reconciliation/ChangeBankRecStatementNo.Codeunit.al144 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.Bank.Check;
using Microsoft.Bank.Ledger;

/// <summary>
/// Provides functionality to change bank reconciliation statement numbers.
/// Handles statement number updates and related data integrity operations.
/// </summary>
codeunit 1253 "Change Bank Rec. Statement No."
{
    Permissions = TableData "Bank Acc. Reconciliation" = rimd,
                  TableData "Bank Acc. Reconciliation Line" = rimd,
                  TableData "Bank Account Ledger Entry" = rm,
                  TableData "Check Ledger Entry" = rm;
    TableNo = "Bank Acc. Reconciliation";

    trigger OnRun()
    var
        BankAccReconciliation: Record "Bank Acc. Reconciliation";
        NewStatementNo: Code[20];
    begin
        BankAccReconciliation := Rec;

        if GetNewStatementNo(BankAccReconciliation, NewStatementNo) then begin
            ChangeStatementNo(BankAccReconciliation, NewStatementNo);
            Rec := BankAccReconciliation;
        end;
    end;

    local procedure GetNewStatementNo(BankAccReconciliation: Record "Bank Acc. Reconciliation"; var NewStatementNo: Code[20]): Boolean
    var
        ChangeBankRecStatementNo: Page "Change Bank Rec. Statement No.";
    begin
        ChangeBankRecStatementNo.SetBankAccReconciliation(BankAccReconciliation);
        if ChangeBankRecStatementNo.RunModal() = Action::OK then begin
            NewStatementNo := ChangeBankRecStatementNo.GetNewStatementNo();
            exit(NewStatementNo <> BankAccReconciliation."Statement No.");
        end;
        exit(false);
    end;

    local procedure ChangeStatementNo(var BankAccReconciliation: Record "Bank Acc. Reconciliation"; NewStatementNo: Code[20])
    var
        TempBankAccReconciliation: Record "Bank Acc. Reconciliation" temporary;
        TempBankAccReconciliationLine: Record "Bank Acc. Reconciliation Line" temporary;
        TempBankAccRecMatchBuffer: Record "Bank Acc. Rec. Match Buffer" temporary;
    begin
        TempBankAccReconciliation.OnInsertValidations(BankAccReconciliation."Statement Type", BankAccReconciliation."Bank Account No.", NewStatementNo);
        UpdateAppliedBankLedgerEntries(BankAccReconciliation, NewStatementNo);
        UpdateAppliedCheckLedgerEntries(BankAccReconciliation, NewStatementNo);

        MoveBankAccReconiliationToBuffers(BankAccReconciliation, TempBankAccReconciliation, TempBankAccReconciliationLine, TempBankAccRecMatchBuffer);

        CreateBankAccReconciliationWithNewStatementNo(
            BankAccReconciliation, TempBankAccReconciliation, TempBankAccReconciliationLine, TempBankAccRecMatchBuffer, NewStatementNo);
    end;

    local procedure MoveBankAccReconiliationToBuffers(var BankAccReconciliation: Record "Bank Acc. Reconciliation"; var TempBankAccReconciliation: Record "Bank Acc. Reconciliation" temporary; var TempBankAccReconciliationLine: Record "Bank Acc. Reconciliation Line" temporary; var TempBankAccRecMatchBuffer: Record "Bank Acc. Rec. Match Buffer" temporary)
    var
        BankAccReconciliationLine: Record "Bank Acc. Reconciliation Line";
        BankAccRecMatchBuffer: Record "Bank Acc. Rec. Match Buffer";
    begin
        TempBankAccReconciliation.TransferFields(BankAccReconciliation);
        TempBankAccReconciliation.Insert();
        BankAccReconciliation.Delete();

        BankAccReconciliationLine.SetRange("Statement Type", BankAccReconciliation."Statement Type");
        BankAccReconciliationLine.SetRange("Bank Account No.", BankAccReconciliation."Bank Account No.");
        BankAccReconciliationLine.SetRange("Statement No.", BankAccReconciliation."Statement No.");
        if BankAccReconciliationLine.FindSet() then
            repeat
                TempBankAccReconciliationLine.TransferFields(BankAccReconciliationLine);
                TempBankAccReconciliationLine.Insert();
            until BankAccReconciliationLine.Next() = 0;
        BankAccReconciliationLine.DeleteAll();

        BankAccRecMatchBuffer.SetRange("Bank Account No.", BankAccReconciliation."Bank Account No.");
        BankAccRecMatchBuffer.SetRange("Statement No.", BankAccReconciliation."Statement No.");
        if BankAccRecMatchBuffer.FindSet() then
            repeat
                TempBankAccRecMatchBuffer.TransferFields(BankAccRecMatchBuffer);
                TempBankAccRecMatchBuffer.Insert();
            until BankAccRecMatchBuffer.Next() = 0;
        BankAccRecMatchBuffer.DeleteAll();
    end;

    local procedure CreateBankAccReconciliationWithNewStatementNo(var BankAccReconciliation: Record "Bank Acc. Reconciliation"; var TempBankAccReconciliation: Record "Bank Acc. Reconciliation" temporary; var TempBankAccReconciliationLine: Record "Bank Acc. Reconciliation Line" temporary; var TempBankAccRecMatchBuffer: Record "Bank Acc. Rec. Match Buffer" temporary; NewStatementNo: Code[20])
    var
        BankAccReconciliationLine: Record "Bank Acc. Reconciliation Line";
        BankAccRecMatchBuffer: Record "Bank Acc. Rec. Match Buffer";
    begin
        BankAccReconciliation.TransferFields(TempBankAccReconciliation);
        BankAccReconciliation."Statement No." := NewStatementNo;
        BankAccReconciliation.Insert();

        if TempBankAccReconciliationLine.FindSet() then
            repeat
                BankAccReconciliationLine.TransferFields(TempBankAccReconciliationLine);
                BankAccReconciliationLine."Statement No." := NewStatementNo;
                OnCreateBankAccReconciliationWithNewStatementNoOnBeforeInsertBankAccReconciliationLine(BankAccReconciliationLine, BankAccReconciliation, TempBankAccReconciliation, TempBankAccReconciliationLine, TempBankAccRecMatchBuffer, NewStatementNo);
                BankAccReconciliationLine.Insert();
            until TempBankAccReconciliationLine.Next() = 0;

        if TempBankAccRecMatchBuffer.FindSet() then
            repeat
                BankAccRecMatchBuffer.TransferFields(TempBankAccRecMatchBuffer);
                BankAccRecMatchBuffer."Statement No." := NewStatementNo;
                BankAccRecMatchBuffer.Insert();
            until TempBankAccRecMatchBuffer.Next() = 0;
    end;

    local procedure UpdateAppliedBankLedgerEntries(BankAccReconciliation: Record "Bank Acc. Reconciliation"; NewStatementNo: Code[20])
    var
        BankAccountLedgerEntry: Record "Bank Account Ledger Entry";
    begin
        BankAccountLedgerEntry.SetRange("Statement No.", BankAccReconciliation."Statement No.");
        BankAccountLedgerEntry.SetRange("Bank Account No.", BankAccReconciliation."Bank Account No.");
        BankAccountLedgerEntry.SetFilter("Statement Status", '%1|%2', BankAccountLedgerEntry."Statement Status"::"Bank Acc. Entry Applied", BankAccountLedgerEntry."Statement Status"::"Check Entry Applied");
        if not BankAccountLedgerEntry.IsEmpty() then
            BankAccountLedgerEntry.ModifyAll("Statement No.", NewStatementNo);
    end;

    local procedure UpdateAppliedCheckLedgerEntries(BankAccReconciliation: Record "Bank Acc. Reconciliation"; NewStatementNo: Code[20])
    var
        CheckLedgerEntry: Record "Check Ledger Entry";
    begin
        CheckLedgerEntry.SetRange("Statement No.", BankAccReconciliation."Statement No.");
        CheckLedgerEntry.SetRange("Bank Account No.", BankAccReconciliation."Bank Account No.");
        CheckLedgerEntry.SetFilter("Statement Status", '%1|%2', CheckLedgerEntry."Statement Status"::"Bank Acc. Entry Applied", CheckLedgerEntry."Statement Status"::"Check Entry Applied");
        if not CheckLedgerEntry.IsEmpty() then
            CheckLedgerEntry.ModifyAll("Statement No.", NewStatementNo);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateBankAccReconciliationWithNewStatementNoOnBeforeInsertBankAccReconciliationLine(var BankAccReconciliationLine: Record "Bank Acc. Reconciliation Line"; var BankAccReconciliation: Record "Bank Acc. Reconciliation"; var TempBankAccReconciliation: Record "Bank Acc. Reconciliation" temporary; var TempBankAccReconciliationLine: Record "Bank Acc. Reconciliation Line" temporary; var TempBankAccRecMatchBuffer: Record "Bank Acc. Rec. Match Buffer" temporary; NewStatementNo: Code[20]);
    begin
    end;
}