Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
5c04f77
Add Remaining Amount field to Review G/L Entries and G/L Entry Review…
Bertverbeek4PS May 9, 2025
aa5b9d7
Add TODO comment for Remaining Amount field logic in Review G/L Entri…
Bertverbeek4PS May 9, 2025
6b0785c
Initial commit
Bertverbeek4PS Jun 18, 2025
c934ec4
Refactor G/L Entry Review logic and add upgrade handling for review e…
Bertverbeek4PS Jul 4, 2025
b9c82fa
Add G/L Account No. field to review log and related entries; update p…
Bertverbeek4PS Jul 4, 2025
0490bc3
Add G/L Account No. handling and update caption logic in Reviewed G/L…
Bertverbeek4PS Jul 4, 2025
c616da0
Fix balance calculation in OnModifyRecord trigger to account for chan…
Bertverbeek4PS Jul 4, 2025
85f8e21
Added 3 tests
Bertverbeek4PS Jul 4, 2025
d21f903
Reorder using directives for consistency in Reviewed G/L Entries page
Bertverbeek4PS Jul 4, 2025
5ca8d19
Refactor Reviewed Amount calculation for consistency
Bertverbeek4PS Jul 7, 2025
35361f1
Remove unnecessary permissions for "G/L Entry Review Setup" in Review…
Bertverbeek4PS Jul 7, 2025
ea5149c
Update obsolete state handling in G/L Entry Review Entry table
Bertverbeek4PS Jul 7, 2025
5761342
Add missing properties for G/L Entry Review Log table
Bertverbeek4PS Jul 7, 2025
36a11b4
Remove "Reviewed Amount" field from G/L Entry Review Entry table
Bertverbeek4PS Jul 7, 2025
f96fbde
Update DataClassification for "Reviewed Amount" and "G/L Account No."…
Bertverbeek4PS Jul 7, 2025
8066d14
Update Reviewed Amount handling in G/L Entry Review Log and Entry tables
Bertverbeek4PS Jul 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ permissionset 22219 "Review G/L Entries - Read"

IncludedPermissionSets = "Review G/L Entries - Objects";

Permissions = tabledata "G/L Entry Review Entry" = r,
Permissions = tabledata "G/L Entry Review Log" = r,
tabledata "G/L Entry Review Setup" = r;
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ permissionset 22220 "Review G/L Entries - View"

IncludedPermissionSets = "Review G/L Entries - Read";

Permissions = tabledata "G/L Entry Review Entry" = imd,
Permissions = tabledata "G/L Entry Review Log" = imd,
tabledata "G/L Entry Review Setup" = imd;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ codeunit 22200 "Review G/L Entry" implements "G/L Entry Reviewer"
{
Permissions = TableData "G/L Entry" = rm,
TableData "G/L Entry Review Setup" = ri,
TableData "G/L Entry Review Entry" = rid;
TableData "G/L Entry Review Log" = rid;

var
NoEntriesSelectedLbl: Label 'No entries were selected';
Expand All @@ -19,35 +19,48 @@ codeunit 22200 "Review G/L Entry" implements "G/L Entry Reviewer"

procedure ReviewEntries(var GLEntry: Record "G/L Entry");
var
GLEntryReviewLog: Record "G/L Entry Review Log";
#if not CLEAN27
GLEntryReviewEntry: Record "G/L Entry Review Entry";
#endif
FeatureTelemetry: Codeunit "Feature Telemetry";
UserName: Code[50];
Identifier: Integer;
begin
ValidateEntries(GLEntry);
Identifier := GetNextIdentifier();
UserName := CopyStr(Database.UserId(), 1, MaxStrLen(UserName));
GLEntry.FindSet();
repeat
GLEntryReviewEntry."G/L Entry No." := GLEntry."Entry No.";
GLEntryReviewEntry."Reviewed Identifier" := Identifier;
GLEntryReviewEntry."Reviewed By" := UserName;
GLEntryReviewEntry.Insert(true);
until GLEntry.Next() = 0;
GLEntryReviewLog.Init();
GLEntryReviewLog."G/L Entry No." := GLEntry."Entry No.";
GLEntryReviewLog."Reviewed Identifier" := Identifier;
GLEntryReviewLog."Reviewed By" := UserName;
GLEntryReviewLog."Reviewed Amount" := GLEntry."Amount to Review";
GLEntryReviewLog."G/L Account No." := GLEntry."G/L Account No.";
GLEntryReviewLog.Insert(true);

GLEntry."Amount to Review" := 0;
GLEntry.Modify(true);
until GLEntry.Next() = 0;
#if not CLEAN27
OnAfterReviewEntries(GLEntry, GLEntryReviewEntry);
#endif

OnAfterReviewEntriesLog(GLEntry, GLEntryReviewLog);

FeatureTelemetry.LogUptake('0000J2W', 'Review G/L Entries', "Feature Uptake Status"::Used);
FeatureTelemetry.LogUsage('0000KQJ', 'Review G/L Entries', 'Review G/L Entries');
end;

procedure UnreviewEntries(var GLEntry: Record "G/L Entry");
var
GLEntryReviewEntry: Record "G/L Entry Review Entry";
GLEntryReviewLog: Record "G/L Entry Review Log";
begin
ValidateEntries(GLEntry);
repeat
if GLEntryReviewEntry.Get(GLEntry."Entry No.") then
GLEntryReviewEntry.Delete(true);
GLEntryReviewLog.SetRange("G/L Entry No.", GLEntry."Entry No.");
GLEntryReviewLog.DeleteAll(true);
until GLEntry.Next() = 0;
end;

Expand Down Expand Up @@ -75,16 +88,21 @@ codeunit 22200 "Review G/L Entry" implements "G/L Entry Reviewer"
var
Balance: Decimal;
begin
if not GLEntry.IsEmpty() then begin
if not GLEntry.IsEmpty() and (GLEntry."Amount to Review" = 0) then begin
GLEntry.CalcSums("Debit Amount", "Credit Amount");
Balance := GLEntry."Credit Amount" - GLEntry."Debit Amount";
end else begin
repeat
Balance := Balance + GLEntry."Amount to Review";
until GLEntry.Next() = 0;
end;

exit(Balance = 0);
end;

local procedure GetNextIdentifier(): Integer
var
GLEntry: Record "G/L Entry Review Entry";
GLEntry: Record "G/L Entry Review Log";
begin
GLEntry.SetCurrentKey("Reviewed Identifier");
GLEntry.SetAscending("Reviewed Identifier", false);
Expand All @@ -104,8 +122,16 @@ codeunit 22200 "Review G/L Entry" implements "G/L Entry Reviewer"
end;
end;

#if not CLEAN27
[Obsolete('Use the event OnAfterReviewEntriesLog instead.', '27.0')]
[IntegrationEvent(false, false)]
local procedure OnAfterReviewEntries(var GLEntry: Record "G/L Entry"; var GLEntryReviewLog: Record "G/L Entry Review Entry")
begin
end;
#endif

[IntegrationEvent(false, false)]
local procedure OnAfterReviewEntries(var GLEntry: Record "G/L Entry"; var GLEntryReviewEntry: Record "G/L Entry Review Entry")
local procedure OnAfterReviewEntriesLog(var GLEntry: Record "G/L Entry"; var GLEntryReviewLog: Record "G/L Entry Review Log")
begin
end;
}
Expand Down
51 changes: 51 additions & 0 deletions Apps/W1/ReviewGLEntries/app/src/codeunits/Upgrade.Codeunit.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
namespace Microsoft.Finance.GeneralLedger.Review;

using System.Upgrade;
using Microsoft.Finance.GeneralLedger.Ledger;
codeunit 22201 "Upgrade"
{
Access = Internal;
Subtype = Upgrade;

trigger OnUpgradePerCompany()
begin
MovetoGLEntryReviewLog();
end;

local procedure MovetoGLEntryReviewLog()
var
GLEntryReviewEntry: Record "G/L Entry Review Entry";
GLEntryReviewLog: Record "G/L Entry Review Log";
GlEntry: Record "G/L Entry";
UpgradeTag: Codeunit "Upgrade Tag";
begin
if UpgradeTag.HasUpgradeTag(UpgradeReviewGLEntryTag) then exit;

if GLEntryReviewEntry.FindSet() then
repeat
GLEntryReviewLog.Init();
GLEntryReviewLog."G/L Entry No." := GLEntryReviewEntry."G/L Entry No.";
GLEntryReviewLog."Reviewed Identifier" := GLEntryReviewEntry."Reviewed Identifier";
GLEntryReviewLog."Reviewed By" := GLEntryReviewEntry."Reviewed By";
if GlEntry.Get(GLEntryReviewEntry."G/L Entry No.") then begin
GLEntryReviewLog."G/L Account No." := GlEntry."G/L Account No.";
GLEntryReviewLog."Reviewed Amount" := GlEntry.Amount;
end;
GLEntryReviewLog.Insert(true);
until GLEntryReviewEntry.Next() = 0;

UpgradeTag.SetUpgradeTag(UpgradeReviewGLEntryTag);
end;


[EventSubscriber(ObjectType::Codeunit, Codeunit::"Upgrade Tag", 'OnGetPerCompanyUpgradeTags', '', false, false)]
local procedure RegisterPerCompanyTags(var PerCompanyUpgradeTags: List of [Code[250]])
begin
PerCompanyUpgradeTags.Add(UpgradeReviewGLEntryTag());
end;

local procedure UpgradeReviewGLEntryTag(): Code[250]
begin
exit('MS-547765-UpdateReviewGLEntry-20250704');
end;
}
70 changes: 63 additions & 7 deletions Apps/W1/ReviewGLEntries/app/src/pages/ReviewGLEntries.Page.al
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ namespace Microsoft.Finance.GeneralLedger.Review;

using Microsoft.Finance.GeneralLedger.Ledger;
using System.Telemetry;
using System.Utilities;
using Microsoft.Finance.GeneralLedger.Account;

page 22207 "Review G/L Entries"
Expand Down Expand Up @@ -82,6 +83,25 @@ page 22207 "Review G/L Entries"
AboutTitle = 'About Reviewed Date?';
AboutText = 'When an entry has been marked as reviewed, you can see the date on which it was done';
}
field("Amount to Review"; Rec."Amount to Review")
{
ApplicationArea = Basic, Suite;

trigger OnValidate()
begin
if AreOppositeSign(Rec."Amount to Review", RemainingAmount) then
Error(MustHavetheSameSignErr);

if Abs(Rec."Amount to Review") > Abs(RemainingAmount) then
Error(MustNotBelargerErr);
end;
}
field(RemainingAmount; RemainingAmount)
{
ApplicationArea = Basic, Suite;
Caption = 'Remaining Amount';
Editable = false;
}
field("Review Id"; Rec."Reviewed Identifier")
{
ApplicationArea = Basic, Suite;
Expand Down Expand Up @@ -199,18 +219,18 @@ page 22207 "Review G/L Entries"
{
ApplicationArea = Dimensions;
Image = Filter;
ToolTip = 'Show reviewed entries, hides all the unreviewed entries on the page';
ToolTip = 'Shows all the reviewed entries on the page';
Caption = 'Show reviewed entries';
ShortCutKey = 'Ctrl+Alt+E';

trigger OnAction()
var
GLEntry: Record "G/L Entry";
GLEntryReviewLog: Record "G/L Entry Review Log";
ReviewedGLEntries: Page "Reviewed G/L Entries";
begin
GLEntry.Reset();
GLEntry.SetView(InitialRecordsLoaded);
GLEntry.SetRange(Reviewed, true);
CurrPage.SetTableView(GLEntry);
GLEntryReviewLog.SetRange("G/L Account No.", Rec."G/L Account No.");
ReviewedGLEntries.SetTableView(GLEntryReviewLog);
ReviewedGLEntries.RunModal();
end;
}
action("Hide Reviewed Entries")
Expand Down Expand Up @@ -281,10 +301,13 @@ page 22207 "Review G/L Entries"
GLEntryReviewer: Interface "G/L Entry Reviewer";
Debit: Decimal;
Credit: Decimal;
RemainingAmount: Decimal;
Balance: Decimal;
ReviewPolicy: Enum "Review Policy Type";
InitialRecordsLoaded: Text;
CaptionLbl: Label '%1 %2', Comment = '%1 is the G/L Account No. and %2 is the G/L Account Name';
MustHavetheSameSignErr: Label 'Amount to Review must have the same sign as Remaining Amount';
MustNotBelargerErr: Label 'Amount to Review must not be larger than Remaining Amount';


trigger OnOpenPage()
Expand All @@ -303,13 +326,26 @@ page 22207 "Review G/L Entries"
GLEntryReviewer := GLEntryReviewSetup.GLEntryReviewer;
InitialRecordsLoaded := Rec.GetView();
FeatureTelemetry.LogUptake('0000J2Y', 'Review G/L Entries', "Feature Uptake Status"::Discovered);

CalcBalance();
end;

trigger OnAfterGetRecord()
begin
Rec.CalcFields("Reviewed Amount");
RemainingAmount := Rec.Amount - Rec."Reviewed Amount";
end;

trigger OnAfterGetCurrRecord()
begin
CalcAmount();
end;

trigger OnModifyRecord(): Boolean
begin
Balance := Balance + Rec."Amount to Review" - xRec."Amount to Review";
end;

local procedure SetSelectedRecordsAsReviewed()
var
GLEntry: Record "G/L Entry";
Expand All @@ -334,7 +370,6 @@ page 22207 "Review G/L Entries"
GLEntry.CalcSums("Debit Amount", "Credit Amount");
Debit := GLEntry."Debit Amount";
Credit := GLEntry."Credit Amount";
Balance := Credit - Debit;
CurrPage.Update(false);
end;

Expand All @@ -354,5 +389,26 @@ page 22207 "Review G/L Entries"
exit(StrSubstNo(CaptionLbl, GLAccount."No.", GLAccount.Name));
end;

local procedure CalcBalance()
var
GLEntry: Record "G/L Entry";
begin
Balance := 0;
GLEntry.Copy(Rec);
if GLEntry.FindSet() then
repeat
Balance += GLEntry."Amount to Review";
until GLEntry.Next() = 0;
end;

local procedure AreOppositeSign(Amount1: Decimal; Amount2: Decimal): Boolean
var
Math: Codeunit "Math";
begin
if (Amount1 = 0) or (Amount2 = 0) then
exit(false);

exit(Math.Sign(Amount1) <> Math.Sign(Amount2));
end;
}

54 changes: 54 additions & 0 deletions Apps/W1/ReviewGLEntries/app/src/pages/ReviewedGLEntries.Page.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
namespace Microsoft.Finance.GeneralLedger.Review;

using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Ledger;
page 22208 "Reviewed G/L Entries"
{
Caption = 'Reviewed G/L Entries';
PageType = List;
DataCaptionExpression = GetCaption();
ApplicationArea = Basic, Suite;
DeleteAllowed = false;
InsertAllowed = false;
ModifyAllowed = false;
Editable = false;
Permissions = tabledata "G/L Entry" = r;
SourceTable = "G/L Entry Review Log";

layout
{
area(Content)
{
repeater(Group)
{
field("Posting Date"; GLEntry."Posting Date") { }
field("Document Type"; GLEntry."Document Type") { }
field("Document No."; GLEntry."Document No.") { }
field(Description; GLEntry.Description) { }
field(Amount; GLEntry.Amount) { }
field("Reviewed Identifier"; Rec."Reviewed Identifier") { }
field("Reviewed By"; Rec."Reviewed By") { }
field("Reviewed Amount"; Rec."Reviewed Amount") { }
}
}
}

var
GLEntry: Record "G/L Entry";
CaptionLbl: Label '%1 %2', Comment = '%1 is the G/L Account No. and %2 is the G/L Account Name';

trigger OnAfterGetRecord()
begin
GLEntry.Get(Rec."G/L Entry No.");
end;

local procedure GetCaption(): Text[250]
var
GLAccount: record "G/L Account";
begin
if not GLAccount.Get(Rec."G/L Account No.") then
if Rec.GetFilter(Rec."G/L Account No.") <> '' then
GLAccount.Get(Rec.GetRangeMin(Rec."G/L Account No."));
exit(StrSubstNo(CaptionLbl, GLAccount."No.", GLAccount.Name));
end;
}
Loading
Loading