Page 1321 Overdue Customers
- App
- Base Application
- Namespace
- Microsoft.Finance.RoleCenters
- Versions
- 24-28
- Source table
- 18
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/RoleCenters/OverdueCustomers.Page.al264 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.Finance.RoleCenters;
using Microsoft.CRM.BusinessRelation;
using Microsoft.CRM.Contact;
using Microsoft.CRM.Interaction;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Receivables;
using Microsoft.Sales.Reminder;
using System.EMail;
page 1321 "Overdue Customers"
{
PageType = ListPart;
SourceTable = Customer;
SourceTableTemporary = true;
Caption = 'Customers with overdue balance';
DeleteAllowed = false;
InsertAllowed = false;
Editable = false;
layout
{
area(Content)
{
repeater(OverdueCustomers)
{
field(Name; Rec.Name)
{
ApplicationArea = All;
Caption = 'Customer Name';
ToolTip = 'Specifies the name of the customer.';
}
field(ContactField; Rec.Contact)
{
ApplicationArea = All;
Caption = 'Contact';
ToolTip = 'Specifies the contact person at the customer''s company.';
}
field("Balance Due (LCY)"; Rec."Balance Due (LCY)")
{
ApplicationArea = All;
Caption = 'Balance Due (LCY)';
ToolTip = 'Specifies the balance due for this customer in local currency.';
trigger OnDrillDown()
var
CustLedgerEntry: Record "Cust. Ledger Entry";
CustomerLedgerEntries: Page "Customer Ledger Entries";
begin
CustLedgerEntry.SetRange("Customer No.", Rec."No.");
CustLedgerEntry.SetRange(Open, true);
CustomerLedgerEntries.SetTableView(CustLedgerEntry);
CustomerLedgerEntries.Run();
end;
}
field(DueDate; DueDate)
{
ApplicationArea = All;
Caption = 'Earliest Due Date';
ToolTip = 'Specifies the earliest due date for this customer''s invoices.';
}
field("Issued Reminder Level"; IssuedReminderLevel)
{
ApplicationArea = All;
Caption = 'Issued Reminder Level';
ToolTip = 'Specifies the highest reminder level issued for this customer.';
trigger OnDrillDown()
var
IssuedReminderHeader: Record "Issued Reminder Header";
IssuedReminders: Page "Issued Reminder List";
begin
if IssuedReminderLevel = 0 then begin
if Confirm('No issued reminders for this customer. Do you wish to create a reminder?') then
CreateReminder(Rec."No.");
exit;
end;
IssuedReminderHeader.SetRange("Customer No.", Rec."No.");
IssuedReminders.SetTableView(IssuedReminderHeader);
IssuedReminders.Run();
end;
}
}
}
}
actions
{
area(Processing)
{
action(OpenContacts)
{
ApplicationArea = All;
Caption = 'Open Contacts';
Image = ContactPerson;
ToolTip = 'Opens the contact list for this customer.';
RunObject = page "Contact List";
RunPageLink = "Company Name" = field(Name),
"Contact Business Relation" = const(Customer);
Scope = Repeater;
}
action(SendAnEmail)
{
ApplicationArea = All;
Caption = 'Send an Email';
Image = Email;
ToolTip = 'Sends an email to the main contact';
Scope = Repeater;
trigger OnAction()
var
TempEmailItem: Record "Email Item" temporary;
Contact: Record Contact;
EmailScenario: Enum "Email Scenario";
begin
GetContact(Rec, Contact);
TempEmailItem.AddSourceDocument(Database::Contact, Contact.SystemId);
TempEmailItem."Send to" := Contact."E-Mail";
TempEmailItem.Send(false, EmailScenario::Default);
end;
}
action(MakePhoneCall)
{
ApplicationArea = All;
Caption = 'Make Phone Call';
Image = Calls;
Scope = Repeater;
ToolTip = 'Calls the main contact.';
trigger OnAction()
var
Contact: Record Contact;
TAPIManagement: Codeunit TAPIManagement;
begin
GetContact(Rec, Contact);
TAPIManagement.DialContCustVendBank(Database::Contact, Contact."No.", Contact.GetDefaultPhoneNo(), '');
end;
}
action(CreateAReminder)
{
ApplicationArea = All;
Caption = 'Create a Reminder';
Image = Reminder;
ToolTip = 'Creates a reminder for this customer.';
Scope = Repeater;
trigger OnAction()
begin
CreateReminder(Rec."No.");
end;
}
}
}
var
IssuedReminderLevel: Integer;
DueDate: Date;
NoContactConfiguredForCustomerErr: Label 'No contact configured for this customer.';
trigger OnOpenPage()
var
Customer: Record Customer;
CustLedgerEntry: Record "Cust. Ledger Entry";
MaxCustomersShown, NCustomersShown : Integer;
begin
MaxCustomersShown := 20;
NCustomersShown := 0;
CustLedgerEntry.SetRange("Due Date", 0D, WorkDate());
CustLedgerEntry.SetRange(Open, true);
if not CustLedgerEntry.FindSet() then
exit;
repeat
Customer.SetRange("Date Filter", 0D, WorkDate());
if Customer.Get(CustLedgerEntry."Customer No.") then
if not Rec.Get(CustLedgerEntry."Customer No.") then begin
Customer.CalcFields("Balance Due (LCY)");
Rec.Copy(Customer);
Rec.Insert();
NCustomersShown += 1;
end;
until (CustLedgerEntry.Next() = 0) or (NCustomersShown >= MaxCustomersShown);
end;
trigger OnAfterGetRecord()
begin
IssuedReminderLevel := GetIssuedReminderLevel(Rec);
DueDate := GetDueDate(Rec);
end;
local procedure GetContact(Customer: Record Customer; var Contact: Record Contact)
var
ContactBusinessRelation: Record "Contact Business Relation";
begin
if Customer."Primary Contact No." <> '' then
Contact.SetRange("No.", Customer."Primary Contact No.")
else
if ContactBusinessRelation.FindByRelation(ContactBusinessRelation."Link to Table"::Customer, Customer."No.") then
Contact.SetRange("Company No.", ContactBusinessRelation."Contact No.");
if not Contact.FindFirst() then
Error(NoContactConfiguredForCustomerErr);
end;
local procedure CreateReminder(CustomerNo: Code[20])
var
CreateReminders: Report "Create Reminders";
begin
CreateReminders.SetCustomer(CustomerNo);
CreateReminders.SetOpenReminderListAfter(true);
CreateReminders.Run();
end;
local procedure GetDueDate(Customer: Record Customer): Date
var
CustLedgerEntry: Record "Cust. Ledger Entry";
begin
CustLedgerEntry.SetRange("Customer No.", Customer."No.");
CustLedgerEntry.SetRange("Due Date", 0D, WorkDate());
CustLedgerEntry.SetRange(Open, true);
CustLedgerEntry.SetCurrentKey("Due Date");
CustLedgerEntry.SetAscending("Due Date", true);
if not CustLedgerEntry.FindFirst() then
exit(0D);
exit(CustLedgerEntry."Due Date");
end;
local procedure GetIssuedReminderLevel(Customer: Record Customer) ReminderLevel: Integer
var
CustLedgerEntry: Record "Cust. Ledger Entry";
IssuedReminderHeader: Record "Issued Reminder Header";
IssuedReminderLine: Record "Issued Reminder Line";
DueDocumentNos: List of [Code[20]];
DueDocumentNo: Code[20];
begin
IssuedReminderHeader.SetRange("Customer No.", Customer."No.");
if not IssuedReminderHeader.FindSet() then
exit(0);
CustLedgerEntry.SetRange("Customer No.", Customer."No.");
CustLedgerEntry.SetRange("Due Date", 0D, WorkDate());
CustLedgerEntry.SetRange(Open, true);
if not CustLedgerEntry.FindSet() then
exit(0);
repeat
if not DueDocumentNos.Contains(CustLedgerEntry."Document No.") then
DueDocumentNos.Add(CustLedgerEntry."Document No.");
until CustLedgerEntry.Next() = 0;
repeat
foreach DueDocumentNo in DueDocumentNos do begin
IssuedReminderLine.SetRange("Reminder No.", IssuedReminderHeader."No.");
IssuedReminderLine.SetRange("Document No.", DueDocumentNo);
if not IssuedReminderLine.IsEmpty() then
if ReminderLevel < IssuedReminderHeader."Reminder Level" then
ReminderLevel := IssuedReminderHeader."Reminder Level";
end;
until IssuedReminderHeader.Next() = 0;
end;
}