Table 295 Reminder Header, source in 29
Source29
src/Layers/W1/BaseApp/Sales/Reminder/ReminderHeader.Table.al1990 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.Bank.BankAccount;
using Microsoft.CRM.Contact;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.SalesTax;
using Microsoft.Finance.VAT.Setup;
using Microsoft.Foundation.Address;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.Company;
using Microsoft.Foundation.ExtendedText;
using Microsoft.Foundation.NoSeries;
using Microsoft.Foundation.Reporting;
using Microsoft.Sales.Customer;
using Microsoft.Sales.FinanceCharge;
using Microsoft.Sales.Setup;
using System.Globalization;
using System.IO;
using System.Security.User;
using System.Text;
/// <summary>
/// Stores the header information for a reminder document including customer, posting, and reminder level details.
/// </summary>
table 295 "Reminder Header"
{
Caption = 'Reminder Header';
DataCaptionFields = "No.", Name;
DrillDownPageID = "Reminder List";
LookupPageID = "Reminder List";
DataClassification = CustomerContent;
fields
{
/// <summary>
/// Specifies the unique identifier for the reminder document.
/// </summary>
field(1; "No."; Code[20])
{
Caption = 'No.';
ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';
trigger OnValidate()
begin
if "No." <> xRec."No." then begin
NoSeries.TestManual(GetNoSeriesCode());
"No. Series" := '';
end;
"Posting Description" := GetDefaultPostingDescription("No.");
end;
}
/// <summary>
/// Specifies the customer to whom this reminder will be sent.
/// </summary>
field(2; "Customer No."; Code[20])
{
Caption = 'Customer No.';
ToolTip = 'Specifies the number of the customer you want to post a reminder for.';
TableRelation = Customer;
trigger OnValidate()
var
Cont: Record Contact;
begin
if CurrFieldNo = FieldNo("Customer No.") then
if Undo() then begin
"Customer No." := xRec."Customer No.";
CreateDimFromDefaultDim();
exit;
end;
if "Customer No." = '' then begin
CreateDimFromDefaultDim();
exit;
end;
Cust.Get("Customer No.");
if Cust."Privacy Blocked" then
Cust.CustPrivacyBlockedErrorMessage(Cust, false);
CheckCustomerBlockedAll(Cust);
if Cont.Get(Cust."Primary Contact No.") then
Cont.CheckIfPrivacyBlockedGeneric();
Name := Cust.Name;
"Name 2" := Cust."Name 2";
Address := Cust.Address;
"Address 2" := Cust."Address 2";
"Post Code" := Cust."Post Code";
City := Cust.City;
County := Cust.County;
Contact := Cust.Contact;
"Country/Region Code" := Cust."Country/Region Code";
"Language Code" := Cust."Language Code";
"Format Region" := Cust."Format Region";
Validate("Currency Code", Cust."Currency Code");
"Shortcut Dimension 1 Code" := Cust."Global Dimension 1 Code";
"Shortcut Dimension 2 Code" := Cust."Global Dimension 2 Code";
"VAT Registration No." := Cust."VAT Registration No.";
Cust.TestField("Customer Posting Group");
"Customer Posting Group" := Cust."Customer Posting Group";
"Gen. Bus. Posting Group" := Cust."Gen. Bus. Posting Group";
"VAT Bus. Posting Group" := Cust."VAT Bus. Posting Group";
"Tax Area Code" := Cust."Tax Area Code";
"Tax Liable" := Cust."Tax Liable";
"Reminder Terms Code" := Cust."Reminder Terms Code";
"Fin. Charge Terms Code" := Cust."Fin. Charge Terms Code";
OnValidateCustomerNoOnAfterAssignCustomerValues(Rec, Cust);
Validate("Reminder Terms Code");
CreateDimFromDefaultDim();
end;
}
/// <summary>
/// Specifies the name of the customer receiving the reminder.
/// </summary>
field(3; Name; Text[100])
{
Caption = 'Name';
ToolTip = 'Specifies the name of the customer the reminder is for.';
}
/// <summary>
/// Specifies additional name information for the customer.
/// </summary>
field(4; "Name 2"; Text[50])
{
Caption = 'Name 2';
}
/// <summary>
/// Specifies the street address of the customer.
/// </summary>
field(5; Address; Text[100])
{
Caption = 'Address';
ToolTip = 'Specifies the address of the customer the reminder is for.';
}
/// <summary>
/// Specifies additional address information for the customer.
/// </summary>
field(6; "Address 2"; Text[50])
{
Caption = 'Address 2';
ToolTip = 'Specifies additional address information.';
}
/// <summary>
/// Specifies the postal code of the customer's address.
/// </summary>
field(7; "Post Code"; Code[20])
{
Caption = 'Post Code';
ToolTip = 'Specifies the postal code.';
TableRelation = if ("Country/Region Code" = const('')) "Post Code"
else
if ("Country/Region Code" = filter(<> '')) "Post Code" where("Country/Region Code" = field("Country/Region Code"));
ValidateTableRelation = false;
trigger OnLookup()
begin
PostCode.LookupPostCode(City, "Post Code", County, "Country/Region Code");
end;
trigger OnValidate()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeValidatePostCode(Rec, PostCode, CurrFieldNo, IsHandled);
if not IsHandled then
PostCode.ValidatePostCode(City, "Post Code", County, "Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
end;
}
/// <summary>
/// Specifies the city of the customer's address.
/// </summary>
field(8; City; Text[30])
{
Caption = 'City';
ToolTip = 'Specifies the city name of the customer the reminder is for.';
TableRelation = if ("Country/Region Code" = const('')) "Post Code".City
else
if ("Country/Region Code" = filter(<> '')) "Post Code".City where("Country/Region Code" = field("Country/Region Code"));
ValidateTableRelation = false;
trigger OnLookup()
begin
PostCode.LookupPostCode(City, "Post Code", County, "Country/Region Code");
end;
trigger OnValidate()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeValidateCity(Rec, PostCode, CurrFieldNo, IsHandled);
if not IsHandled then
PostCode.ValidateCity(City, "Post Code", County, "Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
end;
}
/// <summary>
/// Specifies the county or state of the customer's address.
/// </summary>
field(9; County; Text[30])
{
CaptionClass = '5,1,' + "Country/Region Code";
Caption = 'County';
}
/// <summary>
/// Specifies the country or region code of the customer's address.
/// </summary>
field(10; "Country/Region Code"; Code[10])
{
Caption = 'Country/Region Code';
TableRelation = "Country/Region";
trigger OnValidate()
begin
PostCode.CheckClearPostCodeCityCounty(City, "Post Code", County, "Country/Region Code", xRec."Country/Region Code");
end;
}
/// <summary>
/// Specifies the language code used for translating reminder texts.
/// </summary>
field(11; "Language Code"; Code[10])
{
Caption = 'Language Code';
TableRelation = Language;
}
/// <summary>
/// Specifies the currency in which amounts on the reminder are calculated and displayed.
/// </summary>
field(12; "Currency Code"; Code[10])
{
Caption = 'Currency Code';
ToolTip = 'Specifies the currency code of the reminder.';
TableRelation = Currency;
trigger OnValidate()
begin
if CurrFieldNo = FieldNo("Currency Code") then
if Undo() then begin
"Currency Code" := xRec."Currency Code";
exit;
end;
SetCompanyBankAccount();
end;
}
/// <summary>
/// Specifies the name of the contact person at the customer.
/// </summary>
field(13; Contact; Text[100])
{
Caption = 'Contact';
ToolTip = 'Specifies the name of the person you regularly contact when you communicate with the customer the reminder is for.';
}
/// <summary>
/// Specifies the customer's reference number or code for this document.
/// </summary>
field(14; "Your Reference"; Text[35])
{
Caption = 'Your Reference';
ToolTip = 'Specifies the customer''s reference. The content will be printed on the related document.';
}
/// <summary>
/// Specifies the first shortcut dimension code used for analysis and reporting.
/// </summary>
field(15; "Shortcut Dimension 1 Code"; Code[20])
{
CaptionClass = '1,2,1';
Caption = 'Shortcut Dimension 1 Code';
ToolTip = 'Specifies the code for Shortcut Dimension 1, which is one of two global dimension codes that you set up in the General Ledger Setup window.';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(1),
Blocked = const(false));
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(1, "Shortcut Dimension 1 Code");
end;
}
/// <summary>
/// Specifies the second shortcut dimension code used for analysis and reporting.
/// </summary>
field(16; "Shortcut Dimension 2 Code"; Code[20])
{
CaptionClass = '1,2,2';
Caption = 'Shortcut Dimension 2 Code';
ToolTip = 'Specifies the code for Shortcut Dimension 2, which is one of two global dimension codes that you set up in the General Ledger Setup window.';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(2),
Blocked = const(false));
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(2, "Shortcut Dimension 2 Code");
end;
}
/// <summary>
/// Specifies the customer posting group that determines G/L accounts for posting.
/// </summary>
field(17; "Customer Posting Group"; Code[20])
{
Caption = 'Customer Posting Group';
Editable = false;
TableRelation = "Customer Posting Group";
}
/// <summary>
/// Specifies the general business posting group for VAT and cost allocation.
/// </summary>
field(18; "Gen. Bus. Posting Group"; Code[20])
{
Caption = 'Gen. Bus. Posting Group';
Editable = false;
TableRelation = "Gen. Business Posting Group";
trigger OnValidate()
begin
if xRec."Gen. Bus. Posting Group" <> "Gen. Bus. Posting Group" then
if GenBusPostingGrp.ValidateVatBusPostingGroup(GenBusPostingGrp, "Gen. Bus. Posting Group") then
Validate("VAT Bus. Posting Group", GenBusPostingGrp."Def. VAT Bus. Posting Group");
end;
}
/// <summary>
/// Specifies the customer's VAT registration number for tax reporting.
/// </summary>
field(19; "VAT Registration No."; Text[20])
{
Caption = 'VAT Registration No.';
}
/// <summary>
/// Specifies the reason code that explains the purpose of the reminder entry.
/// </summary>
field(20; "Reason Code"; Code[10])
{
Caption = 'Reason Code';
TableRelation = "Reason Code";
}
/// <summary>
/// Specifies the date when the reminder will be posted to the general ledger.
/// </summary>
field(21; "Posting Date"; Date)
{
Caption = 'Posting Date';
ToolTip = 'Specifies the date when the reminder should be issued.';
trigger OnValidate()
begin
GLSetup.Get();
GLSetup.UpdateVATDate("Posting Date", Enum::"VAT Reporting Date"::"Posting Date", "VAT Reporting Date");
Validate("VAT Reporting Date");
end;
}
/// <summary>
/// Specifies the date when the reminder document was created.
/// </summary>
field(22; "Document Date"; Date)
{
Caption = 'Document Date';
ToolTip = 'Specifies the date when the related document was created.';
trigger OnValidate()
begin
GLSetup.Get();
GLSetup.UpdateVATDate("Document Date", Enum::"VAT Reporting Date"::"Document Date", "VAT Reporting Date");
Validate("VAT Reporting Date");
if CurrFieldNo = FieldNo("Document Date") then
if Undo() then begin
"Document Date" := xRec."Document Date";
exit;
end;
Validate("Reminder Level");
end;
}
/// <summary>
/// Specifies the date by which the customer must pay the outstanding amount.
/// </summary>
field(23; "Due Date"; Date)
{
Caption = 'Due Date';
ToolTip = 'Specifies when payment of the amount on the reminder is due.';
}
/// <summary>
/// Specifies the reminder terms code that controls fees, interest, and escalation levels.
/// </summary>
field(24; "Reminder Terms Code"; Code[10])
{
Caption = 'Reminder Terms Code';
ToolTip = 'Specifies how reminders about late payments are handled for this customer.';
TableRelation = "Reminder Terms";
trigger OnValidate()
begin
if CurrFieldNo = FieldNo("Reminder Terms Code") then
if Undo() then begin
"Reminder Terms Code" := xRec."Reminder Terms Code";
exit;
end;
if "Reminder Terms Code" <> '' then begin
ReminderTerms.Get("Reminder Terms Code");
"Post Interest" := ReminderTerms."Post Interest";
"Post Additional Fee" := ReminderTerms."Post Additional Fee";
"Post Add. Fee per Line" := ReminderTerms."Post Add. Fee per Line";
Validate("Reminder Level");
Validate("Post Interest");
end;
end;
}
/// <summary>
/// Specifies the finance charge terms used for calculating interest on overdue amounts.
/// </summary>
field(25; "Fin. Charge Terms Code"; Code[10])
{
Caption = 'Fin. Charge Terms Code';
ToolTip = 'Specifies the code for the involved finance charges in case of late payment.';
TableRelation = "Finance Charge Terms";
trigger OnValidate()
begin
if CurrFieldNo = FieldNo("Fin. Charge Terms Code") then
if Undo() then begin
"Fin. Charge Terms Code" := xRec."Fin. Charge Terms Code";
exit;
end;
end;
}
/// <summary>
/// Indicates whether interest charges will be posted when the reminder is issued.
/// </summary>
field(26; "Post Interest"; Boolean)
{
Caption = 'Post Interest';
}
/// <summary>
/// Indicates whether additional fees will be posted when the reminder is issued.
/// </summary>
field(27; "Post Additional Fee"; Boolean)
{
Caption = 'Post Additional Fee';
}
/// <summary>
/// Specifies the escalation level of this reminder based on the number of overdue notices sent.
/// </summary>
field(28; "Reminder Level"; Integer)
{
Caption = 'Reminder Level';
ToolTip = 'Specifies the reminder''s level.';
TableRelation = "Reminder Level"."No." where("Reminder Terms Code" = field("Reminder Terms Code"));
trigger OnValidate()
begin
if ("Reminder Level" <> 0) and ("Reminder Terms Code" <> '') then begin
ReminderTerms.Get("Reminder Terms Code");
ReminderLevel.SetRange("Reminder Terms Code", "Reminder Terms Code");
ReminderLevel.SetRange("No.", 1, "Reminder Level");
if ReminderLevel.FindLast() and ("Document Date" <> 0D) then
"Due Date" := CalcDate(ReminderLevel."Due Date Calculation", "Document Date");
OnAfterValidateReminderLevel(Rec, ReminderLevel);
end;
end;
}
/// <summary>
/// Specifies a description that will appear on ledger entries when the reminder is posted.
/// </summary>
field(29; "Posting Description"; Text[100])
{
Caption = 'Posting Description';
}
/// <summary>
/// Indicates whether comments are attached to this reminder document.
/// </summary>
field(30; Comment; Boolean)
{
CalcFormula = exist("Reminder Comment Line" where(Type = const(Reminder),
"No." = field("No.")));
Caption = 'Comment';
Editable = false;
FieldClass = FlowField;
}
/// <summary>
/// Contains the total remaining amount that the customer owes on the entries included in this reminder.
/// </summary>
field(31; "Remaining Amount"; Decimal)
{
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CalcFormula = sum("Reminder Line"."Remaining Amount" where("Reminder No." = field("No."),
"Line Type" = const("Reminder Line"),
"Detailed Interest Rates Entry" = const(false)));
Caption = 'Remaining Amount';
ToolTip = 'Specifies the total of the remaining amounts on the reminder lines.';
DecimalPlaces = 2 : 2;
Editable = false;
FieldClass = FlowField;
}
/// <summary>
/// Contains the total calculated interest amount on overdue entries in this reminder.
/// </summary>
field(32; "Interest Amount"; Decimal)
{
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CalcFormula = sum("Reminder Line".Amount where("Reminder No." = field("No."),
Type = const("Customer Ledger Entry"),
"Detailed Interest Rates Entry" = const(false),
"Line Type" = filter(<> "Not Due")));
Caption = 'Interest Amount';
Editable = false;
FieldClass = FlowField;
}
/// <summary>
/// Contains the total additional fee amount charged on this reminder.
/// </summary>
field(33; "Additional Fee"; Decimal)
{
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CalcFormula = sum("Reminder Line".Amount where("Reminder No." = field("No."),
Type = const("G/L Account"),
"Line Type" = filter(<> "Not Due")));
Caption = 'Additional Fee';
ToolTip = 'Specifies the total of the additional fee amounts on the reminder lines.';
Editable = false;
FieldClass = FlowField;
}
/// <summary>
/// Contains the total VAT amount calculated on fees and interest for this reminder.
/// </summary>
field(34; "VAT Amount"; Decimal)
{
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CalcFormula = sum("Reminder Line"."VAT Amount" where("Reminder No." = field("No."),
"Detailed Interest Rates Entry" = const(false),
"Line Type" = filter(<> "Not Due")));
Caption = 'VAT Amount';
Editable = false;
FieldClass = FlowField;
}
/// <summary>
/// Specifies the number series used to assign document numbers to reminders.
/// </summary>
field(37; "No. Series"; Code[20])
{
Caption = 'No. Series';
Editable = false;
TableRelation = "No. Series";
}
/// <summary>
/// Specifies the number series used to assign document numbers when reminders are issued.
/// </summary>
field(38; "Issuing No. Series"; Code[20])
{
Caption = 'Issuing No. Series';
TableRelation = "No. Series";
trigger OnLookup()
begin
ReminderHeader := Rec;
ReminderHeader.TestNoSeries();
if NoSeries.LookupRelatedNoSeries(GetIssuingNoSeriesCode(), ReminderHeader."Issuing No. Series") then
ReminderHeader.Validate("Issuing No. Series");
Rec := ReminderHeader;
end;
trigger OnValidate()
begin
if "Issuing No. Series" <> '' then begin
TestNoSeries();
NoSeries.TestAreRelated(GetIssuingNoSeriesCode(), "Issuing No. Series");
end;
TestField("Issuing No.", '');
end;
}
/// <summary>
/// Specifies the document number that will be assigned when this reminder is issued.
/// </summary>
field(39; "Issuing No."; Code[20])
{
Caption = 'Issuing No.';
}
/// <summary>
/// Specifies the tax area code for sales tax calculation in North America.
/// </summary>
field(41; "Tax Area Code"; Code[20])
{
Caption = 'Tax Area Code';
TableRelation = "Tax Area";
}
/// <summary>
/// Indicates whether the customer is liable for sales tax.
/// </summary>
field(42; "Tax Liable"; Boolean)
{
Caption = 'Tax Liable';
}
/// <summary>
/// Specifies the VAT business posting group for determining VAT rates and accounts.
/// </summary>
field(43; "VAT Bus. Posting Group"; Code[20])
{
Caption = 'VAT Bus. Posting Group';
TableRelation = "VAT Business Posting Group";
}
/// <summary>
/// Indicates whether the reminder level from the header should apply to all lines.
/// </summary>
field(44; "Use Header Level"; Boolean)
{
Caption = 'Use Header Level';
ToolTip = 'Specifies that the condition of the level for the Reminder Level field is applied to all suggested reminder lines.';
}
/// <summary>
/// Contains the total line fee amount charged per document on this reminder.
/// </summary>
field(45; "Add. Fee per Line"; Decimal)
{
AutoFormatType = 2;
AutoFormatExpression = Rec."Currency Code";
CalcFormula = sum("Reminder Line".Amount where("Reminder No." = field("No."),
Type = const("Line Fee"),
"Line Type" = filter(<> "Not Due")));
Caption = 'Add. Fee per Line';
ToolTip = 'Specifies that the fee is distributed on individual reminder lines.';
FieldClass = FlowField;
}
/// <summary>
/// Indicates whether line fees will be posted when the reminder is issued.
/// </summary>
field(46; "Post Add. Fee per Line"; Boolean)
{
Caption = 'Post Add. Fee per Line';
}
/// <summary>
/// Specifies the date used for VAT reporting purposes.
/// </summary>
field(47; "VAT Reporting Date"; Date)
{
Caption = 'VAT Date';
ToolTip = 'Specifies the date used to include entries on VAT reports in a VAT period. This is either the date that the document was created or posted, depending on your setting on the General Ledger Setup page.';
Editable = false;
trigger OnValidate()
begin
if "VAT Reporting Date" = 0D then
InitVATDate();
end;
}
/// <summary>
/// Specifies the regional format for dates, numbers, and currency display.
/// </summary>
field(54; "Format Region"; Text[80])
{
Caption = 'Format Region';
TableRelation = "Language Selection"."Language Tag";
}
/// <summary>
/// Contains the email body text content for reminder communications.
/// </summary>
field(55; "Email Text"; Blob)
{
Caption = 'Email Text';
}
/// <summary>
/// Specifies the company bank account for receiving payments referenced on this reminder.
/// </summary>
field(163; "Company Bank Account Code"; Code[20])
{
Caption = 'Company Bank Account Code';
ToolTip = 'Specifies the bank account to use for bank information when the document is printed.';
TableRelation = "Bank Account" where("Currency Code" = field("Currency Code"));
}
/// <summary>
/// Specifies the combination of dimension values applied to this reminder for analysis.
/// </summary>
field(480; "Dimension Set ID"; Integer)
{
Caption = 'Dimension Set ID';
Editable = false;
TableRelation = "Dimension Set Entry";
trigger OnLookup()
begin
Rec.ShowDocDim();
end;
trigger OnValidate()
begin
DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
end;
}
/// <summary>
/// Specifies the reminder automation group code used to create this reminder automatically.
/// </summary>
field(500; "Reminder Automation Code"; Code[50])
{
DataClassification = CustomerContent;
TableRelation = "Reminder Action Group"."Code";
}
/// <summary>
/// Specifies the user who is assigned responsibility for this reminder.
/// </summary>
field(9000; "Assigned User ID"; Code[50])
{
Caption = 'Assigned User ID';
ToolTip = 'Specifies the ID of the user who is responsible for the document.';
DataClassification = EndUserIdentifiableInformation;
TableRelation = "User Setup";
}
}
keys
{
key(Key1; "No.")
{
Clustered = true;
}
key(Key2; "Customer No.", "Currency Code")
{
}
}
fieldgroups
{
fieldgroup(DropDown; "No.", "Customer No.", Name, "Due Date")
{
}
}
trigger OnDelete()
begin
ReminderIssue.DeleteHeader(Rec, IssuedReminderHeader);
ReminderLine.SetRange("Reminder No.", "No.");
ReminderLine.DeleteAll();
ReminderCommentLine.SetRange(Type, ReminderCommentLine.Type::Reminder);
ReminderCommentLine.SetRange("No.", "No.");
ReminderCommentLine.DeleteAll();
PrintIssuedReminders();
end;
trigger OnInsert()
var
IsHandled: Boolean;
begin
SalesSetup.Get();
SetReminderNo();
"Posting Description" := GetDefaultPostingDescription("No.");
OnInsertOnBeforeInitNoSeries(Rec, xRec, IsHandled);
if not IsHandled then
if ("No. Series" <> '') and
(SalesSetup."Reminder Nos." = GetIssuingNoSeriesCode())
then
"Issuing No. Series" := "No. Series"
else
if NoSeries.IsAutomatic(GetIssuingNoSeriesCode()) then
"Issuing No. Series" := GetIssuingNoSeriesCode();
if "Posting Date" = 0D then
"Posting Date" := WorkDate();
"Document Date" := WorkDate();
"Due Date" := WorkDate();
InitVATDate();
if GetFilter("Customer No.") <> '' then
if GetRangeMin("Customer No.") = GetRangeMax("Customer No.") then
Validate("Customer No.", GetRangeMin("Customer No."));
end;
var
Currency: Record Currency;
SalesSetup: Record "Sales & Receivables Setup";
CustPostingGr: Record "Customer Posting Group";
ReminderTerms: Record "Reminder Terms";
ReminderLevel: Record "Reminder Level";
FinChrgTerms: Record "Finance Charge Terms";
ReminderHeader: Record "Reminder Header";
ReminderLine: Record "Reminder Line";
ReminderCommentLine: Record "Reminder Comment Line";
Cust: Record Customer;
PostCode: Record "Post Code";
IssuedReminderHeader: Record "Issued Reminder Header";
GenBusPostingGrp: Record "Gen. Business Posting Group";
GLSetup: Record "General Ledger Setup";
AutoFormat: Codeunit "Auto Format";
NoSeries: Codeunit "No. Series";
TransferExtendedText: Codeunit "Transfer Extended Text";
ReminderIssue: Codeunit "Reminder-Issue";
DimMgt: Codeunit DimensionManagement;
NextLineNo: Integer;
LineSpacing: Integer;
ReminderTotal: Decimal;
SelectNoSeriesAllowed: Boolean;
ReminderNoLbl: Label 'Reminder %1', Comment = '%1 = Reminder No.';
PrintReminderQst: Label 'Do you want to print reminder %1?', Comment = '%1 = Reminder No.';
DeleteExistingLinesTxt: Label 'This change will cause the existing lines to be deleted for this reminder.\\';
ContinueTxt: Label 'Do you want to continue?';
GapInNumberSeriesIfDeleteTxt: Label 'Deleting this document will cause a gap in the number series for reminders. ';
CreateEmptyReminderTxt: Label 'An empty reminder %1 will be created to fill this gap in the number series.\\', Comment = '%1 = Reminder No.';
UnexpectedLineTypeErr: Label 'Unexpected line type %1 in reminder %2', Comment = '%1 = Line Type, %2 = Reminder No.';
/// <summary>
/// Returns the default posting description text for the given reminder number.
/// </summary>
/// <param name="ReminderNo">The reminder number to embed in the posting description.</param>
/// <returns>The default posting description text.</returns>
internal procedure GetDefaultPostingDescription(ReminderNo: Code[20]): Text[100]
begin
exit(StrSubstNo(ReminderNoLbl, ReminderNo));
end;
/// <summary>
/// Opens a dialog to assist with selecting a number from related number series.
/// </summary>
/// <param name="OldReminderHeader">The previous reminder header record for reference.</param>
/// <returns>True if a new number was selected; otherwise, false.</returns>
procedure AssistEdit(OldReminderHeader: Record "Reminder Header"): Boolean
begin
ReminderHeader := Rec;
ReminderHeader.TestNoSeries();
if NoSeries.LookupRelatedNoSeries(SalesSetup."Reminder Nos.", OldReminderHeader."No. Series", ReminderHeader."No. Series") then begin
ReminderHeader."No." := NoSeries.GetNextNo(ReminderHeader."No. Series");
Rec := ReminderHeader;
exit(true);
end;
end;
/// <summary>
/// Tests that the required number series are set up in Sales and Receivables Setup.
/// </summary>
procedure TestNoSeries()
var
IsHandled: Boolean;
begin
SalesSetup.Get();
IsHandled := false;
OnBeforeTestNoSeries(Rec, IsHandled);
if not IsHandled then begin
SalesSetup.TestField("Reminder Nos.");
SalesSetup.TestField("Issued Reminder Nos.");
end;
OnAfterTestNoSeries(Rec);
end;
/// <summary>
/// Gets the number series code for reminder documents.
/// </summary>
/// <returns>The number series code to use for reminders.</returns>
procedure GetNoSeriesCode(): Code[20]
var
NoSeriesCode: Code[20];
IsHandled: Boolean;
begin
SalesSetup.Get();
IsHandled := false;
OnBeforeGetNoSeriesCode(Rec, SalesSetup, NoSeriesCode, IsHandled);
if IsHandled then
exit(NoSeriesCode);
NoSeriesCode := SalesSetup."Reminder Nos.";
OnAfterGetNoSeriesCode(Rec, SalesSetup, NoSeriesCode);
if not SelectNoSeriesAllowed then
exit(NoSeriesCode);
if NoSeries.IsAutomatic(NoSeriesCode) then
exit(NoSeriesCode);
if NoSeries.HasRelatedSeries(NoSeriesCode) then
if NoSeries.LookupRelatedNoSeries(NoSeriesCode, "No. Series") then
exit("No. Series");
exit(NoSeriesCode);
end;
local procedure InitVATDate()
begin
"VAT Reporting Date" := GLSetup.GetVATDate("Posting Date", "Document Date");
end;
local procedure GetIssuingNoSeriesCode() IssuingNos: Code[20]
var
IsHandled: Boolean;
begin
SalesSetup.Get();
IsHandled := false;
OnBeforeGetIssuingNoSeriesCode(Rec, SalesSetup, IssuingNos, IsHandled);
if IsHandled then
exit;
IssuingNos := SalesSetup."Issued Reminder Nos.";
OnAfterGetIssuingNoSeriesCode(Rec, IssuingNos);
end;
local procedure SetCompanyBankAccount()
var
BankAccount: Record "Bank Account";
begin
Validate("Company Bank Account Code", BankAccount.GetDefaultBankAccountNoForCurrency("Currency Code"));
OnAfterSetCompanyBankAccount(Rec, xRec);
end;
/// <summary>
/// Prompts the user to confirm deletion of existing reminder lines and deletes them if confirmed.
/// </summary>
/// <returns>True if the user cancels the operation; otherwise, false.</returns>
procedure Undo(): Boolean
begin
ReminderLine.SetRange("Reminder No.", "No.");
if ReminderLine.Find('-') then begin
Commit();
if not
Confirm(
DeleteExistingLinesTxt +
ContinueTxt,
false)
then
exit(true);
ReminderLine.DeleteAll();
Modify();
end;
end;
/// <summary>
/// Inserts reminder lines including additional fees, beginning and ending texts based on the reminder level.
/// </summary>
procedure InsertLines()
var
ReminderLine2: Record "Reminder Line";
CurrencyForReminderLevel: Record "Currency for Reminder Level";
TranslationHelper: Codeunit "Translation Helper";
AdditionalFee: Decimal;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeInsertLines(Rec, IsHandled);
if not IsHandled then begin
CurrencyForReminderLevel.Init();
ReminderLevel.SetRange("Reminder Terms Code", "Reminder Terms Code");
ReminderLevel.SetRange("No.", 1, "Reminder Level");
OnInsertLinesOnAfterReminderLevelSetFilters(Rec, ReminderLevel);
if ReminderLevel.FindLast() then begin
CalcFields("Remaining Amount");
AdditionalFee := ReminderLevel.GetAdditionalFee("Remaining Amount", "Currency Code", false, "Posting Date");
OnInsertLinesOnAfterCalcAdditionalFee(Rec, ReminderLevel, AdditionalFee);
if AdditionalFee > 0 then begin
ReminderLine.Reset();
ReminderLine.SetRange("Reminder No.", "No.");
ReminderLine.SetRange("Line Type", ReminderLine."Line Type"::"Reminder Line");
ReminderLine."Reminder No." := "No.";
if ReminderLine.Find('+') then
NextLineNo := ReminderLine."Line No."
else
NextLineNo := 0;
ReminderLine.SetRange("Line Type");
ReminderLine2 := ReminderLine;
ReminderLine2.CopyFilters(ReminderLine);
ReminderLine2.SetFilter("Line Type", '<>%1', ReminderLine2."Line Type"::"Line Fee");
if ReminderLine2.Next() <> 0 then
LineSpacing := (ReminderLine2."Line No." - ReminderLine."Line No.") div 3
else
LineSpacing := 10000;
InsertBlankLine(ReminderLine."Line Type"::"Additional Fee");
NextLineNo := NextLineNo + LineSpacing;
ReminderLine.Init();
ReminderLine."Line No." := NextLineNo;
ReminderLine.Type := ReminderLine.Type::"G/L Account";
TestField("Customer Posting Group");
CustPostingGr.Get("Customer Posting Group");
ReminderLine.Validate("No.", CustPostingGr.GetAdditionalFeeAccount());
ReminderLine.Description :=
CopyStr(
TranslationHelper.GetTranslatedFieldCaption(
"Language Code", DATABASE::"Currency for Reminder Level",
CurrencyForReminderLevel.FieldNo("Additional Fee")), 1, 100);
IsHandled := false;
OnInsertLinesOnBeforeValidateAmount(Rec, ReminderLine, IsHandled);
if not IsHandled then
ReminderLine.Validate(Amount, AdditionalFee);
ReminderLine."Line Type" := ReminderLine."Line Type"::"Additional Fee";
IsHandled := false;
OnInsertLinesOnBeforeReminderLineInsert(Rec, ReminderLine, IsHandled);
if not IsHandled then
ReminderLine.Insert();
if TransferExtendedText.ReminderCheckIfAnyExtText(ReminderLine, false) then
TransferExtendedText.InsertReminderExtText(ReminderLine);
end;
end;
ReminderLine."Line No." := ReminderLine."Line No." + 10000;
ReminderRounding(Rec);
InsertBeginTexts(Rec);
InsertEndTexts(Rec);
Modify();
end;
OnAfterInsertLines(Rec);
end;
/// <summary>
/// Updates reminder lines by refreshing text lines and optionally recalculating additional fees.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="UpdateAdditionalFee">Indicates whether to recalculate the additional fee.</param>
procedure UpdateLines(ReminderHeader: Record "Reminder Header"; UpdateAdditionalFee: Boolean)
begin
ReminderLine.Reset();
ReminderLine.SetRange("Reminder No.", ReminderHeader."No.");
ReminderLine.SetRange(
"Line Type",
ReminderLine."Line Type"::"Beginning Text",
ReminderLine."Line Type"::"Ending Text");
ReminderLine.SetRange(Type, ReminderLine.Type::" ");
ReminderLine.SetRange("Attached to Line No.", 0);
ReminderLine.DeleteAll(true);
if UpdateAdditionalFee then begin
ReminderLine.Reset();
ReminderLine.SetRange("Reminder No.", ReminderHeader."No.");
ReminderLine.SetRange("Line Type", ReminderLine."Line Type"::"Additional Fee");
ReminderLine.DeleteAll();
InsertLines();
end else begin
InsertBeginTexts(ReminderHeader);
InsertEndTexts(ReminderHeader);
end;
OnAfterUpdateLines(Rec, UpdateAdditionalFee);
end;
local procedure InsertBeginTexts(var ReminderHeader: Record "Reminder Header")
var
ReminderCommunication: Codeunit "Reminder Communication";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeInsertBeginTexts(ReminderHeader, IsHandled);
if IsHandled then
exit;
ReminderLevel.SetRange("Reminder Terms Code", ReminderHeader."Reminder Terms Code");
ReminderLevel.SetRange("No.", 1, ReminderHeader."Reminder Level");
OnInsertBeginTextsOnAfterReminderLevelSetFilters(ReminderLevel, ReminderHeader);
if ReminderLevel.FindLast() then
ReminderCommunication.InsertBeginningText(ReminderHeader, ReminderLevel, ReminderLine);
end;
local procedure InsertEndTexts(var ReminderHeader: Record "Reminder Header")
var
ReminderCommunication: Codeunit "Reminder Communication";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeInsertEndTexts(ReminderHeader, IsHandled);
if IsHandled then
exit;
ReminderLevel.SetRange("Reminder Terms Code", ReminderHeader."Reminder Terms Code");
ReminderLevel.SetRange("No.", 1, ReminderHeader."Reminder Level");
OnInsertEndTextsOnAfterReminderLevelSetFilters(ReminderLevel, ReminderHeader);
if ReminderLevel.FindLast() then
ReminderCommunication.InsertEndingText(ReminderHeader, ReminderLevel, ReminderLine);
end;
/// <summary>
/// Inserts text lines from reminder text records into the reminder document.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderText">The reminder text records to insert.</param>
/// <param name="NextLineNo">The next line number to use, updated after insertion.</param>
/// <param name="LineSpacing">The spacing between lines.</param>
procedure InsertTextLines(var ReminderHeader: Record "Reminder Header"; var ReminderText: Record "Reminder Text"; var NextLineNo: Integer; LineSpacing: Integer)
var
CompanyInfo: Record "Company Information";
AutoFormatType: Enum "Auto Format";
begin
if ReminderText.Find('-') then begin
if ReminderText.Position = ReminderText.Position::Ending then
InsertBlankLine(ReminderLine."Line Type"::"Ending Text");
if ReminderHeader."Fin. Charge Terms Code" <> '' then
FinChrgTerms.Get(ReminderHeader."Fin. Charge Terms Code");
OnInsertTextLinesOnAfterGetFinChrgTerms(ReminderHeader, FinChrgTerms);
if not ReminderLevel."Calculate Interest" then
FinChrgTerms."Interest Rate" := 0;
ReminderHeader.CalcFields(
"Remaining Amount", "Interest Amount", "Additional Fee", "VAT Amount", "Add. Fee per Line");
ReminderTotal :=
ReminderHeader."Remaining Amount" + ReminderHeader."Interest Amount" +
ReminderHeader."Additional Fee" + ReminderHeader."VAT Amount" +
ReminderHeader."Add. Fee per Line";
CompanyInfo.Get();
repeat
NextLineNo := NextLineNo + LineSpacing;
ReminderLine.Init();
ReminderLine."Line No." := NextLineNo;
ReminderLine.Type := ReminderLine.Type::" ";
ReminderLine.Description :=
CopyStr(
StrSubstNo(
ReminderText.Text,
ReminderHeader."Document Date",
ReminderHeader."Due Date",
FinChrgTerms."Interest Rate",
Format(ReminderHeader."Remaining Amount", 0,
AutoFormat.ResolveAutoFormat(AutoFormatType::AmountFormat, ReminderHeader."Currency Code")),
ReminderHeader."Interest Amount",
ReminderHeader."Additional Fee",
Format(ReminderTotal, 0, AutoFormat.ResolveAutoFormat(AutoFormatType::AmountFormat, ReminderHeader."Currency Code")),
ReminderHeader."Reminder Level",
ReminderHeader."Currency Code",
ReminderHeader."Posting Date",
CompanyInfo.Name,
ReminderHeader."Add. Fee per Line"),
1,
MaxStrLen(ReminderLine.Description));
if ReminderText.Position = ReminderText.Position::Beginning then
ReminderLine."Line Type" := ReminderLine."Line Type"::"Beginning Text"
else
ReminderLine."Line Type" := ReminderLine."Line Type"::"Ending Text";
OnInsertTextLinesOnBeforeReminderLineInsert(ReminderLine, ReminderText, ReminderHeader);
ReminderLine.Insert();
until ReminderText.Next() = 0;
if ReminderText.Position = ReminderText.Position::Beginning then
InsertBlankLine(ReminderLine."Line Type"::"Beginning Text");
end;
end;
/// <summary>
/// Inserts text lines from reminder attachment text records into the reminder document.
/// </summary>
/// <param name="LocalReminderHeader">The reminder header record.</param>
/// <param name="ReminderAttachmentText">The reminder attachment text records to insert.</param>
/// <param name="LineType">The type of line (Beginning Text or Ending Text).</param>
/// <param name="NextLineNumber">The next line number to use, updated after insertion.</param>
/// <param name="LineSpace">The spacing between lines.</param>
procedure InsertTextLines(var LocalReminderHeader: Record "Reminder Header"; var ReminderAttachmentText: Record "Reminder Attachment Text"; LineType: Enum "Reminder Line Type"; var NextLineNumber: Integer; LineSpace: Integer)
var
ReminderAttachmentTextLine: Record "Reminder Attachment Text Line";
ReminderCommunication: Codeunit "Reminder Communication";
begin
if not ReminderAttachmentText.IsEmpty() then begin
NextLineNo := NextLineNumber;
LineSpacing := LineSpace;
if LineType = Enum::"Reminder Line Type"::"Ending Text" then
InsertBlankLine(ReminderLine."Line Type"::"Ending Text");
if LocalReminderHeader."Fin. Charge Terms Code" <> '' then
FinChrgTerms.Get(LocalReminderHeader."Fin. Charge Terms Code");
OnInsertTextLinesOnAfterGetFinChrgTerms(LocalReminderHeader, FinChrgTerms);
if not ReminderLevel."Calculate Interest" then
FinChrgTerms."Interest Rate" := 0;
LocalReminderHeader.CalcFields("Remaining Amount", "Interest Amount", "Additional Fee", "VAT Amount", "Add. Fee per Line");
ReminderTotal := LocalReminderHeader."Remaining Amount"
+ LocalReminderHeader."Interest Amount"
+ LocalReminderHeader."Additional Fee"
+ LocalReminderHeader."VAT Amount"
+ LocalReminderHeader."Add. Fee per Line";
ReminderAttachmentTextLine.SetRange(Id, ReminderAttachmentText."Id");
ReminderAttachmentTextLine.SetRange("Language Code", ReminderAttachmentText."Language Code");
case LineType of
Enum::"Reminder Line Type"::"Beginning Text":
ReminderAttachmentTextLine.SetRange(Position, ReminderAttachmentTextLine.Position::"Beginning Line");
Enum::"Reminder Line Type"::"Ending Text":
ReminderAttachmentTextLine.SetRange(Position, ReminderAttachmentTextLine.Position::"Ending Line");
else
Error(UnexpectedLineTypeErr, LineType, LocalReminderHeader."No.");
end;
if ReminderAttachmentTextLine.IsEmpty() then
exit;
ReminderAttachmentTextLine.FindSet();
repeat
NextLineNo := NextLineNo + LineSpacing;
ReminderLine.Init();
ReminderLine.Type := ReminderLine.Type::" ";
case LineType of
Enum::"Reminder Line Type"::"Beginning Text":
ReminderLine."Line Type" := ReminderLine."Line Type"::"Beginning Text";
Enum::"Reminder Line Type"::"Ending Text":
ReminderLine."Line Type" := ReminderLine."Line Type"::"Ending Text";
end;
ReminderLine."Reminder No." := LocalReminderHeader."No.";
ReminderLine."Line No." := NextLineNo;
ReminderLine.Description := ReminderCommunication.SubstituteBeginningOrEndingDescription(ReminderAttachmentTextLine.Text, ReminderTotal, MaxStrLen(ReminderLine.Description), LocalReminderHeader, FinChrgTerms);
OnInsertTextLinesOnBeforeRemLineInsert(LocalReminderHeader, ReminderLine, ReminderAttachmentText, ReminderAttachmentTextLine);
ReminderLine.Insert();
until ReminderAttachmentTextLine.Next() = 0;
if LineType = Enum::"Reminder Line Type"::"Beginning Text" then
InsertBlankLine(ReminderLine."Line Type"::"Beginning Text");
end;
end;
local procedure InsertBlankLine(LineType: Enum "Reminder Line Type")
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeInsertBlankLine(Rec, LineType, NextLineNo, LineSpacing, IsHandled);
if IsHandled then
exit;
NextLineNo := NextLineNo + LineSpacing;
ReminderLine.Init();
ReminderLine."Reminder No." := "No.";
ReminderLine."Line No." := NextLineNo;
ReminderLine."Line Type" := LineType;
OnInsertBlankLineOnBeforeReminderLineInsert(ReminderLine);
ReminderLine.Insert();
end;
/// <summary>
/// Prints the reminder test report for the current record.
/// </summary>
procedure PrintRecords()
var
ReminderHeader: Record "Reminder Header";
ReportSelection: Record "Report Selections";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforePrintRecords(Rec, IsHandled);
if IsHandled then
exit;
ReminderHeader.Copy(Rec);
ReminderHeader.FindFirst();
ReminderHeader.SetRecFilter();
ReportSelection.PrintForCust(ReportSelection.Usage::"Rem.Test", ReminderHeader, ReminderHeader.FieldNo("Customer No."));
end;
/// <summary>
/// Prompts the user to confirm deletion of the reminder and warns about number series gaps.
/// </summary>
/// <returns>True if deletion is confirmed; otherwise, false.</returns>
procedure ConfirmDeletion() Confirmed: Boolean
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeConfirmDeletion(Rec, IssuedReminderHeader, Confirmed, IsHandled);
if IsHandled then
exit(Confirmed);
ReminderIssue.TestDeleteHeader(Rec, IssuedReminderHeader);
if IssuedReminderHeader."No." <> '' then
if not Confirm(
GapInNumberSeriesIfDeleteTxt +
CreateEmptyReminderTxt +
ContinueTxt, true,
IssuedReminderHeader."No.")
then
exit;
exit(true);
end;
/// <summary>
/// Creates dimensions for the reminder header based on the provided dimension sources.
/// </summary>
/// <param name="DefaultDimSource">The list of default dimension sources.</param>
procedure CreateDim(DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
var
SourceCodeSetup: Record "Source Code Setup";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeCreateDimProcedure(Rec, CurrFieldNo, DefaultDimSource, IsHandled);
if not IsHandled then begin
SourceCodeSetup.Get();
"Shortcut Dimension 1 Code" := '';
"Shortcut Dimension 2 Code" := '';
"Dimension Set ID" :=
DimMgt.GetRecDefaultDimID(
Rec, CurrFieldNo, DefaultDimSource, SourceCodeSetup.Reminder, "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code", 0, 0);
end;
OnAfterCreateDimProcedure(Rec, CurrFieldNo, DefaultDimSource);
end;
/// <summary>
/// Validates and updates a shortcut dimension code on the reminder header.
/// </summary>
/// <param name="FieldNumber">The field number of the shortcut dimension.</param>
/// <param name="ShortcutDimCode">The shortcut dimension code value.</param>
procedure ValidateShortcutDimCode(FieldNumber: Integer; var ShortcutDimCode: Code[20])
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode, IsHandled);
if not IsHandled then
DimMgt.ValidateShortcutDimValues(FieldNumber, ShortcutDimCode, "Dimension Set ID");
OnAfterValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode);
end;
/// <summary>
/// Calculates the invoice rounding amount for the reminder based on currency settings.
/// </summary>
/// <returns>The invoice rounding amount.</returns>
procedure GetInvoiceRoundingAmount(): Decimal
var
TotalAmountInclVAT: Decimal;
begin
GetCurrency();
if Currency."Invoice Rounding Precision" = 0 then
exit(0);
CalcFields(
"Remaining Amount", "Interest Amount", "Additional Fee", "VAT Amount", "Add. Fee per Line");
TotalAmountInclVAT :=
"Remaining Amount" + "Interest Amount" + "Additional Fee" +
"Add. Fee per Line" + "VAT Amount";
exit(
-Round(
TotalAmountInclVAT -
Round(
TotalAmountInclVAT,
Currency."Invoice Rounding Precision",
Currency.InvoiceRoundingDirection()),
Currency."Amount Rounding Precision"));
end;
local procedure ReminderRounding(var ReminderHeader: Record "Reminder Header")
var
ReminderRoundingAmount: Decimal;
Handled: Boolean;
begin
OnBeforeReminderRounding(ReminderHeader, Handled);
if Handled then
exit;
ReminderRoundingAmount := ReminderHeader.GetInvoiceRoundingAmount();
if ReminderRoundingAmount <> 0 then begin
CustPostingGr.Get(ReminderHeader."Customer Posting Group");
ReminderLine.Init();
ReminderLine.Validate("Line No.", GetNextLineNo(ReminderHeader."No."));
ReminderLine.Validate("Reminder No.", ReminderHeader."No.");
ReminderLine.Validate(Type, ReminderLine.Type::"G/L Account");
ReminderLine."System-Created Entry" := true;
ReminderLine.Validate("No.", CustPostingGr.GetInvRoundingAccount());
ReminderLine.Validate(
Amount,
Round(
ReminderRoundingAmount / (1 + (ReminderLine."VAT %" / 100)),
Currency."Amount Rounding Precision"));
ReminderLine."VAT Amount" := ReminderRoundingAmount - ReminderLine.Amount;
ReminderLine."Line Type" := ReminderLine."Line Type"::Rounding;
ReminderLine.Insert();
end;
end;
local procedure GetCurrency()
begin
if "Currency Code" = '' then
Currency.InitRoundingPrecision()
else begin
Currency.Get("Currency Code");
Currency.TestField("Amount Rounding Precision");
end;
end;
/// <summary>
/// Updates the invoice rounding line for the reminder by recalculating the rounding amount.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
procedure UpdateReminderRounding(ReminderHeader: Record "Reminder Header")
var
OldLineNo: Integer;
begin
ReminderLine.Reset();
ReminderLine.SetRange("Reminder No.", ReminderHeader."No.");
ReminderLine.SetRange("Line Type", ReminderLine."Line Type"::Rounding);
if ReminderLine.FindFirst() then
ReminderLine.Delete(true);
ReminderLine.SetRange("Line Type");
ReminderLine.SetFilter(Type, '<>%1', ReminderLine.Type::" ");
if ReminderLine.FindLast() then begin
OldLineNo := ReminderLine."Line No.";
ReminderLine.SetRange(Type);
if ReminderLine.Next() <> 0 then
ReminderLine."Line No." := OldLineNo + ((ReminderLine."Line No." - OldLineNo) div 2)
else
ReminderLine."Line No." := OldLineNo + 10000;
end else
ReminderLine."Line No." := 10000;
ReminderRounding(ReminderHeader);
end;
/// <summary>
/// Opens a dialog to view and edit the document dimensions for the reminder.
/// </summary>
procedure ShowDocDim()
begin
"Dimension Set ID" :=
DimMgt.EditDimensionSet(
Rec, "Dimension Set ID", StrSubstNo('%1 %2', TableCaption(), "No."),
"Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
OnAfterShowDocDim(Rec);
end;
/// <summary>
/// Calculates the total VAT amount for line fee type reminder lines.
/// </summary>
/// <returns>The sum of VAT amounts for line fee lines.</returns>
procedure CalculateLineFeeVATAmount(): Decimal
var
ReminderLine: Record "Reminder Line";
begin
ReminderLine.SetCurrentKey("Reminder No.", Type, "Line Type");
ReminderLine.SetRange("Reminder No.", "No.");
ReminderLine.SetRange(Type, ReminderLine.Type::"Line Fee");
ReminderLine.CalcSums("VAT Amount");
exit(ReminderLine."VAT Amount");
end;
local procedure GetNextLineNo(ReminderNo: Code[20]): Integer
var
ReminderLine: Record "Reminder Line";
begin
ReminderLine.SetRange("Reminder No.", ReminderNo);
if ReminderLine.FindLast() then
exit(ReminderLine."Line No." + 10000);
exit(10000);
end;
local procedure GetFilterCustNo(): Code[20]
begin
if GetFilter("Customer No.") <> '' then
if GetRangeMin("Customer No.") = GetRangeMax("Customer No.") then
exit(GetRangeMax("Customer No."));
end;
/// <summary>
/// Enables the option to select from related number series when creating a reminder.
/// </summary>
procedure SetAllowSelectNoSeries()
begin
SelectNoSeriesAllowed := true;
end;
/// <summary>
/// Sets the customer number from the current filter if a single customer is filtered.
/// </summary>
procedure SetCustomerFromFilter()
begin
if GetFilterCustNo() <> '' then
Validate("Customer No.", GetFilterCustNo());
end;
/// <summary>
/// Assigns the next reminder number from the number series if no number is set.
/// </summary>
[Scope('OnPrem')]
procedure SetReminderNo()
begin
if "No." = '' then begin
TestNoSeries();
"No. Series" := GetNoSeriesCode();
if NoSeries.AreRelated("No. Series", xRec."No. Series") then
"No. Series" := xRec."No. Series";
"No." := NoSeries.GetNextNo("No. Series", "Posting Date");
end;
end;
local procedure CheckCustomerBlockedAll(Cust: Record Customer)
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeCheckCustomerBlockedAll(Rec, Cust, IsHandled);
if IsHandled then
exit;
if Cust.Blocked = Cust.Blocked::All then
Cust.CustBlockedErrorMessage(Cust, false);
end;
local procedure PrintIssuedReminders()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforePrintIssuedReminders(Rec, IsHandled);
if IsHandled then
exit;
if IssuedReminderHeader."No." <> '' then begin
Commit();
if Confirm(PrintReminderQst, true, IssuedReminderHeader."No.") then begin
IssuedReminderHeader.SetRecFilter();
IssuedReminderHeader.PrintRecords(true, false, false)
end;
end;
end;
/// <summary>
/// Creates dimensions for the reminder header using the default dimension sources.
/// </summary>
procedure CreateDimFromDefaultDim()
var
DefaultDimSource: List of [Dictionary of [Integer, Code[20]]];
begin
InitDefaultDimensionSources(DefaultDimSource);
CreateDim(DefaultDimSource);
end;
local procedure InitDefaultDimensionSources(var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
begin
DimMgt.AddDimSource(DefaultDimSource, Database::Customer, Rec."Customer No.");
OnAfterInitDefaultDimensionSources(Rec, DefaultDimSource);
end;
/// <summary>
/// Raised after initializing default dimension sources for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="DefaultDimSource">The list of default dimension sources.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterInitDefaultDimensionSources(var ReminderHeader: Record "Reminder Header"; var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
begin
end;
/// <summary>
/// Raised before creating dimensions for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="CurrFieldNo">The current field number triggering the dimension creation.</param>
/// <param name="DefaultDimSource">The list of default dimension sources.</param>
/// <param name="IsHandled">Set to true to skip default dimension creation.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeCreateDimProcedure(var ReminderHeader: Record "Reminder Header"; CurrFieldNo: Integer; var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before confirming deletion of the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header to delete.</param>
/// <param name="IssuedReminderHeader">The related issued reminder header.</param>
/// <param name="Confirmed">Returns the confirmation result.</param>
/// <param name="IsHandled">Set to true to skip default confirmation dialog.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeConfirmDeletion(ReminderHeader: Record "Reminder Header"; IssuedReminderHeader: Record "Issued Reminder Header"; var Confirmed: Boolean; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised after creating dimensions for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="CurrFieldNo">The current field number that triggered dimension creation.</param>
/// <param name="DefaultDimSource">The list of default dimension sources.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterCreateDimProcedure(var ReminderHeader: Record "Reminder Header"; CurrFieldNo: Integer; var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
begin
end;
/// <summary>
/// Raised after retrieving the number series code for reminders.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="SalesSetup">The sales and receivables setup record.</param>
/// <param name="NoSeriesCode">The number series code retrieved.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterGetNoSeriesCode(var ReminderHeader: Record "Reminder Header"; SalesSetup: Record "Sales & Receivables Setup"; var NoSeriesCode: Code[20])
begin
end;
/// <summary>
/// Raised after retrieving the issuing number series code for reminders.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="IssuingNos">The issuing number series code retrieved.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterGetIssuingNoSeriesCode(var ReminderHeader: Record "Reminder Header"; var IssuingNos: Code[20])
begin
end;
/// <summary>
/// Raised after inserting reminder lines for the header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterInsertLines(var ReminderHeader: Record "Reminder Header")
begin
end;
/// <summary>
/// Raised after testing the number series for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterTestNoSeries(var ReminderHeader: Record "Reminder Header")
begin
end;
/// <summary>
/// Raised after setting the company bank account on the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="xReminderHeader">The previous reminder header values.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterSetCompanyBankAccount(var ReminderHeader: Record "Reminder Header"; xReminderHeader: Record "Reminder Header")
begin
end;
/// <summary>
/// Raised after validating a shortcut dimension code on the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="xReminderHeader">The previous reminder header values.</param>
/// <param name="FieldNumber">The field number of the shortcut dimension.</param>
/// <param name="ShortcutDimCode">The shortcut dimension code value.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterValidateShortcutDimCode(var ReminderHeader: Record "Reminder Header"; var xReminderHeader: Record "Reminder Header"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
begin
end;
/// <summary>
/// Raised after updating reminder lines for the header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="UpdateAdditionalFee">Indicates whether to update the additional fee.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterUpdateLines(var ReminderHeader: Record "Reminder Header"; UpdateAdditionalFee: Boolean)
begin
end;
/// <summary>
/// Raised after showing the document dimensions for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterShowDocDim(var ReminderHeader: Record "Reminder Header")
begin
end;
/// <summary>
/// Raised before retrieving the number series code for reminders.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="SalesSetup">The sales and receivables setup record.</param>
/// <param name="NoSeriesCode">The number series code to retrieve.</param>
/// <param name="IsHandled">Set to true to skip default number series retrieval.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeGetNoSeriesCode(var ReminderHeader: Record "Reminder Header"; SalesSetup: Record "Sales & Receivables Setup"; var NoSeriesCode: Code[20]; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before retrieving the issuing number series code for reminders.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="SalesSetup">The sales and receivables setup record.</param>
/// <param name="IssuingNos">The issuing number series code to retrieve.</param>
/// <param name="IsHandled">Set to true to skip default number series retrieval.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeGetIssuingNoSeriesCode(var ReminderHeader: Record "Reminder Header"; SalesSetup: Record "Sales & Receivables Setup"; var IssuingNos: Code[20]; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting a reminder line during InsertLines processing.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderLine">The reminder line to insert.</param>
/// <param name="IsHandled">Set to true to skip default line insertion.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertLinesOnBeforeReminderLineInsert(var ReminderHeader: Record "Reminder Header"; var ReminderLine: Record "Reminder Line"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting a blank reminder line.
/// </summary>
/// <param name="ReminderLine">The blank reminder line to insert.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertBlankLineOnBeforeReminderLineInsert(var ReminderLine: Record "Reminder Line")
begin
end;
/// <summary>
/// Raised before inserting a text line during InsertTextLines processing.
/// </summary>
/// <param name="ReminderLine">The reminder line to insert.</param>
/// <param name="ReminderText">The source reminder text record.</param>
/// <param name="ReminderHeader">The reminder header record.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertTextLinesOnBeforeReminderLineInsert(var ReminderLine: Record "Reminder Line"; var ReminderText: Record "Reminder Text"; var ReminderHeader: Record "Reminder Header")
begin
end;
/// <summary>
/// Raised after setting filters on reminder lines during InsertEndTexts processing.
/// </summary>
/// <param name="ReminderLine">The reminder line record with filters.</param>
/// <param name="ReminderHeader">The reminder header record.</param>
#if not CLEAN29
[Obsolete('The legacy Reminder Text flow is no longer used. Use OnBeforeInsertEndTexts instead.', '29.0')]
[IntegrationEvent(false, false)]
internal procedure OnInsertEndTextsOnAfterReminderLineSetFilters(var ReminderLine: Record "Reminder Line"; ReminderHeader: Record "Reminder Header")
begin
end;
#endif
/// <summary>
/// Raised after setting filters on reminder level during InsertEndTexts processing.
/// </summary>
/// <param name="ReminderLevel">The reminder level record with filters.</param>
/// <param name="ReminderHeader">The reminder header record.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertEndTextsOnAfterReminderLevelSetFilters(var ReminderLevel: Record "Reminder Level"; ReminderHeader: Record "Reminder Header");
begin
end;
/// <summary>
/// Raised after setting filters on reminder level during InsertBeginTexts processing.
/// </summary>
/// <param name="ReminderLevel">The reminder level record with filters.</param>
/// <param name="ReminderHeader">The reminder header record.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertBeginTextsOnAfterReminderLevelSetFilters(var ReminderLevel: Record "Reminder Level"; var ReminderHeader: Record "Reminder Header")
begin
end;
/// <summary>
/// Raised after setting filters on reminder level during InsertLines processing.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderLevel">The reminder level record with filters.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertLinesOnAfterReminderLevelSetFilters(var ReminderHeader: Record "Reminder Header"; var ReminderLevel: Record "Reminder Level")
begin
end;
/// <summary>
/// Raised before initializing the number series during record insertion.
/// </summary>
/// <param name="ReminderHeader">The reminder header record being inserted.</param>
/// <param name="xReminderHeader">The previous reminder header values.</param>
/// <param name="IsHandled">Set to true to skip default number series initialization.</param>
[IntegrationEvent(true, false)]
local procedure OnInsertOnBeforeInitNoSeries(var ReminderHeader: Record "Reminder Header"; var xReminderHeader: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before applying invoice rounding to the reminder.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="Handled">Set to true to skip default rounding logic.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeReminderRounding(var ReminderHeader: Record "Reminder Header"; var Handled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting beginning text lines for the reminder.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="IsHandled">Set to true to skip default begin text insertion.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertBeginTexts(var ReminderHeader: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting a blank line in the reminder.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="LineType">The type of reminder line.</param>
/// <param name="NextLineNo">The next line number to use.</param>
/// <param name="LineSpacing">The spacing between lines.</param>
/// <param name="IsHandled">Set to true to skip default blank line insertion.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertBlankLine(var ReminderHeader: Record "Reminder Header"; LineType: Enum "Reminder Line Type"; NextLineNo: Integer; LineSpacing: Integer; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting ending text lines for the reminder.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="IsHandled">Set to true to skip default end text insertion.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertEndTexts(var ReminderHeader: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before testing the number series for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="IsHandled">Set to true to skip default number series testing.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeTestNoSeries(var ReminderHeader: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised after validating the reminder level on the header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderLevel">The validated reminder level record.</param>
[IntegrationEvent(false, false)]
local procedure OnAfterValidateReminderLevel(var ReminderHeader: Record "Reminder Header"; ReminderLevel: Record "Reminder Level")
begin
end;
/// <summary>
/// Raised before validating a shortcut dimension code on the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="xReminderHeader">The previous reminder header values.</param>
/// <param name="FieldNumber">The field number of the shortcut dimension.</param>
/// <param name="ShortcutDimCode">The shortcut dimension code value.</param>
/// <param name="IsHandled">Set to true to skip default validation.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeValidateShortcutDimCode(var ReminderHeader: Record "Reminder Header"; var xReminderHeader: Record "Reminder Header"; FieldNumber: Integer; var ShortcutDimCode: Code[20]; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before checking if the customer is blocked for all transactions.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="Cust">The customer record to check.</param>
/// <param name="IsHandled">Set to true to skip default blocking check.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckCustomerBlockedAll(var ReminderHeader: Record "Reminder Header"; Cust: Record Customer; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before printing issued reminders.
/// </summary>
/// <param name="Rec">The reminder header record.</param>
/// <param name="IsHandled">Set to true to skip default printing.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforePrintIssuedReminders(var Rec: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised after setting filters on reminder text during InsertBeginTexts processing.
/// </summary>
/// <param name="ReminderText">The reminder text record with filters.</param>
/// <param name="ReminderHeader">The reminder header record.</param>
#if not CLEAN29
[Obsolete('The legacy Reminder Text flow is no longer used. Use OnBeforeInsertBeginTexts instead.', '29.0')]
[IntegrationEvent(false, false)]
internal procedure OnInsertBeginTextsOnAfterReminderTextSetFilters(var ReminderText: Record "Reminder Text"; ReminderHeader: Record "Reminder Header")
begin
end;
#endif
/// <summary>
/// Raised after setting filters on reminder text during InsertEndTexts processing.
/// </summary>
/// <param name="ReminderText">The reminder text record with filters.</param>
/// <param name="ReminderHeader">The reminder header record.</param>
#if not CLEAN29
[Obsolete('The legacy Reminder Text flow is no longer used. Use OnBeforeInsertEndTexts instead.', '29.0')]
[IntegrationEvent(false, false)]
internal procedure OnInsertEndTextsOnAfterReminderTextSetFilters(var ReminderText: Record "Reminder Text"; ReminderHeader: Record "Reminder Header")
begin
end;
#endif
/// <summary>
/// Raised after calculating the additional fee during InsertLines processing.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderLevel">The reminder level record.</param>
/// <param name="AdditionalFee">The calculated additional fee amount.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertLinesOnAfterCalcAdditionalFee(var ReminderHeader: Record "Reminder Header"; ReminderLevel: Record "Reminder Level"; var AdditionalFee: Decimal)
begin
end;
/// <summary>
/// Raised after assigning customer values during Customer No. validation.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="Customer">The customer record with assigned values.</param>
[IntegrationEvent(false, false)]
local procedure OnValidateCustomerNoOnAfterAssignCustomerValues(var ReminderHeader: Record "Reminder Header"; Customer: Record Customer)
begin
end;
/// <summary>
/// Raised before validating the city field on the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="PostCode">The post code record for validation.</param>
/// <param name="CurrentFieldNo">The current field number being validated.</param>
/// <param name="IsHandled">Set to true to skip default city validation.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeValidateCity(var ReminderHeader: Record "Reminder Header"; var PostCode: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before validating the post code field on the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="PostCode">The post code record for validation.</param>
/// <param name="CurrentFieldNo">The current field number being validated.</param>
/// <param name="IsHandled">Set to true to skip default post code validation.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeValidatePostCode(var ReminderHeader: Record "Reminder Header"; var PostCode: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised after retrieving finance charge terms during InsertTextLines processing.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="FinanceChargeTerms">The finance charge terms record.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertTextLinesOnAfterGetFinChrgTerms(var ReminderHeader: Record "Reminder Header"; var FinanceChargeTerms: Record "Finance Charge Terms")
begin
end;
/// <summary>
/// Raised before validating the amount on a reminder line during InsertLines processing.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderLine">The reminder line record.</param>
/// <param name="IsHandled">Set to true to skip default amount validation.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertLinesOnBeforeValidateAmount(var ReminderHeader: Record "Reminder Header"; var ReminderLine: Record "Reminder Line"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before printing reminder records.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="IsHandled">Set to true to skip default printing.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforePrintRecords(var ReminderHeader: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting lines for the reminder header.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="IsHandled">Set to true to skip default line insertion.</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertLines(var ReminderHeader: Record "Reminder Header"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Raised before inserting a reminder line from attachment text during InsertTextLines processing.
/// </summary>
/// <param name="ReminderHeader">The reminder header record.</param>
/// <param name="ReminderLine">The reminder line to insert.</param>
/// <param name="ReminderAttachmentText">The reminder attachment text record.</param>
/// <param name="ReminderAttachmentTextLine">The reminder attachment text line record.</param>
[IntegrationEvent(false, false)]
local procedure OnInsertTextLinesOnBeforeRemLineInsert(var ReminderHeader: Record "Reminder Header"; var ReminderLine: Record "Reminder Line"; var ReminderAttachmentText: Record "Reminder Attachment Text"; var ReminderAttachmentTextLine: Record "Reminder Attachment Text Line")
begin
end;
}