Page 9062 User Security Activities, source in 29
Source29
src/Layers/W1/BaseApp/System/User/UserSecurityActivities.Page.al227 lines, Copyright (c) Microsoft Corporation. MIT
namespace System.Security.User;
using Microsoft.Integration.Dataverse;
using Microsoft.Integration.SyncEngine;
using Microsoft.RoleCenters;
using System;
using System.Azure.Identity;
using System.Diagnostics;
using System.Environment;
using System.Environment.Configuration;
#if not CLEAN28
using System.Feedback;
#endif
using System.Privacy;
page 9062 "User Security Activities"
{
Caption = 'User Security Activities';
Editable = false;
PageType = CardPart;
RefreshOnActivate = true;
SourceTable = "User Security Status";
layout
{
area(content)
{
cuegroup(Control2)
{
ShowCaption = false;
field("Users - To review"; Rec."Users - To review")
{
ApplicationArea = Basic, Suite;
Caption = 'Users - To review';
DrillDownPageID = "User Security Status List";
Editable = false;
ToolTip = 'Specifies new users who have not yet been reviewed by an administrator.';
}
field("Users - Without Subscriptions"; UsersWithoutSubscriptions)
{
ApplicationArea = Basic, Suite;
Caption = 'Users - Without Subscription Plans';
DrillDownPageID = "User Security Status List";
Editable = false;
ToolTip = 'Specifies users without subscription to use Business Central.';
Visible = SoftwareAsAService;
}
field(NumberOfPlans; NumberOfPlans)
{
ApplicationArea = Basic, Suite;
Caption = 'Number of plans';
ToolTip = 'Specifies the number of plans.';
Visible = SoftwareAsAService;
trigger OnDrillDown()
begin
if not SoftwareAsAService then
exit;
PAGE.Run(PAGE::Plans)
end;
}
}
cuegroup("Data Privacy")
{
Caption = 'Data Privacy';
field(UnclassifiedFields; UnclassifiedFields)
{
ApplicationArea = All;
Caption = 'Fields Missing Data Sensitivity';
ToolTip = 'Specifies the number fields with Data Sensitivity set to unclassified.';
trigger OnDrillDown()
var
DataSensitivity: Record "Data Sensitivity";
begin
DataSensitivity.SetRange("Company Name", CompanyName);
DataSensitivity.SetRange("Data Sensitivity", DataSensitivity."Data Sensitivity"::Unclassified);
PAGE.Run(PAGE::"Data Classification Worksheet", DataSensitivity);
end;
}
}
cuegroup("Data Integration")
{
Caption = 'Data Integration';
Visible = ShowDataIntegrationCues;
field("CDS Integration Errors"; Rec."CDS Integration Errors")
{
ApplicationArea = Basic, Suite;
Caption = 'Integration Errors';
DrillDownPageID = "Integration Synch. Error List";
ToolTip = 'Specifies the number of errors related to data integration.';
Visible = ShowDataIntegrationCues;
StyleExpr = IntegrationErrorsCue;
}
field("Coupled Data Synch Errors"; Rec."Coupled Data Synch Errors")
{
ApplicationArea = Basic, Suite;
Caption = 'Coupled Data Synchronization Errors';
DrillDownPageID = "CRM Skipped Records";
ToolTip = 'Specifies the number of errors that occurred in the latest synchronization of coupled data between Business Central and Dynamics 365 Sales.';
Visible = ShowD365SIntegrationCues;
StyleExpr = CoupledErrorsCue;
}
}
cuegroup("Monitored Fields Changes")
{
Caption = 'Monitor Fields Changes';
field(MonitorEntriesNotifications; MonitorEntriesNotifications)
{
ApplicationArea = Basic, Suite;
Caption = 'Entries Notifications';
ToolTip = 'Specifies new monitored changes to selected fields';
trigger OnDrillDown()
begin
Page.Run(Page::"Monitored Field Log Entries");
end;
}
}
#if not CLEAN28
usercontrol(SATAsyncLoader; SatisfactionSurveyAsync)
{
ApplicationArea = Basic, Suite;
Visible = false;
ObsoleteReason = 'The Satisfaction Survey feature will be removed in a future release.';
ObsoleteState = Pending;
ObsoleteTag = '28.0';
}
#endif
}
}
actions
{
}
trigger OnOpenPage()
var
UserSecurityStatus: Record "User Security Status";
DataSensitivity: Record "Data Sensitivity";
IntegrationSynchJobErrors: Record "Integration Synch. Job Errors";
CRMIntegrationRecord: Record "CRM Integration Record";
EnvironmentInfo: Codeunit "Environment Information";
RoleCenterNotificationMgt: Codeunit "Role Center Notification Mgt.";
ConfPersonalizationMgt: Codeunit "Conf./Personalization Mgt.";
CDSIntegrationMgt: Codeunit "CDS Integration Mgt.";
MonitorSensitiveField: codeunit "Monitor Sensitive Field";
CRMIntegrationManagement: Codeunit "CRM Integration Management";
begin
SoftwareAsAService := EnvironmentInfo.IsSaaS();
if SoftwareAsAService then
NumberOfPlans := GetNumberOfPlans();
UserSecurityStatus.LoadUsers();
Rec.Reset();
if not Rec.Get() then begin
Rec.Init();
Rec.Insert();
end;
DataSensitivity.SetRange("Company Name", CompanyName);
DataSensitivity.SetRange("Data Sensitivity", DataSensitivity."Data Sensitivity"::Unclassified);
UnclassifiedFields := DataSensitivity.Count();
RoleCenterNotificationMgt.ShowNotifications();
ConfPersonalizationMgt.RaiseOnOpenRoleCenterEvent();
IntegrationSynchJobErrors.SetDataIntegrationUIElementsVisible(ShowDataIntegrationCues);
ShowD365SIntegrationCues := CRMIntegrationManagement.IsIntegrationEnabled() or CDSIntegrationMgt.IsIntegrationEnabled();
if IntegrationSynchJobErrors.IsEmpty() then
IntegrationErrorsCue := 'Favorable'
else
IntegrationErrorsCue := 'Unfavorable';
CRMIntegrationRecord.SetRange(Skipped, true);
if CRMIntegrationRecord.IsEmpty() then
CoupledErrorsCue := 'Favorable'
else
CoupledErrorsCue := 'Unfavorable';
if PageNotifier.IsAvailable() then begin
PageNotifier := PageNotifier.Create();
PageNotifier.NotifyPageReady();
end;
MonitorEntriesNotifications := MonitorSensitiveField.GetNotificationCount();
MonitorSensitiveField.ShowPromoteMonitorSensitiveFieldNotification();
end;
trigger OnAfterGetRecord()
var
UserSecurityStatus: Record "User Security Status";
AzureADPlan: Codeunit "Azure AD Plan";
begin
UsersWithoutSubscriptions := 0;
if UserSecurityStatus.FindSet() then
repeat
if UserSecurityStatus."User Security ID" <> '00000000-0000-0000-0000-000000000000' then
if not AzureADPlan.DoesUserHavePlans(UserSecurityStatus."User Security ID") then
UsersWithoutSubscriptions := UsersWithoutSubscriptions + 1;
until UserSecurityStatus.Next() = 0;
end;
var
[RunOnClient]
[WithEvents]
PageNotifier: DotNet PageNotifier;
SoftwareAsAService: Boolean;
NumberOfPlans: Integer;
UnclassifiedFields: Integer;
ShowD365SIntegrationCues: Boolean;
ShowDataIntegrationCues: Boolean;
UsersWithoutSubscriptions: Integer;
MonitorEntriesNotifications: Integer;
IntegrationErrorsCue: Text;
CoupledErrorsCue: Text;
local procedure GetNumberOfPlans(): Integer
var
AzureADPlan: Codeunit "Azure AD Plan";
begin
if not SoftwareAsAService then
exit(0);
exit(AzureADPlan.GetAvailablePlansCount());
end;
}