From ad0db5b0c0d76a7da7fed961b09311a0a10e2dd1 Mon Sep 17 00:00:00 2001 From: v-viditgupta Date: Thu, 27 Aug 2026 09:31:21 +0530 Subject: [PATCH 1/4] =?UTF-8?q?Slice=20580818:=20[Expense=20Management]=20?= =?UTF-8?q?-=20Role=20Centers=20updates=20=F0=9F=92=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpAccPayableAdminRCExt.PageExt.al | 21 +++ .../Extensions/ExpAccountantRCExt.PageExt.al | 21 +++ .../ExpBusinessManagerRCExt.PageExt.al | 21 +++ .../Common/Pages/ExpenseActivities.Page.al | 142 ++++++++++++++++++ .../Tables/ExpenseActivitiesCue.Table.al | 92 ++++++++++++ .../ExpenseManagementObjects.permissionset.al | 2 + .../ExpenseMgmtEdit.PermissionSet.al | 1 + .../ExpenseMgmtRead.PermissionSet.al | 1 + 8 files changed, 301 insertions(+) create mode 100644 src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al create mode 100644 src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al create mode 100644 src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al create mode 100644 src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al create mode 100644 src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al new file mode 100644 index 00000000000..4f90733f91b --- /dev/null +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al @@ -0,0 +1,21 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ +namespace Microsoft.ExpenseAgent; + +using Microsoft.Finance.RoleCenters; + +pageextension 6905 "Exp. Acc. Payable Admin RC Ext" extends "Acc. Payable Administrator RC" +{ + layout + { + addlast(rolecenter) + { + part("Expense Activities"; "Expense Activities") + { + ApplicationArea = Basic, Suite; + } + } + } +} diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al new file mode 100644 index 00000000000..22ae6ebb766 --- /dev/null +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al @@ -0,0 +1,21 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ +namespace Microsoft.ExpenseAgent; + +using Microsoft.Finance.RoleCenters; + +pageextension 6904 "Exp. Accountant RC Ext" extends "Accountant Role Center" +{ + layout + { + addlast(rolecenter) + { + part("Expense Activities"; "Expense Activities") + { + ApplicationArea = Basic, Suite; + } + } + } +} diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al new file mode 100644 index 00000000000..e8dce7ac714 --- /dev/null +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al @@ -0,0 +1,21 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ +namespace Microsoft.ExpenseAgent; + +using Microsoft.Finance.RoleCenters; + +pageextension 6906 "Exp. Business Manager RC Ext" extends "Business Manager Role Center" +{ + layout + { + addlast(rolecenter) + { + part("Expense Activities"; "Expense Activities") + { + ApplicationArea = Basic, Suite; + } + } + } +} diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al new file mode 100644 index 00000000000..b2ad75faae5 --- /dev/null +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al @@ -0,0 +1,142 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ +namespace Microsoft.ExpenseAgent; + +page 7107 "Expense Activities" +{ + Caption = 'Expense Activities'; + PageType = CardPart; + RefreshOnActivate = true; + SourceTable = "Expense Activities Cue"; + + layout + { + area(Content) + { + cuegroup("Expense Reports") + { + Caption = 'Expense Reports'; + + field("Opened Expense Reports"; Rec."Opened Expense Reports") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of open expense reports.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::Open); + end; + } + field("Released Expense Reports"; Rec."Released Expense Reports") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of released expense reports.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::Released); + end; + } + field("Pending Approval Exp. Reports"; Rec."Pending Approval Exp. Reports") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of expense reports that are pending approval.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::"Pending Approval"); + end; + } + field("Approved Expense Reports"; Rec."Approved Expense Reports") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of approved expense reports.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::Approved); + end; + } + field("Rejected Expense Reports"; Rec."Rejected Expense Reports") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of rejected expense reports.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::Rejected); + end; + } + field("Processed for Payment Exp."; Rec."Processed for Payment Exp.") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of expense reports that are processed for payment.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::"Processed for Payment"); + end; + } + field("Completed Expense Reports"; Rec."Completed Expense Reports") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of completed expense reports.'; + + trigger OnDrillDown() + begin + DrillDownExpenseReports("Expense Report Status"::Completed); + end; + } + } + cuegroup(Expenses) + { + Caption = 'Expenses'; + + field("Released Expenses"; Rec."Released Expenses") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of released expenses.'; + + trigger OnDrillDown() + var + Expense: Record Expense; + begin + Expense.SetRange(Status, "Expense Status"::Released); + Page.Run(Page::Expenses, Expense); + end; + } + field("Policy Violated Expenses"; Rec."Policy Violated Expenses") + { + ApplicationArea = Basic, Suite; + ToolTip = 'Specifies the number of expense policy violations that are registered on expenses.'; + + trigger OnDrillDown() + var + ExpenseRuleViolation: Record "Expense Rule Violation"; + begin + Page.Run(Page::"Expense Rule Violations", ExpenseRuleViolation); + end; + } + } + } + } + + trigger OnOpenPage() + begin + Rec.Reset(); + if not Rec.Get() then begin + Rec.Init(); + Rec.Insert(); + end; + end; + + local procedure DrillDownExpenseReports(ReportStatus: Enum "Expense Report Status") + var + ExpenseReportHeader: Record "Expense Report Header"; + begin + ExpenseReportHeader.SetRange(Status, ReportStatus); + Page.Run(Page::"Expense Reports", ExpenseReportHeader); + end; +} diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al new file mode 100644 index 00000000000..0baed2e09d0 --- /dev/null +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al @@ -0,0 +1,92 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ +namespace Microsoft.ExpenseAgent; + +table 6939 "Expense Activities Cue" +{ + Access = Internal; + Caption = 'Expense Activities Cue'; + DataClassification = CustomerContent; + ReplicateData = false; + + fields + { + field(1; "Primary Key"; Code[10]) + { + Caption = 'Primary Key'; + } + field(2; "Opened Expense Reports"; Integer) + { + Caption = 'Opened Expense Reports'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const(Open))); + Editable = false; + } + field(3; "Released Expense Reports"; Integer) + { + Caption = 'Released Expense Reports'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const(Released))); + Editable = false; + } + field(4; "Pending Approval Exp. Reports"; Integer) + { + Caption = 'Expense Reports Pending Approvals'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const("Pending Approval"))); + Editable = false; + } + field(5; "Approved Expense Reports"; Integer) + { + Caption = 'Approved Expense Reports'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const(Approved))); + Editable = false; + } + field(6; "Rejected Expense Reports"; Integer) + { + Caption = 'Rejected Expense Reports'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const(Rejected))); + Editable = false; + } + field(7; "Processed for Payment Exp."; Integer) + { + Caption = 'Processed for Payment Exp. Rep.'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const("Processed for Payment"))); + Editable = false; + } + field(8; "Completed Expense Reports"; Integer) + { + Caption = 'Completed Expense Reports'; + FieldClass = FlowField; + CalcFormula = count("Expense Report Header" where(Status = const(Completed))); + Editable = false; + } + field(9; "Released Expenses"; Integer) + { + Caption = 'Released Expenses'; + FieldClass = FlowField; + CalcFormula = count(Expense where(Status = const(Released))); + Editable = false; + } + field(10; "Policy Violated Expenses"; Integer) + { + Caption = 'Policy Violated Expenses'; + FieldClass = FlowField; + CalcFormula = count("Expense Rule Violation"); + Editable = false; + } + } + + keys + { + key(PK; "Primary Key") + { + Clustered = true; + } + } +} diff --git a/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseManagementObjects.permissionset.al b/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseManagementObjects.permissionset.al index f4473c7b2e1..e366f4d2f9b 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseManagementObjects.permissionset.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseManagementObjects.permissionset.al @@ -66,6 +66,7 @@ permissionset 6904 "Expense Management - Objects" table Traveler = X, table "Expense Activity Log Entry" = X, table "Expense Project Buf" = X, + table "Expense Activities Cue" = X, page "EA Billing Overview" = X, page "EA Scheduler Tasks" = X, page "EA Outbox Emails" = X, @@ -109,6 +110,7 @@ permissionset 6904 "Expense Management - Objects" page "Expense Report SubPage" = X, page "Expense Reports" = X, page "Expense Management Role Center" = X, + page "Expense Activities" = X, page "Manager Expense Reports" = X, page "Expense Subcategories" = X, page "Expense Vendors" = X, diff --git a/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtEdit.PermissionSet.al b/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtEdit.PermissionSet.al index 15211f0e313..61a74582f26 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtEdit.PermissionSet.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtEdit.PermissionSet.al @@ -44,5 +44,6 @@ permissionset 6906 "Expense Mgmt. Edit" tabledata Traveler = IMD, tabledata "Expense VAT Specification" = IMD, tabledata "Expense Report Line VAT Spec." = IMD, + tabledata "Expense Activities Cue" = IMD, tabledata "Expense Vendor" = RIMD; } \ No newline at end of file diff --git a/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtRead.PermissionSet.al b/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtRead.PermissionSet.al index 6f9c7f26f0b..b3b30312583 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtRead.PermissionSet.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Permissions/ExpenseMgmtRead.PermissionSet.al @@ -62,5 +62,6 @@ permissionset 6907 "Expense Mgmt. Read" tabledata "Expense VAT Specification" = R, tabledata "Expense Report Line VAT Spec." = R, tabledata "Expense Activity Log Entry" = R, + tabledata "Expense Activities Cue" = RIMD, tabledata "Posted Exp. Rep. Line VAT Spec" = R; } \ No newline at end of file From 91c57339a1278565fce1800e356cadaf80a3271a Mon Sep 17 00:00:00 2001 From: v-viditgupta Date: Mon, 31 Aug 2026 10:55:04 +0530 Subject: [PATCH 2/4] Object id renumbering --- src/Apps/W1/ExpenseAgent/app/app.json | 2 +- .../ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al | 2 +- .../app/src/Common/Tables/ExpenseActivitiesCue.Table.al | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Apps/W1/ExpenseAgent/app/app.json b/src/Apps/W1/ExpenseAgent/app/app.json index 671964cf276..b29b5b69bb2 100644 --- a/src/Apps/W1/ExpenseAgent/app/app.json +++ b/src/Apps/W1/ExpenseAgent/app/app.json @@ -39,7 +39,7 @@ }, { "from": 7073, - "to": 7137 + "to": 7147 } ], "features": [ diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al index b2ad75faae5..7d701a6978a 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al @@ -4,7 +4,7 @@ // ------------------------------------------------------------------------------------------------ namespace Microsoft.ExpenseAgent; -page 7107 "Expense Activities" +page 7140 "Expense Activities" { Caption = 'Expense Activities'; PageType = CardPart; diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al index 0baed2e09d0..3511718af6a 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al @@ -4,7 +4,7 @@ // ------------------------------------------------------------------------------------------------ namespace Microsoft.ExpenseAgent; -table 6939 "Expense Activities Cue" +table 6940 "Expense Activities Cue" { Access = Internal; Caption = 'Expense Activities Cue'; From 423ab6827b9241cac470b1dadea5dd07c1109c5c Mon Sep 17 00:00:00 2001 From: v-viditgupta Date: Mon, 31 Aug 2026 14:28:16 +0530 Subject: [PATCH 3/4] Add dataclassification --- .../app/src/Common/Tables/ExpenseActivitiesCue.Table.al | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al index 3511718af6a..2b9beae025a 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al @@ -16,6 +16,7 @@ table 6940 "Expense Activities Cue" field(1; "Primary Key"; Code[10]) { Caption = 'Primary Key'; + DataClassification = SystemMetadata; } field(2; "Opened Expense Reports"; Integer) { From 35fb03465bda4cbb00636efe448c223de76080ec Mon Sep 17 00:00:00 2001 From: v-viditgupta Date: Mon, 31 Aug 2026 15:43:15 +0530 Subject: [PATCH 4/4] Comments Fix --- .../Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al | 1 + .../src/Common/Extensions/ExpAccountantRCExt.PageExt.al | 1 + .../Common/Extensions/ExpBusinessManagerRCExt.PageExt.al | 1 + .../app/src/Common/Pages/ExpenseActivities.Page.al | 7 ++++--- .../app/src/Common/Tables/ExpenseActivitiesCue.Table.al | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al index 4f90733f91b..39ddd9bae87 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccPayableAdminRCExt.PageExt.al @@ -14,6 +14,7 @@ pageextension 6905 "Exp. Acc. Payable Admin RC Ext" extends "Acc. Payable Admini { part("Expense Activities"; "Expense Activities") { + AccessByPermission = tabledata Expense = R; ApplicationArea = Basic, Suite; } } diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al index 22ae6ebb766..41b531e613f 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpAccountantRCExt.PageExt.al @@ -14,6 +14,7 @@ pageextension 6904 "Exp. Accountant RC Ext" extends "Accountant Role Center" { part("Expense Activities"; "Expense Activities") { + AccessByPermission = tabledata Expense = R; ApplicationArea = Basic, Suite; } } diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al index e8dce7ac714..0d0ecf01684 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Extensions/ExpBusinessManagerRCExt.PageExt.al @@ -14,6 +14,7 @@ pageextension 6906 "Exp. Business Manager RC Ext" extends "Business Manager Role { part("Expense Activities"; "Expense Activities") { + AccessByPermission = tabledata Expense = R; ApplicationArea = Basic, Suite; } } diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al index 7d701a6978a..e856d1fa2b1 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Pages/ExpenseActivities.Page.al @@ -110,13 +110,14 @@ page 7140 "Expense Activities" field("Policy Violated Expenses"; Rec."Policy Violated Expenses") { ApplicationArea = Basic, Suite; - ToolTip = 'Specifies the number of expense policy violations that are registered on expenses.'; + ToolTip = 'Specifies the number of expenses with policy violations.'; trigger OnDrillDown() var - ExpenseRuleViolation: Record "Expense Rule Violation"; + Expense: Record Expense; begin - Page.Run(Page::"Expense Rule Violations", ExpenseRuleViolation); + Expense.SetRange("Rule Violations", true); + Page.Run(Page::Expenses, Expense); end; } } diff --git a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al index 2b9beae025a..473c9468a95 100644 --- a/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al +++ b/src/Apps/W1/ExpenseAgent/app/src/Common/Tables/ExpenseActivitiesCue.Table.al @@ -78,7 +78,7 @@ table 6940 "Expense Activities Cue" { Caption = 'Policy Violated Expenses'; FieldClass = FlowField; - CalcFormula = count("Expense Rule Violation"); + CalcFormula = count(Expense where("Rule Violations" = const(true))); Editable = false; } }