Table 840 Cash Flow Forecast

App
Base Application
Namespace
Microsoft.CashFlow.Forecast
Versions
17-28

Fields, 23Keys, 1Procedures, 21Events, 2Obsolete, 3

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/CashFlow/Forecast/CashFlowForecast.Table.al386 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.CashFlow.Forecast;

using Microsoft.CashFlow.Comment;
using Microsoft.CashFlow.Setup;
using Microsoft.Finance.GeneralLedger.Budget;
using Microsoft.Foundation.NoSeries;

table 840 "Cash Flow Forecast"
{
    Caption = 'Cash Flow Forecast';
    DrillDownPageID = "Cash Flow Forecast List";
    LookupPageID = "Cash Flow Forecast List";
    DataClassification = CustomerContent;
    Permissions = TableData "Cash Flow Account Comment" = rimd,
                  TableData "Cash Flow Forecast Entry" = rimd;

    fields
    {
        field(1; "No."; Code[20])
        {
            Caption = 'No.';
        }
        field(2; "Search Name"; Code[100])
        {
            Caption = 'Search Name';
        }
        field(3; Description; Text[100])
        {
            Caption = 'Description';

            trigger OnValidate()
            begin
                if ("Search Name" = UpperCase(xRec.Description)) or ("Search Name" = '') then
                    "Search Name" := Description;
            end;
        }
        field(4; "Description 2"; Text[50])
        {
            Caption = 'Description 2';
        }
        field(5; "Consider Discount"; Boolean)
        {
            Caption = 'Consider Discount';

            trigger OnValidate()
            begin
                if not "Consider Discount" then
                    "Consider Pmt. Disc. Tol. Date" := false;
            end;
        }
        field(6; "Creation Date"; Date)
        {
            Caption = 'Creation Date';
        }
        field(7; "Created By"; Code[50])
        {
            Caption = 'Created By';
            DataClassification = EndUserIdentifiableInformation;
        }
        field(8; "Manual Payments To"; Date)
        {
            Caption = 'Manual Payments To';
        }
        field(9; Comment; Boolean)
        {
            CalcFormula = exist("Cash Flow Account Comment" where("Table Name" = const("Cash Flow Forecast"),
                                                                   "No." = field("No.")));
            Caption = 'Comment';
            FieldClass = FlowField;
        }
        field(10; "No. Series"; Code[20])
        {
            Caption = 'No. Series';
            Editable = false;
            TableRelation = "No. Series";
        }
        field(11; "Manual Payments From"; Date)
        {
            Caption = 'Manual Payments From';
        }
        field(12; "G/L Budget From"; Date)
        {
            AccessByPermission = TableData "G/L Budget Name" = R;
            Caption = 'G/L Budget From';
        }
        field(13; "G/L Budget To"; Date)
        {
            AccessByPermission = TableData "G/L Budget Name" = R;
            Caption = 'G/L Budget To';
        }
        field(14; "Consider CF Payment Terms"; Boolean)
        {
            Caption = 'Consider CF Payment Terms';
        }
        field(15; "Consider Pmt. Disc. Tol. Date"; Boolean)
        {
            Caption = 'Consider Pmt. Disc. Tol. Date';
        }
        field(16; "Consider Pmt. Tol. Amount"; Boolean)
        {
            Caption = 'Consider Pmt. Tol. Amount';
        }
        field(17; "Account No. Filter"; Code[20])
        {
            Caption = 'Account No. Filter';
            FieldClass = FlowFilter;
        }
        field(18; "Source Type Filter"; Enum "Cash Flow Source Type")
        {
            Caption = 'Source Type Filter';
            FieldClass = FlowFilter;
        }
        field(19; "Cash Flow Date Filter"; Date)
        {
            Caption = 'Cash Flow Date Filter';
            FieldClass = FlowFilter;
        }
        field(20; "Amount (LCY)"; Decimal)
        {
            CalcFormula = sum("Cash Flow Forecast Entry"."Amount (LCY)" where("Cash Flow Forecast No." = field("No."),
                                                                               "Cash Flow Date" = field("Cash Flow Date Filter"),
                                                                               "Source Type" = field("Source Type Filter"),
                                                                               "Cash Flow Account No." = field("Account No. Filter"),
                                                                               Positive = field("Positive Filter")));
            Caption = 'Amount (LCY)';
            FieldClass = FlowField;
            AutoFormatType = 1;
            AutoFormatExpression = '';
        }
        field(21; "Positive Filter"; Boolean)
        {
            Caption = 'Positive Filter';
            FieldClass = FlowFilter;
        }
        field(22; "Overdue CF Dates to Work Date"; Boolean)
        {
            Caption = 'Overdue CF Dates to Work Date';
        }
        field(23; "Default G/L Budget Name"; Code[10])
        {
            Caption = 'Default G/L Budget Name';
            TableRelation = "G/L Budget Name";
        }
    }

    keys
    {
        key(Key1; "No.")
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
        fieldgroup(DropDown; "No.", Description, "Description 2", "Creation Date")
        {
        }
    }

    trigger OnDelete()
    begin
        if GetShowInChart() then
            CFSetup.SetChartRoleCenterCFNo('');

        CFAccountComment.Reset();
        CFAccountComment.SetRange("Table Name", CFAccountComment."Table Name"::"Cash Flow Forecast");
        CFAccountComment.SetRange("No.", "No.");
        CFAccountComment.DeleteAll();

        CFForecastEntry.Reset();
        CFForecastEntry.SetCurrentKey("Cash Flow Forecast No.");
        CFForecastEntry.SetRange("Cash Flow Forecast No.", "No.");
        CFForecastEntry.DeleteAll();
    end;

    trigger OnInsert()
    begin
        if "No." = '' then begin
            CFSetup.Get();
            CFSetup.TestField("Cash Flow Forecast No. Series");
            if NoSeries.AreRelated(CFSetup."Cash Flow Forecast No. Series", xRec."No. Series") then
                "No. Series" := xRec."No. Series"
            else
                "No. Series" := CFSetup."Cash Flow Forecast No. Series";
            "No." := NoSeries.GetNextNo("No. Series");
        end;

        "Creation Date" := WorkDate();
        "Created By" := UserId;
        "Manual Payments From" := WorkDate();
        "G/L Budget From" := WorkDate();
    end;

    var
        CFSetup: Record "Cash Flow Setup";
        CashFlowForecast: Record "Cash Flow Forecast";
        CFAccountComment: Record "Cash Flow Account Comment";
        CFForecastEntry: Record "Cash Flow Forecast Entry";
        NoSeries: Codeunit "No. Series";

    procedure AssistEdit(OldCashFlowForecast: Record "Cash Flow Forecast"): Boolean
    begin
        CashFlowForecast := Rec;
        CFSetup.Get();
        CFSetup.TestField("Cash Flow Forecast No. Series");
        if NoSeries.LookupRelatedNoSeries(CFSetup."Cash Flow Forecast No. Series", OldCashFlowForecast."No. Series", CashFlowForecast."No. Series") then begin
            CashFlowForecast."No." := NoSeries.GetNextNo(CashFlowForecast."No. Series");
            Rec := CashFlowForecast;
            exit(true);
        end;
    end;

    procedure DrillDown()
    var
        CFForecastEntry: Record "Cash Flow Forecast Entry";
    begin
        CFForecastEntry.DrillDownOnEntries(Rec);
    end;

    procedure CalcAmountForPosNeg(PositiveAmount: Boolean): Decimal
    begin
        SetRange("Positive Filter", PositiveAmount);
        exit(CalcAmount());
    end;

    procedure DrillDownPosNegEntries(PositiveAmount: Boolean)
    begin
        SetRange("Positive Filter", PositiveAmount);
        DrillDown();
    end;

    procedure CalcAmountForAccountNo(AccountNo: Code[20]): Decimal
    begin
        SetAccountNoFilter(AccountNo);
        exit(CalcAmount());
    end;

    procedure SetAccountNoFilter(AccountNo: Code[20])
    begin
        if AccountNo = '' then
            SetRange("Account No. Filter")
        else
            SetRange("Account No. Filter", AccountNo);
    end;

    procedure DrillDownEntriesForAccNo(AccountNo: Code[20])
    begin
        SetAccountNoFilter(AccountNo);
        DrillDown();
    end;

    procedure CalcSourceTypeAmount(SourceType: Enum "Cash Flow Source Type"): Decimal
    begin
        SetSourceTypeEntriesFilter(SourceType);
        exit(CalcAmount());
    end;

    procedure SetSourceTypeEntriesFilter(SourceType: Enum "Cash Flow Source Type")
    begin
        if SourceType = SourceType::" " then
            SetRange("Source Type Filter")
        else
            SetRange("Source Type Filter", SourceType);
    end;

    procedure DrillDownSourceTypeEntries(SourceType: Enum "Cash Flow Source Type")
    begin
        SetSourceTypeEntriesFilter(SourceType);
        DrillDown();
    end;

    procedure CalcAmount(): Decimal
    begin
        OnBeforeCalcAmount(Rec);

        CalcFields("Amount (LCY)");
        exit("Amount (LCY)");
    end;

    procedure SetCashFlowDateFilter(FromDate: Date; ToDate: Date)
    begin
        if (FromDate = 0D) and (ToDate = 0D) then
            SetRange("Cash Flow Date Filter")
        else
            if ToDate = 0D then
                SetFilter("Cash Flow Date Filter", '%1..', FromDate)
            else
                SetRange("Cash Flow Date Filter", FromDate, ToDate);
    end;

    procedure PrintRecords()
    var
        CashFlowForecast: Record "Cash Flow Forecast";
        CFReportSelection: Record "Cash Flow Report Selection";
    begin
        CashFlowForecast.Copy(Rec);
        CFReportSelection.SetFilter("Report ID", '<>0');
        if CFReportSelection.FindSet() then
            repeat
                REPORT.RunModal(CFReportSelection."Report ID", true, false, CashFlowForecast);
            until CFReportSelection.Next() = 0;
    end;

    procedure LookupCashFlowFilter(var Text: Text): Boolean
    var
        CashFlowForecastList: Page "Cash Flow Forecast List";
    begin
        CashFlowForecastList.LookupMode(true);
        if CashFlowForecastList.RunModal() = ACTION::LookupOK then begin
            Text := CashFlowForecastList.GetSelectionFilter();
            exit(true);
        end;
        exit(false)
    end;

    procedure CalculateAllAmounts(FromDate: Date; ToDate: Date; var Amounts: array[14] of Decimal; var TotalAmount: Decimal)
    var
        SourceType: Integer;
    begin
        Clear(Amounts);
        SetCashFlowDateFilter(FromDate, ToDate);
        for SourceType := 1 to ArrayLen(Amounts) do
            Amounts[SourceType] := CalcSourceTypeAmount("Cash Flow Source Type".FromInteger(SourceType));
        TotalAmount := CalcSourceTypeAmount("Cash Flow Source Type".FromInteger(0));

        OnAfterCalculateAllAmounts(FromDate, ToDate, TotalAmount);
    end;

    procedure ValidateShowInChart(ShowInChart: Boolean): Boolean
    var
        NewCashFlowNo: Code[20];
    begin
        if ShowInChart then
            NewCashFlowNo := "No."
        else
            NewCashFlowNo := '';

        CFSetup.Get();
        CFSetup.Validate("CF No. on Chart in Role Center", NewCashFlowNo);
        CFSetup.Modify();
        exit(GetShowInChart());
    end;

    procedure GetShowInChart(): Boolean
    var
        ChartRoleCenterCFNo: Code[20];
    begin
        ChartRoleCenterCFNo := CFSetup.GetChartRoleCenterCFNo();
        if ChartRoleCenterCFNo = '' then
            exit(false);

        exit("No." = ChartRoleCenterCFNo);
    end;

    procedure GetEntryDate(Which: Option First,Last): Date
    var
        CFForecastEntry: Record "Cash Flow Forecast Entry";
    begin
        CFForecastEntry.SetCurrentKey("Cash Flow Forecast No.", "Cash Flow Date");
        CFForecastEntry.SetRange("Cash Flow Forecast No.", "No.");
        case Which of
            Which::First:
                if not CFForecastEntry.FindFirst() then
                    exit(0D);
            Which::Last:
                if not CFForecastEntry.FindLast() then
                    exit(0D);
        end;
        exit(CFForecastEntry."Cash Flow Date");
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalculateAllAmounts(FromDate: Date; ToDate: Date; var TotalAmount: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcAmount(var CashFlowForecast: Record "Cash Flow Forecast")
    begin
    end;
}