Table 1053 Line Fee Note on Report Hist., source in 29

Source29

src/Layers/W1/BaseApp/Sales/Reminder/LineFeeNoteonReportHist.Table.al213 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.Finance.GeneralLedger.Setup;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Receivables;
using System.Globalization;

/// <summary>
/// Stores history of line fee notes that have been printed on reminder reports for customer ledger entries.
/// </summary>
table 1053 "Line Fee Note on Report Hist."
{
    Caption = 'Line Fee Note on Report Hist.';
    Permissions = TableData "Line Fee Note on Report Hist." = rimd,
                  tabledata "Reminder Attachment Text" = R,
                  tabledata "Reminder Terms" = R;
    DataClassification = CustomerContent;

    fields
    {
        /// <summary>
        /// Specifies the customer ledger entry number for which this line fee note was generated.
        /// </summary>
        field(1; "Cust. Ledger Entry No"; Integer)
        {
            Caption = 'Cust. Ledger Entry No';
            Editable = false;
            TableRelation = "Cust. Ledger Entry"."Entry No." where("Entry No." = field("Cust. Ledger Entry No"));
        }
        /// <summary>
        /// Specifies the due date at which this line fee note applies.
        /// </summary>
        field(2; "Due Date"; Date)
        {
            Caption = 'Due Date';
            Editable = false;
        }
        /// <summary>
        /// Specifies the language code used for this translated line fee note.
        /// </summary>
        field(3; "Language Code"; Code[10])
        {
            Caption = 'Language Code';
            Editable = false;
            NotBlank = true;
            TableRelation = Language;
        }
        /// <summary>
        /// Specifies the reminder terms code for which this line fee note was generated.
        /// </summary>
        field(4; "Reminder Terms Code"; Code[10])
        {
            Caption = 'Reminder Terms Code';
        }
        /// <summary>
        /// Specifies the reminder level at which this line fee note applies.
        /// </summary>
        field(5; "Reminder Level No"; Integer)
        {
            Caption = 'Reminder Level No';
        }
        /// <summary>
        /// Contains the formatted line fee note text that appeared on the reminder report.
        /// </summary>
        field(6; ReportText; Text[200])
        {
            Caption = 'ReportText';
            Editable = false;
            NotBlank = true;
        }
    }

    keys
    {
        key(Key1; "Cust. Ledger Entry No", "Due Date", "Language Code", "Reminder Terms Code", "Reminder Level No")
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    local procedure GetLineFeeNoteOnReport(CustLedgerEntry: Record "Cust. Ledger Entry"; ReminderLevel: Record "Reminder Level"; LineFeeNoteOnReport: Text[150]; DueDate: Date): Text[200]
    var
        GeneralLedgerSetup: Record "General Ledger Setup";
        AdditionalFeePerLine: Decimal;
        CurrencyCode: Code[10];
        MarginalPerc: Decimal;
    begin
        CustLedgerEntry.CalcFields("Original Amount");
        AdditionalFeePerLine :=
          ReminderLevel.GetAdditionalFee(
            CustLedgerEntry."Original Amount", CustLedgerEntry."Currency Code", true, CustLedgerEntry."Posting Date");
        if AdditionalFeePerLine = 0 then
            exit;

        if CustLedgerEntry."Currency Code" = '' then begin
            GeneralLedgerSetup.Get();
            CurrencyCode := GeneralLedgerSetup."LCY Code";
        end else
            CurrencyCode := CustLedgerEntry."Currency Code";

        if CustLedgerEntry."Original Amount" > 0 then
            MarginalPerc := Round(AdditionalFeePerLine * 100 / CustLedgerEntry."Original Amount", 0.01);

        exit(StrSubstNo(LineFeeNoteOnReport, Format(Round(AdditionalFeePerLine, 0.01), 0, 9), CurrencyCode, DueDate, Format(MarginalPerc, 0, 9)));
    end;

    local procedure InsertRec(ReminderLevel: Record "Reminder Level"; CustLedgerEntryNo: Integer; DueDate: Date; LanguageCode: Code[10]; LineFeeNoteOnReport: Text[200])
    var
        LineFeeNoteOnReportHist: Record "Line Fee Note on Report Hist.";
    begin
        if LineFeeNoteOnReport <> '' then begin
            if LineFeeNoteOnReportHist.Get(
                CustLedgerEntryNo, DueDate, LanguageCode, ReminderLevel."Reminder Terms Code", ReminderLevel."No.")
            then
                exit;

            LineFeeNoteOnReportHist.Init();
            LineFeeNoteOnReportHist."Cust. Ledger Entry No" := CustLedgerEntryNo;
            LineFeeNoteOnReportHist."Due Date" := DueDate;
            LineFeeNoteOnReportHist."Language Code" := LanguageCode;
            LineFeeNoteOnReportHist."Reminder Terms Code" := ReminderLevel."Reminder Terms Code";
            LineFeeNoteOnReportHist."Reminder Level No" := ReminderLevel."No.";
            LineFeeNoteOnReportHist.ReportText := LineFeeNoteOnReport;
            LineFeeNoteOnReportHist.Insert(true);
        end;
    end;

    local procedure InsertAttachmentLineFeeNotesOnReport(CustLedgerEntry: Record "Cust. Ledger Entry"; ReminderTerms: Record "Reminder Terms"; ReminderLevel: Record "Reminder Level"; DueDate: Date)
    var
        ReminderAttachmentText: Record "Reminder Attachment Text";
        ReminderLevelAttachmentText: Record "Reminder Attachment Text";
        LineFeeNoteOnReport: Text[200];
    begin
        if not IsNullGuid(ReminderLevel."Reminder Attachment Text") then begin
            ReminderAttachmentText.SetRange(Id, ReminderLevel."Reminder Attachment Text");
            if ReminderAttachmentText.FindSet() then
                repeat
                    if ReminderAttachmentText."Inline Fee Description" <> '' then begin
                        LineFeeNoteOnReport :=
                            GetLineFeeNoteOnReport(CustLedgerEntry, ReminderLevel, ReminderAttachmentText."Inline Fee Description", DueDate);
                        InsertRec(ReminderLevel,
                            CustLedgerEntry."Entry No.",
                            DueDate,
                            ReminderAttachmentText."Language Code",
                            LineFeeNoteOnReport);
                    end;
                until ReminderAttachmentText.Next() = 0;
        end;

        if IsNullGuid(ReminderTerms."Reminder Attachment Text") then
            exit;

        ReminderAttachmentText.Reset();
        ReminderAttachmentText.SetRange(Id, ReminderTerms."Reminder Attachment Text");
        ReminderAttachmentText.SetFilter("Inline Fee Description", '<>%1', '');
        if ReminderAttachmentText.FindSet() then
            repeat
                if IsNullGuid(ReminderLevel."Reminder Attachment Text") or
                   not ReminderLevelAttachmentText.Get(
                       ReminderLevel."Reminder Attachment Text", ReminderAttachmentText."Language Code")
                then begin
                    LineFeeNoteOnReport :=
                        GetLineFeeNoteOnReport(CustLedgerEntry, ReminderLevel, ReminderAttachmentText."Inline Fee Description", DueDate);
                    InsertRec(ReminderLevel,
                        CustLedgerEntry."Entry No.",
                        DueDate,
                        ReminderAttachmentText."Language Code",
                        LineFeeNoteOnReport);
                end;
            until ReminderAttachmentText.Next() = 0;
    end;

    /// <summary>
    /// Saves the line fee note history for the specified customer ledger entry based on reminder terms.
    /// </summary>
    /// <param name="CustLedgerEntry">The customer ledger entry to save line fee history for.</param>
    procedure Save(CustLedgerEntry: Record "Cust. Ledger Entry")
    var
        Customer: Record Customer;
        ReminderTerms: Record "Reminder Terms";
        ReminderLevel: Record "Reminder Level";
        DueDate: Date;
    begin
        if not Customer.Get(CustLedgerEntry."Customer No.") then
            exit;

        if Customer."Reminder Terms Code" = '' then
            exit;

        ReminderTerms.Get(Customer."Reminder Terms Code");
        if not ReminderTerms."Post Add. Fee per Line" then
            exit;

        ReminderLevel.SetRange("Reminder Terms Code", ReminderTerms.Code);
        if ReminderLevel.FindSet() then begin
            DueDate := CalcDate(ReminderLevel."Grace Period", CustLedgerEntry."Due Date");
            InsertAttachmentLineFeeNotesOnReport(CustLedgerEntry, ReminderTerms, ReminderLevel, DueDate);
            while ReminderLevel.Next() <> 0 do begin
                DueDate := CalcDate(ReminderLevel."Grace Period", DueDate);
                InsertAttachmentLineFeeNotesOnReport(CustLedgerEntry, ReminderTerms, ReminderLevel, DueDate);
            end;
        end;
    end;
}