Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
@@ -0,0 +1,74 @@
// ------------------------------------------------------------------------------------------------
// 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 System.Agents;
using System.Environment.Configuration;

codeunit 6922 "EA Setup Mgt."
{
Access = Internal;
InherentEntitlements = X;
InherentPermissions = X;
Permissions = tabledata Agent = rm;

internal procedure ResolveAgentUserSecurityID(): Guid
var
ExpenseAgentSetup: Record "Expense Agent Setup";
Agent: Record Agent;
AgentUserSecurityID: Guid;
begin
if ExpenseAgentSetup.Get() then
AgentUserSecurityID := ExpenseAgentSetup."User Security ID";

if not IsNullGuid(AgentUserSecurityID) then
if Agent.Get(AgentUserSecurityID) then
exit(AgentUserSecurityID);

// Recover an existing company Agent when the per-company setup pointer is missing or stale.
exit(FindCompanyAgentUserSecurityID());
end;

internal procedure GetAgentSetupChangesMade(var AgentSetupBuffer: Record "Agent Setup Buffer"): Boolean
var
AgentSetup: Codeunit "Agent Setup";
begin
exit(AgentSetup.GetChangesMade(AgentSetupBuffer));
end;

internal procedure SaveAgentSetup(var AgentSetupBuffer: Record "Agent Setup Buffer")
var
AgentSetup: Codeunit "Agent Setup";
begin
AgentSetup.SaveChanges(AgentSetupBuffer);
end;

local procedure FindCompanyAgentUserSecurityID(): Guid
var
Agent: Record Agent;
TempUserSettings: Record "User Settings" temporary;
AgentCU: Codeunit Agent;
begin
Agent.SetRange("Agent Metadata Provider", "Agent Metadata Provider"::"Expense Agent");
if Agent.FindSet() then
repeat
Clear(TempUserSettings);
AgentCU.GetUserSettings(Agent."User Security ID", TempUserSettings);
// The originating company is stored in the Agent user settings.
if TempUserSettings.Company = CopyStr(CompanyName(), 1, MaxStrLen(TempUserSettings.Company)) then
exit(Agent."User Security ID");
until Agent.Next() = 0;
end;

internal procedure UpdateActivatorAttribution(AgentUserSecurityId: Guid)
var
Agent: Record Agent;
begin
if Agent.Get(AgentUserSecurityId) then begin
Agent."Display Name" := Agent."Display Name";
Agent.Modify();
end;
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,7 @@ page 6991 "Expense Agent Setup Wizard"
trigger OnOpenPage()
var
AzureOpenAI: Codeunit "Azure OpenAI";
EASetupMgt: Codeunit "EA Setup Mgt.";
AgentSystemPermissions: Codeunit "Agent System Permissions";
FeatureTelemetry: Codeunit "Feature Telemetry";
EAHttpClient: Codeunit "EA Http Client";
Expand All @@ -897,7 +898,7 @@ page 6991 "Expense Agent Setup Wizard"
ShowExpenseDashboardLink := ExpenseDashboardUrl <> '';
CanaryToggleVisible := Rec."Use Canary Endpoint" or EAHttpClient.IsTenantOnCanaryAllowlist();

AgentUserSecurityID := ResolveAgentUserSecurityID();
AgentUserSecurityID := EASetupMgt.ResolveAgentUserSecurityID();
CurrPage.AgentSetupPart.Page.Initialize(AgentUserSecurityID, "Agent Metadata Provider"::"Expense Agent", AgentUserName(), AgentDisplayNameLbl, AgentSummaryLbl);
UpdateAgentSetupBuffer();

Expand All @@ -908,9 +909,10 @@ page 6991 "Expense Agent Setup Wizard"
trigger OnAfterGetCurrRecord()
var
CreateExpenseAgentSetup: Codeunit "Create Expense Agent Setup";
EASetupMgt: Codeunit "EA Setup Mgt.";
begin
UpdateAgentSetupBuffer();
IsConfigUpdated := IsConfigUpdated or AgentSetup.GetChangesMade(AgentSetupBuffer);
IsConfigUpdated := IsConfigUpdated or EASetupMgt.GetAgentSetupChangesMade(AgentSetupBuffer);
EnableSendingEmailWithReceipts := EnableSendingEmailWithReceipts or (Rec."Email Address" <> '');
if Rec."Default Mileage UOM" = '' then
Rec."Default Mileage UOM" := CreateExpenseAgentSetup.GetDefaultMileageUOM();
Expand Down Expand Up @@ -949,7 +951,6 @@ page 6991 "Expense Agent Setup Wizard"

var
AgentSetupBuffer: Record "Agent Setup Buffer";
AgentSetup: Codeunit "Agent Setup";
InitialState: Option;
EnableMailboxChanged: Boolean;
IsConfigUpdated: Boolean;
Expand Down Expand Up @@ -1150,44 +1151,6 @@ page 6991 "Expense Agent Setup Wizard"
ExpenseAgentSetup.Modify(true);
end;

local procedure ResolveAgentUserSecurityID(): Guid
var
ExpenseAgentSetup: Record "Expense Agent Setup";
Agent: Record Agent;
AgentUserSecurityID: Guid;
begin
if ExpenseAgentSetup.Get() then
AgentUserSecurityID := ExpenseAgentSetup."User Security ID";

if not IsNullGuid(AgentUserSecurityID) then
if Agent.Get(AgentUserSecurityID) then
exit(AgentUserSecurityID);

// The per-company Setup pointer is missing or stale, but the Agent table is
// system-wide and this company may already have an agent (e.g. the pointer was
// lost, or a concurrent setup created one). Recover it so a save reuses that
// agent instead of provisioning a duplicate.
exit(FindCompanyAgentUserSecurityID());
end;

local procedure FindCompanyAgentUserSecurityID(): Guid
var
Agent: Record Agent;
TempUserSettings: Record "User Settings" temporary;
AgentCU: Codeunit Agent;
begin
// Only reuse the agent this company provisioned; the agent's originating company
// is stored in its user settings, never another company's Expense Agent.
Agent.SetRange("Agent Metadata Provider", "Agent Metadata Provider"::"Expense Agent");
if Agent.FindSet() then
repeat
Clear(TempUserSettings);
AgentCU.GetUserSettings(Agent."User Security ID", TempUserSettings);
if TempUserSettings.Company = CopyStr(CompanyName(), 1, MaxStrLen(TempUserSettings.Company)) then
exit(Agent."User Security ID");
until Agent.Next() = 0;
end;

local procedure AgentUserName(): Code[50]
begin
exit(CopyStr(AgentUserNameLbl + ' - ' + CompanyName(), 1, 50));
Expand Down Expand Up @@ -1451,6 +1414,7 @@ page 6991 "Expense Agent Setup Wizard"
local procedure PersistAgentState()
var
ExpenseAgentSetup: Record "Expense Agent Setup";
EASetupMgt: Codeunit "EA Setup Mgt.";
begin
Rec."Enable Agent" := AgentBeingEnabled();

Expand All @@ -1460,11 +1424,13 @@ page 6991 "Expense Agent Setup Wizard"
ExpenseAgentSetup.ReadIsolation := IsolationLevel::UpdLock;
if ExpenseAgentSetup.Get() then;
if IsNullGuid(AgentSetupBuffer."User Security ID") then
AgentSetupBuffer."User Security ID" := ResolveAgentUserSecurityID();
AgentSetupBuffer."User Security ID" := EASetupMgt.ResolveAgentUserSecurityID();

AgentSetup.SaveChanges(AgentSetupBuffer);
EASetupMgt.SaveAgentSetup(AgentSetupBuffer);
SaveSetup();
ApplyDefaultsIfRequested();
if AgentBeingEnabled() and StateChanged() then
EASetupMgt.UpdateActivatorAttribution(AgentSetupBuffer."User Security ID");
end;

local procedure ApplyScheduleChange()
Expand Down
Loading