Report 188 Create Reminders

App
Base Application
Namespace
Microsoft.Sales.Reminder
Versions
17-28

Procedures, 4Events, 8

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Sales/Reminder/CreateReminders.Report.al405 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.Reminder;

using Microsoft.Sales.Customer;
using Microsoft.Sales.Receivables;
using Microsoft.Sales.Setup;
using System.Utilities;

/// <summary>
/// Creates reminder documents in batch for customers with overdue entries based on reminder terms configuration.
/// </summary>
report 188 "Create Reminders"
{
    Caption = 'Create Reminders';
    ToolTip = 'Create reminders for one or more customers with overdue payments.';
    ProcessingOnly = true;

    dataset
    {
        dataitem(Customer; Customer)
        {
            DataItemTableView = sorting("No.");
            RequestFilterFields = "No.";

            trigger OnAfterGetRecord()
            var
                IsHandled: Boolean;
                Result: Boolean;
                NotMakeReminderCode: Boolean;
            begin
                RecordNo := RecordNo + 1;
                Clear(MakeReminder);
                MakeReminder.Set(Customer, CustLedgEntry, ReminderHeaderReq, OverdueEntriesOnly, IncludeEntriesOnHold, CustLedgEntryLineFeeOn);
                if NoOfRecords = 1 then begin
                    Result := false;
                    IsHandled := false;
                    OnAfterGetRecordCustomerOnBeforeMakeReminder(
                        Customer, CustLedgEntry, ReminderHeaderReq, OverdueEntriesOnly, IncludeEntriesOnHold, CustLedgEntryLineFeeOn, Result, IsHandled, MakeReminder);
                    if not IsHandled then
                        MakeReminder.Code();
                    Mark := false;
                    EmitMakeReminderTelemetry := true;
                end else begin
                    NewDateTime := CurrentDateTime;
                    if (NewDateTime - OldDateTime > 100) or (NewDateTime < OldDateTime) then begin
                        UpdateProgressWindow();
                        OldDateTime := CurrentDateTime;
                    end;
                    Result := false;
                    IsHandled := false;
                    OnAfterGetRecordCustomerOnBeforeMakeReminder(
                        Customer, CustLedgEntry, ReminderHeaderReq, OverdueEntriesOnly, IncludeEntriesOnHold, CustLedgEntryLineFeeOn, Result, IsHandled, MakeReminder);
                    if IsHandled then
                        Mark(Result)
                    else begin
                        NotMakeReminderCode := not MakeReminder.Code();
                        Mark := NotMakeReminderCode;
                        if (NotMakeReminderCode = false) then
                            EmitMakeReminderTelemetry := true
                    end
                end;
            end;

            trigger OnPostDataItem()
            var
                ConfirmManagement: Codeunit "Confirm Management";
            begin
                Window.Close();
                MarkedOnly := true;
                Commit();
                if FindFirst() then begin
                    FinishDateTime := CurrentDateTime();
                    if ConfirmManagement.GetResponse(Text003, true) then
                        PAGE.RunModal(0, Customer);
                end;
            end;

            trigger OnPreDataItem()
            var
                SalesSetup: Record "Sales & Receivables Setup";
            begin
                if ReminderHeaderReq."Document Date" = 0D then
                    Error(Text000, ReminderHeaderReq.FieldCaption("Document Date"));
                FilterGroup := 2;
                SetFilter("Reminder Terms Code", '<>%1', '');
                FilterGroup := 0;
                OnCustomerOnPreDataItemOnBeforeCount(Customer);
                NoOfRecords := Count;
                SalesSetup.Get();
                SalesSetup.TestField("Reminder Nos.");
                OpenProgressWindow();
                ReminderHeaderReq."Use Header Level" := UseHeaderLevel;
            end;
        }
        dataitem(CustLedgEntry2; "Cust. Ledger Entry")
        {
            DataItemTableView = sorting("Customer No.");
            RequestFilterFields = "Document Type";

            trigger OnPreDataItem()
            begin
                CurrReport.Break();
            end;
        }
        dataitem(CustLedgEntryLineFeeOn; "Cust. Ledger Entry")
        {
            DataItemTableView = sorting("Entry No.") order(ascending);
            RequestFilterFields = "Document Type";
            RequestFilterHeading = 'Apply Fee per Line On';

            trigger OnPreDataItem()
            begin
                CurrReport.Break();
            end;
        }
    }

    requestpage
    {
        SaveValues = true;

        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
#pragma warning disable AA0100
                    field("ReminderHeaderReq.""Posting Date"""; ReminderHeaderReq."Posting Date")
#pragma warning restore AA0100
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Posting Date';
                        ToolTip = 'Specifies the date that will appear as the posting date on the header of the reminder that is created by the batch job.';
                    }
                    field(DocumentDate; ReminderHeaderReq."Document Date")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Document Date';
                        ToolTip = 'Specifies the date that will appear as the document date on the header of the reminder that is created by the batch job. This date is used for any interest calculations and to determine the due date of the reminder.';
                    }
                    field(OverdueEntriesOnly; OverdueEntriesOnly)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Only Entries with Overdue Amounts';
                        MultiLine = true;
                        ToolTip = 'Specifies that the batch job will only insert open entries that are overdue for payments and invoices. Overdue open entries have a due date that is before the document date on the reminder.';
                    }
                    field(IncludeEntriesOnHold; IncludeEntriesOnHold)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Include Entries On Hold';
                        ToolTip = 'Specifies if you want to create reminders for entries that are on hold.';
                    }
                    field(UseHeaderLevel; UseHeaderLevel)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Use Header Level';
                        ToolTip = 'Specifies if the batch job will apply the condition of the reminder level to all the reminder lines.';
                    }
                }
            }
        }

        actions
        {
        }

        trigger OnOpenPage()
        begin
            if ReminderHeaderReq."Document Date" = 0D then begin
                ReminderHeaderReq."Document Date" := WorkDate();
                ReminderHeaderReq."Posting Date" := WorkDate();
            end;
            if InitialCustomer."No." <> '' then
                Customer.SetRange("No.", InitialCustomer."No.");
        end;
    }

    labels
    {
    }

    trigger OnInitReport()
    begin
        OverdueEntriesOnly := true;
    end;

    trigger OnPostReport()
    var
        ReminderLine: Record "Reminder Line";
    begin
        if EmitMakeReminderTelemetry then
            MakeReminder.EmitCreateReminderTelemetry();

        OnBeforeOnPostReport();
        if FinishDateTime = 0DT then
            FinishDateTime := CurrentDateTime();
        NumberOfReminderLines := ReminderLine.Count() - NumberOfReminderLines;
        LogReportTelemetry(StartDateTime, FinishDateTime, NumberOfReminderLines);
        if OpenReminderListAfter then
            Page.Run(Page::"Reminder List");
    end;

    trigger OnPreReport()
    var
        ReminderLine: Record "Reminder Line";
    begin
        StartDateTime := CurrentDateTime();
        OnBeforeOnPreReport();

        CustLedgEntry.Copy(CustLedgEntry2);
        if CustLedgEntryLineFeeOnFilters.GetFilters <> '' then
            CustLedgEntryLineFeeOn.CopyFilters(CustLedgEntryLineFeeOnFilters);

        NumberOfReminderLines := ReminderLine.Count();
        OnAfterOnPreReport(CustLedgEntry);
    end;

    var
        CustLedgEntry: Record "Cust. Ledger Entry";
        CustLedgEntryLineFeeOnFilters: Record "Cust. Ledger Entry";
        InitialCustomer: Record Customer;
        MakeReminder: Codeunit "Reminder-Make";
        Window: Dialog;
        NoOfRecords: Integer;
        RecordNo: Integer;
        NewProgress: Integer;
        OldProgress: Integer;
        NewDateTime: DateTime;
        OldDateTime: DateTime;
        OpenReminderListAfter: Boolean;
        EmitMakeReminderTelemetry: Boolean;

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label '%1 must be specified.';
#pragma warning restore AA0470
        Text001: Label 'Making reminders...';
        Text002: Label 'Making reminders @1@@@@@@@@@@@@@';
        Text003: Label 'It was not possible to create reminders for some of the selected customers.\Do you want to see these customers?';
#pragma warning restore AA0074
        TelemetryCategoryTxt: Label 'Report', Locked = true;
        CreateRemindersReportGeneratedTxt: Label 'Create Reminders report generated.', Locked = true;

    protected var
        ReminderHeaderReq: Record "Reminder Header";
        NumberOfReminderLines: Integer;
        StartDateTime: DateTime;
        FinishDateTime: DateTime;
        OverdueEntriesOnly: Boolean;
        UseHeaderLevel: Boolean;
        IncludeEntriesOnHold: Boolean;

    /// <summary>
    /// Initializes the report request parameters for reminder creation.
    /// </summary>
    /// <param name="DocumentDate">Specifies the document date for the reminders.</param>
    /// <param name="PostingDate">Specifies the posting date for the reminders.</param>
    /// <param name="OverdueEntries">Specifies whether to include only overdue entries.</param>
    /// <param name="NewUseHeaderLevel">Specifies whether to use the header level for all lines.</param>
    /// <param name="IncludeEntries">Specifies whether to include entries on hold.</param>
    procedure InitializeRequest(DocumentDate: Date; PostingDate: Date; OverdueEntries: Boolean; NewUseHeaderLevel: Boolean; IncludeEntries: Boolean)
    begin
        ReminderHeaderReq."Document Date" := DocumentDate;
        ReminderHeaderReq."Posting Date" := PostingDate;
        OverdueEntriesOnly := OverdueEntries;
        UseHeaderLevel := NewUseHeaderLevel;
        IncludeEntriesOnHold := IncludeEntries;
    end;

    /// <summary>
    /// Sets the filters for customer ledger entries to apply line fees on.
    /// </summary>
    /// <param name="CustLedgEntryLineFeeOn2">Specifies the customer ledger entry filters for line fees.</param>
    procedure SetApplyLineFeeOnFilters(var CustLedgEntryLineFeeOn2: Record "Cust. Ledger Entry")
    begin
        CustLedgEntryLineFeeOnFilters.CopyFilters(CustLedgEntryLineFeeOn2);
    end;

    internal procedure SetCustomer(CustomerNo: Code[20])
    begin
        InitialCustomer.Get(CustomerNo);
    end;

    internal procedure SetOpenReminderListAfter(NewOpenReminderListAfter: Boolean)
    begin
        OpenReminderListAfter := NewOpenReminderListAfter;
    end;

    local procedure LogReportTelemetry(StartDateTime: DateTime; FinishDateTime: DateTime; NumberOfLines: Integer)
    var
        Dimensions: Dictionary of [Text, Text];
        ReportDuration: BigInteger;
    begin
        ReportDuration := FinishDateTime - StartDateTime;
        Dimensions.Add('Category', TelemetryCategoryTxt);
        Dimensions.Add('ReportStartTime', Format(StartDateTime, 0, 9));
        Dimensions.Add('ReportFinishTime', Format(FinishDateTime, 0, 9));
        Dimensions.Add('ReportDuration', Format(ReportDuration));
        Dimensions.Add('NumberOfLines', Format(NumberOfLines));
        Session.LogMessage('0000FJP', CreateRemindersReportGeneratedTxt, Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, Dimensions);
    end;

    local procedure OpenProgressWindow()
    var
        ProgressBarText: Text;
    begin
        if NoOfRecords = 1 then
            ProgressBarText := Text001
        else begin
            ProgressBarText := Text002;
            OldDateTime := CurrentDateTime();
        end;
        OnOpenProgressWindowOnBeforeWindowOpen(NoOfRecords, ProgressBarText);
        Window.Open(ProgressBarText);
    end;

    local procedure UpdateProgressWindow()
    begin
        NewProgress := Round(RecordNo / NoOfRecords * 100, 1);
        if NewProgress <> OldProgress then begin
            Window.Update(1, NewProgress * 100);
            OldProgress := NewProgress;
        end;
        OnAfterUpdateProgressWindow(Customer, Window);
    end;

    /// <summary>
    /// Raised after the pre-report trigger completes and filters are set up.
    /// </summary>
    /// <param name="CustLedgerEntry">The customer ledger entry filter record.</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterOnPreReport(var CustLedgerEntry: Record "Cust. Ledger Entry")
    begin
    end;

    /// <summary>
    /// Raised after updating the progress window during batch processing.
    /// </summary>
    /// <param name="Customer">The current customer being processed.</param>
    /// <param name="Window">The progress dialog window.</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateProgressWindow(Customer: Record Customer; var Window: Dialog)
    begin
    end;

    /// <summary>
    /// Raised before the pre-report trigger executes.
    /// </summary>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnPreReport()
    begin
    end;

    /// <summary>
    /// Raised before the post-report trigger executes.
    /// </summary>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnPostReport()
    begin
    end;

    /// <summary>
    /// Raised before creating reminders for a customer in the batch process.
    /// </summary>
    /// <param name="Customer">The customer for reminder creation.</param>
    /// <param name="CustLedgEntry">The customer ledger entries filter.</param>
    /// <param name="ReminderHeaderReq">The reminder header request parameters.</param>
    /// <param name="OverdueEntriesOnly">Indicates whether only overdue entries are included.</param>
    /// <param name="IncludeEntriesOnHold">Indicates whether entries on hold are included.</param>
    /// <param name="CustLedgEntryLineFeeOn">The customer ledger entries filter for line fees.</param>
    /// <param name="Result">Returns the result when handling is skipped.</param>
    /// <param name="IsHandled">Set to true to skip default processing.</param>
    /// <param name="ReminderMake">The reminder creation codeunit instance.</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterGetRecordCustomerOnBeforeMakeReminder(Customer: Record Customer; var CustLedgEntry: Record "Cust. Ledger Entry"; ReminderHeaderReq: Record "Reminder Header"; OverdueEntriesOnly: Boolean; IncludeEntriesOnHold: Boolean; var CustLedgEntryLineFeeOn: Record "Cust. Ledger Entry"; var Result: Boolean; var IsHandled: Boolean; var ReminderMake: Codeunit "Reminder-Make")
    begin
    end;

    /// <summary>
    /// Raised before counting the number of customers in the pre-data item trigger.
    /// </summary>
    /// <param name="Customer">The customer record with filters applied.</param>
    [IntegrationEvent(false, false)]
    local procedure OnCustomerOnPreDataItemOnBeforeCount(var Customer: Record Customer)
    begin
    end;

    /// <summary>
    /// Raised before opening the progress window for batch processing.
    /// </summary>
    /// <param name="NoOfRecords">The number of records to process.</param>
    /// <param name="ProgressBarText">The text to display in the progress bar.</param>
    [IntegrationEvent(false, false)]
    local procedure OnOpenProgressWindowOnBeforeWindowOpen(NoOfRecords: Integer; var ProgressBarText: Text)
    begin
    end;
}