From 0d6049fb5376e62954e0ccc7edd5a742c7df24fd Mon Sep 17 00:00:00 2001 From: Neelesh Kumar Singhal Date: Tue, 30 Jun 2026 23:22:17 +0530 Subject: [PATCH] Fix and Automation --- .../Sales/Customer/CustomerCard.Page.al | 3 +- .../ERM/ERMCustomerStatistics.Codeunit.al | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/Layers/W1/BaseApp/Sales/Customer/CustomerCard.Page.al b/src/Layers/W1/BaseApp/Sales/Customer/CustomerCard.Page.al index a80df697cc..c78e901d6d 100644 --- a/src/Layers/W1/BaseApp/Sales/Customer/CustomerCard.Page.al +++ b/src/Layers/W1/BaseApp/Sales/Customer/CustomerCard.Page.al @@ -2389,6 +2389,7 @@ page 21 "Customer Card" ActivateFields(); SetCreditLimitStyle(); + Rec.SetRange("Date Filter", 0D, WorkDate()); if CRMIntegrationEnabled or CDSIntegrationEnabled then begin CRMIsCoupledToRecord := CRMCouplingManagement.IsRecordCoupledToCRM(Rec.RecordId); if Rec."No." <> xRec."No." then @@ -2440,8 +2441,6 @@ page 21 "Customer Card" begin OnBeforeOnOpenPage(Rec); - if Rec.GetFilter("Date Filter") = '' then - Rec.SetRange("Date Filter", 0D, WorkDate()); if GuiAllowed() then OnOpenPageFunc() else diff --git a/src/Layers/W1/Tests/ERM/ERMCustomerStatistics.Codeunit.al b/src/Layers/W1/Tests/ERM/ERMCustomerStatistics.Codeunit.al index 26b7019b52..282a6a4020 100644 --- a/src/Layers/W1/Tests/ERM/ERMCustomerStatistics.Codeunit.al +++ b/src/Layers/W1/Tests/ERM/ERMCustomerStatistics.Codeunit.al @@ -293,6 +293,40 @@ codeunit 134389 "ERM Customer Statistics" Assert.AreEqual(Round(InvoiceAmountLCY), Customer.CalcOverdueBalance(), OverDueBalanceErr); end; + [Test] + procedure OverdueBalanceUsesWorkDateWhenCustomerCardOpenedWithExistingDateFilter() + var + Customer: Record Customer; + CustomerCard: TestPage "Customer Card"; + OverdueAmount: Decimal; + NotOverdueAmount: Decimal; + begin + // [FEATURE] [UI] [Overdue Balance] + // [SCENARIO 638790] Overdue Balance (LCY) on Customer Card uses 0D..WORKDATE even when the page is opened from a document or journal that already applied a "Date Filter". + Initialize(); + + // [GIVEN] Customer with two posted sales invoices. + LibrarySales.CreateCustomer(Customer); + // [GIVEN] Invoice "A" is overdue: Due Date < WORKDATE, Amount = "X". + OverdueAmount := CreateAndPostInvoiceWithDueDate(Customer."No.", CalcDate('<-2M>', WorkDate()), CalcDate('<-1M>', WorkDate())); + // [GIVEN] Invoice "B" is not yet due: Due Date > WORKDATE, Amount = "Y". + NotOverdueAmount := CreateAndPostInvoiceWithDueDate(Customer."No.", WorkDate(), CalcDate('<2M>', WorkDate())); + + // [GIVEN] Customer Card is opened on the customer. + CustomerCard.OpenView(); + CustomerCard.GotoRecord(Customer); + + // [WHEN] A "Date Filter" covering both due dates is applied to the record, simulating opening the card from a document or journal. + CustomerCard.FILTER.SetFilter("Date Filter", Format(CalcDate('<3M>', WorkDate()))); + + // [THEN] Overdue Balance (LCY) shows only the overdue invoice amount "X". + CustomerCard."Balance Due (LCY)".AssertEquals(OverdueAmount); + // [THEN] Balance (LCY) shows the total of both invoices "X" + "Y". + CustomerCard."Balance (LCY)".AssertEquals(OverdueAmount + NotOverdueAmount); + + CustomerCard.Close(); + end; + [Test] [Scope('OnPrem')] procedure UTCheckEmptyBilltoCustomer() @@ -1242,6 +1276,21 @@ codeunit 134389 "ERM Customer Statistics" exit(SalesHeader."Amount Including VAT"); end; + local procedure CreateAndPostInvoiceWithDueDate(CustomerNo: Code[20]; PostingDate: Date; DueDate: Date): Decimal + var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + begin + CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Invoice, CustomerNo, PostingDate); + SalesHeader.Validate("Due Date", DueDate); + SalesHeader.Modify(true); + LibrarySales.CreateSalesLine( + SalesLine, SalesHeader, SalesLine.Type::Item, CreateItemWithUnitPrice(), LibraryRandom.RandDec(10, 2)); + SalesHeader.CalcFields("Amount Including VAT"); + LibrarySales.PostSalesDocument(SalesHeader, true, true); + exit(SalesHeader."Amount Including VAT"); + end; + local procedure CreateAndPostSalesDocument(CustomerNo: Code[20]; CurrencyCode: Code[10]): Decimal var SalesHeader: Record "Sales Header";