Codeunit 120 Calc. Running Cust. Balance, source in 29

Source29

src/Layers/W1/BaseApp/Sales/Receivables/CalcRunningCustBalance.codeunit.al50 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.Sales.Receivables;

/// <summary>
/// Calculates and caches the running balance in local currency for customer ledger entries to optimize balance display on list pages.
/// </summary>
codeunit 120 "Calc. Running Cust. Balance"
{
    InherentPermissions = X;

    var
        CustLedgerEntry2: Record "Cust. Ledger Entry";
        ClientTypeManagement: Codeunit System.Environment."Client Type Management";
        EntryValuesLCY: Dictionary of [Integer, Decimal];

    internal procedure GetCustomerBalanceLCY(var CustLedgerEntry: Record "Cust. Ledger Entry"): Decimal
    var
        RunningBalanceLCY: Decimal;
    begin
        CalcCustomerBalance(CustLedgerEntry, RunningBalanceLCY);
        exit(RunningBalanceLCY);
    end;

    local procedure CalcCustomerBalance(var CustLedgerEntry: Record "Cust. Ledger Entry"; var RunningBalanceLCY: Decimal)
    var
        BalanceLCY: Decimal;
    begin
        if ClientTypeManagement.GetCurrentClientType() in [ClientType::OData, ClientType::ODataV4] then
            exit;
        if EntryValuesLCY.Get(CustLedgerEntry."Entry No.", RunningBalanceLCY) then
            exit;
        RunningBalanceLCY := 0;
        CustLedgerEntry2.SetLoadFields("Entry No.", "Amount (LCY)");
        CustLedgerEntry2.SetAutoCalcFields("Amount (LCY)");
        CustLedgerEntry2.SetRange("Customer No.", CustLedgerEntry."Customer No.");
        CustLedgerEntry2.SetCurrentKey("Customer No.", "Posting Date", "Entry No.");
        if CustLedgerEntry2.FindSet() then
            repeat
                BalanceLCY += CustLedgerEntry2."Amount (LCY)";
                if CustLedgerEntry2."Entry No." = CustLedgerEntry."Entry No." then
                    RunningBalanceLCY := BalanceLCY;
                if not EntryValuesLCY.ContainsKey(CustLedgerEntry2."Entry No.") then
                    EntryValuesLCY.Add(CustLedgerEntry2."Entry No.", BalanceLCY);
            until CustLedgerEntry2.Next() = 0;
    end;
}