From f1f37959b8300670232a5f6791962b4c5ce616db Mon Sep 17 00:00:00 2001 From: Darrick Date: Tue, 12 Nov 2024 09:48:52 +0100 Subject: [PATCH 01/14] [releases/25.x] [Email/RetPol] Harden retention policy for Email Inbox setup. (#2325) This pull request backports #2324 to releases/25.x Fixes [AB#557160](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/557160) --- .../App/Email/src/EmailInstaller.Codeunit.al | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/src/System Application/App/Email/src/EmailInstaller.Codeunit.al b/src/System Application/App/Email/src/EmailInstaller.Codeunit.al index 42949a2979..692a12320f 100644 --- a/src/System Application/App/Email/src/EmailInstaller.Codeunit.al +++ b/src/System Application/App/Email/src/EmailInstaller.Codeunit.al @@ -31,7 +31,6 @@ codeunit 1596 "Email Installer" procedure AddRetentionPolicyAllowedTables() begin AddRetentionPolicyAllowedTables(false); - AddRetentionPolicyEmailInboxAllowedTable(false); CreateRetentionPolicySetup(false); end; @@ -53,26 +52,11 @@ codeunit 1596 "Email Installer" UpgradeTag.SetUpgradeTag(GetEmailTablesAddedToAllowedListUpgradeTag()); end; - procedure AddRetentionPolicyEmailInboxAllowedTable(ForceUpdate: Boolean) - var - Field: Record Field; - RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables"; - UpgradeTag: Codeunit "Upgrade Tag"; - IsInitialSetup: Boolean; - begin - IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetEmailInboxAddedToAllowedListUpgradeTag()); - if not (IsInitialSetup or ForceUpdate) then - exit; - - RetenPolAllowedTables.AddAllowedTable(Database::"Email Inbox", Field.FieldNo(SystemCreatedAt), 2); - - if IsInitialSetup then - UpgradeTag.SetUpgradeTag(GetEmailInboxAddedToAllowedListUpgradeTag()); - end; - procedure CreateRetentionPolicySetup(ForceUpdate: Boolean) var + Field: Record Field; RetentionPolicySetup: Record "Retention Policy Setup"; + RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables"; RetentionPolicySetupCU: Codeunit "Retention Policy Setup"; UpgradeTag: Codeunit "Upgrade Tag"; DateFormula: DateFormula; @@ -82,6 +66,9 @@ codeunit 1596 "Email Installer" if not (IsInitialSetup or ForceUpdate) then exit; + if not RetenPolAllowedTables.AddAllowedTable(Database::"Email Inbox", Field.FieldNo(SystemCreatedAt), 2) then + exit; + RetentionPolicySetup.SetRange("Table Id", Database::"Email Inbox"); if not RetentionPolicySetup.IsEmpty() then exit; @@ -103,11 +90,6 @@ codeunit 1596 "Email Installer" exit('MS-373161-EmailLogEntryAdded-20201005'); end; - local procedure GetEmailInboxAddedToAllowedListUpgradeTag(): Code[250] - begin - exit('MS-539754-EmailInboxAdded-20240827'); - end; - local procedure GetEmailInboxPolicyAddedToAllowedListUpgradeTag(): Code[250] begin exit('MS-539754-EmailInboxPolicyAdded-20240827'); @@ -117,7 +99,6 @@ codeunit 1596 "Email Installer" local procedure AddAllowedTablesOnRefreshAllowedTables() begin AddRetentionPolicyAllowedTables(true); - AddRetentionPolicyEmailInboxAllowedTable(true); CreateRetentionPolicySetup(true); end; From 60271f1937f6529c9afa2e06ebf3bad8f7afb7d3 Mon Sep 17 00:00:00 2001 From: bcbuild-github-agent <137281497+bcbuild-github-agent@users.noreply.github.com> Date: Wed, 13 Nov 2024 00:44:28 -0800 Subject: [PATCH 02/14] [25.x] Update translation package version. New value: 25.2.20241111.2 (#2329) This PR contains the following changes: - Update translation package version. New value: 25.2.20241111.2 [AB#539394](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/539394) Co-authored-by: aholstrup1 --- build/Packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Packages.json b/build/Packages.json index 706c262d57..2f44741159 100644 --- a/build/Packages.json +++ b/build/Packages.json @@ -1,6 +1,6 @@ { "Microsoft.Dynamics.BusinessCentral.Translations": { - "Version": "25.1.20241024.3", + "Version": "25.2.20241111.2", "Source": "NuGet.org" }, "AppBaselines-BCArtifacts": { From 1e9b3b514b2a9ccbe6fe872f3985ab0ebe5a3d25 Mon Sep 17 00:00:00 2001 From: bcbuild-github-agent <137281497+bcbuild-github-agent@users.noreply.github.com> Date: Thu, 14 Nov 2024 01:35:55 -0800 Subject: [PATCH 03/14] [releases/25.x] Update AL-Go System Files from microsoft/AL-Go-PTE@preview - 50903624159826257124c0f799a1b4add9b0260b (#2359) ## v6.1 ### Issues - Issue 1241 Increment Version Number might produce wrong app.json - When auto discovering appFolders, testFolders and bcptTestFolders - if a BCPT Test app has a dependency to a test framework app, it is added to testFolders as well as bcptTestFolders and will cause a failure. ### New Project Settings - `pageScriptingTests` should be an array of page scripting test file specifications, relative to the AL-Go project. Examples of file specifications: `recordings/my*.yml` (for all yaml files in the recordings subfolder matching my\*.yml), `recordings` (for all \*.yml files in the recordings subfolder) or `recordings/test.yml` (for a single yml file) - `doNotRunPageScriptingTests` can force the pipeline to NOT run the page scripting tests specified in pageScriptingTests. Note this setting can be set in a [workflow specific settings file](#where-are-the-settings-located) to only apply to that workflow - `restoreDatabases` should be an array of events, indicating when you want to start with clean databases in the container. Possible events are: `BeforeBcpTests`, `BeforePageScriptingTests`, `BeforeEachTestApp`, `BeforeEachBcptTestApp`, `BeforeEachPageScriptingTest` ### New Repository Settings - `trustedSigning` is a structure defining `Account`, `EndPoint` and `CertificateProfile` if you want to use trusted signing. Note that your Azure_Credentials secret (Microsoft Entra ID App or Managed identity) still needs to provide access to your azure subscription and be assigned the `Trusted Signing Certificate Profile Signer` role in the Trusted Signing Account. - `deployTo` now has an additional property called DependencyInstallMode, which determines how dependencies are deployed if GenerateDependencyArtifact is true. Default value is `install` to install dependencies if not already installed. Other values are `ignore` for ignoring dependencies, `upgrade` for upgrading dependencies if possible and `forceUpgrade` for force upgrading dependencies. ### Support for Azure Trusted Signing Read https://learn.microsoft.com/en-us/azure/trusted-signing/ for more information about Trusted Signing and how to set it up. After setting up your trusted signing account and certificate profile, you need to create a setting called [trustedSigning](https://aka.ms/algosettings#trustedSigning) for AL-Go to sign your apps using Azure Trusted Signing. ### Support for Page Scripting Tests Page Scripting tests are now supported as part of CI/CD. By specifying pageScriptingTests in your project settings file, AL-Go for GitHub will automatically run these page scripting tests as part of your CI/CD workflow, generating the following build artifacts: - `PageScriptingTestResults` is a JUnit test results file with all results combined. - `PageScriptingTestResultDetails` are the detailed test results (including videos) when any of the page scripting tests have failures. If the page scripting tests succeed - the details are not published. ### Experimental support for Git submodule [Git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) is now supported as part of CI/CD on your project. [AB#539394](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/539394) Co-authored-by: bcbuild-github-agent --- .github/AL-Go-Settings.json | 2 +- .github/RELEASENOTES.copy.md | 11 +++-- .github/workflows/CICD.yaml | 41 ++++++++++--------- .../DeployReferenceDocumentation.yaml | 10 ++--- .github/workflows/IncrementVersionNumber.yaml | 12 +++--- .github/workflows/PullRequestHandler.yaml | 14 +++---- .github/workflows/Troubleshooting.yaml | 2 +- .../workflows/UpdateGitHubGoSystemFiles.yaml | 12 +++--- .github/workflows/_BuildALGoProject.yaml | 19 +++++---- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../System Application/.AL-Go/cloudDevEnv.ps1 | 6 +-- .../System Application/.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- 23 files changed, 106 insertions(+), 101 deletions(-) diff --git a/.github/AL-Go-Settings.json b/.github/AL-Go-Settings.json index adb61d02d5..9d995ea2d7 100644 --- a/.github/AL-Go-Settings.json +++ b/.github/AL-Go-Settings.json @@ -72,5 +72,5 @@ ] }, "UpdateALGoSystemFilesEnvironment": "Official-Build", - "templateSha": "c62bf167f8c516d997bed1ed600a9d03d5093ad5" + "templateSha": "50903624159826257124c0f799a1b4add9b0260b" } diff --git a/.github/RELEASENOTES.copy.md b/.github/RELEASENOTES.copy.md index df702406be..a7d36bd611 100644 --- a/.github/RELEASENOTES.copy.md +++ b/.github/RELEASENOTES.copy.md @@ -1,11 +1,9 @@ -## preview - -Note that when using the preview version of AL-Go for GitHub, we recommend you Update your AL-Go system files, as soon as possible when informed that an update is available. +## v6.1 ### Issues - Issue 1241 Increment Version Number might produce wrong app.json -- `deployTo` now has an additional property called DependencyInstallMode, which determines how dependencies are deployed if GenerateDependencyArtifact is true. Default value is `install` to install dependencies if not already installed. Other values are `ignore` for ignoring dependencies, `upgrade` for upgrading dependencies if possible and `forceUpgrade` for force upgrading dependencies. +- When auto discovering appFolders, testFolders and bcptTestFolders - if a BCPT Test app has a dependency to a test framework app, it is added to testFolders as well as bcptTestFolders and will cause a failure. ### New Project Settings @@ -16,6 +14,7 @@ Note that when using the preview version of AL-Go for GitHub, we recommend you U ### New Repository Settings - `trustedSigning` is a structure defining `Account`, `EndPoint` and `CertificateProfile` if you want to use trusted signing. Note that your Azure_Credentials secret (Microsoft Entra ID App or Managed identity) still needs to provide access to your azure subscription and be assigned the `Trusted Signing Certificate Profile Signer` role in the Trusted Signing Account. +- `deployTo` now has an additional property called DependencyInstallMode, which determines how dependencies are deployed if GenerateDependencyArtifact is true. Default value is `install` to install dependencies if not already installed. Other values are `ignore` for ignoring dependencies, `upgrade` for upgrading dependencies if possible and `forceUpgrade` for force upgrading dependencies. ### Support for Azure Trusted Signing @@ -28,6 +27,10 @@ Page Scripting tests are now supported as part of CI/CD. By specifying pageScrip - `PageScriptingTestResults` is a JUnit test results file with all results combined. - `PageScriptingTestResultDetails` are the detailed test results (including videos) when any of the page scripting tests have failures. If the page scripting tests succeed - the details are not published. +### Experimental support for Git submodule + +[Git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) is now supported as part of CI/CD on your project. + ## v6.0 ### Issues diff --git a/.github/workflows/CICD.yaml b/.github/workflows/CICD.yaml index 6c41674b21..f1702fdf5c 100644 --- a/.github/workflows/CICD.yaml +++ b/.github/workflows/CICD.yaml @@ -45,7 +45,7 @@ jobs: workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} steps: - name: Dump Workflow Information - uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 with: shell: powershell @@ -53,16 +53,17 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: lfs: true + submodules: recursive - name: Initialize the workflow id: init - uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 with: shell: powershell - name: Read settings id: ReadSettings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell get: type, powerPlatformSolutionFolder @@ -74,7 +75,7 @@ jobs: - name: Determine Projects To Build id: determineProjectsToBuild - uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineProjectsToBuild@v6.1 with: shell: powershell maxBuildDepth: ${{ env.workflowDepth }} @@ -87,7 +88,7 @@ jobs: - name: Determine Delivery Target Secrets id: DetermineDeliveryTargetSecrets - uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineDeliveryTargets@v6.1 with: shell: powershell projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' @@ -95,7 +96,7 @@ jobs: - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} @@ -103,7 +104,7 @@ jobs: - name: Determine Delivery Targets id: DetermineDeliveryTargets - uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineDeliveryTargets@v6.1 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -113,7 +114,7 @@ jobs: - name: Determine Deployment Environments id: DetermineDeploymentEnvironments - uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineDeploymentEnvironments@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: @@ -129,13 +130,13 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell get: templateUrl - name: Check for updates to AL-Go system files - uses: microsoft/AL-Go/Actions/CheckForUpdates@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/CheckForUpdates@v6.1 with: shell: powershell templateUrl: ${{ env.templateUrl }} @@ -210,7 +211,7 @@ jobs: path: '.artifacts' - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell @@ -219,7 +220,7 @@ jobs: uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Build Reference Documentation - uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/BuildReferenceDocumentation@v6.1 with: shell: powershell artifacts: '.artifacts' @@ -256,7 +257,7 @@ jobs: path: '.artifacts' - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: ${{ matrix.shell }} get: type,powerPlatformSolutionFolder @@ -270,7 +271,7 @@ jobs: - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 with: shell: ${{ matrix.shell }} gitHubSecrets: ${{ toJson(secrets) }} @@ -278,7 +279,7 @@ jobs: - name: Deploy to Business Central id: Deploy - uses: microsoft/AL-Go/Actions/Deploy@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/Deploy@v6.1 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -290,7 +291,7 @@ jobs: - name: Deploy to Power Platform if: env.type == 'PTE' && env.powerPlatformSolutionFolder != '' - uses: microsoft/AL-Go/Actions/DeployPowerPlatform@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DeployPowerPlatform@v6.1 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -318,20 +319,20 @@ jobs: path: '.artifacts' - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} getSecrets: '${{ matrix.deliveryTarget }}Context' - name: Deliver - uses: microsoft/AL-Go/Actions/Deliver@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/Deliver@v6.1 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -351,7 +352,7 @@ jobs: - name: Finalize the workflow id: PostProcess - uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/DeployReferenceDocumentation.yaml b/.github/workflows/DeployReferenceDocumentation.yaml index 81934dae0a..f194e65760 100644 --- a/.github/workflows/DeployReferenceDocumentation.yaml +++ b/.github/workflows/DeployReferenceDocumentation.yaml @@ -30,18 +30,18 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 with: shell: powershell - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell - name: Determine Deployment Environments id: DetermineDeploymentEnvironments - uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineDeploymentEnvironments@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: @@ -54,7 +54,7 @@ jobs: uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Build Reference Documentation - uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/BuildReferenceDocumentation@v6.1 with: shell: powershell artifacts: 'latest' @@ -71,7 +71,7 @@ jobs: - name: Finalize the workflow if: always() - uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/IncrementVersionNumber.yaml b/.github/workflows/IncrementVersionNumber.yaml index 20eb20d265..479fce3d05 100644 --- a/.github/workflows/IncrementVersionNumber.yaml +++ b/.github/workflows/IncrementVersionNumber.yaml @@ -41,7 +41,7 @@ jobs: runs-on: [ windows-latest ] steps: - name: Dump Workflow Information - uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 with: shell: powershell @@ -50,18 +50,18 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 with: shell: powershell - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} @@ -69,7 +69,7 @@ jobs: useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' - name: Increment Version Number - uses: microsoft/AL-Go/Actions/IncrementVersionNumber@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/IncrementVersionNumber@v6.1 with: shell: powershell token: ${{ steps.ReadSecrets.outputs.TokenForPush }} @@ -79,7 +79,7 @@ jobs: - name: Finalize the workflow if: always() - uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/PullRequestHandler.yaml b/.github/workflows/PullRequestHandler.yaml index b18559b873..695ae0b143 100644 --- a/.github/workflows/PullRequestHandler.yaml +++ b/.github/workflows/PullRequestHandler.yaml @@ -28,7 +28,7 @@ jobs: if: (github.event.pull_request.base.repo.full_name != github.event.pull_request.head.repo.full_name) && (github.event_name != 'pull_request') runs-on: windows-latest steps: - - uses: microsoft/AL-Go/Actions/VerifyPRChanges@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + - uses: microsoft/AL-Go-Actions/VerifyPRChanges@v6.1 Initialization: needs: [ PregateCheck ] @@ -43,7 +43,7 @@ jobs: telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} steps: - name: Dump Workflow Information - uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 with: shell: powershell @@ -55,13 +55,13 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 with: shell: powershell - name: Read settings id: ReadSettings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell @@ -72,7 +72,7 @@ jobs: - name: Determine Projects To Build id: determineProjectsToBuild - uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineProjectsToBuild@v6.1 with: shell: powershell maxBuildDepth: ${{ env.workflowDepth }} @@ -131,7 +131,7 @@ jobs: steps: - name: Pull Request Status Check id: PullRequestStatusCheck - uses: microsoft/AL-Go/Actions/PullRequestStatusCheck@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/PullRequestStatusCheck@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: @@ -139,7 +139,7 @@ jobs: - name: Finalize the workflow id: PostProcess - uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 if: success() || failure() env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/Troubleshooting.yaml b/.github/workflows/Troubleshooting.yaml index bf186aeb72..0337b67d1d 100644 --- a/.github/workflows/Troubleshooting.yaml +++ b/.github/workflows/Troubleshooting.yaml @@ -30,7 +30,7 @@ jobs: lfs: true - name: Troubleshooting - uses: microsoft/AL-Go/Actions/Troubleshooting@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/Troubleshooting@v6.1 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} diff --git a/.github/workflows/UpdateGitHubGoSystemFiles.yaml b/.github/workflows/UpdateGitHubGoSystemFiles.yaml index ec4ea80290..6d57e5e6fa 100644 --- a/.github/workflows/UpdateGitHubGoSystemFiles.yaml +++ b/.github/workflows/UpdateGitHubGoSystemFiles.yaml @@ -37,7 +37,7 @@ jobs: runs-on: [ windows-latest ] steps: - name: Dump Workflow Information - uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 with: shell: powershell @@ -46,19 +46,19 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 with: shell: powershell - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: powershell get: templateUrl - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} @@ -94,7 +94,7 @@ jobs: Add-Content -Encoding UTF8 -Path $env:GITHUB_ENV -Value "downloadLatest=$downloadLatest" - name: Update AL-Go system files - uses: microsoft/AL-Go/Actions/CheckForUpdates@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/CheckForUpdates@v6.1 with: shell: powershell token: ${{ fromJson(steps.ReadSecrets.outputs.Secrets).ghTokenWorkflow }} @@ -105,7 +105,7 @@ jobs: - name: Finalize the workflow if: always() - uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/_BuildALGoProject.yaml b/.github/workflows/_BuildALGoProject.yaml index a9b47acb32..8aec2e83f1 100644 --- a/.github/workflows/_BuildALGoProject.yaml +++ b/.github/workflows/_BuildALGoProject.yaml @@ -91,9 +91,10 @@ jobs: with: ref: ${{ inputs.checkoutRef }} lfs: true + submodules: recursive - name: Read settings - uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 with: shell: ${{ inputs.shell }} project: ${{ inputs.project }} @@ -102,14 +103,14 @@ jobs: - name: Read secrets id: ReadSecrets if: github.event_name != 'pull_request' - uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 with: shell: ${{ inputs.shell }} gitHubSecrets: ${{ toJson(secrets) }} getSecrets: '${{ inputs.secrets }},appDependencySecrets,AZURE_CREDENTIALS' - name: Determine ArtifactUrl - uses: microsoft/AL-Go/Actions/DetermineArtifactUrl@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DetermineArtifactUrl@v6.1 id: determineArtifactUrl with: shell: ${{ inputs.shell }} @@ -124,7 +125,7 @@ jobs: - name: Download Project Dependencies id: DownloadProjectDependencies - uses: microsoft/AL-Go/Actions/DownloadProjectDependencies@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/DownloadProjectDependencies@v6.1 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -135,7 +136,7 @@ jobs: baselineWorkflowRunId: ${{ inputs.baselineWorkflowRunId }} - name: Build - uses: microsoft/AL-Go/Actions/RunPipeline@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/RunPipeline@v6.1 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' BuildMode: ${{ inputs.buildMode }} @@ -150,7 +151,7 @@ jobs: - name: Sign if: inputs.signArtifacts && env.doNotSignApps == 'False' && (env.keyVaultCodesignCertificateName != '' || (fromJson(env.trustedSigning).Endpoint != '' && fromJson(env.trustedSigning).Account != '' && fromJson(env.trustedSigning).CertificateProfile != '')) id: sign - uses: microsoft/AL-Go/Actions/Sign@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/Sign@v6.1 with: shell: ${{ inputs.shell }} azureCredentialsJson: '${{ fromJson(steps.ReadSecrets.outputs.Secrets).AZURE_CREDENTIALS }}' @@ -158,7 +159,7 @@ jobs: - name: Calculate Artifact names id: calculateArtifactsNames - uses: microsoft/AL-Go/Actions/CalculateArtifactNames@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/CalculateArtifactNames@v6.1 if: success() || failure() with: shell: ${{ inputs.shell }} @@ -268,14 +269,14 @@ jobs: - name: Analyze Test Results id: analyzeTestResults if: (success() || failure()) && env.doNotRunTests == 'False' - uses: microsoft/AL-Go/Actions/AnalyzeTests@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/AnalyzeTests@v6.1 with: shell: ${{ inputs.shell }} project: ${{ inputs.project }} - name: Cleanup if: always() - uses: microsoft/AL-Go/Actions/PipelineCleanup@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 + uses: microsoft/AL-Go-Actions/PipelineCleanup@v6.1 with: shell: ${{ inputs.shell }} project: ${{ inputs.project }} diff --git a/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 b/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 b/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 +++ b/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 b/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 b/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 +++ b/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 b/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 b/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 b/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application/.AL-Go/localDevEnv.ps1 b/build/projects/System Application/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/System Application/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 b/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 index 8d3fe87491..1afe6090dd 100644 --- a/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 b/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 index 64a9b3bbd0..358732d795 100644 --- a/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 +++ b/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local From 1fd1ac56983eadee433aab60ed0da147b836333f Mon Sep 17 00:00:00 2001 From: ehenriksen9 <125461642+ehenriksen9@users.noreply.github.com> Date: Fri, 15 Nov 2024 10:31:04 +0100 Subject: [PATCH 04/14] [25.x] Use AppId function to delete orphaned extension data AB#557275 (#2343) Problem: Before apps not installed since 14.x might be missing a package ID. So we are unable to delete them by packageID Fix: Delete by AppId Fixes: [AB#534788](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/534788) #### Summary #### Work Item(s) Fixes # Backport of https://github.com/microsoft/BCApps/pull/1976 --- .../src/ExtensionInstallationImpl.Codeunit.al | 20 +++++++++++++++---- .../src/ExtnOrphanedAppDetails.Page.al | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/System Application/App/Extension Management/src/ExtensionInstallationImpl.Codeunit.al b/src/System Application/App/Extension Management/src/ExtensionInstallationImpl.Codeunit.al index c8e9fa8a7f..3c7f340cc5 100644 --- a/src/System Application/App/Extension Management/src/ExtensionInstallationImpl.Codeunit.al +++ b/src/System Application/App/Extension Management/src/ExtensionInstallationImpl.Codeunit.al @@ -53,7 +53,8 @@ codeunit 2500 "Extension Installation Impl" exit(not NAVAppInstalledApp.IsEmpty()); end; - procedure IsInstalledByAppId(AppID: Guid): Boolean + + procedure IsInstalledByAppId(AppId: Guid): Boolean var [SecurityFiltering(SecurityFilter::Ignored)] NAVAppInstalledApp: Record "NAV App Installed App"; @@ -209,7 +210,7 @@ codeunit 2500 "Extension Installation Impl" exit(UninstallExtensionSilently(PackageID, ClearSchema, ClearSchema)); end; - procedure DeleteOrphanData(PackageID: Guid; ExtensionName: Text): Boolean + procedure DeleteOrphanData(AppId: Guid; ExtensionName: Text): Boolean var ConfirmManagement: Codeunit "Confirm Management"; begin @@ -217,7 +218,7 @@ codeunit 2500 "Extension Installation Impl" if not ConfirmManagement.GetResponse(StrSubstNo(ClearExtensionSchemaOrphanMsg, ExtensionName), false) then exit(false); - exit(UninstallExtensionSilently(PackageID, false, true)); + exit(UninstallExtensionSilentlyByAppId(AppId, false, true)); end; procedure RunOrphanDeletion(OrphanedApplication: Record "Extension Database Snapshot"): Boolean @@ -228,7 +229,6 @@ codeunit 2500 "Extension Installation Impl" exit(OrphanedExtensionDetails.RunModal() = Action::OK); end; - local procedure UninstallExtensionSilently(PackageID: Guid; ClearData: Boolean; ClearSchema: Boolean): Boolean begin CheckPermissions(); @@ -241,6 +241,18 @@ codeunit 2500 "Extension Installation Impl" exit(true); end; + local procedure UninstallExtensionSilentlyByAppId(AppId: Guid; ClearData: Boolean; ClearSchema: Boolean): Boolean + begin + CheckPermissions(); + AssertIsInitialized(); + DotNetNavAppALInstaller.ALUninstallNavAppByAppId(AppId, ClearData, ClearSchema); + + if IsInstalledByAppId(AppId) then + exit(false); + + exit(true); + end; + procedure UninstallExtensionWithConfirmDialog(PackageId: Guid; ClearData: Boolean; ClearSchema: Boolean): Boolean var PublishedApplication: Record "Published Application"; diff --git a/src/System Application/App/Extension Management/src/ExtnOrphanedAppDetails.Page.al b/src/System Application/App/Extension Management/src/ExtnOrphanedAppDetails.Page.al index 304cb5e4e5..2550164e6c 100644 --- a/src/System Application/App/Extension Management/src/ExtnOrphanedAppDetails.Page.al +++ b/src/System Application/App/Extension Management/src/ExtnOrphanedAppDetails.Page.al @@ -73,7 +73,7 @@ page 2513 "Extn. Orphaned App Details" trigger OnAction() begin - ExtensionInstallationImpl.DeleteOrphanData(Rec."Package Id", Rec."Name"); + ExtensionInstallationImpl.DeleteOrphanData(Rec."App Id", Rec."Name"); CurrPage.Close(); end; } From 08300d657e4a4b3887c1d041797fe062adf607c5 Mon Sep 17 00:00:00 2001 From: bcbuild-github-agent <137281497+bcbuild-github-agent@users.noreply.github.com> Date: Tue, 19 Nov 2024 01:07:35 -0800 Subject: [PATCH 05/14] [25.x] Update translation package version. New value: 25.2.20241115.1 (#2371) This PR contains the following changes: - Update translation package version. New value: 25.2.20241115.1 [AB#539394](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/539394) Co-authored-by: aholstrup1 --- build/Packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Packages.json b/build/Packages.json index 2f44741159..c72c888234 100644 --- a/build/Packages.json +++ b/build/Packages.json @@ -1,6 +1,6 @@ { "Microsoft.Dynamics.BusinessCentral.Translations": { - "Version": "25.2.20241111.2", + "Version": "25.2.20241115.1", "Source": "NuGet.org" }, "AppBaselines-BCArtifacts": { From 33158a1074741237b2432026138c6639fce21c6f Mon Sep 17 00:00:00 2001 From: Matti Andreas Nielsen Date: Wed, 20 Nov 2024 11:41:17 +0100 Subject: [PATCH 06/14] [25.x] Private/mattinielsen/change invalid filter text 25 x (#2386) #### Summary Change the text of the invalid filter error #### Work Item(s) Fixes [AB#557943](https://dynamicssmb2.visualstudio.com/Dynamics%20SMB/_workitems/edit/557943/) --- .../App/Edit in Excel/src/EditinExcelImpl.Codeunit.al | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System Application/App/Edit in Excel/src/EditinExcelImpl.Codeunit.al b/src/System Application/App/Edit in Excel/src/EditinExcelImpl.Codeunit.al index 44c70f1b81..c802b58e66 100644 --- a/src/System Application/App/Edit in Excel/src/EditinExcelImpl.Codeunit.al +++ b/src/System Application/App/Edit in Excel/src/EditinExcelImpl.Codeunit.al @@ -43,7 +43,7 @@ codeunit 1482 "Edit in Excel Impl." CreateEndpointForObjectTxt: Label 'Creating endpoint for %1 %2.', Locked = true; EditInExcelHandledTxt: Label 'Edit in excel has been handled.', Locked = true; EditInExcelOnlySupportPageWebServicesTxt: Label 'Edit in Excel only support web services created from pages.', Locked = true; - EditInExcelInvalidFilterErr: Label 'We had to remove the filters applied to the following fields because they are not available in the Office Add-In. As a result, the number of rows you see in Excel may differ from what you see in Dynamics 365 Business Central.\ \ Removed filters: %1', Comment = '%1 = The field filters we had to remove because they are not exposed through OData'; + EditInExcelInvalidFilterErr: Label 'Certain filters applied on the page are not available in Office, so more rows will be shown compared to Business Central.\ \ Removed filters: %1', Comment = '%1 = The field filters we had to remove because they are not exposed through OData'; DialogTitleTxt: Label 'Export'; ExcelFileNameTxt: Text; XmlByteEncodingTok: Label '_x00%1_%2', Locked = true; From e2f97899ffdf00d04a4a0cd94e49bde308672010 Mon Sep 17 00:00:00 2001 From: Maria Zhelezova <43066499+mazhelez@users.noreply.github.com> Date: Mon, 25 Nov 2024 08:32:27 +0100 Subject: [PATCH 07/14] [25x] Bump platform property to 25.2 in app.json-s (#2389) Bump platform property to 25.2 in app.json-s [AB#557754](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/557754) --- src/Business Foundation/App/AuditCodes/app.json | 2 +- src/Business Foundation/App/NoSeries/app.json | 2 +- src/Business Foundation/App/NoSeriesCopilot/app.json | 2 +- src/Business Foundation/App/app.json | 2 +- src/Business Foundation/Test Library/NoSeries/app.json | 2 +- src/Business Foundation/Test Library/NoSeriesCopilot/app.json | 2 +- src/Business Foundation/Test Library/app.json | 2 +- src/Business Foundation/Test/NoSeries/app.json | 2 +- src/Business Foundation/Test/NoSeriesCopilot/app.json | 2 +- src/Business Foundation/Test/app.json | 2 +- src/System Application/App/AI/app.json | 2 +- src/System Application/App/Advanced Settings/app.json | 2 +- src/System Application/App/AppSource Gallery/app.json | 2 +- src/System Application/App/Auto Format/app.json | 2 +- src/System Application/App/Azure AD Graph/app.json | 2 +- src/System Application/App/Azure AD Licensing/app.json | 2 +- src/System Application/App/Azure AD Plan/app.json | 2 +- src/System Application/App/Azure AD Tenant/app.json | 2 +- src/System Application/App/Azure AD User Management/app.json | 2 +- src/System Application/App/Azure AD User/app.json | 2 +- src/System Application/App/Azure Blob Services API/app.json | 2 +- src/System Application/App/Azure File Services API/app.json | 2 +- src/System Application/App/Azure Function/app.json | 2 +- src/System Application/App/Azure Key Vault/app.json | 2 +- .../App/Azure Storage Services Authorization/app.json | 2 +- src/System Application/App/BLOB Storage/app.json | 2 +- src/System Application/App/Barcode/app.json | 2 +- src/System Application/App/Base64 Convert/app.json | 2 +- src/System Application/App/Business Chart/app.json | 2 +- .../App/Camera and Media Interaction/app.json | 2 +- src/System Application/App/Caption Class/app.json | 2 +- src/System Application/App/Client Type Management/app.json | 2 +- src/System Application/App/Confirm Management/app.json | 2 +- src/System Application/App/ControlAddIns/app.json | 2 +- src/System Application/App/Cryptography Management/app.json | 2 +- src/System Application/App/Cues and KPIs/app.json | 2 +- src/System Application/App/Customer Experience Survey/app.json | 2 +- src/System Application/App/Data Administration/app.json | 2 +- src/System Application/App/Data Archive/app.json | 2 +- src/System Application/App/Data Classification/app.json | 2 +- src/System Application/App/Data Compression/app.json | 2 +- src/System Application/App/Date and Time/app.json | 2 +- src/System Application/App/Date-Time Dialog/app.json | 2 +- src/System Application/App/Default Role Center/app.json | 2 +- src/System Application/App/Device/app.json | 2 +- src/System Application/App/Document Sharing/app.json | 2 +- src/System Application/App/DotNet Aliases/app.json | 2 +- src/System Application/App/Edit in Excel/app.json | 2 +- src/System Application/App/Email/app.json | 2 +- src/System Application/App/Encoding/app.json | 2 +- src/System Application/App/Entity Text/app.json | 2 +- src/System Application/App/Environment Cleanup/app.json | 2 +- src/System Application/App/Environment Information/app.json | 2 +- src/System Application/App/Extension Management/app.json | 2 +- src/System Application/App/Feature Key/app.json | 2 +- src/System Application/App/Field Selection/app.json | 2 +- src/System Application/App/Filter Tokens/app.json | 2 +- src/System Application/App/Geolocation/app.json | 2 +- src/System Application/App/Guided Experience/app.json | 2 +- src/System Application/App/Headlines/app.json | 2 +- src/System Application/App/Image/app.json | 2 +- src/System Application/App/Language/app.json | 2 +- src/System Application/App/Math/app.json | 2 +- src/System Application/App/MicrosoftGraph/app.json | 2 +- src/System Application/App/Navigation Bar Subscribers/app.json | 2 +- src/System Application/App/OAuth/app.json | 2 +- src/System Application/App/OAuth2/app.json | 2 +- src/System Application/App/Object Selection/app.json | 2 +- src/System Application/App/Page Action Provider/app.json | 2 +- src/System Application/App/Page Summary Provider/app.json | 2 +- src/System Application/App/Password/app.json | 2 +- src/System Application/App/Performance Profiler/app.json | 2 +- src/System Application/App/Permission Sets/app.json | 2 +- src/System Application/App/Printer Management/app.json | 2 +- src/System Application/App/Privacy Notice/app.json | 2 +- src/System Application/App/Record Link Management/app.json | 2 +- src/System Application/App/Record Reference/app.json | 2 +- src/System Application/App/Record Selection/app.json | 2 +- src/System Application/App/Recurrence Schedule/app.json | 2 +- src/System Application/App/Regex/app.json | 2 +- src/System Application/App/Rest Client/app.json | 2 +- src/System Application/App/Retention Policy/app.json | 2 +- src/System Application/App/Satisfaction Survey/app.json | 2 +- src/System Application/App/Secrets/app.json | 2 +- src/System Application/App/Security Groups/app.json | 2 +- src/System Application/App/Server Settings/app.json | 2 +- src/System Application/App/SharePoint Authorization/app.json | 2 +- src/System Application/App/SharePoint/app.json | 2 +- .../App/SmartList Designer Subscribers/app.json | 2 +- src/System Application/App/System Initialization/app.json | 2 +- src/System Application/App/System Permissions/app.json | 2 +- src/System Application/App/Table Information/app.json | 2 +- src/System Application/App/Table Keys/app.json | 2 +- src/System Application/App/Telemetry/app.json | 2 +- src/System Application/App/Tenant License State/app.json | 2 +- src/System Application/App/Time Zone Selection/app.json | 2 +- src/System Application/App/Translation/app.json | 2 +- src/System Application/App/URI/app.json | 2 +- src/System Application/App/Upgrade Tags/app.json | 2 +- src/System Application/App/User Details/app.json | 2 +- src/System Application/App/User Login Times/app.json | 2 +- src/System Application/App/User Permissions/app.json | 2 +- src/System Application/App/User Selection/app.json | 2 +- src/System Application/App/User Settings/app.json | 2 +- src/System Application/App/VS Code Integration/app.json | 2 +- src/System Application/App/Video/app.json | 2 +- src/System Application/App/Web Service Management/app.json | 2 +- src/System Application/App/Word Templates/app.json | 2 +- src/System Application/App/XML Validation/app.json | 2 +- src/System Application/App/XmlWriter/app.json | 2 +- src/System Application/App/app.json | 2 +- src/System Application/Test Library/AI/app.json | 2 +- src/System Application/Test Library/Advanced Settings/app.json | 2 +- src/System Application/Test Library/Azure AD Graph/app.json | 2 +- src/System Application/Test Library/Azure AD Licensing/app.json | 2 +- src/System Application/Test Library/Azure AD Plan/app.json | 2 +- .../Test Library/Azure AD User Management/app.json | 2 +- src/System Application/Test Library/Azure AD User/app.json | 2 +- src/System Application/Test Library/Azure Key Vault/app.json | 2 +- src/System Application/Test Library/Blob Storage/app.json | 2 +- src/System Application/Test Library/Business Chart/app.json | 2 +- .../Test Library/Camera and Media Interaction/app.json | 2 +- .../Test Library/Client Type Management/app.json | 2 +- src/System Application/Test Library/Confirm Management/app.json | 2 +- src/System Application/Test Library/Cues And KPIs/app.json | 2 +- .../Test Library/Customer Experience Survey/app.json | 2 +- .../Test Library/Data Classification/app.json | 2 +- src/System Application/Test Library/DotNet Aliases/app.json | 2 +- src/System Application/Test Library/Edit in Excel/app.json | 2 +- src/System Application/Test Library/Email/app.json | 2 +- .../Test Library/Environment Information/app.json | 2 +- src/System Application/Test Library/Feature Key/app.json | 2 +- src/System Application/Test Library/Field Selection/app.json | 2 +- src/System Application/Test Library/Geolocation/app.json | 2 +- src/System Application/Test Library/Guided Experience/app.json | 2 +- src/System Application/Test Library/Headlines/app.json | 2 +- src/System Application/Test Library/Language/app.json | 2 +- src/System Application/Test Library/MockGraphQuery/app.json | 2 +- .../Test Library/Page Action Provider/app.json | 2 +- .../Test Library/Page Summary Provider/app.json | 2 +- src/System Application/Test Library/Password/app.json | 2 +- .../Test Library/Performance Profiler/app.json | 2 +- src/System Application/Test Library/Permission Sets/app.json | 2 +- .../Test Library/Record Link Management/app.json | 2 +- src/System Application/Test Library/Record Selection/app.json | 2 +- .../Test Library/Recurrence Schedule/app.json | 2 +- src/System Application/Test Library/Retention Policy/app.json | 2 +- .../Test Library/Satisfaction Survey/app.json | 2 +- src/System Application/Test Library/Security Groups/app.json | 2 +- src/System Application/Test Library/SharePoint/app.json | 2 +- .../Test Library/System Initialization/app.json | 2 +- src/System Application/Test Library/Telemetry/app.json | 2 +- .../Test Library/Tenant License State/app.json | 2 +- .../Test Library/Time Zone Selection/app.json | 2 +- src/System Application/Test Library/Translation/app.json | 2 +- src/System Application/Test Library/Upgrade Tags/app.json | 2 +- src/System Application/Test Library/User Details/app.json | 2 +- src/System Application/Test Library/User Login Times/app.json | 2 +- src/System Application/Test Library/User Permissions/app.json | 2 +- src/System Application/Test Library/User Selection/app.json | 2 +- src/System Application/Test Library/User Settings/app.json | 2 +- src/System Application/Test Library/Video/app.json | 2 +- .../Test Library/Web Service Management/app.json | 2 +- src/System Application/Test Library/Word Templates/app.json | 2 +- src/System Application/Test Library/app.json | 2 +- src/System Application/Test/AI/app.json | 2 +- src/System Application/Test/Advanced Settings/app.json | 2 +- src/System Application/Test/AppSource Gallery/app.json | 2 +- src/System Application/Test/Auto Format/app.json | 2 +- src/System Application/Test/Azure AD Graph/app.json | 2 +- src/System Application/Test/Azure AD Licensing/app.json | 2 +- src/System Application/Test/Azure AD Plan/app.json | 2 +- src/System Application/Test/Azure AD User Management/app.json | 2 +- src/System Application/Test/Azure AD User/app.json | 2 +- src/System Application/Test/Azure Blob Services API/app.json | 2 +- src/System Application/Test/Azure File Services API/app.json | 2 +- src/System Application/Test/Azure Key Vault/app.json | 2 +- .../Test/Azure Storage Services Authorization/app.json | 2 +- src/System Application/Test/BLOB Storage/app.json | 2 +- src/System Application/Test/Barcode/app.json | 2 +- src/System Application/Test/Base64 Convert/app.json | 2 +- src/System Application/Test/Business Chart/app.json | 2 +- .../Test/Camera and Media Interaction/app.json | 2 +- src/System Application/Test/Caption Class/app.json | 2 +- src/System Application/Test/Client Type Management/app.json | 2 +- src/System Application/Test/Confirm Management/app.json | 2 +- src/System Application/Test/Cryptography Management/app.json | 2 +- src/System Application/Test/Cues and KPIs/app.json | 2 +- src/System Application/Test/Customer Experience Survey/app.json | 2 +- src/System Application/Test/Data Administration/app.json | 2 +- src/System Application/Test/Data Classification/app.json | 2 +- src/System Application/Test/Data Compression/app.json | 2 +- src/System Application/Test/Date and Time/app.json | 2 +- src/System Application/Test/Date-Time Dialog/app.json | 2 +- src/System Application/Test/Document Sharing/app.json | 2 +- src/System Application/Test/Edit in Excel/app.json | 2 +- src/System Application/Test/Email/app.json | 2 +- src/System Application/Test/Encoding/app.json | 2 +- src/System Application/Test/Environment Information/app.json | 2 +- src/System Application/Test/Extension Management/app.json | 2 +- src/System Application/Test/Feature Key/app.json | 2 +- src/System Application/Test/Field Selection/app.json | 2 +- src/System Application/Test/Filter Tokens/app.json | 2 +- src/System Application/Test/Geolocation/app.json | 2 +- src/System Application/Test/Guided Experience/app.json | 2 +- src/System Application/Test/Headlines/app.json | 2 +- src/System Application/Test/Image/app.json | 2 +- src/System Application/Test/Language/app.json | 2 +- src/System Application/Test/MicrosoftGraph/app.json | 2 +- src/System Application/Test/Navigation Bar Subscribers/app.json | 2 +- src/System Application/Test/Page Action Provider/app.json | 2 +- src/System Application/Test/Page Summary Provider/app.json | 2 +- src/System Application/Test/Password/app.json | 2 +- src/System Application/Test/Performance Profiler/app.json | 2 +- src/System Application/Test/Permission Sets/app.json | 2 +- src/System Application/Test/Privacy Notice/app.json | 2 +- src/System Application/Test/Record Link Management/app.json | 2 +- src/System Application/Test/Record Reference/app.json | 2 +- src/System Application/Test/Record Selection/app.json | 2 +- src/System Application/Test/Recurrence Schedule/app.json | 2 +- src/System Application/Test/Regex/app.json | 2 +- src/System Application/Test/Rest Client/app.json | 2 +- src/System Application/Test/Retention Policy/app.json | 2 +- src/System Application/Test/Satisfaction Survey/app.json | 2 +- src/System Application/Test/Secrets/app.json | 2 +- src/System Application/Test/Security Groups/app.json | 2 +- src/System Application/Test/SharePoint Authorization/app.json | 2 +- src/System Application/Test/SharePoint/app.json | 2 +- src/System Application/Test/System Initialization/app.json | 2 +- src/System Application/Test/Telemetry/app.json | 2 +- src/System Application/Test/Tenant License State/app.json | 2 +- src/System Application/Test/Time Zone Selection/app.json | 2 +- src/System Application/Test/Translation/app.json | 2 +- src/System Application/Test/URI/app.json | 2 +- src/System Application/Test/Upgrade Tags/app.json | 2 +- src/System Application/Test/User Details/app.json | 2 +- src/System Application/Test/User Login Times/app.json | 2 +- src/System Application/Test/User Permissions/app.json | 2 +- src/System Application/Test/User Selection/app.json | 2 +- src/System Application/Test/User Settings/app.json | 2 +- src/System Application/Test/Video/app.json | 2 +- src/System Application/Test/Vs Code Integration/app.json | 2 +- src/System Application/Test/Web Service Management/app.json | 2 +- src/System Application/Test/Word Templates/app.json | 2 +- src/System Application/Test/XML Validation/app.json | 2 +- src/System Application/Test/XmlWriter/app.json | 2 +- src/System Application/Test/app.json | 2 +- src/Tools/AI Test Toolkit/app.json | 2 +- src/Tools/Performance Toolkit/App/app.json | 2 +- src/Tools/Performance Toolkit/Test/app.json | 2 +- src/Tools/Test Framework/Test Libraries/Any/app.json | 2 +- src/Tools/Test Framework/Test Libraries/Assert/app.json | 2 +- .../Test Framework/Test Libraries/Permissions Mock/app.json | 2 +- .../Test Framework/Test Libraries/Variable Storage/app.json | 2 +- src/Tools/Test Framework/Test Runner/app.json | 2 +- .../Test Stability Tools/Prevent Metadata Updates/app.json | 2 +- 256 files changed, 256 insertions(+), 256 deletions(-) diff --git a/src/Business Foundation/App/AuditCodes/app.json b/src/Business Foundation/App/AuditCodes/app.json index 1799dd9405..cf16102247 100644 --- a/src/Business Foundation/App/AuditCodes/app.json +++ b/src/Business Foundation/App/AuditCodes/app.json @@ -13,7 +13,7 @@ "dependencies": [], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/App/NoSeries/app.json b/src/Business Foundation/App/NoSeries/app.json index 4ceea7a64d..6738c9e646 100644 --- a/src/Business Foundation/App/NoSeries/app.json +++ b/src/Business Foundation/App/NoSeries/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/App/NoSeriesCopilot/app.json b/src/Business Foundation/App/NoSeriesCopilot/app.json index d9b4ca87a1..fcef7fa920 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/app.json +++ b/src/Business Foundation/App/NoSeriesCopilot/app.json @@ -32,7 +32,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/App/app.json b/src/Business Foundation/App/app.json index ac63e02d77..b04f02c839 100644 --- a/src/Business Foundation/App/app.json +++ b/src/Business Foundation/App/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/Test Library/NoSeries/app.json b/src/Business Foundation/Test Library/NoSeries/app.json index 9c8d26b1dd..d34f127415 100644 --- a/src/Business Foundation/Test Library/NoSeries/app.json +++ b/src/Business Foundation/Test Library/NoSeries/app.json @@ -26,7 +26,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/Test Library/NoSeriesCopilot/app.json b/src/Business Foundation/Test Library/NoSeriesCopilot/app.json index e4b53727ae..056cb4b2f5 100644 --- a/src/Business Foundation/Test Library/NoSeriesCopilot/app.json +++ b/src/Business Foundation/Test Library/NoSeriesCopilot/app.json @@ -24,7 +24,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/Test Library/app.json b/src/Business Foundation/Test Library/app.json index 73bdf6b1fa..ea53ded3fd 100644 --- a/src/Business Foundation/Test Library/app.json +++ b/src/Business Foundation/Test Library/app.json @@ -26,7 +26,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/Test/NoSeries/app.json b/src/Business Foundation/Test/NoSeries/app.json index f831e3f10d..fe12a5c520 100644 --- a/src/Business Foundation/Test/NoSeries/app.json +++ b/src/Business Foundation/Test/NoSeries/app.json @@ -56,7 +56,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/Test/NoSeriesCopilot/app.json b/src/Business Foundation/Test/NoSeriesCopilot/app.json index 6bec1bcc18..c711ac0920 100644 --- a/src/Business Foundation/Test/NoSeriesCopilot/app.json +++ b/src/Business Foundation/Test/NoSeriesCopilot/app.json @@ -68,7 +68,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/Business Foundation/Test/app.json b/src/Business Foundation/Test/app.json index 02666c909d..6e278cd94f 100644 --- a/src/Business Foundation/Test/app.json +++ b/src/Business Foundation/Test/app.json @@ -68,7 +68,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/AI/app.json b/src/System Application/App/AI/app.json index c0e174501e..ec4ac3a305 100644 --- a/src/System Application/App/AI/app.json +++ b/src/System Application/App/AI/app.json @@ -86,7 +86,7 @@ "publisher": "Microsoft" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 7758, diff --git a/src/System Application/App/Advanced Settings/app.json b/src/System Application/App/Advanced Settings/app.json index a976d549db..754a134d79 100644 --- a/src/System Application/App/Advanced Settings/app.json +++ b/src/System Application/App/Advanced Settings/app.json @@ -38,7 +38,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9202, diff --git a/src/System Application/App/AppSource Gallery/app.json b/src/System Application/App/AppSource Gallery/app.json index 58916c2ffc..909c4624d9 100644 --- a/src/System Application/App/AppSource Gallery/app.json +++ b/src/System Application/App/AppSource Gallery/app.json @@ -69,7 +69,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2515, diff --git a/src/System Application/App/Auto Format/app.json b/src/System Application/App/Auto Format/app.json index 0d91d0541c..b7398c8a3e 100644 --- a/src/System Application/App/Auto Format/app.json +++ b/src/System Application/App/Auto Format/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 45, diff --git a/src/System Application/App/Azure AD Graph/app.json b/src/System Application/App/Azure AD Graph/app.json index a068ea3385..87491321d2 100644 --- a/src/System Application/App/Azure AD Graph/app.json +++ b/src/System Application/App/Azure AD Graph/app.json @@ -32,7 +32,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9012, diff --git a/src/System Application/App/Azure AD Licensing/app.json b/src/System Application/App/Azure AD Licensing/app.json index 611d47ebe7..341b0bd7cf 100644 --- a/src/System Application/App/Azure AD Licensing/app.json +++ b/src/System Application/App/Azure AD Licensing/app.json @@ -38,7 +38,7 @@ "publisher": "Microsoft" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 239, diff --git a/src/System Application/App/Azure AD Plan/app.json b/src/System Application/App/Azure AD Plan/app.json index 6752966af4..0b7a9ecfb1 100644 --- a/src/System Application/App/Azure AD Plan/app.json +++ b/src/System Application/App/Azure AD Plan/app.json @@ -85,7 +85,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 774, diff --git a/src/System Application/App/Azure AD Tenant/app.json b/src/System Application/App/Azure AD Tenant/app.json index 4c720e9259..2de589df15 100644 --- a/src/System Application/App/Azure AD Tenant/app.json +++ b/src/System Application/App/Azure AD Tenant/app.json @@ -26,7 +26,7 @@ ], "screenshots": [], "target": "OnPrem", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 433, diff --git a/src/System Application/App/Azure AD User Management/app.json b/src/System Application/App/Azure AD User Management/app.json index 358a1b8f34..30e1773bf6 100644 --- a/src/System Application/App/Azure AD User Management/app.json +++ b/src/System Application/App/Azure AD User Management/app.json @@ -91,7 +91,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9010, diff --git a/src/System Application/App/Azure AD User/app.json b/src/System Application/App/Azure AD User/app.json index 6143e23587..1013531cfa 100644 --- a/src/System Application/App/Azure AD User/app.json +++ b/src/System Application/App/Azure AD User/app.json @@ -44,7 +44,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9011, diff --git a/src/System Application/App/Azure Blob Services API/app.json b/src/System Application/App/Azure Blob Services API/app.json index 8658e7338b..39f443971c 100644 --- a/src/System Application/App/Azure Blob Services API/app.json +++ b/src/System Application/App/Azure Blob Services API/app.json @@ -51,7 +51,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9042, diff --git a/src/System Application/App/Azure File Services API/app.json b/src/System Application/App/Azure File Services API/app.json index 6fdefeccc7..0d17d90918 100644 --- a/src/System Application/App/Azure File Services API/app.json +++ b/src/System Application/App/Azure File Services API/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 8950, diff --git a/src/System Application/App/Azure Function/app.json b/src/System Application/App/Azure Function/app.json index e38e65ee26..0e1588aa00 100644 --- a/src/System Application/App/Azure Function/app.json +++ b/src/System Application/App/Azure Function/app.json @@ -38,7 +38,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 7800, diff --git a/src/System Application/App/Azure Key Vault/app.json b/src/System Application/App/Azure Key Vault/app.json index d2a19db7b3..467741b69e 100644 --- a/src/System Application/App/Azure Key Vault/app.json +++ b/src/System Application/App/Azure Key Vault/app.json @@ -38,7 +38,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2200, diff --git a/src/System Application/App/Azure Storage Services Authorization/app.json b/src/System Application/App/Azure Storage Services Authorization/app.json index 69a9adce5a..dd7a3b8dca 100644 --- a/src/System Application/App/Azure Storage Services Authorization/app.json +++ b/src/System Application/App/Azure Storage Services Authorization/app.json @@ -32,7 +32,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9060, diff --git a/src/System Application/App/BLOB Storage/app.json b/src/System Application/App/BLOB Storage/app.json index 2f4775ad5d..d2c3846bb6 100644 --- a/src/System Application/App/BLOB Storage/app.json +++ b/src/System Application/App/BLOB Storage/app.json @@ -19,7 +19,7 @@ ], "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 4100, diff --git a/src/System Application/App/Barcode/app.json b/src/System Application/App/Barcode/app.json index e0e8758f2e..74f542c1f2 100644 --- a/src/System Application/App/Barcode/app.json +++ b/src/System Application/App/Barcode/app.json @@ -10,7 +10,7 @@ "help": "https://go.microsoft.com/fwlink/?linkid=2103698", "url": "https://go.microsoft.com/fwlink/?linkid=724011", "contextSensitiveHelpUrl": "https://learn.microsoft.com/dynamics365/business-central/", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "dependencies": [ { "id": "7e3b999e-1182-45d2-8b82-d5127ddba9b2", diff --git a/src/System Application/App/Base64 Convert/app.json b/src/System Application/App/Base64 Convert/app.json index e75069ee70..9fb05a32bc 100644 --- a/src/System Application/App/Base64 Convert/app.json +++ b/src/System Application/App/Base64 Convert/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 4110, diff --git a/src/System Application/App/Business Chart/app.json b/src/System Application/App/Business Chart/app.json index 691b1c9c04..04c1f9e9b4 100644 --- a/src/System Application/App/Business Chart/app.json +++ b/src/System Application/App/Business Chart/app.json @@ -11,7 +11,7 @@ "url": "https://go.microsoft.com/fwlink/?linkid=724011", "logo": "", "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "dependencies": [ { "id": "7e3b999e-1182-45d2-8b82-d5127ddba9b2", diff --git a/src/System Application/App/Camera and Media Interaction/app.json b/src/System Application/App/Camera and Media Interaction/app.json index 5a680f1903..59453f0d15 100644 --- a/src/System Application/App/Camera and Media Interaction/app.json +++ b/src/System Application/App/Camera and Media Interaction/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1907, diff --git a/src/System Application/App/Caption Class/app.json b/src/System Application/App/Caption Class/app.json index 583d064c91..14a5f5f27f 100644 --- a/src/System Application/App/Caption Class/app.json +++ b/src/System Application/App/Caption Class/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 42, diff --git a/src/System Application/App/Client Type Management/app.json b/src/System Application/App/Client Type Management/app.json index 2d8dae937f..f8adf3796b 100644 --- a/src/System Application/App/Client Type Management/app.json +++ b/src/System Application/App/Client Type Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 4030, diff --git a/src/System Application/App/Confirm Management/app.json b/src/System Application/App/Confirm Management/app.json index f8380e1247..3f87beb25d 100644 --- a/src/System Application/App/Confirm Management/app.json +++ b/src/System Application/App/Confirm Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 26, diff --git a/src/System Application/App/ControlAddIns/app.json b/src/System Application/App/ControlAddIns/app.json index f72dc7184c..cdb20d0d53 100644 --- a/src/System Application/App/ControlAddIns/app.json +++ b/src/System Application/App/ControlAddIns/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [], "target": "OnPrem", "contextSensitiveHelpUrl": "https://learn.microsoft.com/dynamics365/business-central/" diff --git a/src/System Application/App/Cryptography Management/app.json b/src/System Application/App/Cryptography Management/app.json index 430dbd80c9..89810ae70c 100644 --- a/src/System Application/App/Cryptography Management/app.json +++ b/src/System Application/App/Cryptography Management/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1258, diff --git a/src/System Application/App/Cues and KPIs/app.json b/src/System Application/App/Cues and KPIs/app.json index 19607452ab..370876bb70 100644 --- a/src/System Application/App/Cues and KPIs/app.json +++ b/src/System Application/App/Cues and KPIs/app.json @@ -32,7 +32,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9701, diff --git a/src/System Application/App/Customer Experience Survey/app.json b/src/System Application/App/Customer Experience Survey/app.json index de4754fa42..42f67031ec 100644 --- a/src/System Application/App/Customer Experience Survey/app.json +++ b/src/System Application/App/Customer Experience Survey/app.json @@ -68,7 +68,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9260, diff --git a/src/System Application/App/Data Administration/app.json b/src/System Application/App/Data Administration/app.json index f5b81dea44..fe5e2d607f 100644 --- a/src/System Application/App/Data Administration/app.json +++ b/src/System Application/App/Data Administration/app.json @@ -11,7 +11,7 @@ "url": "https://go.microsoft.com/fwlink/?linkid=724011", "logo": "", "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "dependencies": [ { "id": "fd3d0b8e-61fa-4f87-b2fc-c4a1f3e53a63", diff --git a/src/System Application/App/Data Archive/app.json b/src/System Application/App/Data Archive/app.json index 978a8b77dd..c17cd7fc4d 100644 --- a/src/System Application/App/Data Archive/app.json +++ b/src/System Application/App/Data Archive/app.json @@ -10,7 +10,7 @@ "help": "https://go.microsoft.com/fwlink/?linkid=2103698", "url": "https://go.microsoft.com/fwlink/?linkid=724011", "logo": "", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 600, diff --git a/src/System Application/App/Data Classification/app.json b/src/System Application/App/Data Classification/app.json index c64aaceb81..4f3e4dd72c 100644 --- a/src/System Application/App/Data Classification/app.json +++ b/src/System Application/App/Data Classification/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1180, diff --git a/src/System Application/App/Data Compression/app.json b/src/System Application/App/Data Compression/app.json index b6fa6bd624..5caea00548 100644 --- a/src/System Application/App/Data Compression/app.json +++ b/src/System Application/App/Data Compression/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 421, diff --git a/src/System Application/App/Date and Time/app.json b/src/System Application/App/Date and Time/app.json index f5c229478e..5fa9786ab1 100644 --- a/src/System Application/App/Date and Time/app.json +++ b/src/System Application/App/Date and Time/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 8720, diff --git a/src/System Application/App/Date-Time Dialog/app.json b/src/System Application/App/Date-Time Dialog/app.json index cd8aba141a..bb47aee18e 100644 --- a/src/System Application/App/Date-Time Dialog/app.json +++ b/src/System Application/App/Date-Time Dialog/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 684, diff --git a/src/System Application/App/Default Role Center/app.json b/src/System Application/App/Default Role Center/app.json index 18b025cf8a..a5269b020d 100644 --- a/src/System Application/App/Default Role Center/app.json +++ b/src/System Application/App/Default Role Center/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9171, diff --git a/src/System Application/App/Device/app.json b/src/System Application/App/Device/app.json index c15fe48681..231c31dbb8 100644 --- a/src/System Application/App/Device/app.json +++ b/src/System Application/App/Device/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 776, diff --git a/src/System Application/App/Document Sharing/app.json b/src/System Application/App/Document Sharing/app.json index 55306ca985..b485abe6ea 100644 --- a/src/System Application/App/Document Sharing/app.json +++ b/src/System Application/App/Document Sharing/app.json @@ -39,7 +39,7 @@ "internalsVisibleTo": [], "screenshots": [], "target": "OnPrem", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9560, diff --git a/src/System Application/App/DotNet Aliases/app.json b/src/System Application/App/DotNet Aliases/app.json index 7daf636c7a..48e967cccd 100644 --- a/src/System Application/App/DotNet Aliases/app.json +++ b/src/System Application/App/DotNet Aliases/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "contextSensitiveHelpUrl": "https://learn.microsoft.com/dynamics365/business-central/" } diff --git a/src/System Application/App/Edit in Excel/app.json b/src/System Application/App/Edit in Excel/app.json index 6139ff3f53..da83396c81 100644 --- a/src/System Application/App/Edit in Excel/app.json +++ b/src/System Application/App/Edit in Excel/app.json @@ -56,7 +56,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/Email/app.json b/src/System Application/App/Email/app.json index c75dda0953..87179a294a 100644 --- a/src/System Application/App/Email/app.json +++ b/src/System Application/App/Email/app.json @@ -127,7 +127,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1, diff --git a/src/System Application/App/Encoding/app.json b/src/System Application/App/Encoding/app.json index 44c8cb7834..4f9faa4006 100644 --- a/src/System Application/App/Encoding/app.json +++ b/src/System Application/App/Encoding/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1486, diff --git a/src/System Application/App/Entity Text/app.json b/src/System Application/App/Entity Text/app.json index 07f520c3e5..11a32fb454 100644 --- a/src/System Application/App/Entity Text/app.json +++ b/src/System Application/App/Entity Text/app.json @@ -86,7 +86,7 @@ ], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/Environment Cleanup/app.json b/src/System Application/App/Environment Cleanup/app.json index 066ede623b..543c2b26b5 100644 --- a/src/System Application/App/Environment Cleanup/app.json +++ b/src/System Application/App/Environment Cleanup/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1884, diff --git a/src/System Application/App/Environment Information/app.json b/src/System Application/App/Environment Information/app.json index a9d7c10952..57971ed42e 100644 --- a/src/System Application/App/Environment Information/app.json +++ b/src/System Application/App/Environment Information/app.json @@ -33,7 +33,7 @@ ], "screenshots": [], "target": "OnPrem", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 417, diff --git a/src/System Application/App/Extension Management/app.json b/src/System Application/App/Extension Management/app.json index 143e835347..148f35f8d4 100644 --- a/src/System Application/App/Extension Management/app.json +++ b/src/System Application/App/Extension Management/app.json @@ -86,7 +86,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2500, diff --git a/src/System Application/App/Feature Key/app.json b/src/System Application/App/Feature Key/app.json index 9c1dbe8a75..1029c659fa 100644 --- a/src/System Application/App/Feature Key/app.json +++ b/src/System Application/App/Feature Key/app.json @@ -39,7 +39,7 @@ ], "screenshots": [], "target": "OnPrem", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2609, diff --git a/src/System Application/App/Field Selection/app.json b/src/System Application/App/Field Selection/app.json index d27a0f7aac..cef572b3c0 100644 --- a/src/System Application/App/Field Selection/app.json +++ b/src/System Application/App/Field Selection/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9806, diff --git a/src/System Application/App/Filter Tokens/app.json b/src/System Application/App/Filter Tokens/app.json index a05c689757..e7d09b6654 100644 --- a/src/System Application/App/Filter Tokens/app.json +++ b/src/System Application/App/Filter Tokens/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 41, diff --git a/src/System Application/App/Geolocation/app.json b/src/System Application/App/Geolocation/app.json index e24aee163a..5bc0e338d6 100644 --- a/src/System Application/App/Geolocation/app.json +++ b/src/System Application/App/Geolocation/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 7567, diff --git a/src/System Application/App/Guided Experience/app.json b/src/System Application/App/Guided Experience/app.json index 920f875ca9..f67e201a3f 100644 --- a/src/System Application/App/Guided Experience/app.json +++ b/src/System Application/App/Guided Experience/app.json @@ -91,7 +91,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1471, diff --git a/src/System Application/App/Headlines/app.json b/src/System Application/App/Headlines/app.json index 2e88d23f24..9ab4811c91 100644 --- a/src/System Application/App/Headlines/app.json +++ b/src/System Application/App/Headlines/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1439, diff --git a/src/System Application/App/Image/app.json b/src/System Application/App/Image/app.json index 9bf8402875..8fb9ed186f 100644 --- a/src/System Application/App/Image/app.json +++ b/src/System Application/App/Image/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3970, diff --git a/src/System Application/App/Language/app.json b/src/System Application/App/Language/app.json index 382f70b77b..bdfa814367 100644 --- a/src/System Application/App/Language/app.json +++ b/src/System Application/App/Language/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 8, diff --git a/src/System Application/App/Math/app.json b/src/System Application/App/Math/app.json index 1ba4a51e97..7621750e63 100644 --- a/src/System Application/App/Math/app.json +++ b/src/System Application/App/Math/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 710, diff --git a/src/System Application/App/MicrosoftGraph/app.json b/src/System Application/App/MicrosoftGraph/app.json index 10dc2dddaa..66478014b0 100644 --- a/src/System Application/App/MicrosoftGraph/app.json +++ b/src/System Application/App/MicrosoftGraph/app.json @@ -50,7 +50,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9350, diff --git a/src/System Application/App/Navigation Bar Subscribers/app.json b/src/System Application/App/Navigation Bar Subscribers/app.json index c066a04bbb..8a8d05fe5a 100644 --- a/src/System Application/App/Navigation Bar Subscribers/app.json +++ b/src/System Application/App/Navigation Bar Subscribers/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 154, diff --git a/src/System Application/App/OAuth/app.json b/src/System Application/App/OAuth/app.json index 1ea953332b..196cc3ff09 100644 --- a/src/System Application/App/OAuth/app.json +++ b/src/System Application/App/OAuth/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1288, diff --git a/src/System Application/App/OAuth2/app.json b/src/System Application/App/OAuth2/app.json index a9aa504fe6..3912cd88d3 100644 --- a/src/System Application/App/OAuth2/app.json +++ b/src/System Application/App/OAuth2/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 501, diff --git a/src/System Application/App/Object Selection/app.json b/src/System Application/App/Object Selection/app.json index 734c7f8806..7aaa86eb15 100644 --- a/src/System Application/App/Object Selection/app.json +++ b/src/System Application/App/Object Selection/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 358, diff --git a/src/System Application/App/Page Action Provider/app.json b/src/System Application/App/Page Action Provider/app.json index 317157457c..1b93c10bd7 100644 --- a/src/System Application/App/Page Action Provider/app.json +++ b/src/System Application/App/Page Action Provider/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/Page Summary Provider/app.json b/src/System Application/App/Page Summary Provider/app.json index 1b99cf2bed..450a2df86c 100644 --- a/src/System Application/App/Page Summary Provider/app.json +++ b/src/System Application/App/Page Summary Provider/app.json @@ -44,7 +44,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/Password/app.json b/src/System Application/App/Password/app.json index bdaa6ec8c6..733e6f229f 100644 --- a/src/System Application/App/Password/app.json +++ b/src/System Application/App/Password/app.json @@ -19,7 +19,7 @@ ], "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1282, diff --git a/src/System Application/App/Performance Profiler/app.json b/src/System Application/App/Performance Profiler/app.json index 95e154ccec..a3bcd337a1 100644 --- a/src/System Application/App/Performance Profiler/app.json +++ b/src/System Application/App/Performance Profiler/app.json @@ -11,7 +11,7 @@ "url": "https://go.microsoft.com/fwlink/?linkid=724011", "logo": "", "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "dependencies": [ { "id": "7e3b999e-1182-45d2-8b82-d5127ddba9b2", diff --git a/src/System Application/App/Permission Sets/app.json b/src/System Application/App/Permission Sets/app.json index 2334779ea4..77aefd7a73 100644 --- a/src/System Application/App/Permission Sets/app.json +++ b/src/System Application/App/Permission Sets/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9802, diff --git a/src/System Application/App/Printer Management/app.json b/src/System Application/App/Printer Management/app.json index cbe7b5ddd2..920b22f220 100644 --- a/src/System Application/App/Printer Management/app.json +++ b/src/System Application/App/Printer Management/app.json @@ -13,7 +13,7 @@ "dependencies": [], "internalsVisibleTo": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/Privacy Notice/app.json b/src/System Application/App/Privacy Notice/app.json index a0031b27af..f043e8350f 100644 --- a/src/System Application/App/Privacy Notice/app.json +++ b/src/System Application/App/Privacy Notice/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "internalsVisibleTo": [ { diff --git a/src/System Application/App/Record Link Management/app.json b/src/System Application/App/Record Link Management/app.json index 0211f5c3fe..ca595e7d85 100644 --- a/src/System Application/App/Record Link Management/app.json +++ b/src/System Application/App/Record Link Management/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 447, diff --git a/src/System Application/App/Record Reference/app.json b/src/System Application/App/Record Reference/app.json index cb937d9a14..489b9e0baa 100644 --- a/src/System Application/App/Record Reference/app.json +++ b/src/System Application/App/Record Reference/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3917, diff --git a/src/System Application/App/Record Selection/app.json b/src/System Application/App/Record Selection/app.json index 495d1ee13f..542787645c 100644 --- a/src/System Application/App/Record Selection/app.json +++ b/src/System Application/App/Record Selection/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9555, diff --git a/src/System Application/App/Recurrence Schedule/app.json b/src/System Application/App/Recurrence Schedule/app.json index 2ae4634b1b..343ab895b6 100644 --- a/src/System Application/App/Recurrence Schedule/app.json +++ b/src/System Application/App/Recurrence Schedule/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 4690, diff --git a/src/System Application/App/Regex/app.json b/src/System Application/App/Regex/app.json index 64c6659f0f..1579de731c 100644 --- a/src/System Application/App/Regex/app.json +++ b/src/System Application/App/Regex/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3960, diff --git a/src/System Application/App/Rest Client/app.json b/src/System Application/App/Rest Client/app.json index 95ed90c8b3..e21a941caf 100644 --- a/src/System Application/App/Rest Client/app.json +++ b/src/System Application/App/Rest Client/app.json @@ -30,7 +30,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2350, diff --git a/src/System Application/App/Retention Policy/app.json b/src/System Application/App/Retention Policy/app.json index abb8768fc6..d684a9c10e 100644 --- a/src/System Application/App/Retention Policy/app.json +++ b/src/System Application/App/Retention Policy/app.json @@ -80,7 +80,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3900, diff --git a/src/System Application/App/Satisfaction Survey/app.json b/src/System Application/App/Satisfaction Survey/app.json index 1324f26d5f..ff0d5ed913 100644 --- a/src/System Application/App/Satisfaction Survey/app.json +++ b/src/System Application/App/Satisfaction Survey/app.json @@ -68,7 +68,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1432, diff --git a/src/System Application/App/Secrets/app.json b/src/System Application/App/Secrets/app.json index e89c16b73e..e2a6975f1a 100644 --- a/src/System Application/App/Secrets/app.json +++ b/src/System Application/App/Secrets/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3800, diff --git a/src/System Application/App/Security Groups/app.json b/src/System Application/App/Security Groups/app.json index 9cd74284c1..e7cdfdfd83 100644 --- a/src/System Application/App/Security Groups/app.json +++ b/src/System Application/App/Security Groups/app.json @@ -62,7 +62,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9001, diff --git a/src/System Application/App/Server Settings/app.json b/src/System Application/App/Server Settings/app.json index bdc9765948..621c414917 100644 --- a/src/System Application/App/Server Settings/app.json +++ b/src/System Application/App/Server Settings/app.json @@ -13,7 +13,7 @@ "dependencies": [], "screenshots": [], "target": "OnPrem", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3703, diff --git a/src/System Application/App/SharePoint Authorization/app.json b/src/System Application/App/SharePoint Authorization/app.json index 7ff47ce1a7..6497204f0f 100644 --- a/src/System Application/App/SharePoint Authorization/app.json +++ b/src/System Application/App/SharePoint Authorization/app.json @@ -20,7 +20,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9141, diff --git a/src/System Application/App/SharePoint/app.json b/src/System Application/App/SharePoint/app.json index d59dda8832..8f9bed30e1 100644 --- a/src/System Application/App/SharePoint/app.json +++ b/src/System Application/App/SharePoint/app.json @@ -44,7 +44,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9100, diff --git a/src/System Application/App/SmartList Designer Subscribers/app.json b/src/System Application/App/SmartList Designer Subscribers/app.json index 4e396e5a37..a3c8f04361 100644 --- a/src/System Application/App/SmartList Designer Subscribers/app.json +++ b/src/System Application/App/SmartList Designer Subscribers/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2888, diff --git a/src/System Application/App/System Initialization/app.json b/src/System Application/App/System Initialization/app.json index 95f56305c0..0816316f98 100644 --- a/src/System Application/App/System Initialization/app.json +++ b/src/System Application/App/System Initialization/app.json @@ -38,7 +38,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 150, diff --git a/src/System Application/App/System Permissions/app.json b/src/System Application/App/System Permissions/app.json index 99a92ababc..0f80934128 100644 --- a/src/System Application/App/System Permissions/app.json +++ b/src/System Application/App/System Permissions/app.json @@ -10,7 +10,7 @@ "help": "https://go.microsoft.com/fwlink/?linkid=2103698", "url": "https://go.microsoft.com/fwlink/?linkid=724011", "contextSensitiveHelpUrl": "https://learn.microsoft.com/dynamics365/business-central/", - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/App/Table Information/app.json b/src/System Application/App/Table Information/app.json index 343867bfca..055bb5869b 100644 --- a/src/System Application/App/Table Information/app.json +++ b/src/System Application/App/Table Information/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 8700, diff --git a/src/System Application/App/Table Keys/app.json b/src/System Application/App/Table Keys/app.json index 3266a8fd7b..24e7c58dd4 100644 --- a/src/System Application/App/Table Keys/app.json +++ b/src/System Application/App/Table Keys/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9557, diff --git a/src/System Application/App/Telemetry/app.json b/src/System Application/App/Telemetry/app.json index 89dfb6e259..969d0726ad 100644 --- a/src/System Application/App/Telemetry/app.json +++ b/src/System Application/App/Telemetry/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 8703, diff --git a/src/System Application/App/Tenant License State/app.json b/src/System Application/App/Tenant License State/app.json index 99a76e0a03..7af608bc97 100644 --- a/src/System Application/App/Tenant License State/app.json +++ b/src/System Application/App/Tenant License State/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 2300, diff --git a/src/System Application/App/Time Zone Selection/app.json b/src/System Application/App/Time Zone Selection/app.json index f9e525a5ad..d1d4eefa36 100644 --- a/src/System Application/App/Time Zone Selection/app.json +++ b/src/System Application/App/Time Zone Selection/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9198, diff --git a/src/System Application/App/Translation/app.json b/src/System Application/App/Translation/app.json index 399e6c95fb..80af7d8a71 100644 --- a/src/System Application/App/Translation/app.json +++ b/src/System Application/App/Translation/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 3711, diff --git a/src/System Application/App/URI/app.json b/src/System Application/App/URI/app.json index 2af9c26d0f..a90c488dcb 100644 --- a/src/System Application/App/URI/app.json +++ b/src/System Application/App/URI/app.json @@ -25,7 +25,7 @@ "to": 3062 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "contextSensitiveHelpUrl": "https://learn.microsoft.com/dynamics365/business-central/" } diff --git a/src/System Application/App/Upgrade Tags/app.json b/src/System Application/App/Upgrade Tags/app.json index fbe5f1368c..035fb8c9ad 100644 --- a/src/System Application/App/Upgrade Tags/app.json +++ b/src/System Application/App/Upgrade Tags/app.json @@ -12,7 +12,7 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9992, diff --git a/src/System Application/App/User Details/app.json b/src/System Application/App/User Details/app.json index 11b106758e..9e90d7a9be 100644 --- a/src/System Application/App/User Details/app.json +++ b/src/System Application/App/User Details/app.json @@ -26,7 +26,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 773, diff --git a/src/System Application/App/User Login Times/app.json b/src/System Application/App/User Login Times/app.json index e59c4c1d14..7d6bad765f 100644 --- a/src/System Application/App/User Login Times/app.json +++ b/src/System Application/App/User Login Times/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9008, diff --git a/src/System Application/App/User Permissions/app.json b/src/System Application/App/User Permissions/app.json index 2102f52fda..e210779236 100644 --- a/src/System Application/App/User Permissions/app.json +++ b/src/System Application/App/User Permissions/app.json @@ -32,7 +32,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 152, diff --git a/src/System Application/App/User Selection/app.json b/src/System Application/App/User Selection/app.json index b8c7ca0ae6..249df2f693 100644 --- a/src/System Application/App/User Selection/app.json +++ b/src/System Application/App/User Selection/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9843, diff --git a/src/System Application/App/User Settings/app.json b/src/System Application/App/User Settings/app.json index 9d92ffe417..cf777cdc52 100644 --- a/src/System Application/App/User Settings/app.json +++ b/src/System Application/App/User Settings/app.json @@ -92,7 +92,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9172, diff --git a/src/System Application/App/VS Code Integration/app.json b/src/System Application/App/VS Code Integration/app.json index b2e79d7dc1..ab4b080f10 100644 --- a/src/System Application/App/VS Code Integration/app.json +++ b/src/System Application/App/VS Code Integration/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 8333, diff --git a/src/System Application/App/Video/app.json b/src/System Application/App/Video/app.json index 72e5ec311e..3a8992535c 100644 --- a/src/System Application/App/Video/app.json +++ b/src/System Application/App/Video/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1470, diff --git a/src/System Application/App/Web Service Management/app.json b/src/System Application/App/Web Service Management/app.json index d649648c2f..4d6f9e44a7 100644 --- a/src/System Application/App/Web Service Management/app.json +++ b/src/System Application/App/Web Service Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 810, diff --git a/src/System Application/App/Word Templates/app.json b/src/System Application/App/Word Templates/app.json index 4d4ff887e7..27de2d9098 100644 --- a/src/System Application/App/Word Templates/app.json +++ b/src/System Application/App/Word Templates/app.json @@ -90,7 +90,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 9981, diff --git a/src/System Application/App/XML Validation/app.json b/src/System Application/App/XML Validation/app.json index e02abba394..424e42406e 100644 --- a/src/System Application/App/XML Validation/app.json +++ b/src/System Application/App/XML Validation/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 6240, diff --git a/src/System Application/App/XmlWriter/app.json b/src/System Application/App/XmlWriter/app.json index 12e2b71ddf..f5b207f135 100644 --- a/src/System Application/App/XmlWriter/app.json +++ b/src/System Application/App/XmlWriter/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 1483, diff --git a/src/System Application/App/app.json b/src/System Application/App/app.json index 268888da14..048dfb3fa9 100644 --- a/src/System Application/App/app.json +++ b/src/System Application/App/app.json @@ -24,7 +24,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/Test Library/AI/app.json b/src/System Application/Test Library/AI/app.json index 45063bd3f9..922c9dfd86 100644 --- a/src/System Application/Test Library/AI/app.json +++ b/src/System Application/Test Library/AI/app.json @@ -25,6 +25,6 @@ "to": 132934 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Advanced Settings/app.json b/src/System Application/Test Library/Advanced Settings/app.json index 869de3a9e6..9f77aeeb8a 100644 --- a/src/System Application/Test Library/Advanced Settings/app.json +++ b/src/System Application/Test Library/Advanced Settings/app.json @@ -25,6 +25,6 @@ "to": 132589 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Azure AD Graph/app.json b/src/System Application/Test Library/Azure AD Graph/app.json index c2b3e2691f..2d53966005 100644 --- a/src/System Application/Test Library/Azure AD Graph/app.json +++ b/src/System Application/Test Library/Azure AD Graph/app.json @@ -43,6 +43,6 @@ "to": 132922 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Azure AD Licensing/app.json b/src/System Application/Test Library/Azure AD Licensing/app.json index c899f5a258..3aa976e4be 100644 --- a/src/System Application/Test Library/Azure AD Licensing/app.json +++ b/src/System Application/Test Library/Azure AD Licensing/app.json @@ -25,6 +25,6 @@ "to": 138458 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Azure AD Plan/app.json b/src/System Application/Test Library/Azure AD Plan/app.json index 7e66169b38..cabe11b622 100644 --- a/src/System Application/Test Library/Azure AD Plan/app.json +++ b/src/System Application/Test Library/Azure AD Plan/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132916, diff --git a/src/System Application/Test Library/Azure AD User Management/app.json b/src/System Application/Test Library/Azure AD User Management/app.json index 52e2c8bebe..2067536914 100644 --- a/src/System Application/Test Library/Azure AD User Management/app.json +++ b/src/System Application/Test Library/Azure AD User Management/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132914, diff --git a/src/System Application/Test Library/Azure AD User/app.json b/src/System Application/Test Library/Azure AD User/app.json index 1b5d0c00ee..30bcdbe396 100644 --- a/src/System Application/Test Library/Azure AD User/app.json +++ b/src/System Application/Test Library/Azure AD User/app.json @@ -29,6 +29,6 @@ "to": 132915 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Azure Key Vault/app.json b/src/System Application/Test Library/Azure Key Vault/app.json index d8df04e281..409c9be13b 100644 --- a/src/System Application/Test Library/Azure Key Vault/app.json +++ b/src/System Application/Test Library/Azure Key Vault/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135210, diff --git a/src/System Application/Test Library/Blob Storage/app.json b/src/System Application/Test Library/Blob Storage/app.json index 3b2b86ff3d..2e5cf41a9f 100644 --- a/src/System Application/Test Library/Blob Storage/app.json +++ b/src/System Application/Test Library/Blob Storage/app.json @@ -25,6 +25,6 @@ "to": 135032 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Business Chart/app.json b/src/System Application/Test Library/Business Chart/app.json index a2ec4a646a..ddc18fd0b1 100644 --- a/src/System Application/Test Library/Business Chart/app.json +++ b/src/System Application/Test Library/Business Chart/app.json @@ -31,6 +31,6 @@ "to": 135103 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Camera and Media Interaction/app.json b/src/System Application/Test Library/Camera and Media Interaction/app.json index 6b85088deb..a518adf138 100644 --- a/src/System Application/Test Library/Camera and Media Interaction/app.json +++ b/src/System Application/Test Library/Camera and Media Interaction/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135101, diff --git a/src/System Application/Test Library/Client Type Management/app.json b/src/System Application/Test Library/Client Type Management/app.json index 2aae05f332..9a5acf3556 100644 --- a/src/System Application/Test Library/Client Type Management/app.json +++ b/src/System Application/Test Library/Client Type Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130018, diff --git a/src/System Application/Test Library/Confirm Management/app.json b/src/System Application/Test Library/Confirm Management/app.json index cb81a4509e..068612cf67 100644 --- a/src/System Application/Test Library/Confirm Management/app.json +++ b/src/System Application/Test Library/Confirm Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132513, diff --git a/src/System Application/Test Library/Cues And KPIs/app.json b/src/System Application/Test Library/Cues And KPIs/app.json index 83c0b15b4d..3787d976be 100644 --- a/src/System Application/Test Library/Cues And KPIs/app.json +++ b/src/System Application/Test Library/Cues And KPIs/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135039, diff --git a/src/System Application/Test Library/Customer Experience Survey/app.json b/src/System Application/Test Library/Customer Experience Survey/app.json index c714bd68f0..5ec4d9af41 100644 --- a/src/System Application/Test Library/Customer Experience Survey/app.json +++ b/src/System Application/Test Library/Customer Experience Survey/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132100, diff --git a/src/System Application/Test Library/Data Classification/app.json b/src/System Application/Test Library/Data Classification/app.json index 6cc98b17a9..c17fb11f9f 100644 --- a/src/System Application/Test Library/Data Classification/app.json +++ b/src/System Application/Test Library/Data Classification/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135157, diff --git a/src/System Application/Test Library/DotNet Aliases/app.json b/src/System Application/Test Library/DotNet Aliases/app.json index 1b2d9c954e..0b699e9ee4 100644 --- a/src/System Application/Test Library/DotNet Aliases/app.json +++ b/src/System Application/Test Library/DotNet Aliases/app.json @@ -12,6 +12,6 @@ "logo": "", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Edit in Excel/app.json b/src/System Application/Test Library/Edit in Excel/app.json index 4874e2f6c8..de07458233 100644 --- a/src/System Application/Test Library/Edit in Excel/app.json +++ b/src/System Application/Test Library/Edit in Excel/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132524, diff --git a/src/System Application/Test Library/Email/app.json b/src/System Application/Test Library/Email/app.json index 6efe6b9b2d..20a3312277 100644 --- a/src/System Application/Test Library/Email/app.json +++ b/src/System Application/Test Library/Email/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 134682, diff --git a/src/System Application/Test Library/Environment Information/app.json b/src/System Application/Test Library/Environment Information/app.json index 7c401c929e..fbf79af8f0 100644 --- a/src/System Application/Test Library/Environment Information/app.json +++ b/src/System Application/Test Library/Environment Information/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135094, diff --git a/src/System Application/Test Library/Feature Key/app.json b/src/System Application/Test Library/Feature Key/app.json index d9dbb99de1..0fcd818bb3 100644 --- a/src/System Application/Test Library/Feature Key/app.json +++ b/src/System Application/Test Library/Feature Key/app.json @@ -25,6 +25,6 @@ "to": 135003 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Field Selection/app.json b/src/System Application/Test Library/Field Selection/app.json index d42bccdec3..88c168250c 100644 --- a/src/System Application/Test Library/Field Selection/app.json +++ b/src/System Application/Test Library/Field Selection/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135036, diff --git a/src/System Application/Test Library/Geolocation/app.json b/src/System Application/Test Library/Geolocation/app.json index a156940642..239342d827 100644 --- a/src/System Application/Test Library/Geolocation/app.json +++ b/src/System Application/Test Library/Geolocation/app.json @@ -24,7 +24,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135028, diff --git a/src/System Application/Test Library/Guided Experience/app.json b/src/System Application/Test Library/Guided Experience/app.json index 2d064cfe8c..1810934304 100644 --- a/src/System Application/Test Library/Guided Experience/app.json +++ b/src/System Application/Test Library/Guided Experience/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132585, diff --git a/src/System Application/Test Library/Headlines/app.json b/src/System Application/Test Library/Headlines/app.json index a17e5bdff3..d66b595d59 100644 --- a/src/System Application/Test Library/Headlines/app.json +++ b/src/System Application/Test Library/Headlines/app.json @@ -25,6 +25,6 @@ "to": 139481 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Language/app.json b/src/System Application/Test Library/Language/app.json index fafdd3daf6..3d293b7b2d 100644 --- a/src/System Application/Test Library/Language/app.json +++ b/src/System Application/Test Library/Language/app.json @@ -25,6 +25,6 @@ "to": 130043 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/MockGraphQuery/app.json b/src/System Application/Test Library/MockGraphQuery/app.json index 951e40b86d..49f6e50bb3 100644 --- a/src/System Application/Test Library/MockGraphQuery/app.json +++ b/src/System Application/Test Library/MockGraphQuery/app.json @@ -25,6 +25,6 @@ "to": 132927 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Page Action Provider/app.json b/src/System Application/Test Library/Page Action Provider/app.json index 282851a232..d0d7631da0 100644 --- a/src/System Application/Test Library/Page Action Provider/app.json +++ b/src/System Application/Test Library/Page Action Provider/app.json @@ -18,7 +18,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132616, diff --git a/src/System Application/Test Library/Page Summary Provider/app.json b/src/System Application/Test Library/Page Summary Provider/app.json index b98107908b..0ac7e3358a 100644 --- a/src/System Application/Test Library/Page Summary Provider/app.json +++ b/src/System Application/Test Library/Page Summary Provider/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132548, diff --git a/src/System Application/Test Library/Password/app.json b/src/System Application/Test Library/Password/app.json index e5b964feb7..ef084bc575 100644 --- a/src/System Application/Test Library/Password/app.json +++ b/src/System Application/Test Library/Password/app.json @@ -29,6 +29,6 @@ "to": 135033 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Performance Profiler/app.json b/src/System Application/Test Library/Performance Profiler/app.json index c54813c4a1..52c03b46cc 100644 --- a/src/System Application/Test Library/Performance Profiler/app.json +++ b/src/System Application/Test Library/Performance Profiler/app.json @@ -31,6 +31,6 @@ "to": 135104 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Permission Sets/app.json b/src/System Application/Test Library/Permission Sets/app.json index d4a2867e79..d0b622645e 100644 --- a/src/System Application/Test Library/Permission Sets/app.json +++ b/src/System Application/Test Library/Permission Sets/app.json @@ -31,6 +31,6 @@ "to": 133404 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Record Link Management/app.json b/src/System Application/Test Library/Record Link Management/app.json index 8dd9be9163..9d5e724316 100644 --- a/src/System Application/Test Library/Record Link Management/app.json +++ b/src/System Application/Test Library/Record Link Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132507, diff --git a/src/System Application/Test Library/Record Selection/app.json b/src/System Application/Test Library/Record Selection/app.json index a9be6f591e..2a51c81eb4 100644 --- a/src/System Application/Test Library/Record Selection/app.json +++ b/src/System Application/Test Library/Record Selection/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135536, diff --git a/src/System Application/Test Library/Recurrence Schedule/app.json b/src/System Application/Test Library/Recurrence Schedule/app.json index dbfeb0bd6c..dd58fe90d5 100644 --- a/src/System Application/Test Library/Recurrence Schedule/app.json +++ b/src/System Application/Test Library/Recurrence Schedule/app.json @@ -25,6 +25,6 @@ "to": 134691 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Retention Policy/app.json b/src/System Application/Test Library/Retention Policy/app.json index f9ee59268d..e70c556738 100644 --- a/src/System Application/Test Library/Retention Policy/app.json +++ b/src/System Application/Test Library/Retention Policy/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138700, diff --git a/src/System Application/Test Library/Satisfaction Survey/app.json b/src/System Application/Test Library/Satisfaction Survey/app.json index a603d73c35..79ba5859f8 100644 --- a/src/System Application/Test Library/Satisfaction Survey/app.json +++ b/src/System Application/Test Library/Satisfaction Survey/app.json @@ -29,6 +29,6 @@ "to": 138078 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Security Groups/app.json b/src/System Application/Test Library/Security Groups/app.json index b1f2d7cd61..ed6b8642ff 100644 --- a/src/System Application/Test Library/Security Groups/app.json +++ b/src/System Application/Test Library/Security Groups/app.json @@ -37,6 +37,6 @@ "to": 135105 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/SharePoint/app.json b/src/System Application/Test Library/SharePoint/app.json index 37dddd65a1..eb3a24cb4c 100644 --- a/src/System Application/Test Library/SharePoint/app.json +++ b/src/System Application/Test Library/SharePoint/app.json @@ -38,7 +38,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132972, diff --git a/src/System Application/Test Library/System Initialization/app.json b/src/System Application/Test Library/System Initialization/app.json index 1a4a6a8169..6088764c71 100644 --- a/src/System Application/Test Library/System Initialization/app.json +++ b/src/System Application/Test Library/System Initialization/app.json @@ -31,6 +31,6 @@ "to": 130046 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Telemetry/app.json b/src/System Application/Test Library/Telemetry/app.json index f054b35b53..24f863c649 100644 --- a/src/System Application/Test Library/Telemetry/app.json +++ b/src/System Application/Test Library/Telemetry/app.json @@ -25,6 +25,6 @@ "to": 139482 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Tenant License State/app.json b/src/System Application/Test Library/Tenant License State/app.json index 3f24ee9637..b0951f9ea8 100644 --- a/src/System Application/Test Library/Tenant License State/app.json +++ b/src/System Application/Test Library/Tenant License State/app.json @@ -25,6 +25,6 @@ "to": 138077 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Time Zone Selection/app.json b/src/System Application/Test Library/Time Zone Selection/app.json index d0bee29e64..91e128c7d6 100644 --- a/src/System Application/Test Library/Time Zone Selection/app.json +++ b/src/System Application/Test Library/Time Zone Selection/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 137122, diff --git a/src/System Application/Test Library/Translation/app.json b/src/System Application/Test Library/Translation/app.json index 5e628108f2..70534d9b37 100644 --- a/src/System Application/Test Library/Translation/app.json +++ b/src/System Application/Test Library/Translation/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 137121, diff --git a/src/System Application/Test Library/Upgrade Tags/app.json b/src/System Application/Test Library/Upgrade Tags/app.json index 395f67df9e..7caa6d3d4a 100644 --- a/src/System Application/Test Library/Upgrade Tags/app.json +++ b/src/System Application/Test Library/Upgrade Tags/app.json @@ -29,6 +29,6 @@ "to": 135102 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/User Details/app.json b/src/System Application/Test Library/User Details/app.json index 50550d3a05..01c9238a50 100644 --- a/src/System Application/Test Library/User Details/app.json +++ b/src/System Application/Test Library/User Details/app.json @@ -31,6 +31,6 @@ "to": 132001 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/User Login Times/app.json b/src/System Application/Test Library/User Login Times/app.json index 07daada1b5..94d3e98c98 100644 --- a/src/System Application/Test Library/User Login Times/app.json +++ b/src/System Application/Test Library/User Login Times/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138049, diff --git a/src/System Application/Test Library/User Permissions/app.json b/src/System Application/Test Library/User Permissions/app.json index e2d9e2c50f..e7d17b4a4f 100644 --- a/src/System Application/Test Library/User Permissions/app.json +++ b/src/System Application/Test Library/User Permissions/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130017, diff --git a/src/System Application/Test Library/User Selection/app.json b/src/System Application/Test Library/User Selection/app.json index d112119265..8471c84eb2 100644 --- a/src/System Application/Test Library/User Selection/app.json +++ b/src/System Application/Test Library/User Selection/app.json @@ -25,6 +25,6 @@ "to": 135035 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/User Settings/app.json b/src/System Application/Test Library/User Settings/app.json index 38e80ddf86..c951f0889c 100644 --- a/src/System Application/Test Library/User Settings/app.json +++ b/src/System Application/Test Library/User Settings/app.json @@ -29,6 +29,6 @@ "to": 135040 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test Library/Video/app.json b/src/System Application/Test Library/Video/app.json index 8f0f72693d..96d69c52a4 100644 --- a/src/System Application/Test Library/Video/app.json +++ b/src/System Application/Test Library/Video/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135038, diff --git a/src/System Application/Test Library/Web Service Management/app.json b/src/System Application/Test Library/Web Service Management/app.json index e33c9a26c7..f795b808c6 100644 --- a/src/System Application/Test Library/Web Service Management/app.json +++ b/src/System Application/Test Library/Web Service Management/app.json @@ -19,7 +19,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139043, diff --git a/src/System Application/Test Library/Word Templates/app.json b/src/System Application/Test Library/Word Templates/app.json index 7de2864161..0ff26674c5 100644 --- a/src/System Application/Test Library/Word Templates/app.json +++ b/src/System Application/Test Library/Word Templates/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130443, diff --git a/src/System Application/Test Library/app.json b/src/System Application/Test Library/app.json index b3bca8312a..922b15d09c 100644 --- a/src/System Application/Test Library/app.json +++ b/src/System Application/Test Library/app.json @@ -35,7 +35,7 @@ "allowDownloadingSource": true, "includeSourceInSymbolFile": true }, - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/Test/AI/app.json b/src/System Application/Test/AI/app.json index c1e35b05db..6d4dd7ac12 100644 --- a/src/System Application/Test/AI/app.json +++ b/src/System Application/Test/AI/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132683, diff --git a/src/System Application/Test/Advanced Settings/app.json b/src/System Application/Test/Advanced Settings/app.json index 2669a19e12..264302aa02 100644 --- a/src/System Application/Test/Advanced Settings/app.json +++ b/src/System Application/Test/Advanced Settings/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132589, diff --git a/src/System Application/Test/AppSource Gallery/app.json b/src/System Application/Test/AppSource Gallery/app.json index 80cf8671ab..07dc175414 100644 --- a/src/System Application/Test/AppSource Gallery/app.json +++ b/src/System Application/Test/AppSource Gallery/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135074, diff --git a/src/System Application/Test/Auto Format/app.json b/src/System Application/Test/Auto Format/app.json index af46d72b0d..d6f3730251 100644 --- a/src/System Application/Test/Auto Format/app.json +++ b/src/System Application/Test/Auto Format/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132584, diff --git a/src/System Application/Test/Azure AD Graph/app.json b/src/System Application/Test/Azure AD Graph/app.json index 33d27c1e48..2b741371f1 100644 --- a/src/System Application/Test/Azure AD Graph/app.json +++ b/src/System Application/Test/Azure AD Graph/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139087, diff --git a/src/System Application/Test/Azure AD Licensing/app.json b/src/System Application/Test/Azure AD Licensing/app.json index 2d27bff78e..0038c75b59 100644 --- a/src/System Application/Test/Azure AD Licensing/app.json +++ b/src/System Application/Test/Azure AD Licensing/app.json @@ -67,7 +67,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138458, diff --git a/src/System Application/Test/Azure AD Plan/app.json b/src/System Application/Test/Azure AD Plan/app.json index a2fb806cc5..9217012c62 100644 --- a/src/System Application/Test/Azure AD Plan/app.json +++ b/src/System Application/Test/Azure AD Plan/app.json @@ -85,7 +85,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132912, diff --git a/src/System Application/Test/Azure AD User Management/app.json b/src/System Application/Test/Azure AD User Management/app.json index 20a648aa96..af2a166f75 100644 --- a/src/System Application/Test/Azure AD User Management/app.json +++ b/src/System Application/Test/Azure AD User Management/app.json @@ -103,7 +103,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132909, diff --git a/src/System Application/Test/Azure AD User/app.json b/src/System Application/Test/Azure AD User/app.json index 111f4c35f2..6cd6b7b4af 100644 --- a/src/System Application/Test/Azure AD User/app.json +++ b/src/System Application/Test/Azure AD User/app.json @@ -67,7 +67,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132911, diff --git a/src/System Application/Test/Azure Blob Services API/app.json b/src/System Application/Test/Azure Blob Services API/app.json index e26c032caa..79cb277e6a 100644 --- a/src/System Application/Test/Azure Blob Services API/app.json +++ b/src/System Application/Test/Azure Blob Services API/app.json @@ -38,7 +38,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132919, diff --git a/src/System Application/Test/Azure File Services API/app.json b/src/System Application/Test/Azure File Services API/app.json index 49ea9f40f1..89dc0a750c 100644 --- a/src/System Application/Test/Azure File Services API/app.json +++ b/src/System Application/Test/Azure File Services API/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132518, diff --git a/src/System Application/Test/Azure Key Vault/app.json b/src/System Application/Test/Azure Key Vault/app.json index 2611ae26bd..6379beb52d 100644 --- a/src/System Application/Test/Azure Key Vault/app.json +++ b/src/System Application/Test/Azure Key Vault/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135212, diff --git a/src/System Application/Test/Azure Storage Services Authorization/app.json b/src/System Application/Test/Azure Storage Services Authorization/app.json index 75b945d357..9fad702586 100644 --- a/src/System Application/Test/Azure Storage Services Authorization/app.json +++ b/src/System Application/Test/Azure Storage Services Authorization/app.json @@ -32,7 +32,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132917, diff --git a/src/System Application/Test/BLOB Storage/app.json b/src/System Application/Test/BLOB Storage/app.json index c86c0904fc..8d40847858 100644 --- a/src/System Application/Test/BLOB Storage/app.json +++ b/src/System Application/Test/BLOB Storage/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135030, diff --git a/src/System Application/Test/Barcode/app.json b/src/System Application/Test/Barcode/app.json index 319b6c7379..cc5047ab6b 100644 --- a/src/System Application/Test/Barcode/app.json +++ b/src/System Application/Test/Barcode/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135040, diff --git a/src/System Application/Test/Base64 Convert/app.json b/src/System Application/Test/Base64 Convert/app.json index 92207d6be7..2db3064ac2 100644 --- a/src/System Application/Test/Base64 Convert/app.json +++ b/src/System Application/Test/Base64 Convert/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135041, diff --git a/src/System Application/Test/Business Chart/app.json b/src/System Application/Test/Business Chart/app.json index 56fca3cf29..1125436b09 100644 --- a/src/System Application/Test/Business Chart/app.json +++ b/src/System Application/Test/Business Chart/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135012, diff --git a/src/System Application/Test/Camera and Media Interaction/app.json b/src/System Application/Test/Camera and Media Interaction/app.json index 01bd48aa72..f562eb78e4 100644 --- a/src/System Application/Test/Camera and Media Interaction/app.json +++ b/src/System Application/Test/Camera and Media Interaction/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135011, diff --git a/src/System Application/Test/Caption Class/app.json b/src/System Application/Test/Caption Class/app.json index eee0296be9..158249ce54 100644 --- a/src/System Application/Test/Caption Class/app.json +++ b/src/System Application/Test/Caption Class/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132577, diff --git a/src/System Application/Test/Client Type Management/app.json b/src/System Application/Test/Client Type Management/app.json index 814a6a580b..d0d2a354b3 100644 --- a/src/System Application/Test/Client Type Management/app.json +++ b/src/System Application/Test/Client Type Management/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132700, diff --git a/src/System Application/Test/Confirm Management/app.json b/src/System Application/Test/Confirm Management/app.json index a415b244d9..8412bfe9a2 100644 --- a/src/System Application/Test/Confirm Management/app.json +++ b/src/System Application/Test/Confirm Management/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132509, diff --git a/src/System Application/Test/Cryptography Management/app.json b/src/System Application/Test/Cryptography Management/app.json index 679289c996..48cd68553f 100644 --- a/src/System Application/Test/Cryptography Management/app.json +++ b/src/System Application/Test/Cryptography Management/app.json @@ -42,7 +42,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/Test/Cues and KPIs/app.json b/src/System Application/Test/Cues and KPIs/app.json index abbd1f6a6d..cc659dd576 100644 --- a/src/System Application/Test/Cues and KPIs/app.json +++ b/src/System Application/Test/Cues and KPIs/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135039, diff --git a/src/System Application/Test/Customer Experience Survey/app.json b/src/System Application/Test/Customer Experience Survey/app.json index cf4f75d5f6..fa899d176e 100644 --- a/src/System Application/Test/Customer Experience Survey/app.json +++ b/src/System Application/Test/Customer Experience Survey/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132103, diff --git a/src/System Application/Test/Data Administration/app.json b/src/System Application/Test/Data Administration/app.json index 4083aaa664..3787b21f11 100644 --- a/src/System Application/Test/Data Administration/app.json +++ b/src/System Application/Test/Data Administration/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135018, diff --git a/src/System Application/Test/Data Classification/app.json b/src/System Application/Test/Data Classification/app.json index c38d3af371..abdeb0e18f 100644 --- a/src/System Application/Test/Data Classification/app.json +++ b/src/System Application/Test/Data Classification/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135150, diff --git a/src/System Application/Test/Data Compression/app.json b/src/System Application/Test/Data Compression/app.json index 599f21d6cf..c30f08df76 100644 --- a/src/System Application/Test/Data Compression/app.json +++ b/src/System Application/Test/Data Compression/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139036, diff --git a/src/System Application/Test/Date and Time/app.json b/src/System Application/Test/Date and Time/app.json index 71c06bfbaa..a8cd4b3b32 100644 --- a/src/System Application/Test/Date and Time/app.json +++ b/src/System Application/Test/Date and Time/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132979, diff --git a/src/System Application/Test/Date-Time Dialog/app.json b/src/System Application/Test/Date-Time Dialog/app.json index 778c6e78d9..4cc473f376 100644 --- a/src/System Application/Test/Date-Time Dialog/app.json +++ b/src/System Application/Test/Date-Time Dialog/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 134684, diff --git a/src/System Application/Test/Document Sharing/app.json b/src/System Application/Test/Document Sharing/app.json index fa6de86a01..1899167e90 100644 --- a/src/System Application/Test/Document Sharing/app.json +++ b/src/System Application/Test/Document Sharing/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132593, diff --git a/src/System Application/Test/Edit in Excel/app.json b/src/System Application/Test/Edit in Excel/app.json index ae813497fe..288a0cf21b 100644 --- a/src/System Application/Test/Edit in Excel/app.json +++ b/src/System Application/Test/Edit in Excel/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132525, diff --git a/src/System Application/Test/Email/app.json b/src/System Application/Test/Email/app.json index 22e1ebceb0..87c70b1a66 100644 --- a/src/System Application/Test/Email/app.json +++ b/src/System Application/Test/Email/app.json @@ -85,7 +85,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 134487, diff --git a/src/System Application/Test/Encoding/app.json b/src/System Application/Test/Encoding/app.json index 961c0bdec1..81334878f4 100644 --- a/src/System Application/Test/Encoding/app.json +++ b/src/System Application/Test/Encoding/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132512, diff --git a/src/System Application/Test/Environment Information/app.json b/src/System Application/Test/Environment Information/app.json index cb7a9996db..aa6c7cc9ff 100644 --- a/src/System Application/Test/Environment Information/app.json +++ b/src/System Application/Test/Environment Information/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135091, diff --git a/src/System Application/Test/Extension Management/app.json b/src/System Application/Test/Extension Management/app.json index e70980b42c..9fe09168b4 100644 --- a/src/System Application/Test/Extension Management/app.json +++ b/src/System Application/Test/Extension Management/app.json @@ -55,7 +55,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 133100, diff --git a/src/System Application/Test/Feature Key/app.json b/src/System Application/Test/Feature Key/app.json index 7a5d15cab4..62898e4191 100644 --- a/src/System Application/Test/Feature Key/app.json +++ b/src/System Application/Test/Feature Key/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135003, diff --git a/src/System Application/Test/Field Selection/app.json b/src/System Application/Test/Field Selection/app.json index d29273673e..1ebc600212 100644 --- a/src/System Application/Test/Field Selection/app.json +++ b/src/System Application/Test/Field Selection/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135036, diff --git a/src/System Application/Test/Filter Tokens/app.json b/src/System Application/Test/Filter Tokens/app.json index 4297703e0b..c02e9b011f 100644 --- a/src/System Application/Test/Filter Tokens/app.json +++ b/src/System Application/Test/Filter Tokens/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135034, diff --git a/src/System Application/Test/Geolocation/app.json b/src/System Application/Test/Geolocation/app.json index 68c22e991a..9408071c16 100644 --- a/src/System Application/Test/Geolocation/app.json +++ b/src/System Application/Test/Geolocation/app.json @@ -30,7 +30,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135037, diff --git a/src/System Application/Test/Guided Experience/app.json b/src/System Application/Test/Guided Experience/app.json index 87fcde59d7..88f33e96ee 100644 --- a/src/System Application/Test/Guided Experience/app.json +++ b/src/System Application/Test/Guided Experience/app.json @@ -67,7 +67,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132586, diff --git a/src/System Application/Test/Headlines/app.json b/src/System Application/Test/Headlines/app.json index 58c640ba9f..66a4245d98 100644 --- a/src/System Application/Test/Headlines/app.json +++ b/src/System Application/Test/Headlines/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139481, diff --git a/src/System Application/Test/Image/app.json b/src/System Application/Test/Image/app.json index ab8a478873..18854d3022 100644 --- a/src/System Application/Test/Image/app.json +++ b/src/System Application/Test/Image/app.json @@ -36,7 +36,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135135, diff --git a/src/System Application/Test/Language/app.json b/src/System Application/Test/Language/app.json index cbdb751537..4586753dbc 100644 --- a/src/System Application/Test/Language/app.json +++ b/src/System Application/Test/Language/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130043, diff --git a/src/System Application/Test/MicrosoftGraph/app.json b/src/System Application/Test/MicrosoftGraph/app.json index cfff8de898..9b1969cb66 100644 --- a/src/System Application/Test/MicrosoftGraph/app.json +++ b/src/System Application/Test/MicrosoftGraph/app.json @@ -49,6 +49,6 @@ "to": 135149 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem" } diff --git a/src/System Application/Test/Navigation Bar Subscribers/app.json b/src/System Application/Test/Navigation Bar Subscribers/app.json index f9385d1a78..e702cb31eb 100644 --- a/src/System Application/Test/Navigation Bar Subscribers/app.json +++ b/src/System Application/Test/Navigation Bar Subscribers/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132598, diff --git a/src/System Application/Test/Page Action Provider/app.json b/src/System Application/Test/Page Action Provider/app.json index 8705f8ea77..093bdedb3e 100644 --- a/src/System Application/Test/Page Action Provider/app.json +++ b/src/System Application/Test/Page Action Provider/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132616, diff --git a/src/System Application/Test/Page Summary Provider/app.json b/src/System Application/Test/Page Summary Provider/app.json index 0931c0132b..3280b9e429 100644 --- a/src/System Application/Test/Page Summary Provider/app.json +++ b/src/System Application/Test/Page Summary Provider/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132548, diff --git a/src/System Application/Test/Password/app.json b/src/System Application/Test/Password/app.json index 9b878a5a16..a1b463c8cf 100644 --- a/src/System Application/Test/Password/app.json +++ b/src/System Application/Test/Password/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135033, diff --git a/src/System Application/Test/Performance Profiler/app.json b/src/System Application/Test/Performance Profiler/app.json index 62917a4c7c..e6ea2ef85f 100644 --- a/src/System Application/Test/Performance Profiler/app.json +++ b/src/System Application/Test/Performance Profiler/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135013, diff --git a/src/System Application/Test/Permission Sets/app.json b/src/System Application/Test/Permission Sets/app.json index d099ce7f97..0b373e02f7 100644 --- a/src/System Application/Test/Permission Sets/app.json +++ b/src/System Application/Test/Permission Sets/app.json @@ -67,7 +67,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132437, diff --git a/src/System Application/Test/Privacy Notice/app.json b/src/System Application/Test/Privacy Notice/app.json index b21e6467a5..e0b0ce2bc4 100644 --- a/src/System Application/Test/Privacy Notice/app.json +++ b/src/System Application/Test/Privacy Notice/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132535, diff --git a/src/System Application/Test/Record Link Management/app.json b/src/System Application/Test/Record Link Management/app.json index 5dbf59d45b..67e173edc4 100644 --- a/src/System Application/Test/Record Link Management/app.json +++ b/src/System Application/Test/Record Link Management/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132508, diff --git a/src/System Application/Test/Record Reference/app.json b/src/System Application/Test/Record Reference/app.json index 01fa5e3730..575622f55f 100644 --- a/src/System Application/Test/Record Reference/app.json +++ b/src/System Application/Test/Record Reference/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138706, diff --git a/src/System Application/Test/Record Selection/app.json b/src/System Application/Test/Record Selection/app.json index c1f15df325..ccdcde0c58 100644 --- a/src/System Application/Test/Record Selection/app.json +++ b/src/System Application/Test/Record Selection/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135136, diff --git a/src/System Application/Test/Recurrence Schedule/app.json b/src/System Application/Test/Recurrence Schedule/app.json index c7ba148ccd..2a7de094f2 100644 --- a/src/System Application/Test/Recurrence Schedule/app.json +++ b/src/System Application/Test/Recurrence Schedule/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 134691, diff --git a/src/System Application/Test/Regex/app.json b/src/System Application/Test/Regex/app.json index fe3339bd66..440d031c93 100644 --- a/src/System Application/Test/Regex/app.json +++ b/src/System Application/Test/Regex/app.json @@ -24,7 +24,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135057, diff --git a/src/System Application/Test/Rest Client/app.json b/src/System Application/Test/Rest Client/app.json index ae586f501b..3433c37c1e 100644 --- a/src/System Application/Test/Rest Client/app.json +++ b/src/System Application/Test/Rest Client/app.json @@ -30,7 +30,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/Test/Retention Policy/app.json b/src/System Application/Test/Retention Policy/app.json index 1872236347..32a601f284 100644 --- a/src/System Application/Test/Retention Policy/app.json +++ b/src/System Application/Test/Retention Policy/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138700, diff --git a/src/System Application/Test/Satisfaction Survey/app.json b/src/System Application/Test/Satisfaction Survey/app.json index 2a040d56e8..0b4c00e8b4 100644 --- a/src/System Application/Test/Satisfaction Survey/app.json +++ b/src/System Application/Test/Satisfaction Survey/app.json @@ -79,7 +79,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138074, diff --git a/src/System Application/Test/Secrets/app.json b/src/System Application/Test/Secrets/app.json index 80f7a20c91..415c545389 100644 --- a/src/System Application/Test/Secrets/app.json +++ b/src/System Application/Test/Secrets/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/Test/Security Groups/app.json b/src/System Application/Test/Security Groups/app.json index bf75dba4c8..4964ae91d4 100644 --- a/src/System Application/Test/Security Groups/app.json +++ b/src/System Application/Test/Security Groups/app.json @@ -61,7 +61,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135016, diff --git a/src/System Application/Test/SharePoint Authorization/app.json b/src/System Application/Test/SharePoint Authorization/app.json index 41728777c2..7dd1f65e92 100644 --- a/src/System Application/Test/SharePoint Authorization/app.json +++ b/src/System Application/Test/SharePoint Authorization/app.json @@ -44,7 +44,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132976, diff --git a/src/System Application/Test/SharePoint/app.json b/src/System Application/Test/SharePoint/app.json index 79c8d4a616..33bdd0099a 100644 --- a/src/System Application/Test/SharePoint/app.json +++ b/src/System Application/Test/SharePoint/app.json @@ -50,7 +50,7 @@ ], "screenshots": [], "features": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132970, diff --git a/src/System Application/Test/System Initialization/app.json b/src/System Application/Test/System Initialization/app.json index 8dacfe9bad..7a12c9a61b 100644 --- a/src/System Application/Test/System Initialization/app.json +++ b/src/System Application/Test/System Initialization/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130045, diff --git a/src/System Application/Test/Telemetry/app.json b/src/System Application/Test/Telemetry/app.json index 2158053f61..fbc1cd6308 100644 --- a/src/System Application/Test/Telemetry/app.json +++ b/src/System Application/Test/Telemetry/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139482, diff --git a/src/System Application/Test/Tenant License State/app.json b/src/System Application/Test/Tenant License State/app.json index 908c3bd407..d589cb18c7 100644 --- a/src/System Application/Test/Tenant License State/app.json +++ b/src/System Application/Test/Tenant License State/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138077, diff --git a/src/System Application/Test/Time Zone Selection/app.json b/src/System Application/Test/Time Zone Selection/app.json index f0b30f9987..1373e6e26d 100644 --- a/src/System Application/Test/Time Zone Selection/app.json +++ b/src/System Application/Test/Time Zone Selection/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 137122, diff --git a/src/System Application/Test/Translation/app.json b/src/System Application/Test/Translation/app.json index 8851f7e012..9de8551cdb 100644 --- a/src/System Application/Test/Translation/app.json +++ b/src/System Application/Test/Translation/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 137121, diff --git a/src/System Application/Test/URI/app.json b/src/System Application/Test/URI/app.json index 783b7415f6..0a3339968c 100644 --- a/src/System Application/Test/URI/app.json +++ b/src/System Application/Test/URI/app.json @@ -31,7 +31,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "contextSensitiveHelpUrl": "https://learn.microsoft.com/dynamics365/business-central/dev-itpro/terms/legal/" } diff --git a/src/System Application/Test/Upgrade Tags/app.json b/src/System Application/Test/Upgrade Tags/app.json index cd9c7a06fc..a446d43ba1 100644 --- a/src/System Application/Test/Upgrade Tags/app.json +++ b/src/System Application/Test/Upgrade Tags/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135092, diff --git a/src/System Application/Test/User Details/app.json b/src/System Application/Test/User Details/app.json index 75836a7ac6..f5ec8b474c 100644 --- a/src/System Application/Test/User Details/app.json +++ b/src/System Application/Test/User Details/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132908, diff --git a/src/System Application/Test/User Login Times/app.json b/src/System Application/Test/User Login Times/app.json index eff6a5a49b..e3d7a6f4d3 100644 --- a/src/System Application/Test/User Login Times/app.json +++ b/src/System Application/Test/User Login Times/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130044, diff --git a/src/System Application/Test/User Permissions/app.json b/src/System Application/Test/User Permissions/app.json index c0017c09c6..3369c2f6c7 100644 --- a/src/System Application/Test/User Permissions/app.json +++ b/src/System Application/Test/User Permissions/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139146, diff --git a/src/System Application/Test/User Selection/app.json b/src/System Application/Test/User Selection/app.json index b5f1004b07..bcfb6175c6 100644 --- a/src/System Application/Test/User Selection/app.json +++ b/src/System Application/Test/User Selection/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135035, diff --git a/src/System Application/Test/User Settings/app.json b/src/System Application/Test/User Settings/app.json index bb9f446ba5..7c7ab47467 100644 --- a/src/System Application/Test/User Settings/app.json +++ b/src/System Application/Test/User Settings/app.json @@ -61,7 +61,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132905, diff --git a/src/System Application/Test/Video/app.json b/src/System Application/Test/Video/app.json index 9463125156..0c7553cc7c 100644 --- a/src/System Application/Test/Video/app.json +++ b/src/System Application/Test/Video/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135038, diff --git a/src/System Application/Test/Vs Code Integration/app.json b/src/System Application/Test/Vs Code Integration/app.json index 98f52b9321..ba55d44914 100644 --- a/src/System Application/Test/Vs Code Integration/app.json +++ b/src/System Application/Test/Vs Code Integration/app.json @@ -37,7 +37,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 138133, diff --git a/src/System Application/Test/Web Service Management/app.json b/src/System Application/Test/Web Service Management/app.json index 82e0c468b6..873b408468 100644 --- a/src/System Application/Test/Web Service Management/app.json +++ b/src/System Application/Test/Web Service Management/app.json @@ -43,7 +43,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 139043, diff --git a/src/System Application/Test/Word Templates/app.json b/src/System Application/Test/Word Templates/app.json index a44fc58c6b..a8bc1bf731 100644 --- a/src/System Application/Test/Word Templates/app.json +++ b/src/System Application/Test/Word Templates/app.json @@ -49,7 +49,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130443, diff --git a/src/System Application/Test/XML Validation/app.json b/src/System Application/Test/XML Validation/app.json index 3602ebbb30..8945c2cf4d 100644 --- a/src/System Application/Test/XML Validation/app.json +++ b/src/System Application/Test/XML Validation/app.json @@ -25,7 +25,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 135051, diff --git a/src/System Application/Test/XmlWriter/app.json b/src/System Application/Test/XmlWriter/app.json index e50c2741be..c1d77feb83 100644 --- a/src/System Application/Test/XmlWriter/app.json +++ b/src/System Application/Test/XmlWriter/app.json @@ -24,7 +24,7 @@ "version": "25.2.0.0" } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "target": "OnPrem", "idRanges": [ { diff --git a/src/System Application/Test/app.json b/src/System Application/Test/app.json index b1e5ba2576..8bcf8294a0 100644 --- a/src/System Application/Test/app.json +++ b/src/System Application/Test/app.json @@ -50,7 +50,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "features": [ "GenerateCaptions", "TranslationFile" diff --git a/src/Tools/AI Test Toolkit/app.json b/src/Tools/AI Test Toolkit/app.json index fb7555e9e3..00d8e5dc22 100644 --- a/src/Tools/AI Test Toolkit/app.json +++ b/src/Tools/AI Test Toolkit/app.json @@ -27,7 +27,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 149030, diff --git a/src/Tools/Performance Toolkit/App/app.json b/src/Tools/Performance Toolkit/App/app.json index e3fae88f09..030414402a 100644 --- a/src/Tools/Performance Toolkit/App/app.json +++ b/src/Tools/Performance Toolkit/App/app.json @@ -33,7 +33,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 149000, diff --git a/src/Tools/Performance Toolkit/Test/app.json b/src/Tools/Performance Toolkit/Test/app.json index db2ef4f528..0c045fb1f9 100644 --- a/src/Tools/Performance Toolkit/Test/app.json +++ b/src/Tools/Performance Toolkit/Test/app.json @@ -32,7 +32,7 @@ "to": 144759 } ], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "features": [ "TranslationFile", "GenerateCaptions" diff --git a/src/Tools/Test Framework/Test Libraries/Any/app.json b/src/Tools/Test Framework/Test Libraries/Any/app.json index 5fdad9bf55..4995f1409e 100644 --- a/src/Tools/Test Framework/Test Libraries/Any/app.json +++ b/src/Tools/Test Framework/Test Libraries/Any/app.json @@ -13,7 +13,7 @@ "logo": "ExtensionLogo.png", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130500, diff --git a/src/Tools/Test Framework/Test Libraries/Assert/app.json b/src/Tools/Test Framework/Test Libraries/Assert/app.json index e53d2c5b2e..8bfb40b537 100644 --- a/src/Tools/Test Framework/Test Libraries/Assert/app.json +++ b/src/Tools/Test Framework/Test Libraries/Assert/app.json @@ -13,7 +13,7 @@ "logo": "ExtensionLogo.png", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130002, diff --git a/src/Tools/Test Framework/Test Libraries/Permissions Mock/app.json b/src/Tools/Test Framework/Test Libraries/Permissions Mock/app.json index da6bd19632..370bf45b82 100644 --- a/src/Tools/Test Framework/Test Libraries/Permissions Mock/app.json +++ b/src/Tools/Test Framework/Test Libraries/Permissions Mock/app.json @@ -13,7 +13,7 @@ "logo": "ExtensionLogo.png", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 131006, diff --git a/src/Tools/Test Framework/Test Libraries/Variable Storage/app.json b/src/Tools/Test Framework/Test Libraries/Variable Storage/app.json index 373f1861e9..c614d4a0a1 100644 --- a/src/Tools/Test Framework/Test Libraries/Variable Storage/app.json +++ b/src/Tools/Test Framework/Test Libraries/Variable Storage/app.json @@ -20,7 +20,7 @@ } ], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 131004, diff --git a/src/Tools/Test Framework/Test Runner/app.json b/src/Tools/Test Framework/Test Runner/app.json index 203e748199..c597e73a84 100644 --- a/src/Tools/Test Framework/Test Runner/app.json +++ b/src/Tools/Test Framework/Test Runner/app.json @@ -13,7 +13,7 @@ "logo": "ExtensionLogo.png", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 130450, diff --git a/src/Tools/Test Framework/Test Stability Tools/Prevent Metadata Updates/app.json b/src/Tools/Test Framework/Test Stability Tools/Prevent Metadata Updates/app.json index 3b524997ac..342d6e49b8 100644 --- a/src/Tools/Test Framework/Test Stability Tools/Prevent Metadata Updates/app.json +++ b/src/Tools/Test Framework/Test Stability Tools/Prevent Metadata Updates/app.json @@ -13,7 +13,7 @@ "logo": "ExtensionLogo.png", "dependencies": [], "screenshots": [], - "platform": "25.0.0.0", + "platform": "25.2.0.0", "idRanges": [ { "from": 132553, From 4a075f6bf8f0b22f6393b3bba3b13aaac6f63e37 Mon Sep 17 00:00:00 2001 From: Jesper Schulz-Wedde Date: Thu, 28 Nov 2024 13:13:14 +0100 Subject: [PATCH 08/14] Bug 558934: [25.x][BCApps #2361]No. Series: Ability to extend filters on finding No. Series Lines when getting new numbers (#2416) #### Summary Backport of #2361 #### Work Item(s) Fixes [AB#558934](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/558934) Co-authored-by: Peter Durrer <116004093+PeterDurrer@users.noreply.github.com> --- .../src/Setup/NoSeriesSetupImpl.Codeunit.al | 21 ++++++++++++++++--- .../NoSeries/src/Single/NoSeries.Codeunit.al | 10 +++++++++ .../src/Single/NoSeriesImpl.Codeunit.al | 5 ++--- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Business Foundation/App/NoSeries/src/Setup/NoSeriesSetupImpl.Codeunit.al b/src/Business Foundation/App/NoSeries/src/Setup/NoSeriesSetupImpl.Codeunit.al index 0d29405e4b..8e7385b867 100644 --- a/src/Business Foundation/App/NoSeries/src/Setup/NoSeriesSetupImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeries/src/Setup/NoSeriesSetupImpl.Codeunit.al @@ -15,6 +15,7 @@ codeunit 305 "No. Series - Setup Impl." NumberFormatErr: Label 'The number format in %1 must be the same as the number format in %2.', Comment = '%1=No. Series Code,%2=No. Series Code'; UnIncrementableStringErr: Label 'The value in the %1 field must have a number so that we can assign the next number in the series.', Comment = '%1 = New Field Name'; NumberLengthErr: Label 'The number %1 cannot be extended to more than 20 characters.', Comment = '%1=No.'; + CodeFieldChangedErr: Label 'The filter on %1 was altered by an event subscriber. This is a programming error. Please contact your partner to resolve the issue.\Original %1: %2\Modified Filter: %3', Comment = '%1=NoSeriesLine.FieldCaption("Series Code") %2=Original filter Value of NoSeriesLine."Series Code" %3=New filter Value of NoSeriesLine."Series Code"'; procedure SetImplementation(var NoSeries: Record "No. Series"; Implementation: Enum "No. Series Implementation") var @@ -98,9 +99,7 @@ codeunit 305 "No. Series - Setup Impl." #endif begin NoSeriesLine.Reset(); - NoSeriesLine.SetCurrentKey("Series Code", "Starting Date"); - NoSeriesLine.SetRange("Series Code", NoSeriesRec.Code); - NoSeriesLine.SetRange("Starting Date", 0D, WorkDate()); + SetNoSeriesLineFilters(NoSeriesLine, NoSeriesRec.Code, WorkDate()); #if not CLEAN24 #pragma warning disable AL0432 NoSeriesManagement.RaiseObsoleteOnNoSeriesLineFilterOnBeforeFindLast(NoSeriesLine); @@ -137,6 +136,22 @@ codeunit 305 "No. Series - Setup Impl." exit(NoSeriesSingle.MayProduceGaps()); end; + procedure SetNoSeriesLineFilters(var NoSeriesLine: Record "No. Series Line"; NoSeriesCode: Code[20]; StartingDate: Date) + var + NoSeriesLine2: Record "No. Series Line"; + NoSeries: Codeunit "No. Series"; + begin + NoSeriesLine2.SetCurrentKey("Series Code", "Starting Date"); + NoSeriesLine2.SetRange("Starting Date", 0D, StartingDate); + NoSeriesLine2.SetRange("Series Code", NoSeriesCode); + NoSeries.OnSetNoSeriesLineFilters(NoSeriesLine2); + if NoSeriesLine2.GetFilter("Series Code") <> NoSeriesCode then + Error(CodeFieldChangedErr, NoSeriesLine2.FieldCaption("Series Code"), NoSeriesCode, NoSeriesLine2.GetFilter("Series Code")); + + NoSeriesLine.SetCurrentKey("Series Code", "Starting Date"); + NoSeriesLine.CopyFilters(NoSeriesLine2); + end; + procedure CalculateOpen(NoSeriesLine: Record "No. Series Line"): Boolean var NoSeries: Codeunit "No. Series"; diff --git a/src/Business Foundation/App/NoSeries/src/Single/NoSeries.Codeunit.al b/src/Business Foundation/App/NoSeries/src/Single/NoSeries.Codeunit.al index 38d7107f5d..439dd3057d 100644 --- a/src/Business Foundation/App/NoSeries/src/Single/NoSeries.Codeunit.al +++ b/src/Business Foundation/App/NoSeries/src/Single/NoSeries.Codeunit.al @@ -362,4 +362,14 @@ codeunit 310 "No. Series" internal procedure OnAfterSetNoSeriesCurrentLineFilters(NoSeries: Record "No. Series"; var NoSeriesLine: Record "No. Series Line"; IsDrillDown: Boolean); begin end; + + /// + /// Use this event to set additional filters on the No. Series Line record. These filters are used when searching the No. Series. + /// + /// Changing the filter on the "Series Code" field is not allowed and will result in an error. + /// The No. Series Line to set filters on. + [IntegrationEvent(false, false)] + internal procedure OnSetNoSeriesLineFilters(var NoSeriesLine: Record "No. Series Line"); + begin + end; } diff --git a/src/Business Foundation/App/NoSeries/src/Single/NoSeriesImpl.Codeunit.al b/src/Business Foundation/App/NoSeries/src/Single/NoSeriesImpl.Codeunit.al index c7ee570e03..9109f6b443 100644 --- a/src/Business Foundation/App/NoSeries/src/Single/NoSeriesImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeries/src/Single/NoSeriesImpl.Codeunit.al @@ -155,6 +155,7 @@ codeunit 304 "No. Series - Impl." NoSeriesRec: Record "No. Series"; NoSeriesLine2: Record "No. Series Line"; NoSeries: Codeunit "No. Series"; + NoSeriesSetupImpl: Codeunit "No. Series - Setup Impl."; NoSeriesErrorsImpl: Codeunit "No. Series - Errors Impl."; #if not CLEAN24 #pragma warning disable AL0432 @@ -174,9 +175,7 @@ codeunit 304 "No. Series - Impl." // Find the No. Series Line closest to the usage date NoSeriesLine2.Reset(); - NoSeriesLine2.SetCurrentKey("Series Code", "Starting Date"); - NoSeriesLine2.SetRange("Series Code", NoSeriesCode); - NoSeriesLine2.SetRange("Starting Date", 0D, UsageDate); + NoSeriesSetupImpl.SetNoSeriesLineFilters(NoSeriesLine2, NoSeriesCode, UsageDate); #if not CLEAN24 #pragma warning disable AL0432 NoSeriesManagement.RaiseObsoleteOnNoSeriesLineFilterOnBeforeFindLast(NoSeriesLine2); From 8f85f7e3a3cfd3ff6761097980909a88fe50da19 Mon Sep 17 00:00:00 2001 From: Bert Verbeek Date: Fri, 29 Nov 2024 13:41:46 +0100 Subject: [PATCH 09/14] [25.x] 2293 add page for upgrade tags (#2301) (#2420) #### Summary It would be very welcome to add a page to the upgrade tags table so in that case you can see what kind of upgrade tags there are executed for troubleshooting. #### Work Item(s) Fixes #2417 Fixes [AB#556569](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/556569) --------- #### Summary #### Work Item(s) Fixes # --------- Co-authored-by: Jesper Schulz-Wedde Co-authored-by: Jesper Schulz-Wedde --- .../App/Upgrade Tags/app.json | 4 + .../App/Upgrade Tags/src/UpgradeTags.Page.al | 34 ++++++++ .../App/Upgrade Tags/src/UpgradeTags.Table.al | 4 + .../src/WordTemplatesRelatedList.Page.al | 82 ------------------- 4 files changed, 42 insertions(+), 82 deletions(-) create mode 100644 src/System Application/App/Upgrade Tags/src/UpgradeTags.Page.al delete mode 100644 src/System Application/App/Word Templates/src/WordTemplatesRelatedList.Page.al diff --git a/src/System Application/App/Upgrade Tags/app.json b/src/System Application/App/Upgrade Tags/app.json index 035fb8c9ad..9e7371d3ca 100644 --- a/src/System Application/App/Upgrade Tags/app.json +++ b/src/System Application/App/Upgrade Tags/app.json @@ -14,6 +14,10 @@ "screenshots": [], "platform": "25.2.0.0", "idRanges": [ + { + "from": 9985, + "to": 9985 + }, { "from": 9992, "to": 9994 diff --git a/src/System Application/App/Upgrade Tags/src/UpgradeTags.Page.al b/src/System Application/App/Upgrade Tags/src/UpgradeTags.Page.al new file mode 100644 index 0000000000..96113cff76 --- /dev/null +++ b/src/System Application/App/Upgrade Tags/src/UpgradeTags.Page.al @@ -0,0 +1,34 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Upgrade; +page 9985 "Upgrade Tags" +{ + PageType = List; + ApplicationArea = All; + Caption = 'Upgrade Tags'; + Extensible = false; + UsageCategory = Lists; + SourceTable = "Upgrade Tags"; + InsertAllowed = false; + DeleteAllowed = false; + ModifyAllowed = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(GroupName) + { + field(Tag; Rec.Tag) { } + field("Tag Timestamp"; Rec."Tag Timestamp") { } + field(Company; Rec.Company) { } + field("Skipped Upgrade"; Rec."Skipped Upgrade") { } + } + } + } +} \ No newline at end of file diff --git a/src/System Application/App/Upgrade Tags/src/UpgradeTags.Table.al b/src/System Application/App/Upgrade Tags/src/UpgradeTags.Table.al index 890273a693..b15acb9301 100644 --- a/src/System Application/App/Upgrade Tags/src/UpgradeTags.Table.al +++ b/src/System Application/App/Upgrade Tags/src/UpgradeTags.Table.al @@ -20,22 +20,26 @@ table 9999 "Upgrade Tags" { Caption = 'Tag'; DataClassification = SystemMetadata; + ToolTip = 'Specifies the tag that is used to identify the upgrade.'; } field(2; "Tag Timestamp"; DateTime) { Caption = 'Tag Timestamp'; DataClassification = SystemMetadata; + ToolTip = 'Specifies the date and time when the upgrade is executed.'; } field(3; Company; Code[30]) { Caption = 'Company'; DataClassification = SystemMetadata; + ToolTip = 'Specifies the company where the upgrade is executed.'; } field(4; "Skipped Upgrade"; Boolean) { Caption = 'Skipped Upgrade'; DataClassification = SystemMetadata; + ToolTip = 'Specifies whether the upgrade is skipped.'; } } diff --git a/src/System Application/App/Word Templates/src/WordTemplatesRelatedList.Page.al b/src/System Application/App/Word Templates/src/WordTemplatesRelatedList.Page.al deleted file mode 100644 index 14182112eb..0000000000 --- a/src/System Application/App/Word Templates/src/WordTemplatesRelatedList.Page.al +++ /dev/null @@ -1,82 +0,0 @@ -#if not CLEAN22 -// ------------------------------------------------------------------------------------------------ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. -// ------------------------------------------------------------------------------------------------ - -namespace System.Integration.Word; - -/// -/// A list page to view and edit related entities for Word templates. -/// -page 9985 "Word Templates Related List" -{ - Caption = 'Related Entities'; - PageType = List; - SourceTable = "Word Templates Related Table"; - InsertAllowed = false; - Permissions = tabledata "Word Templates Related Table" = rimd; - Extensible = false; - ObsoleteState = Pending; - ObsoleteTag = '22.0'; - ObsoleteReason = 'No longer used. Use page 9987 Word Templates Related Part instead.'; - InherentEntitlements = X; - InherentPermissions = X; - - layout - { - area(Content) - { - repeater(Tables) - { - field("Table ID"; Rec."Related Table ID") - { - ApplicationArea = All; - ToolTip = 'Specifies the id of the related entity.'; - Visible = false; - } - field("Table Caption"; Rec."Related Table Caption") - { - ApplicationArea = All; - Caption = 'Name'; - ToolTip = 'Specifies the related entity.'; - Editable = false; - - trigger OnAssistEdit() - var - WordTemplateImpl: Codeunit "Word Template Impl."; - begin - WordTemplateImpl.UpdateRelatedEntity(Rec, TableId); - end; - } - field("Related Table Code"; Rec."Related Table Code") - { - ApplicationArea = All; - Caption = 'Field Prefix'; - ToolTip = 'Specifies a prefix that will indicate that the field is from the related entity when you are setting up the template. For example, if you enter SALES, the field names are prefixed with SALES_. The prefix must be unique.'; - } - } - } - } - - trigger OnNewRecord(BelowxRec: Boolean) - begin - Rec."Table ID" := TableId; - end; - - internal procedure AddTable(WordTemplatesRelatedTable: Record "Word Templates Related Table"): Boolean - var - WordTemplateImpl: Codeunit "Word Template Impl."; - begin - exit(WordTemplateImpl.AddRelatedTable(Rec, WordTemplatesRelatedTable)); - end; - - internal procedure SetTableNo(TableNo: Integer) - begin - TableId := TableNo; - end; - - var - TableId: Integer; -} -#endif \ No newline at end of file From 2c3b63c9aa06ebe2c0c9b40a681c6cb60dc8f219 Mon Sep 17 00:00:00 2001 From: bcbuild-github-agent <137281497+bcbuild-github-agent@users.noreply.github.com> Date: Mon, 2 Dec 2024 23:25:53 -0800 Subject: [PATCH 10/14] [25.x] Update translation package version. New value: 25.2.20241128.3 (#2433) This PR contains the following changes: - Update translation package version. New value: 25.2.20241128.3 [AB#539394](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/539394) Co-authored-by: aholstrup1 --- build/Packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Packages.json b/build/Packages.json index c72c888234..2f7f26cfe6 100644 --- a/build/Packages.json +++ b/build/Packages.json @@ -1,6 +1,6 @@ { "Microsoft.Dynamics.BusinessCentral.Translations": { - "Version": "25.2.20241115.1", + "Version": "25.2.20241128.3", "Source": "NuGet.org" }, "AppBaselines-BCArtifacts": { From 09c57a404bece694e0e8175cd5c0c9ba00122e81 Mon Sep 17 00:00:00 2001 From: Darrick Date: Tue, 3 Dec 2024 09:52:15 +0100 Subject: [PATCH 11/14] [releases/25.x] [Email] Add email retrieval filters (#2425) This pull request backports #2415 to releases/25.x Fixes [AB#550315](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/550315) --------- Co-authored-by: Maria Zhelezova <43066499+mazhelez@users.noreply.github.com> --- .github/AL-Go-Settings.json | 3 +- .../App/DotNet Aliases/src/dotnet.al | 10 + .../src/Account/EmailAccountImpl.Codeunit.al | 6 +- .../Email/src/Account/EmailAccounts.Page.al | 34 +- .../DefaultEmailConnectorv2.Codeunit.al | 17 +- .../src/Connector/EmailConnector.Enum.al | 13 +- .../Connector/EmailConnectorv2.Interface.al | 8 +- .../Connector/EmailConnectorv3.Interface.al | 34 ++ .../App/Email/src/Email/Email.Codeunit.al | 78 ++++- .../App/Email/src/Email/EmailImpl.Codeunit.al | 116 +++++-- .../Email/src/Email/Inbox/EmailInbox.Table.al | 10 + .../Inbox/EmailRetrievalFilters.Table.al | 65 ++++ .../App/Email/src/Email/SendEmail.Codeunit.al | 27 +- .../src/Message/EmailMessage.Codeunit.al | 27 +- .../src/Message/EmailMessageImpl.Codeunit.al | 62 ++-- .../Test Library/Email/app.json | 4 + .../Email/src/TestEmailConnector.EnumExt.al | 6 + .../src/TestEmailConnectorv2.Codeunit.al | 8 +- .../src/TestEmailConnectorv3.Codeunit.al | 90 ++++++ .../Test/Email/src/EmailTest.Codeunit.al | 304 ++++++++++++++++-- 20 files changed, 811 insertions(+), 111 deletions(-) create mode 100644 src/System Application/App/Email/src/Connector/EmailConnectorv3.Interface.al create mode 100644 src/System Application/App/Email/src/Email/Inbox/EmailRetrievalFilters.Table.al create mode 100644 src/System Application/Test Library/Email/src/TestEmailConnectorv3.Codeunit.al diff --git a/.github/AL-Go-Settings.json b/.github/AL-Go-Settings.json index 9d995ea2d7..9db124024d 100644 --- a/.github/AL-Go-Settings.json +++ b/.github/AL-Go-Settings.json @@ -18,7 +18,8 @@ "CLEAN22", "CLEAN23", "CLEAN24", - "CLEAN25" + "CLEAN25", + "CLEAN26" ], "unusedALGoSystemFiles": [ "AddExistingAppOrTestApp.yaml", diff --git a/src/System Application/App/DotNet Aliases/src/dotnet.al b/src/System Application/App/DotNet Aliases/src/dotnet.al index 3d6c90fe62..ab644a31b1 100644 --- a/src/System Application/App/DotNet Aliases/src/dotnet.al +++ b/src/System Application/App/DotNet Aliases/src/dotnet.al @@ -261,6 +261,16 @@ dotnet } } + assembly("Microsoft.Dynamics.Nav.AppHTMLSanitizer") + { + Culture = 'neutral'; + PublicKeyToken = '31bf3856ad364e35'; + + type("Microsoft.Dynamics.Nav.AppHTMLSanitizer.AppHtmlSanitizer"; "AppHtmlSanitizer") + { + } + } + assembly("Microsoft.Dynamics.Nav.AzureADGraphClient") { type("Microsoft.Dynamics.Nav.AzureADGraphClient.GroupInfoPage"; "GroupInfoPage") diff --git a/src/System Application/App/Email/src/Account/EmailAccountImpl.Codeunit.al b/src/System Application/App/Email/src/Account/EmailAccountImpl.Codeunit.al index 63bc7aa1f9..b66b5a4022 100644 --- a/src/System Application/App/Email/src/Account/EmailAccountImpl.Codeunit.al +++ b/src/System Application/App/Email/src/Account/EmailAccountImpl.Codeunit.al @@ -29,16 +29,16 @@ codeunit 8889 "Email Account Impl." var EmailAccounts: Record "Email Account"; Connector: Enum "Email Connector"; - IEmailConnector: Interface "Email Connector"; + EmailConnector: Interface "Email Connector"; begin TempEmailAccount.Reset(); TempEmailAccount.DeleteAll(); foreach Connector in Connector.Ordinals do begin - IEmailConnector := Connector; + EmailConnector := Connector; EmailAccounts.DeleteAll(); - IEmailConnector.GetAccounts(EmailAccounts); + EmailConnector.GetAccounts(EmailAccounts); if EmailAccounts.FindSet() then repeat diff --git a/src/System Application/App/Email/src/Account/EmailAccounts.Page.al b/src/System Application/App/Email/src/Account/EmailAccounts.Page.al index bfe33cf06a..71fd3a9995 100644 --- a/src/System Application/App/Email/src/Account/EmailAccounts.Page.al +++ b/src/System Application/App/Email/src/Account/EmailAccounts.Page.al @@ -387,8 +387,8 @@ page 8887 "Email Accounts" IsSelected := not IsNullGuid(SelectedAccountId); EmailAccount.GetAllAccounts(true, Rec); // Refresh the email accounts - if V2Filter then - FilterToConnectorv2Accounts(Rec); + if V2V3Filter then + FilterToConnectorv2v3Accounts(Rec); EmailScenario.GetDefaultEmailAccount(DefaultEmailAccount); // Refresh the default email account if IsSelected then begin @@ -402,7 +402,7 @@ page 8887 "Email Accounts" CurrPage.Update(false); end; - local procedure FilterToConnectorv2Accounts(var EmailAccounts: Record "Email Account") + local procedure FilterToConnectorv2v3Accounts(var EmailAccounts: Record "Email Account") var IConnector: Interface "Email Connector"; begin @@ -411,7 +411,13 @@ page 8887 "Email Accounts" repeat IConnector := EmailAccounts.Connector; - if not (IConnector is "Email Connector v2") then +#if not CLEAN26 +#pragma warning disable AL0432 + if not (IConnector is "Email Connector v2") and not (IConnector is "Email Connector v3") then +#pragma warning restore AL0432 +#else + if not (IConnector is "Email Connector v3") then +#endif EmailAccounts.Delete(); until EmailAccounts.Next() = 0; end; @@ -457,12 +463,24 @@ page 8887 "Email Accounts" end; /// - /// Filters the email accounts to only show accounts that are using the Email Connector v2. + /// Filters the email accounts to only show accounts that are using the Email Connector v2 or v3. /// /// True to filter the email accounts, false to show all email accounts - procedure FilterConnectorV2Accounts(Filter: Boolean) +#if not CLEAN26 + [Obsolete('Replaced by FilterConnectorV3Accounts. In addition, this function now returns both v2 and v3 accounts.', '26.0')] + procedure FilterConnectorV2Accounts(UseFilter: Boolean) begin - V2Filter := Filter; + V2V3Filter := UseFilter; + end; +#endif + + /// + /// Filters the email accounts to only show accounts that are using the Email Connector v2 or v3. + /// + /// True to filter the email accounts, false to show all email accounts + procedure FilterConnectorV3Accounts(UseFilter: Boolean) + begin + V2V3Filter := UseFilter; end; var @@ -477,6 +495,6 @@ page 8887 "Email Accounts" ShowLogo: Boolean; IsLookupMode: Boolean; HasEmailAccount: Boolean; - V2Filter: Boolean; + V2V3Filter: Boolean; EmailConnectorHasBeenUninstalledMsg: Label 'The selected email extension has been uninstalled. To view information about the email account, you must reinstall the extension.'; } \ No newline at end of file diff --git a/src/System Application/App/Email/src/Connector/DefaultEmailConnectorv2.Codeunit.al b/src/System Application/App/Email/src/Connector/DefaultEmailConnectorv2.Codeunit.al index 9be71709cb..1a12853797 100644 --- a/src/System Application/App/Email/src/Connector/DefaultEmailConnectorv2.Codeunit.al +++ b/src/System Application/App/Email/src/Connector/DefaultEmailConnectorv2.Codeunit.al @@ -8,8 +8,15 @@ namespace System.Email; /// /// This is the default implementation of the Email Connector v2 interface which adds the reply, retrievial of emails and marking them as read functionalities. /// -codeunit 8998 "Default Email Connector v2" implements "Email Connector v2" +#if not CLEAN26 +#pragma warning disable AL0432 +codeunit 8998 "Default Email Connector v2" implements "Email Connector v2", "Email Connector v3" +#pragma warning restore AL0432 +#else +codeunit 8998 "Default Email Connector v2" implements "Email Connector v3" +#endif { + procedure Send(EmailMessage: Codeunit "Email Message"; AccountId: Guid) begin @@ -50,10 +57,18 @@ codeunit 8998 "Default Email Connector v2" implements "Email Connector v2" end; +#if not CLEAN26 + [Obsolete('Replaced by RetrieveEmails with an additional Filters parameter of type Record "Email Retrieval Filters".', '26.0')] procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox") begin end; +#endif + + procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary) + begin + + end; procedure MarkAsRead(AccountId: Guid; ExternalId: Text) begin diff --git a/src/System Application/App/Email/src/Connector/EmailConnector.Enum.al b/src/System Application/App/Email/src/Connector/EmailConnector.Enum.al index e7b91df374..e44699a614 100644 --- a/src/System Application/App/Email/src/Connector/EmailConnector.Enum.al +++ b/src/System Application/App/Email/src/Connector/EmailConnector.Enum.al @@ -8,9 +8,18 @@ namespace System.Email; /// /// Enum that holds all of the available email connectors. /// -enum 8889 "Email Connector" implements "Email Connector", "Email Connector v2", "Default Email Rate Limit" +#if not CLEAN26 +#pragma warning disable AL0432 +enum 8889 "Email Connector" implements "Email Connector", "Email Connector v2", "Email Connector v3", "Default Email Rate Limit" +#pragma warning restore AL0432 +#else +enum 8889 "Email Connector" implements "Email Connector", "Email Connector v3", "Default Email Rate Limit" +#endif { Extensible = true; DefaultImplementation = "Default Email Rate Limit" = "Default Email Rate Limit", - "Email Connector v2" = "Default Email Connector v2"; +#if not CLEAN26 + "Email Connector v2" = "Default Email Connector v2", +#endif + "Email Connector v3" = "Default Email Connector v2"; } \ No newline at end of file diff --git a/src/System Application/App/Email/src/Connector/EmailConnectorv2.Interface.al b/src/System Application/App/Email/src/Connector/EmailConnectorv2.Interface.al index 20f36643f5..73fa9a93bd 100644 --- a/src/System Application/App/Email/src/Connector/EmailConnectorv2.Interface.al +++ b/src/System Application/App/Email/src/Connector/EmailConnectorv2.Interface.al @@ -1,3 +1,4 @@ +#if not CLEAN26 // ------------------------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. @@ -10,6 +11,10 @@ namespace System.Email; /// interface "Email Connector v2" extends "Email Connector" { + ObsoleteReason = 'Replaced by "Email Connector v3" which adds filtering capability for retrieval of emails'; + ObsoleteState = Pending; + ObsoleteTag = '26.0'; + /// /// Reply to an e-mail using the provided account. /// @@ -30,4 +35,5 @@ interface "Email Connector v2" extends "Email Connector" /// The email account ID. /// The external ID of the email. procedure MarkAsRead(AccountId: Guid; ExternalId: Text); -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/System Application/App/Email/src/Connector/EmailConnectorv3.Interface.al b/src/System Application/App/Email/src/Connector/EmailConnectorv3.Interface.al new file mode 100644 index 0000000000..3457e2edb0 --- /dev/null +++ b/src/System Application/App/Email/src/Connector/EmailConnectorv3.Interface.al @@ -0,0 +1,34 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Email; + +/// +/// An e-mail connector interface enhances the "Email Connector" with reading, replying to e-mails and marking emails as read. +/// +interface "Email Connector v3" extends "Email Connector" +{ + /// + /// Reply to an e-mail using the provided account. + /// + /// The email message that is to be sent out. + /// The email account ID which is used to send out the email. + procedure Reply(var EmailMessage: Codeunit "Email Message"; AccountId: Guid); + + /// + /// Read e-mails from the provided account. + /// + /// The email account ID which is used to send out the email. + /// The email inbox record that will store the emails. + /// Filters to be used when retrieving emails. + procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary); + + /// + /// Mark an e-mail as read in the provided account. + /// + /// The email account ID. + /// The external ID of the email. + procedure MarkAsRead(AccountId: Guid; ExternalId: Text); +} \ No newline at end of file diff --git a/src/System Application/App/Email/src/Email/Email.Codeunit.al b/src/System Application/App/Email/src/Email/Email.Codeunit.al index 6455872e7a..8968910823 100644 --- a/src/System Application/App/Email/src/Email/Email.Codeunit.al +++ b/src/System Application/App/Email/src/Email/Email.Codeunit.al @@ -197,7 +197,7 @@ codeunit 8901 Email #endregion #region Reply - +#if not CLEAN26 /// /// Sends a reply to an external message id in the foreground. /// @@ -206,9 +206,10 @@ codeunit 8901 Email /// The ID of the email account to use for sending the email. /// The email connector to use for sending the email. /// True if sent + [Obsolete('Replaced by Reply without the ExternalId parameter. ExternalId is not used and is contained in the EmailMessage parameter.', '26.0')] procedure Reply(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean begin - exit(EmailImpl.Reply(EmailMessage, ExternalId, EmailAccountId, EmailConnector)); + exit(EmailImpl.Reply(EmailMessage, EmailAccountId, EmailConnector)); end; /// @@ -219,9 +220,10 @@ codeunit 8901 Email /// The ID of the email account to use for sending the email. /// The email connector to use for sending the email. /// True if sent + [Obsolete('Replaced by ReplyAll without the ExternalId parameter. ExternalId is not used and is contained in the EmailMessage parameter.', '26.0')] procedure ReplyAll(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean begin - exit(EmailImpl.ReplyAll(EmailMessage, ExternalId, EmailAccountId, EmailConnector)); + exit(EmailImpl.ReplyAll(EmailMessage, EmailAccountId, EmailConnector)); end; /// @@ -232,9 +234,10 @@ codeunit 8901 Email /// The ID of the email account to use for sending the email. /// The email connector to use for sending the email. /// The email outbox which is set up for sending in the background. + [Obsolete('Replaced by EnqueueReply without the ExternalId parameter. ExternalId is not used and is contained in the EmailMessage parameter.', '26.0')] procedure EnqueueReply(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") begin - EmailImpl.Reply(EmailMessage, ExternalId, EmailAccountId, EmailConnector, EmailOutbox); + EmailImpl.Reply(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox); end; /// @@ -245,25 +248,88 @@ codeunit 8901 Email /// The ID of the email account to use for sending the email. /// The email connector to use for sending the email. /// The email outbox which is set up for sending in the background. + [Obsolete('Replaced by EnqueueReplyAll without the ExternalId parameter. ExternalId is not used and is contained in the EmailMessage parameter.', '26.0')] procedure EnqueueReplyAll(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") begin - EmailImpl.ReplyAll(EmailMessage, ExternalId, EmailAccountId, EmailConnector, EmailOutbox); + EmailImpl.ReplyAll(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox); + end; +#endif + + /// + /// Sends a reply to an external message id in the foreground. + /// + /// The email message with the details of the recipients and reply to be added. + /// The ID of the email account to use for sending the email. + /// The email connector to use for sending the email. + /// True if sent + procedure Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean + begin + exit(EmailImpl.Reply(EmailMessage, EmailAccountId, EmailConnector)); + end; + + /// + /// Sends a reply to an external message id to all recipients on that email in the foreground. + /// + /// The email message with the details of the recipients and reply to be added. + /// The ID of the email account to use for sending the email. + /// The email connector to use for sending the email. + /// True if sent + procedure ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean + begin + exit(EmailImpl.ReplyAll(EmailMessage, EmailAccountId, EmailConnector)); + end; + + /// + /// Sends a reply to an external message id in the background. + /// + /// The email message with the details of the recipients and reply to be added. + /// The ID of the email account to use for sending the email. + /// The email connector to use for sending the email. + /// The email outbox which is set up for sending in the background. + procedure EnqueueReply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") + begin + EmailImpl.Reply(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox); + end; + + /// + /// Sends a reply to an external message id to all recipients on that email in the foreground. + /// + /// The email message with the details of the recipients and reply to be added. + /// The ID of the email account to use for sending the email. + /// The email connector to use for sending the email. + /// The email outbox which is set up for sending in the background. + procedure EnqueueReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") + begin + EmailImpl.ReplyAll(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox); end; #endregion #region RetrieveEmails - +#if not CLEAN26 /// /// Retrieves emails from the email account. /// /// The ID of the email account to use for sending the email. /// The email connector to use for sending the email. /// The return record of all new emails that were retrieved. + [Obsolete('Replaced by RetrieveEmails with an additional Filters parameter of type Record "Email Retrieval Filters".', '26.0')] procedure RetrieveEmails(EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox") begin EmailImpl.RetrieveEmails(EmailAccountId, EmailConnector, EmailInbox); end; +#endif + /// + /// Retrieves emails from the email account. + /// + /// The ID of the email account to use for sending the email. + /// The email connector to use for sending the email. + /// The return record of all new emails that were retrieved. + /// Filters to be used when retrieving emails. + procedure RetrieveEmails(EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary) + begin + EmailImpl.RetrieveEmails(EmailAccountId, EmailConnector, EmailInbox, Filters); + end; #endregion diff --git a/src/System Application/App/Email/src/Email/EmailImpl.Codeunit.al b/src/System Application/App/Email/src/Email/EmailImpl.Codeunit.al index e08ce2c8a6..c181dfe49f 100644 --- a/src/System Application/App/Email/src/Email/EmailImpl.Codeunit.al +++ b/src/System Application/App/Email/src/Email/EmailImpl.Codeunit.al @@ -125,31 +125,31 @@ codeunit 8900 "Email Impl" exit(Send(EmailMessage, EmailAccountId, EmailConnector, false, CurrentDateTime(), EmailOutbox)); end; - procedure Reply(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean + procedure Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean var EmailOutbox: Record "Email Outbox"; begin - exit(Reply(EmailMessage, ExternalId, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), false, false)); + exit(Reply(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), false, false)); end; - procedure ReplyAll(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean + procedure ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean var EmailOutbox: Record "Email Outbox"; begin - exit(Reply(EmailMessage, ExternalId, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), false, true)); + exit(Reply(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), false, true)); end; - procedure Reply(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") + procedure Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") begin - Reply(EmailMessage, ExternalId, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), true, false); + Reply(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), true, false); end; - procedure ReplyAll(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") + procedure ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox") begin - Reply(EmailMessage, ExternalId, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), true, true); + Reply(EmailMessage, EmailAccountId, EmailConnector, EmailOutbox, CurrentDateTime(), true, true); end; - procedure Reply(EmailMessage: Codeunit "Email Message"; ExternalId: Text; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox"; NotBefore: DateTime; InBackground: Boolean; ReplyToAll: Boolean): Boolean + procedure Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox"; NotBefore: DateTime; InBackground: Boolean; ReplyToAll: Boolean): Boolean var EmailAccountRec: Record "Email Account"; CurrentUser: Record User; @@ -172,6 +172,9 @@ codeunit 8900 "Email Impl" if GetEmailOutbox(EmailMessage.GetId(), EmailOutbox) and IsOutboxEnqueued(EmailOutbox) then Error(EmailMessageQueuedErr); + if EmailMessage.GetExternalId() = '' then + Error(ExternalIdCannotBeEmptyErr); + // Get email account GetEmailAccount(EmailAccountId, EmailConnector, EmailAccountRec); @@ -199,17 +202,41 @@ codeunit 8900 "Email Impl" procedure RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox") var - IEmailConnectorv2: Interface "Email Connector v2"; + Filters: Record "Email Retrieval Filters"; + begin + Filters.Insert(); + RetrieveEmails(EmailAccountId, Connector, EmailInbox, Filters); + end; + + procedure RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary) + var +#if not CLEAN26 +#pragma warning disable AL0432 + EmailConnectorv2: Interface "Email Connector v2"; +#pragma warning restore AL0432 +#endif + EmailConnectorv3: Interface "Email Connector v3"; begin CheckRequiredPermissions(); - if CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then begin + if CheckAndGetEmailConnectorv3(Connector, EmailConnectorv3) then begin TelemetryAppsAndPublishers(TelemetryRetrieveEmailsUsedTxt); - IEmailConnectorv2.RetrieveEmails(EmailAccountId, EmailInbox); - end else - Error(EmailConnectorDoesNotSupportRetrievingEmailsErr); + EmailConnectorv3.RetrieveEmails(EmailAccountId, EmailInbox, Filters); + EmailInbox.MarkedOnly(true); + exit; + end; +#if not CLEAN26 +#pragma warning disable AL0432 + if CheckAndGetEmailConnectorv2(Connector, EmailConnectorv2) then begin +#pragma warning restore AL0432 + TelemetryAppsAndPublishers(TelemetryRetrieveEmailsUsedTxt); + EmailConnectorv2.RetrieveEmails(EmailAccountId, EmailInbox); + EmailInbox.MarkedOnly(true); + exit; + end; +#endif - EmailInbox.MarkedOnly(true); + Error(EmailConnectorDoesNotSupportRetrievingEmailsErr); end; local procedure TelemetryAppsAndPublishers(Message: Text) @@ -236,30 +263,59 @@ codeunit 8900 "Email Impl" procedure MarkAsRead(EmailAccountId: Guid; Connector: Enum "Email Connector"; ExternalId: Text) var - IEmailConnectorv2: Interface "Email Connector v2"; +#if not CLEAN26 +#pragma warning disable AL0432 + EmailConnectorv2: Interface "Email Connector v2"; +#pragma warning restore AL0432 +#endif + EmailConnectorv3: Interface "Email Connector v3"; begin CheckRequiredPermissions(); if ExternalId = '' then Error(ExternalIdCannotBeEmptyErr); - if CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then - IEmailConnectorv2.MarkAsRead(EmailAccountId, ExternalId) - else - Error(EmailConnectorDoesNotSupportMarkAsReadErr); + if CheckAndGetEmailConnectorv3(Connector, EmailConnectorv3) then begin + EmailConnectorv3.MarkAsRead(EmailAccountId, ExternalId); + exit; + end; +#if not CLEAN26 +#pragma warning disable AL0432 + if CheckAndGetEmailConnectorv2(Connector, EmailConnectorv2) then begin +#pragma warning restore AL0432 + EmailConnectorv2.MarkAsRead(EmailAccountId, ExternalId); + exit; + end; +#endif + + Error(EmailConnectorDoesNotSupportMarkAsReadErr); end; procedure CheckReplySupported(Connector: Enum "Email Connector"): Boolean var - IEmailConnectorv2: Interface "Email Connector v2"; +#if not CLEAN26 +#pragma warning disable AL0432 + EmailConnectorv2: Interface "Email Connector v2"; +#pragma warning restore AL0432 +#endif + EmailConnectorv3: Interface "Email Connector v3"; begin - if not CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then - Error(EmailconnectorDoesNotSupportReplyingErr); + if CheckAndGetEmailConnectorv3(Connector, EmailConnectorv3) then + exit(true); +#if not CLEAN26 +#pragma warning disable AL0432 + if CheckAndGetEmailConnectorv2(Connector, EmailConnectorv2) then + exit(true); +#pragma warning restore AL0432 +#endif - exit(true); + Error(EmailconnectorDoesNotSupportReplyingErr); end; - +#if not CLEAN26 +#pragma warning disable AL0432 + [Obsolete('Replaced by CheckAndGetEmailConnectorv3.', '26.0')] procedure CheckAndGetEmailConnectorv2(Connector: Interface "Email Connector"; var Connectorv2: Interface "Email Connector v2"): Boolean +#pragma warning restore AL0432 begin if Connector is "Email Connector v2" then begin Connectorv2 := Connector as "Email Connector v2"; @@ -267,6 +323,16 @@ codeunit 8900 "Email Impl" end else exit(false); end; +#endif + + procedure CheckAndGetEmailConnectorv3(Connector: Interface "Email Connector"; var Connectorv3: Interface "Email Connector v3"): Boolean + begin + if Connector is "Email Connector v3" then begin + Connectorv3 := Connector as "Email Connector v3"; + exit(true); + end else + exit(false); + end; procedure OpenInEditor(EmailMessage: Codeunit "Email Message"; EmailScenario: Enum "Email Scenario"; IsModal: Boolean): Enum "Email Action" var diff --git a/src/System Application/App/Email/src/Email/Inbox/EmailInbox.Table.al b/src/System Application/App/Email/src/Email/Inbox/EmailInbox.Table.al index 4235488296..d9ba46f55f 100644 --- a/src/System Application/App/Email/src/Email/Inbox/EmailInbox.Table.al +++ b/src/System Application/App/Email/src/Email/Inbox/EmailInbox.Table.al @@ -76,6 +76,16 @@ table 8886 "Email Inbox" { DataClassification = CustomerContent; } + + field(13; "Is Read"; Boolean) + { + DataClassification = CustomerContent; + } + + field(14; "Is Draft"; Boolean) + { + DataClassification = CustomerContent; + } } keys diff --git a/src/System Application/App/Email/src/Email/Inbox/EmailRetrievalFilters.Table.al b/src/System Application/App/Email/src/Email/Inbox/EmailRetrievalFilters.Table.al new file mode 100644 index 0000000000..7f17da78b6 --- /dev/null +++ b/src/System Application/App/Email/src/Email/Inbox/EmailRetrievalFilters.Table.al @@ -0,0 +1,65 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Email; + +/// Holds information about the filters for retrieving emails. +table 8885 "Email Retrieval Filters" +{ + Access = Public; + TableType = Temporary; + DataClassification = SystemMetadata; + InherentEntitlements = RIMDX; + InherentPermissions = RIMDX; + + fields + { + field(1; Id; Integer) + { + AutoIncrement = true; + } + + field(2; "Load Attachments"; Boolean) + { + Caption = 'Load Attachments'; + } + + field(3; "Unread Emails"; Boolean) + { + Caption = 'Unread Emails'; + } + + field(4; "Draft Emails"; Boolean) + { + Caption = 'Draft Emails'; + } + + field(5; "Max No. of Emails"; Integer) + { + InitValue = 20; + Caption = 'Max No. of Emails'; + } + + field(6; "Body Type"; Option) + { + OptionMembers = "HTML","Text"; + InitValue = "HTML"; + Caption = 'Body Type'; + } + + field(7; "Earliest Email"; DateTime) + { + Caption = 'Earliest Email'; + } + } + + keys + { + key(PK; Id) + { + Clustered = true; + } + } +} \ No newline at end of file diff --git a/src/System Application/App/Email/src/Email/SendEmail.Codeunit.al b/src/System Application/App/Email/src/Email/SendEmail.Codeunit.al index 08fd191271..c236de3940 100644 --- a/src/System Application/App/Email/src/Email/SendEmail.Codeunit.al +++ b/src/System Application/App/Email/src/Email/SendEmail.Codeunit.al @@ -16,22 +16,33 @@ codeunit 8890 "Send Email" var EmailMessage: Codeunit "Email Message"; EmailImpl: Codeunit "Email Impl"; - IEmailConnector: Interface "Email Connector"; - IEmailConnectorv2: Interface "Email Connector v2"; + EmailConnector: Interface "Email Connector"; +#if not CLEAN26 +#pragma warning disable AL0432 + EmailConnectorv2: Interface "Email Connector v2"; +#pragma warning restore AL0432 +#endif + EmailConnectorv3: Interface "Email Connector v3"; begin EmailMessage.Get(Rec.Id); if EmailMessage.GetExternalId() <> '' then begin - IEmailConnector := EmailConnector; - if EmailImpl.CheckAndGetEmailConnectorv2(IEmailConnector, IEmailConnectorv2) then - IEmailConnectorv2.Reply(EmailMessage, AccountId); + EmailConnector := GlobalEmailConnector; +#if not CLEAN26 +#pragma warning disable AL0432 + if EmailImpl.CheckAndGetEmailConnectorv2(EmailConnector, EmailConnectorv2) then +#pragma warning restore AL0432 + EmailConnectorv2.Reply(EmailMessage, AccountId); +#endif + if EmailImpl.CheckAndGetEmailConnectorv3(EmailConnector, EmailConnectorv3) then + EmailConnectorv3.Reply(EmailMessage, AccountId); end else - EmailConnector.Send(EmailMessage, AccountId); + GlobalEmailConnector.Send(EmailMessage, AccountId); end; procedure SetConnector(NewEmailConnector: Interface "Email Connector") begin - EmailConnector := NewEmailConnector; + GlobalEmailConnector := NewEmailConnector; end; procedure SetAccount(NewAccountId: Guid) @@ -40,6 +51,6 @@ codeunit 8890 "Send Email" end; var - EmailConnector: Interface "Email Connector"; + GlobalEmailConnector: Interface "Email Connector"; AccountId: Guid; } \ No newline at end of file diff --git a/src/System Application/App/Email/src/Message/EmailMessage.Codeunit.al b/src/System Application/App/Email/src/Message/EmailMessage.Codeunit.al index 01c836d4c8..3ae7967701 100644 --- a/src/System Application/App/Email/src/Message/EmailMessage.Codeunit.al +++ b/src/System Application/App/Email/src/Message/EmailMessage.Codeunit.al @@ -35,6 +35,21 @@ codeunit 8904 "Email Message" EmailMessageImpl.Create(ToRecipients, Subject, Body, HtmlFormatted); end; + /// + /// Creates the email with recipients, subject, and body. + /// + /// The recipient(s) of the email. A string containing the email addresses of the recipients separated by semicolon. + /// The subject of the email. + /// The body of the email. + /// Whether the body is HTML formatted. + /// If the body is of HTML formatting, most of it will be sanitized. Keeping only tags and no styling. + /// Sanitize is only applicable if the body is HTML formatted. It also helps prevent potential email messages from hiding images and text from the user. + procedure Create(ToRecipients: Text; Subject: Text; Body: Text; HtmlFormatted: Boolean; Sanitize: Boolean) + begin + EmailMessageImpl.Create(ToRecipients, Subject, Body, HtmlFormatted, Sanitize); + end; + + /// /// Creates the email with recipients, subject, and body. /// @@ -43,8 +58,11 @@ codeunit 8904 "Email Message" /// The body of the email /// Whether the body is HTML formatted procedure Create(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean) + var + CCRecipients: List of [Text]; + BCCRecipients: List of [Text]; begin - EmailMessageImpl.Create(ToRecipients, Subject, Body, HtmlFormatted); + EmailMessageImpl.Create(ToRecipients, Subject, Body, HtmlFormatted, CCRecipients, BCCRecipients, false); end; /// @@ -58,7 +76,7 @@ codeunit 8904 "Email Message" /// TThe BCC recipient(s) of the email. A list of email addresses that will be listed as BCC. procedure Create(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; CCRecipients: List of [Text]; BCCRecipients: List of [Text]) begin - EmailMessageImpl.Create(ToRecipients, Subject, Body, HtmlFormatted, CCRecipients, BCCRecipients); + EmailMessageImpl.Create(ToRecipients, Subject, Body, HtmlFormatted, CCRecipients, BCCRecipients, false); end; /// @@ -83,8 +101,11 @@ codeunit 8904 "Email Message" /// Whether the body is HTML formatted. /// The external message id to reply to. procedure CreateReply(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text) + var + CCRecipients: List of [Text]; + BCCRecipients: List of [Text]; begin - EmailMessageImpl.CreateReply(ToRecipients, Subject, Body, HtmlFormatted, ExternalId); + EmailMessageImpl.CreateReply(ToRecipients, Subject, Body, HtmlFormatted, ExternalId, CCRecipients, BCCRecipients); end; /// diff --git a/src/System Application/App/Email/src/Message/EmailMessageImpl.Codeunit.al b/src/System Application/App/Email/src/Message/EmailMessageImpl.Codeunit.al index 1ceac8f859..9dc5be3522 100644 --- a/src/System Application/App/Email/src/Message/EmailMessageImpl.Codeunit.al +++ b/src/System Application/App/Email/src/Message/EmailMessageImpl.Codeunit.al @@ -53,57 +53,50 @@ codeunit 8905 "Email Message Impl." end; procedure Create(ToRecipients: Text; Subject: Text; Body: Text; HtmlFormatted: Boolean) - var - EmptyList: List of [Text]; begin -#pragma warning disable AA0205 - Create(EmptyList, Subject, Body, HtmlFormatted); -#pragma warning restore AA0205 - - SetRecipients(Enum::"Email Recipient Type"::"To", ToRecipients); + Create(ToRecipients, Subject, Body, HtmlFormatted, false); end; - procedure Create(Recipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean) + procedure Create(ToRecipients: Text; Subject: Text; Body: Text; HtmlFormatted: Boolean; Sanitize: Boolean) var - EmptyList: List of [Text]; + Recipients: List of [Text]; + CCRecipients: List of [Text]; + BCCRecipients: List of [Text]; begin -#pragma warning disable AA0205 - Create(Recipients, Subject, Body, HtmlFormatted, EmptyList, EmptyList); -#pragma warning restore AA0205 + Create(Recipients, Subject, Body, HtmlFormatted, CCRecipients, BCCRecipients, Sanitize); + + SetRecipients(Enum::"Email Recipient Type"::"To", ToRecipients); end; - procedure Create(Recipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; CCRecipients: List of [Text]; BCCRecipients: List of [Text]) + procedure Create(Recipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; CCRecipients: List of [Text]; BCCRecipients: List of [Text]; Sanitize: Boolean) begin InitializeCreation(); - UpdateMessage(Recipients, Subject, Body, HtmlFormatted, '', CCRecipients, BCCRecipients); + UpdateMessage(Recipients, Subject, Body, HtmlFormatted, '', CCRecipients, BCCRecipients, Sanitize); end; procedure CreateReply(ToRecipients: Text; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text) var - EmptyList: List of [Text]; + Recipients: List of [Text]; + CCRecipients: List of [Text]; + BCCRecipients: List of [Text]; begin - CreateReply(EmptyList, Subject, Body, HtmlFormatted, ExternalId, EmptyList, EmptyList); + CreateReply(Recipients, Subject, Body, HtmlFormatted, ExternalId, CCRecipients, BCCRecipients); SetRecipients(Enum::"Email Recipient Type"::"To", ToRecipients); end; - procedure CreateReply(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text) - var - EmptyList: List of [Text]; + procedure CreateReply(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text; CCRecipients: List of [Text]; BCCRecipients: List of [Text]) begin - CreateReply(ToRecipients, Subject, Body, HtmlFormatted, ExternalId, EmptyList, EmptyList); + InitializeCreation(); + UpdateMessage(ToRecipients, Subject, Body, HtmlFormatted, ExternalId, CCRecipients, BCCRecipients, false); end; procedure CreateReplyAll(Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text) var - EmptyList: List of [Text]; + ToRecipients: List of [Text]; + CCRecipients: List of [Text]; + BCCRecipients: List of [Text]; begin - CreateReply(EmptyList, Subject, Body, HtmlFormatted, ExternalId, EmptyList, EmptyList); - end; - - procedure CreateReply(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text; CCRecipients: List of [Text]; BCCRecipients: List of [Text]) - begin - InitializeCreation(); - UpdateMessage(ToRecipients, Subject, Body, HtmlFormatted, ExternalId, CCRecipients, BCCRecipients); + CreateReply(ToRecipients, Subject, Body, HtmlFormatted, ExternalId, CCRecipients, BCCRecipients); end; local procedure InitializeCreation() @@ -115,8 +108,11 @@ codeunit 8905 "Email Message Impl." GlobalEmailMessage.Insert(); end; - procedure UpdateMessage(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text; CCRecipients: List of [Text]; BCCRecipients: List of [Text]) + procedure UpdateMessage(ToRecipients: List of [Text]; Subject: Text; Body: Text; HtmlFormatted: Boolean; ExternalId: Text; CCRecipients: List of [Text]; BCCRecipients: List of [Text]; Sanitize: Boolean) begin + if HtmlFormatted and Sanitize then + Body := SanitizeBody(Body); + SetBodyValue(Body); SetSubjectValue(Subject); SetBodyHTMLFormattedValue(HtmlFormatted); @@ -128,6 +124,14 @@ codeunit 8905 "Email Message Impl." SetRecipients(Enum::"Email Recipient Type"::Bcc, BCCRecipients); end; + local procedure SanitizeBody(Body: Text): Text + var + AppHTMLSanitizer: DotNet AppHtmlSanitizer; + begin + AppHTMLSanitizer := AppHTMLSanitizer.AppHtmlSanitizer(); + exit(AppHTMLSanitizer.SanitizeEmail(Body)); + end; + procedure Modify() var EmailMessage: Record "Email Message"; diff --git a/src/System Application/Test Library/Email/app.json b/src/System Application/Test Library/Email/app.json index 20a3312277..29291181ac 100644 --- a/src/System Application/Test Library/Email/app.json +++ b/src/System Application/Test Library/Email/app.json @@ -40,6 +40,10 @@ { "from": 134694, "to": 134694 + }, + { + "from": 134702, + "to": 134702 } ], "contextSensitiveHelpUrl": "https://go.microsoft.com/fwlink/?linkid=2134520", diff --git a/src/System Application/Test Library/Email/src/TestEmailConnector.EnumExt.al b/src/System Application/Test Library/Email/src/TestEmailConnector.EnumExt.al index d6810edf0b..b438681ab3 100644 --- a/src/System Application/Test Library/Email/src/TestEmailConnector.EnumExt.al +++ b/src/System Application/Test Library/Email/src/TestEmailConnector.EnumExt.al @@ -13,8 +13,14 @@ enumextension 134684 "Test Email Connector" extends "Email Connector" { Implementation = "Email Connector" = "Test Email Connector"; } +#if not CLEAN26 value(134685; "Test Email Connector v2") { Implementation = "Email Connector" = "Test Email Connector v2"; } +#endif + value(134686; "Test Email Connector v3") + { + Implementation = "Email Connector" = "Test Email Connector v3"; + } } \ No newline at end of file diff --git a/src/System Application/Test Library/Email/src/TestEmailConnectorv2.Codeunit.al b/src/System Application/Test Library/Email/src/TestEmailConnectorv2.Codeunit.al index 7e2d9dd685..c7602641ad 100644 --- a/src/System Application/Test Library/Email/src/TestEmailConnectorv2.Codeunit.al +++ b/src/System Application/Test Library/Email/src/TestEmailConnectorv2.Codeunit.al @@ -1,3 +1,4 @@ +#if not CLEAN26 // ------------------------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. @@ -7,7 +8,9 @@ namespace System.TestLibraries.Email; using System.Email; -codeunit 134682 "Test Email Connector v2" implements "Email Connector v2", "Email Connector" // Temporary bug #540622 +#pragma warning disable AL0432 +codeunit 134682 "Test Email Connector v2" implements "Email Connector v2" +#pragma warning restore AL0432 { var @@ -87,4 +90,5 @@ codeunit 134682 "Test Email Connector v2" implements "Email Connector v2", "Emai if ConnectorMock.FailOnMarkAsRead() then Error('Failed to mark email as read'); end; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/System Application/Test Library/Email/src/TestEmailConnectorv3.Codeunit.al b/src/System Application/Test Library/Email/src/TestEmailConnectorv3.Codeunit.al new file mode 100644 index 0000000000..20c89be8aa --- /dev/null +++ b/src/System Application/Test Library/Email/src/TestEmailConnectorv3.Codeunit.al @@ -0,0 +1,90 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.TestLibraries.Email; + +using System.Email; + +codeunit 134702 "Test Email Connector v3" implements "Email Connector v3" +{ + + var + ConnectorMock: Codeunit "Connector Mock"; + + procedure Send(EmailMessage: Codeunit "Email Message"; AccountId: Guid) + begin + ConnectorMock.SetEmailMessageID(EmailMessage.GetId()); + Commit(); + if ConnectorMock.FailOnSend() then + Error('Failed to send email'); + end; + + procedure GetAccounts(var Accounts: Record "Email Account") + begin + ConnectorMock.GetAccounts(Accounts, Enum::"Email Connector"::"Test Email Connector v3"); + end; + + procedure ShowAccountInformation(AccountId: Guid) + begin + Message('Showing information for account: %1', AccountId); + end; + + procedure RegisterAccount(var EmailAccount: Record "Email Account"): Boolean + begin + if ConnectorMock.FailOnRegisterAccount() then + Error('Failed to register account'); + + if ConnectorMock.UnsuccessfulRegister() then + exit(false); + + EmailAccount."Account Id" := CreateGuid(); + EmailAccount."Email Address" := 'Test email address'; + EmailAccount.Name := 'Test account'; + + exit(true); + end; + + procedure DeleteAccount(AccountId: Guid): Boolean + var + TestEmailAccount: Record "Test Email Account"; + begin + if TestEmailAccount.Get(AccountId) then + exit(TestEmailAccount.Delete()); + exit(false); + end; + + procedure GetLogoAsBase64(): Text + begin + + end; + + procedure GetDescription(): Text[250] + begin + exit('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ornare ante a est commodo interdum. Pellentesque eu diam maximus, faucibus neque ut, viverra leo. Praesent ullamcorper nibh ut pretium dapibus. Nullam eu dui libero. Etiam ac cursus metus.') + end; + + procedure Reply(var EmailMessage: Codeunit "Email Message"; AccountId: Guid) + begin + if ConnectorMock.FailOnReply() then + Error('Failed to send email'); + end; + + procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox"; var Filter: Record "Email Retrieval Filters" temporary) + begin + if ConnectorMock.FailOnRetrieveEmails() then + Error('Failed to retrieve emails'); + + ConnectorMock.CreateEmailInbox(AccountId, Enum::"Email Connector"::"Test Email Connector v3", EmailInbox); + EmailInbox.Mark(true); + ConnectorMock.CreateEmailInbox(AccountId, Enum::"Email Connector"::"Test Email Connector v3", EmailInbox); + EmailInbox.Mark(true); + end; + + procedure MarkAsRead(AccountId: Guid; ConversationId: Text) + begin + if ConnectorMock.FailOnMarkAsRead() then + Error('Failed to mark email as read'); + end; +} \ No newline at end of file diff --git a/src/System Application/Test/Email/src/EmailTest.Codeunit.al b/src/System Application/Test/Email/src/EmailTest.Codeunit.al index dc28d58a37..45ab5a8cfe 100644 --- a/src/System Application/Test/Email/src/EmailTest.Codeunit.al +++ b/src/System Application/Test/Email/src/EmailTest.Codeunit.al @@ -390,7 +390,6 @@ codeunit 134685 "Email Test" Assert.ExpectedError(EmailMessageCannotBeEditedErr); end; - [Test] [HandlerFunctions('EmailEditorHandler,OnEmailEditorClose')] procedure OpenInEditorModallyDiscardAOptionTest() @@ -1403,6 +1402,7 @@ codeunit 134685 "Email Test" var EmailAccount: Record "Email Account"; EmailInbox: Record "Email Inbox"; + TempFilters: Record "Email Retrieval Filters" temporary; ConnectorMock: Codeunit "Connector Mock"; begin // [Scenario] Retrieving emails with a V1 connector should fail @@ -1412,12 +1412,14 @@ codeunit 134685 "Email Test" // [When] Retrieving emails // [Then] An error is thrown that the connector does not support this operation - asserterror Email.RetrieveEmails(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox); + asserterror Email.RetrieveEmails(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox, TempFilters); Assert.ExpectedError('The selected email connector does not support retrieving emails'); end; +#if not CLEAN26 [Test] - procedure RetrieveEmails() + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] + procedure RetrieveEmailsv2() var EmailAccount: Record "Email Account"; EmailInbox: Record "Email Inbox"; @@ -1438,7 +1440,9 @@ codeunit 134685 "Email Test" InitialId := EmailInbox.Id; // [When] Retrieving emails +#pragma warning disable AL0432 Email.RetrieveEmails(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox); +#pragma warning restore AL0432 // [Then] The EmailInbox will be filled only with new emails and not existing ones EmailInbox.FindSet(); @@ -1450,7 +1454,8 @@ codeunit 134685 "Email Test" end; [Test] - procedure RetrieveEmailsFail() + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] + procedure RetrieveEmailsFailv2() var EmailAccount: Record "Email Account"; EmailInbox: Record "Email Inbox"; @@ -1472,7 +1477,73 @@ codeunit 134685 "Email Test" ConnectorMock.FailOnRetrieveEmails(true); // [When] Retrieving emails +#pragma warning disable AL0432 asserterror Email.RetrieveEmails(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox); +#pragma warning restore AL0432 + + // [Then] The EmailInbox will be filled only with new emails and not existing ones + Assert.ExpectedError('Failed to retrieve emails'); + end; +#endif + [Test] + procedure RetrieveEmailsv3() + var + EmailAccount: Record "Email Account"; + EmailInbox: Record "Email Inbox"; + TempFilters: Record "Email Retrieval Filters" temporary; + ConnectorMock: Codeunit "Connector Mock"; + InitialId: Integer; + begin + // [Scenario] Retrieving emails with a V3 connector will succeed and the EmailInbox will be filled only with new emails and not existing ones + PermissionsMock.Set('Email Edit'); + + // [Given] An email account with a V3 connector + // [Given] Existing emails in Email Inbox + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + + EmailInbox.DeleteAll(); + ConnectorMock.CreateEmailInbox(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox); + Assert.AreEqual(1, EmailInbox.Count(), 'Wrong number of emails in the inbox'); + InitialId := EmailInbox.Id; + + // [When] Retrieving emails + Email.RetrieveEmails(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox, TempFilters); + + // [Then] The EmailInbox will be filled only with new emails and not existing ones + EmailInbox.FindSet(); + Assert.AreEqual(2, EmailInbox.Count(), 'Wrong number of emails in the inbox'); + + repeat + Assert.AreNotEqual(InitialId, EmailInbox.Id, 'The email should not be the same as the initial one'); + until EmailInbox.Next() = 0; + end; + + [Test] + procedure RetrieveEmailsFailv3() + var + EmailAccount: Record "Email Account"; + EmailInbox: Record "Email Inbox"; + TempFilters: Record "Email Retrieval Filters" temporary; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Retrieving emails with a V3 connector fails due to some error + PermissionsMock.Set('Email Edit'); + + // [Given] An email account with a V3 connector + // [Given] Existing emails in Email Inbox + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + + EmailInbox.DeleteAll(); + ConnectorMock.CreateEmailInbox(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox); + Assert.AreEqual(1, EmailInbox.Count(), 'Wrong number of emails in the inbox'); + + // [Given] An error occurs when retrieving emails + ConnectorMock.FailOnRetrieveEmails(true); + + // [When] Retrieving emails + asserterror Email.RetrieveEmails(EmailAccount."Account Id", EmailAccount.Connector, EmailInbox, TempFilters); // [Then] The EmailInbox will be filled only with new emails and not existing ones Assert.ExpectedError('Failed to retrieve emails'); @@ -1495,8 +1566,9 @@ codeunit 134685 "Email Test" asserterror Email.MarkAsRead(EmailAccount."Account Id", EmailAccount.Connector, Any.AlphabeticText(10)); Assert.ExpectedError('The selected email connector does not support marking emails as read'); end; - +#if not CLEAN26 [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure MarkEmailAsRead() var EmailAccount: Record "Email Account"; @@ -1514,6 +1586,7 @@ codeunit 134685 "Email Test" end; [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure MarkEmailAsReadFail() var EmailAccount: Record "Email Account"; @@ -1533,6 +1606,45 @@ codeunit 134685 "Email Test" asserterror Email.MarkAsRead(EmailAccount."Account Id", EmailAccount.Connector, Any.AlphabeticText(10)); Assert.ExpectedError('Failed to mark email as read'); end; +#endif + + [Test] + procedure MarkEmailAsReadv3() + var + EmailAccount: Record "Email Account"; + ConnectorMock: Codeunit "Connector Mock"; + Any: Codeunit Any; + begin + // [Scenario] Marking email as read with a V3 connector should succeed with no errors + // [Given] An email account with a V3 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + + // [When] Mark email as read + // [Then] No error occurs + Email.MarkAsRead(EmailAccount."Account Id", EmailAccount.Connector, Any.AlphabeticText(10)); + end; + + [Test] + procedure MarkEmailAsReadFailv3() + var + EmailAccount: Record "Email Account"; + ConnectorMock: Codeunit "Connector Mock"; + Any: Codeunit Any; + begin + // [Scenario] Marking email as read with a V3 connector fails due to some error + // [Given] An email account with a V3 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + + // [Given] Force an error to occur when marking email as read + ConnectorMock.FailOnMarkAsRead(true); + + // [When] Mark email as read + // [Then] An error occurs + asserterror Email.MarkAsRead(EmailAccount."Account Id", EmailAccount.Connector, Any.AlphabeticText(10)); + Assert.ExpectedError('Failed to mark email as read'); + end; [Test] procedure ReplyToEmailWithV1Connector() @@ -1540,7 +1652,6 @@ codeunit 134685 "Email Test" EmailAccount: Record "Email Account"; EmailMessage: Codeunit "Email Message"; ConnectorMock: Codeunit "Connector Mock"; - Any: Codeunit Any; begin // [Scenario] Replying to an email with a V1 connector should fail // [Given] An email account with a V1 connector @@ -1550,11 +1661,13 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] An error is thrown that the connector does not support this operation - asserterror Email.Reply(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector); + asserterror Email.Reply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector); Assert.ExpectedError('The selected email connector does not support replying to emails'); end; +#if not CLEAN26 [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure ReplyToEmail() var EmailAccount: Record "Email Account"; @@ -1570,10 +1683,11 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true - Assert.IsTrue(Email.Reply(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector), 'Did not succeed in replying the email'); + Assert.IsTrue(Email.Reply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector), 'Did not succeed in replying the email'); end; [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure ReplyToEmailWithNoRecipients() var EmailAccount: Record "Email Account"; @@ -1589,7 +1703,44 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true - asserterror Email.Reply(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector); + asserterror Email.Reply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector); + Assert.ExpectedError('You must specify a valid email account to send the message to'); + end; +#endif + [Test] + procedure ReplyToEmailv3() + var + EmailAccount: Record "Email Account"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector should succeed with no errors + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReply(EmailMessage); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + Assert.IsTrue(Email.Reply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector), 'Did not succeed in replying the email'); + end; + + [Test] + procedure ReplyToEmailWithNoRecipientsv3() + var + EmailAccount: Record "Email Account"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector should succeed with no errors + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReply(EmailMessage, ''); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + asserterror Email.Reply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector); Assert.ExpectedError('You must specify a valid email account to send the message to'); end; @@ -1599,7 +1750,6 @@ codeunit 134685 "Email Test" EmailAccount: Record "Email Account"; EmailMessage: Codeunit "Email Message"; ConnectorMock: Codeunit "Connector Mock"; - Any: Codeunit Any; begin // [Scenario] Replying to an email with a V1 connector should fail // [Given] An email account with a V1 connector @@ -1609,11 +1759,13 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] An error is thrown that the connector does not support this operation - asserterror Email.ReplyAll(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector); + asserterror Email.ReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector); Assert.ExpectedError('The selected email connector does not support replying to emails'); end; +#if not CLEAN26 [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure ReplyAllToEmail() var EmailAccount: Record "Email Account"; @@ -1629,10 +1781,11 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true - Assert.IsTrue(Email.ReplyAll(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector), 'Did not succeed in replying the email'); + Assert.IsTrue(Email.ReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector), 'Did not succeed in replying the email'); end; [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure ReplyAllToEmailFail() var EmailAccount: Record "Email Account"; @@ -1651,7 +1804,47 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true - Assert.IsFalse(Email.ReplyAll(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector), 'Did succeed in replying the email when it should fail'); + Assert.IsFalse(Email.ReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector), 'Did succeed in replying the email when it should fail'); + end; +#endif + + [Test] + procedure ReplyAllToEmailv3() + var + EmailAccount: Record "Email Account"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector should succeed with no errors + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReplyAll(EmailMessage); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + Assert.IsTrue(Email.ReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector), 'Did not succeed in replying the email'); + end; + + [Test] + procedure ReplyAllToEmailFailv3() + var + EmailAccount: Record "Email Account"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector fails due to some error + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReplyAll(EmailMessage); + + // [Given] Force the connector to fail on reply + ConnectorMock.FailOnReply(true); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + Assert.IsFalse(Email.ReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector), 'Did succeed in replying the email when it should fail'); end; [Test] @@ -1661,7 +1854,6 @@ codeunit 134685 "Email Test" EmailOutbox: Record "Email Outbox"; EmailMessage: Codeunit "Email Message"; ConnectorMock: Codeunit "Connector Mock"; - Any: Codeunit Any; begin // [Scenario] Replying to an email with a V1 connector should fail // [Given] An email account with a V1 connector @@ -1671,11 +1863,12 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] An error is thrown that the connector does not support this operation - asserterror Email.EnqueueReply(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + asserterror Email.EnqueueReply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); Assert.ExpectedError('The selected email connector does not support replying to emails'); end; - +#if not CLEAN26 [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure EnqueueReplyToEmail() var EmailAccount: Record "Email Account"; @@ -1693,12 +1886,13 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true Assert.IsTrue(IsNullGuid(EmailOutbox."Message Id"), 'The email message id in the outbox should be empty'); - Email.EnqueueReply(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + Email.EnqueueReply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); Assert.AreEqual(EmailMessage.GetId(), EmailOutbox."Message Id", 'The email message id should be the same as the one in the outbox'); end; [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure EnqueueReplyToEmailWithNoRecipients() var EmailAccount: Record "Email Account"; @@ -1715,7 +1909,50 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true - asserterror Email.EnqueueReply(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + asserterror Email.EnqueueReply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + Assert.ExpectedError('You must specify a valid email account to send the message to'); + end; +#endif + + [Test] + procedure EnqueueReplyToEmailv3() + var + EmailAccount: Record "Email Account"; + EmailOutbox: Record "Email Outbox"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector should succeed with no errors + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReply(EmailMessage); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + Assert.IsTrue(IsNullGuid(EmailOutbox."Message Id"), 'The email message id in the outbox should be empty'); + Email.EnqueueReply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + + Assert.AreEqual(EmailMessage.GetId(), EmailOutbox."Message Id", 'The email message id should be the same as the one in the outbox'); + end; + + [Test] + procedure EnqueueReplyToEmailWithNoRecipientsv3() + var + EmailAccount: Record "Email Account"; + EmailOutbox: Record "Email Outbox"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector should succeed with no errors + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReply(EmailMessage, ''); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + asserterror Email.EnqueueReply(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); Assert.ExpectedError('You must specify a valid email account to send the message to'); end; @@ -1726,7 +1963,6 @@ codeunit 134685 "Email Test" EmailOutbox: Record "Email Outbox"; EmailMessage: Codeunit "Email Message"; ConnectorMock: Codeunit "Connector Mock"; - Any: Codeunit Any; begin // [Scenario] Replying to an email with a V1 connector should fail // [Given] An email account with a V1 connector @@ -1736,18 +1972,19 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] An error is thrown that the connector does not support this operation - asserterror Email.EnqueueReplyAll(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + asserterror Email.EnqueueReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); Assert.ExpectedError('The selected email connector does not support replying to emails'); end; +#if not CLEAN26 [Test] + [Obsolete('v2 connector is replaced by v3 connector.', '26.0')] procedure EnqueueReplyAllToEmailFail() var EmailAccount: Record "Email Account"; EmailOutbox: Record "Email Outbox"; EmailMessage: Codeunit "Email Message"; ConnectorMock: Codeunit "Connector Mock"; - Any: Codeunit Any; begin // [Scenario] Replying to an email with a V2 connector fails due to some error // [Given] An email account with a V2 connector @@ -1760,7 +1997,30 @@ codeunit 134685 "Email Test" // [When] Reply to email // [Then] No error occurs and reply returns true - Email.EnqueueReplyAll(EmailMessage, Any.AlphabeticText(10), EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + Email.EnqueueReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); + end; +#endif + + [Test] + procedure EnqueueReplyAllToEmailFailv3() + var + EmailAccount: Record "Email Account"; + EmailOutbox: Record "Email Outbox"; + EmailMessage: Codeunit "Email Message"; + ConnectorMock: Codeunit "Connector Mock"; + begin + // [Scenario] Replying to an email with a V2 connector fails due to some error + // [Given] An email account with a V2 connector + ConnectorMock.Initialize(); + ConnectorMock.AddAccount(EmailAccount, Enum::"Email Connector"::"Test Email Connector v3"); + CreateEmailReplyAll(EmailMessage); + + // [Given] Force the connector to fail on reply + ConnectorMock.FailOnReply(true); + + // [When] Reply to email + // [Then] No error occurs and reply returns true + Email.EnqueueReplyAll(EmailMessage, EmailAccount."Account Id", EmailAccount.Connector, EmailOutbox); end; local procedure CreateEmail(var EmailMessage: Codeunit "Email Message") From 70c02a1a7c8211950aaaa21b4b93b3f3476ab698 Mon Sep 17 00:00:00 2001 From: bcbuild-github-agent <137281497+bcbuild-github-agent@users.noreply.github.com> Date: Wed, 4 Dec 2024 03:48:51 -0800 Subject: [PATCH 12/14] [releases/25.x] Update AL-Go System Files from microsoft/AL-Go-PTE@preview - bbc88d84c6c206b79a63ce535897e97c394d7059 (#2452) ## preview Note that when using the preview version of AL-Go for GitHub, we recommend you Update your AL-Go system files, as soon as possible when informed that an update is available. ### Issues - Issue 1296 Make property "appFolders" optional Related to [AB#420000](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/420000) Co-authored-by: bcbuild-github-agent --- .github/AL-Go-Settings.json | 2 +- .github/RELEASENOTES.copy.md | 8 ++++ .github/workflows/CICD.yaml | 40 +++++++++---------- .../DeployReferenceDocumentation.yaml | 10 ++--- .github/workflows/IncrementVersionNumber.yaml | 12 +++--- .github/workflows/PullRequestHandler.yaml | 14 +++---- .github/workflows/Troubleshooting.yaml | 2 +- .../workflows/UpdateGitHubGoSystemFiles.yaml | 12 +++--- .github/workflows/_BuildALGoProject.yaml | 18 ++++----- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- .../System Application/.AL-Go/cloudDevEnv.ps1 | 6 +-- .../System Application/.AL-Go/localDevEnv.ps1 | 6 +-- .../.AL-Go/cloudDevEnv.ps1 | 6 +-- .../.AL-Go/localDevEnv.ps1 | 6 +-- 23 files changed, 105 insertions(+), 97 deletions(-) diff --git a/.github/AL-Go-Settings.json b/.github/AL-Go-Settings.json index 9db124024d..4a3e5ac597 100644 --- a/.github/AL-Go-Settings.json +++ b/.github/AL-Go-Settings.json @@ -73,5 +73,5 @@ ] }, "UpdateALGoSystemFilesEnvironment": "Official-Build", - "templateSha": "50903624159826257124c0f799a1b4add9b0260b" + "templateSha": "bbc88d84c6c206b79a63ce535897e97c394d7059" } diff --git a/.github/RELEASENOTES.copy.md b/.github/RELEASENOTES.copy.md index a7d36bd611..8fb684f578 100644 --- a/.github/RELEASENOTES.copy.md +++ b/.github/RELEASENOTES.copy.md @@ -1,3 +1,11 @@ +## preview + +Note that when using the preview version of AL-Go for GitHub, we recommend you Update your AL-Go system files, as soon as possible when informed that an update is available. + +### Issues + +- Issue 1296 Make property "appFolders" optional + ## v6.1 ### Issues diff --git a/.github/workflows/CICD.yaml b/.github/workflows/CICD.yaml index f1702fdf5c..e8b9907ce7 100644 --- a/.github/workflows/CICD.yaml +++ b/.github/workflows/CICD.yaml @@ -45,7 +45,7 @@ jobs: workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} steps: - name: Dump Workflow Information - uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 + uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell @@ -57,13 +57,13 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowInitialize@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read settings id: ReadSettings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell get: type, powerPlatformSolutionFolder @@ -75,7 +75,7 @@ jobs: - name: Determine Projects To Build id: determineProjectsToBuild - uses: microsoft/AL-Go-Actions/DetermineProjectsToBuild@v6.1 + uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell maxBuildDepth: ${{ env.workflowDepth }} @@ -88,7 +88,7 @@ jobs: - name: Determine Delivery Target Secrets id: DetermineDeliveryTargetSecrets - uses: microsoft/AL-Go-Actions/DetermineDeliveryTargets@v6.1 + uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' @@ -96,7 +96,7 @@ jobs: - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 + uses: microsoft/AL-Go/Actions/ReadSecrets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} @@ -104,7 +104,7 @@ jobs: - name: Determine Delivery Targets id: DetermineDeliveryTargets - uses: microsoft/AL-Go-Actions/DetermineDeliveryTargets@v6.1 + uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -114,7 +114,7 @@ jobs: - name: Determine Deployment Environments id: DetermineDeploymentEnvironments - uses: microsoft/AL-Go-Actions/DetermineDeploymentEnvironments@v6.1 + uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: @@ -130,13 +130,13 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell get: templateUrl - name: Check for updates to AL-Go system files - uses: microsoft/AL-Go-Actions/CheckForUpdates@v6.1 + uses: microsoft/AL-Go/Actions/CheckForUpdates@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell templateUrl: ${{ env.templateUrl }} @@ -211,7 +211,7 @@ jobs: path: '.artifacts' - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell @@ -220,7 +220,7 @@ jobs: uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Build Reference Documentation - uses: microsoft/AL-Go-Actions/BuildReferenceDocumentation@v6.1 + uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell artifacts: '.artifacts' @@ -257,7 +257,7 @@ jobs: path: '.artifacts' - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ matrix.shell }} get: type,powerPlatformSolutionFolder @@ -271,7 +271,7 @@ jobs: - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 + uses: microsoft/AL-Go/Actions/ReadSecrets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ matrix.shell }} gitHubSecrets: ${{ toJson(secrets) }} @@ -279,7 +279,7 @@ jobs: - name: Deploy to Business Central id: Deploy - uses: microsoft/AL-Go-Actions/Deploy@v6.1 + uses: microsoft/AL-Go/Actions/Deploy@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -291,7 +291,7 @@ jobs: - name: Deploy to Power Platform if: env.type == 'PTE' && env.powerPlatformSolutionFolder != '' - uses: microsoft/AL-Go-Actions/DeployPowerPlatform@v6.1 + uses: microsoft/AL-Go/Actions/DeployPowerPlatform@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -319,20 +319,20 @@ jobs: path: '.artifacts' - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 + uses: microsoft/AL-Go/Actions/ReadSecrets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} getSecrets: '${{ matrix.deliveryTarget }}Context' - name: Deliver - uses: microsoft/AL-Go-Actions/Deliver@v6.1 + uses: microsoft/AL-Go/Actions/Deliver@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -352,7 +352,7 @@ jobs: - name: Finalize the workflow id: PostProcess - uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowPostProcess@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/DeployReferenceDocumentation.yaml b/.github/workflows/DeployReferenceDocumentation.yaml index f194e65760..2a7c2f2820 100644 --- a/.github/workflows/DeployReferenceDocumentation.yaml +++ b/.github/workflows/DeployReferenceDocumentation.yaml @@ -30,18 +30,18 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowInitialize@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Determine Deployment Environments id: DetermineDeploymentEnvironments - uses: microsoft/AL-Go-Actions/DetermineDeploymentEnvironments@v6.1 + uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: @@ -54,7 +54,7 @@ jobs: uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Build Reference Documentation - uses: microsoft/AL-Go-Actions/BuildReferenceDocumentation@v6.1 + uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell artifacts: 'latest' @@ -71,7 +71,7 @@ jobs: - name: Finalize the workflow if: always() - uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowPostProcess@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/IncrementVersionNumber.yaml b/.github/workflows/IncrementVersionNumber.yaml index 479fce3d05..0043d02541 100644 --- a/.github/workflows/IncrementVersionNumber.yaml +++ b/.github/workflows/IncrementVersionNumber.yaml @@ -41,7 +41,7 @@ jobs: runs-on: [ windows-latest ] steps: - name: Dump Workflow Information - uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 + uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell @@ -50,18 +50,18 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowInitialize@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 + uses: microsoft/AL-Go/Actions/ReadSecrets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} @@ -69,7 +69,7 @@ jobs: useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' - name: Increment Version Number - uses: microsoft/AL-Go-Actions/IncrementVersionNumber@v6.1 + uses: microsoft/AL-Go/Actions/IncrementVersionNumber@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell token: ${{ steps.ReadSecrets.outputs.TokenForPush }} @@ -79,7 +79,7 @@ jobs: - name: Finalize the workflow if: always() - uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowPostProcess@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/PullRequestHandler.yaml b/.github/workflows/PullRequestHandler.yaml index 695ae0b143..edd893058c 100644 --- a/.github/workflows/PullRequestHandler.yaml +++ b/.github/workflows/PullRequestHandler.yaml @@ -28,7 +28,7 @@ jobs: if: (github.event.pull_request.base.repo.full_name != github.event.pull_request.head.repo.full_name) && (github.event_name != 'pull_request') runs-on: windows-latest steps: - - uses: microsoft/AL-Go-Actions/VerifyPRChanges@v6.1 + - uses: microsoft/AL-Go/Actions/VerifyPRChanges@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 Initialization: needs: [ PregateCheck ] @@ -43,7 +43,7 @@ jobs: telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} steps: - name: Dump Workflow Information - uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 + uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell @@ -55,13 +55,13 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowInitialize@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read settings id: ReadSettings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell @@ -72,7 +72,7 @@ jobs: - name: Determine Projects To Build id: determineProjectsToBuild - uses: microsoft/AL-Go-Actions/DetermineProjectsToBuild@v6.1 + uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell maxBuildDepth: ${{ env.workflowDepth }} @@ -131,7 +131,7 @@ jobs: steps: - name: Pull Request Status Check id: PullRequestStatusCheck - uses: microsoft/AL-Go-Actions/PullRequestStatusCheck@v6.1 + uses: microsoft/AL-Go/Actions/PullRequestStatusCheck@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: @@ -139,7 +139,7 @@ jobs: - name: Finalize the workflow id: PostProcess - uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowPostProcess@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 if: success() || failure() env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/Troubleshooting.yaml b/.github/workflows/Troubleshooting.yaml index 0337b67d1d..7f226aaded 100644 --- a/.github/workflows/Troubleshooting.yaml +++ b/.github/workflows/Troubleshooting.yaml @@ -30,7 +30,7 @@ jobs: lfs: true - name: Troubleshooting - uses: microsoft/AL-Go-Actions/Troubleshooting@v6.1 + uses: microsoft/AL-Go/Actions/Troubleshooting@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} diff --git a/.github/workflows/UpdateGitHubGoSystemFiles.yaml b/.github/workflows/UpdateGitHubGoSystemFiles.yaml index 6d57e5e6fa..e903ea509b 100644 --- a/.github/workflows/UpdateGitHubGoSystemFiles.yaml +++ b/.github/workflows/UpdateGitHubGoSystemFiles.yaml @@ -37,7 +37,7 @@ jobs: runs-on: [ windows-latest ] steps: - name: Dump Workflow Information - uses: microsoft/AL-Go-Actions/DumpWorkflowInfo@v6.1 + uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell @@ -46,19 +46,19 @@ jobs: - name: Initialize the workflow id: init - uses: microsoft/AL-Go-Actions/WorkflowInitialize@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowInitialize@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell get: templateUrl - name: Read secrets id: ReadSecrets - uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 + uses: microsoft/AL-Go/Actions/ReadSecrets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell gitHubSecrets: ${{ toJson(secrets) }} @@ -94,7 +94,7 @@ jobs: Add-Content -Encoding UTF8 -Path $env:GITHUB_ENV -Value "downloadLatest=$downloadLatest" - name: Update AL-Go system files - uses: microsoft/AL-Go-Actions/CheckForUpdates@v6.1 + uses: microsoft/AL-Go/Actions/CheckForUpdates@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: powershell token: ${{ fromJson(steps.ReadSecrets.outputs.Secrets).ghTokenWorkflow }} @@ -105,7 +105,7 @@ jobs: - name: Finalize the workflow if: always() - uses: microsoft/AL-Go-Actions/WorkflowPostProcess@v6.1 + uses: microsoft/AL-Go/Actions/WorkflowPostProcess@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/_BuildALGoProject.yaml b/.github/workflows/_BuildALGoProject.yaml index 8aec2e83f1..2b2aed1375 100644 --- a/.github/workflows/_BuildALGoProject.yaml +++ b/.github/workflows/_BuildALGoProject.yaml @@ -94,7 +94,7 @@ jobs: submodules: recursive - name: Read settings - uses: microsoft/AL-Go-Actions/ReadSettings@v6.1 + uses: microsoft/AL-Go/Actions/ReadSettings@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ inputs.shell }} project: ${{ inputs.project }} @@ -103,14 +103,14 @@ jobs: - name: Read secrets id: ReadSecrets if: github.event_name != 'pull_request' - uses: microsoft/AL-Go-Actions/ReadSecrets@v6.1 + uses: microsoft/AL-Go/Actions/ReadSecrets@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ inputs.shell }} gitHubSecrets: ${{ toJson(secrets) }} getSecrets: '${{ inputs.secrets }},appDependencySecrets,AZURE_CREDENTIALS' - name: Determine ArtifactUrl - uses: microsoft/AL-Go-Actions/DetermineArtifactUrl@v6.1 + uses: microsoft/AL-Go/Actions/DetermineArtifactUrl@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 id: determineArtifactUrl with: shell: ${{ inputs.shell }} @@ -125,7 +125,7 @@ jobs: - name: Download Project Dependencies id: DownloadProjectDependencies - uses: microsoft/AL-Go-Actions/DownloadProjectDependencies@v6.1 + uses: microsoft/AL-Go/Actions/DownloadProjectDependencies@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' with: @@ -136,7 +136,7 @@ jobs: baselineWorkflowRunId: ${{ inputs.baselineWorkflowRunId }} - name: Build - uses: microsoft/AL-Go-Actions/RunPipeline@v6.1 + uses: microsoft/AL-Go/Actions/RunPipeline@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 env: Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' BuildMode: ${{ inputs.buildMode }} @@ -151,7 +151,7 @@ jobs: - name: Sign if: inputs.signArtifacts && env.doNotSignApps == 'False' && (env.keyVaultCodesignCertificateName != '' || (fromJson(env.trustedSigning).Endpoint != '' && fromJson(env.trustedSigning).Account != '' && fromJson(env.trustedSigning).CertificateProfile != '')) id: sign - uses: microsoft/AL-Go-Actions/Sign@v6.1 + uses: microsoft/AL-Go/Actions/Sign@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ inputs.shell }} azureCredentialsJson: '${{ fromJson(steps.ReadSecrets.outputs.Secrets).AZURE_CREDENTIALS }}' @@ -159,7 +159,7 @@ jobs: - name: Calculate Artifact names id: calculateArtifactsNames - uses: microsoft/AL-Go-Actions/CalculateArtifactNames@v6.1 + uses: microsoft/AL-Go/Actions/CalculateArtifactNames@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 if: success() || failure() with: shell: ${{ inputs.shell }} @@ -269,14 +269,14 @@ jobs: - name: Analyze Test Results id: analyzeTestResults if: (success() || failure()) && env.doNotRunTests == 'False' - uses: microsoft/AL-Go-Actions/AnalyzeTests@v6.1 + uses: microsoft/AL-Go/Actions/AnalyzeTests@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ inputs.shell }} project: ${{ inputs.project }} - name: Cleanup if: always() - uses: microsoft/AL-Go-Actions/PipelineCleanup@v6.1 + uses: microsoft/AL-Go/Actions/PipelineCleanup@9dbee17f636ca9ba2649b45adc2b65f4fd66af84 with: shell: ${{ inputs.shell }} project: ${{ inputs.project }} diff --git a/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 b/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/Business Foundation/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 b/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 +++ b/build/projects/Business Foundation/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 b/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/Performance Toolkit/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 b/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 +++ b/build/projects/Performance Toolkit/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application Modules/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 b/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application Modules/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application Tests (No Isolation)/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 b/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application Tests (No Isolation)/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application Tests/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 b/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application Tests/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 b/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/System Application/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/System Application/.AL-Go/localDevEnv.ps1 b/build/projects/System Application/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/System Application/.AL-Go/localDevEnv.ps1 +++ b/build/projects/System Application/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 b/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 index 1afe6090dd..84dc46252f 100644 --- a/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 +++ b/build/projects/Test Stability Tools/.AL-Go/cloudDevEnv.ps1 @@ -42,9 +42,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local diff --git a/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 b/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 index 358732d795..e1daa615a3 100644 --- a/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 +++ b/build/projects/Test Stability Tools/.AL-Go/localDevEnv.ps1 @@ -46,9 +46,9 @@ Write-Host -ForegroundColor Yellow @' $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null -$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Github-Helper.psm1' -folder $tmpFolder -$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/AL-Go-Helper.ps1' -folder $tmpFolder -DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go-Actions/v6.1/Packages.json' -folder $tmpFolder | Out-Null +$GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Github-Helper.psm1' -folder $tmpFolder +$ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/AL-Go-Helper.ps1' -folder $tmpFolder +DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/9dbee17f636ca9ba2649b45adc2b65f4fd66af84/Actions/Packages.json' -folder $tmpFolder | Out-Null Import-Module $GitHubHelperPath . $ALGoHelperPath -local From 49dfc9699d847287bc0c98deb9bdfce9c8537dd2 Mon Sep 17 00:00:00 2001 From: Nikola Kukrika <39086991+nikolakukrika@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:23:30 +0100 Subject: [PATCH 13/14] Agents - Introduce agent system app to v25.x (#2458) #### Summary Introducing Agent System app #### Work Item(s) Fixes [AB#559557](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/559557) --- .../App/Agent/ExtensionLogo.png | Bin 0 -> 2408 bytes .../Interaction/AgentMessage.Codeunit.al | 75 +++ .../Interaction/AgentMessageImpl.Codeunit.al | 80 ++++ .../Agent/Interaction/AgentTask.Codeunit.al | 41 ++ .../Interaction/AgentTaskImpl.Codeunit.al | 202 +++++++++ .../Agent/Interaction/AgentTaskList.Page.al | 187 ++++++++ .../Interaction/AgentTaskMessageCard.Page.al | 167 +++++++ .../Interaction/AgentTaskMessageList.Page.al | 95 ++++ .../Interaction/AgentTaskStepList.Page.al | 81 ++++ .../Permissions/AgentObjects.PermissionSet.al | 23 + .../App/Agent/Setup/Agent.Codeunit.al | 174 +++++++ .../Agent/Setup/AgentAccessControl.Page.al | 134 ++++++ .../App/Agent/Setup/AgentCard.Page.al | 228 ++++++++++ .../App/Agent/Setup/AgentImpl.Codeunit.al | 429 ++++++++++++++++++ .../App/Agent/Setup/AgentList.Page.al | 93 ++++ .../Setup/SelectAgentAccessControl.Page.al | 179 ++++++++ .../App/Agent/TaskPane/TaskDetails.Page.al | 132 ++++++ .../App/Agent/TaskPane/TaskTimeline.Page.al | 270 +++++++++++ .../App/Agent/TaskPane/Tasks.Page.al | 131 ++++++ src/System Application/App/Agent/app.json | 48 ++ .../src/UserSubformPermissions.PageExt.al | 32 ++ .../App/Security Groups/app.json | 8 + .../SecurityGroupsObjects.PermissionSet.al | 2 + .../src/InheritedPermissionSetsPart.Page.al | 120 +++++ .../src/SecurityGroupPermissionSets.Page.al | 15 +- .../src/UserSecurityGroupsPart.Page.al | 79 ++++ .../App/User Permissions/app.json | 4 + .../UserPermissionsObjects.PermissionSet.al | 3 +- .../src/UserPermissions.Codeunit.al | 13 + .../src/UserPermissionsImpl.Codeunit.al | 26 ++ .../User Permissions/src/UserSubform.Page.al | 142 ++++++ .../src/UserSettings.Codeunit.al | 34 ++ .../src/UserSettingsImpl.Codeunit.al | 8 + src/System Application/App/app.json | 5 + 34 files changed, 3248 insertions(+), 12 deletions(-) create mode 100644 src/System Application/App/Agent/ExtensionLogo.png create mode 100644 src/System Application/App/Agent/Interaction/AgentMessage.Codeunit.al create mode 100644 src/System Application/App/Agent/Interaction/AgentMessageImpl.Codeunit.al create mode 100644 src/System Application/App/Agent/Interaction/AgentTask.Codeunit.al create mode 100644 src/System Application/App/Agent/Interaction/AgentTaskImpl.Codeunit.al create mode 100644 src/System Application/App/Agent/Interaction/AgentTaskList.Page.al create mode 100644 src/System Application/App/Agent/Interaction/AgentTaskMessageCard.Page.al create mode 100644 src/System Application/App/Agent/Interaction/AgentTaskMessageList.Page.al create mode 100644 src/System Application/App/Agent/Interaction/AgentTaskStepList.Page.al create mode 100644 src/System Application/App/Agent/Permissions/AgentObjects.PermissionSet.al create mode 100644 src/System Application/App/Agent/Setup/Agent.Codeunit.al create mode 100644 src/System Application/App/Agent/Setup/AgentAccessControl.Page.al create mode 100644 src/System Application/App/Agent/Setup/AgentCard.Page.al create mode 100644 src/System Application/App/Agent/Setup/AgentImpl.Codeunit.al create mode 100644 src/System Application/App/Agent/Setup/AgentList.Page.al create mode 100644 src/System Application/App/Agent/Setup/SelectAgentAccessControl.Page.al create mode 100644 src/System Application/App/Agent/TaskPane/TaskDetails.Page.al create mode 100644 src/System Application/App/Agent/TaskPane/TaskTimeline.Page.al create mode 100644 src/System Application/App/Agent/TaskPane/Tasks.Page.al create mode 100644 src/System Application/App/Agent/app.json create mode 100644 src/System Application/App/Permission Sets/src/UserSubformPermissions.PageExt.al create mode 100644 src/System Application/App/Security Groups/src/InheritedPermissionSetsPart.Page.al create mode 100644 src/System Application/App/Security Groups/src/UserSecurityGroupsPart.Page.al create mode 100644 src/System Application/App/User Permissions/src/UserSubform.Page.al diff --git a/src/System Application/App/Agent/ExtensionLogo.png b/src/System Application/App/Agent/ExtensionLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f53be3156b9b6164dfc7e90c0043ef0bdd1ddc9f GIT binary patch literal 2408 zcmaJ@c~lc=67K|p5CM&Hh(I_L0nu<|89=~9xraqA<(MS{ivlY?b-2+CB*75y3?3sQ z4q+7pQ4R$~%#sfAfZ-e!L0mcv0RYem@b?Y_02D%^08I^KiAk+aL>8?d{G-zVVD&oHi+VAdD?@l21H5y%O3qs%KE8bD!`EEZw++`UO;#&;JgV~>&KV$zfB~>T2tY>zdO$e< zU;rC{jQWyAA8s)N4n#Ru;Zn?SNf&v#i)!?ImM9Wfn~MPi^#EC_4`_mDdO|@giaZK| z5kNyfyg2HMqQiD78HeV!7td;zCdit!vk<#b+QYs2P1Gyg^CL<*yYS&j9yK+N30{WX z)ogHzUB8jX1Rq78@CG*wG=`V<cZQ@3S7pbl9 zfz=OCITl1;X(u1_!zz2H9;okhe~5hluts_O2@IxlfA;m3>XV;Bef`gBj-{uBARCHW z0>xZrU%y&5J5i1}J}wX$C~CRW=vo&f2>iV#4qS!7ZH)V-`G}#L#+#jgL@V`g|JIv< zf+B%-NB^DIwcN4!v8akQ7aFS<3H6zJ2!g18Nn^h^Y`CFv5GI|R_oN4sUv_xP+;bMK z=FL8(Z^UJt7KPd%LFj{<14!~|P@s%KmlnFR3updu!amFI-!Lfr1-+`{aJ*E6H-DV9 zknuLyIhS47_0;3^c+_JsS>g6xImca}1Ss+5vlVI;bF4UBR1c5PaK)WNZERjgo>xW4P%XdaA9Q9!7$MAmqA7IMx*0F|Zuo2{%^7{2Tko5XGX=6q{; zl~DJCHDsuGL!h@X!S3mtDXMpjk7z*v&cJ4Kk@S(uR#9`6{LS}IjC041U21W475&eH zrgDd)toR_O>~UY~nZg3}Am+E`8$TR@IBg&0=@k(B2|Srg!zXGIHqlt-@q65{lSYdB zXd4%@Q?X>H_mq$GW9_yehG?(y+-@W_R3>RU{m}Xxm!4CPc%Ka(69Q^3SZcW6|a6AB3t{jt{imO~$i#$oi~8l3C?tE0DIBn79lul`ZPavnAxn@#Y{d zlF`#{CI6I0;!+F)%T^H<8!pVdW7*qfM`xa;X~4V_p4;N1mo1B+nTjVy-wvt5sn0it z`eKHu&c~(16U6_#y4?Y~MkOLivZF`pX0BhFUgk1kku^svJv5PJuF9Sr-9=YI=}rg_ zRt$C00>`P|GNUD;I?kwX1^n~2UM$VHlH=$QQ(@=qQDB2oXA)FNI|+N0MFUt z9h_z?9-eZdYCanZb?r_>?y_`>FTJ)w@v-VbvXS|_L`_{`=oR;$Y-Nqx=_8Eu`U?Af zIz_2n1)Fx>Lk@X6B`g$fwAXkyqB~vN=J9TK5u_(4SVmxSgw}SoFE1-p&W0!?S zLPjZcvvM#gIEq+iBNs{JOpj%f(s&+kK97F}Yx*Uo4KqHqqaQg(r4%)Px9T2C zLG0uZe@kc2+9p-0N{6g}9qks-GW8%Dfl+W+>vy7jHIsH36OwpvE+wBdE%r!A(qz&; zVv4v;S%!)NCWn$qQL^X7z2RbuN&)yD-9Z^HZM-!Zt<&7q+nSM8Qg8{Yv|MeTg{=~qda4zeCzW;oFZU06H1_%Y+ERLai;WG(RV6I5KGgyYB)LKsV;s?C(SyQ)cq54P z$pG&O)z<+Md&Zge^jfCbO#*!|aNO3i?gIYhf{n~4xXtts2CiH8x^{YQoyJ5zd+NLE zRO(heKF_M?{w+Ug6|uYNAy|gaZd6|uFIEJ3vIV4;jA0#L*F1EGNp`>GqD7?*P?Lo# zS!3&i3TYiFxO5$;9-ET8HL1Uv8NR0T|C7a^OZ_p8d^xzN=q;Z}OV)&j TThioJs%?PJ9`Cx{ae4m*g9kO? literal 0 HcmV?d00001 diff --git a/src/System Application/App/Agent/Interaction/AgentMessage.Codeunit.al b/src/System Application/App/Agent/Interaction/AgentMessage.Codeunit.al new file mode 100644 index 0000000000..1ec3011219 --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentMessage.Codeunit.al @@ -0,0 +1,75 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +codeunit 4307 "Agent Message" +{ + InherentEntitlements = X; + InherentPermissions = X; + + /// + /// Get the message text for the given agent task message. + /// + /// Agent task message. + /// The body of the agent task message. + [Scope('OnPrem')] + procedure GetText(var AgentTaskMessage: Record "Agent Task Message"): Text + var + AgentMessageImpl: Codeunit "Agent Message Impl."; + begin + exit(AgentMessageImpl.GetMessageText(AgentTaskMessage)); + end; + + /// + /// Updates the message text. + /// + /// The message record to update. + /// New message text to set. + [Scope('OnPrem')] + procedure UpdateText(var AgentTaskMessage: Record "Agent Task Message"; NewMessageText: Text) + var + AgentMessageImpl: Codeunit "Agent Message Impl."; + begin + AgentMessageImpl.UpdateText(AgentTaskMessage, NewMessageText); + end; + + /// + /// Check if it is possible to edit the message. + /// + /// Agent task message to verify. + /// If it is possible to change the message. + [Scope('OnPrem')] + procedure IsEditable(var AgentTaskMessage: Record "Agent Task Message"): Boolean + var + AgentMessageImpl: Codeunit "Agent Message Impl."; + begin + exit(AgentMessageImpl.IsMessageEditable(AgentTaskMessage)); + end; + + /// + /// Sets the message status to sent. + /// + /// Agent task message to update status. + [Scope('OnPrem')] + procedure SetStatusToSent(var AgentTaskMessage: Record "Agent Task Message") + var + AgentMessageImpl: Codeunit "Agent Message Impl."; + begin + AgentMessageImpl.SetStatusToSent(AgentTaskMessage); + end; + + /// + /// Downloads the attachments for a specific message. + /// + /// Message to download attachments for. + [Scope('OnPrem')] + procedure DownloadAttachments(var AgentTaskMessage: Record "Agent Task Message") + var + AgentMessageImpl: Codeunit "Agent Message Impl."; + begin + AgentMessageImpl.DownloadAttachments(AgentTaskMessage); + end; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentMessageImpl.Codeunit.al b/src/System Application/App/Agent/Interaction/AgentMessageImpl.Codeunit.al new file mode 100644 index 0000000000..17a727fd55 --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentMessageImpl.Codeunit.al @@ -0,0 +1,80 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +codeunit 4308 "Agent Message Impl." +{ + Access = Internal; + InherentEntitlements = X; + InherentPermissions = X; + + procedure GetMessageText(var AgentTaskMessage: Record "Agent Task Message"): Text + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + ContentInStream: InStream; + ContentText: Text; + begin + AgentTaskMessage.CalcFields(Content); + AgentTaskMessage.Content.CreateInStream(ContentInStream, AgentTaskImpl.GetDefaultEncoding()); + ContentInStream.Read(ContentText); + exit(ContentText); + end; + + procedure UpdateText(var AgentTaskMessage: Record "Agent Task Message"; NewMessageText: Text) + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + ContentOutStream: OutStream; + begin + Clear(AgentTaskMessage.Content); + AgentTaskMessage.Content.CreateOutStream(ContentOutStream, AgentTaskImpl.GetDefaultEncoding()); + ContentOutStream.Write(NewMessageText); + AgentTaskMessage.Modify(true); + end; + + procedure IsMessageEditable(var AgentTaskMessage: Record "Agent Task Message"): Boolean + begin + if AgentTaskMessage.Type <> AgentTaskMessage.Type::Output then + exit(false); + + exit(AgentTaskMessage.Status = AgentTaskMessage.Status::Draft); + end; + + procedure SetStatusToSent(var AgentTaskMessage: Record "Agent Task Message") + begin + UpdateAgentTaskMessageStatus(AgentTaskMessage, AgentTaskMessage.Status::Sent); + end; + + procedure DownloadAttachments(var AgentTaskMessage: Record "Agent Task Message") + var + AgentTaskFile: Record "Agent Task File"; + AgentTaskMessageAttachment: Record "Agent Task Message Attachment"; + AgentTaskImpl: Codeunit "Agent Task Impl."; + InStream: InStream; + FileName: Text; + DownloadDialogTitleLbl: Label 'Download Email Attachment'; + begin + AgentTaskMessageAttachment.SetRange("Task ID", AgentTaskMessage."Task ID"); + AgentTaskMessageAttachment.SetRange("Message ID", AgentTaskMessage.ID); + if not AgentTaskMessageAttachment.FindSet() then + exit; + + repeat + if not AgentTaskFile.Get(AgentTaskMessageAttachment."Task ID", AgentTaskMessageAttachment."File ID") then + exit; + + FileName := AgentTaskFile."File Name"; + AgentTaskFile.CalcFields(Content); + AgentTaskFile.Content.CreateInStream(InStream, AgentTaskImpl.GetDefaultEncoding()); + File.DownloadFromStream(InStream, DownloadDialogTitleLbl, '', '', FileName); + until AgentTaskMessageAttachment.Next() = 0; + end; + + procedure UpdateAgentTaskMessageStatus(var AgentTaskMessage: Record "Agent Task Message"; Status: Option) + begin + AgentTaskMessage.Status := Status; + AgentTaskMessage.Modify(true); + end; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentTask.Codeunit.al b/src/System Application/App/Agent/Interaction/AgentTask.Codeunit.al new file mode 100644 index 0000000000..d2571da29b --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentTask.Codeunit.al @@ -0,0 +1,41 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +codeunit 4303 "Agent Task" +{ + InherentEntitlements = X; + InherentPermissions = X; + + /// + /// Check if a task exists for the given agent user and conversation + /// + /// The user security ID of the agent. + /// The conversation ID to check. + /// True if task exists, false if not. + [Scope('OnPrem')] + procedure TaskExists(AgentUserSecurityId: Guid; ConversationId: Text): Boolean + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + exit(AgentTaskImpl.TaskExists(AgentUserSecurityId, ConversationId)); + end; + + /// + /// Create a new task message for the given agent user and conversation. + /// If task does not exist, it will be created. + /// + /// Specifies from address. + /// The message text for the task. + /// Current Agent Task to which the message will be added. + [Scope('OnPrem')] + procedure CreateTaskMessage(From: Text[250]; MessageText: Text; ExternalMessageId: Text[2048]; var CurrentAgentTask: Record "Agent Task") + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + AgentTaskImpl.CreateTaskMessage(From, MessageText, ExternalMessageId, CurrentAgentTask); + end; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentTaskImpl.Codeunit.al b/src/System Application/App/Agent/Interaction/AgentTaskImpl.Codeunit.al new file mode 100644 index 0000000000..539b10fb6d --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentTaskImpl.Codeunit.al @@ -0,0 +1,202 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Integration; +using System.Environment; + +codeunit 4300 "Agent Task Impl." +{ + Access = Internal; + InherentEntitlements = X; + InherentPermissions = X; + + procedure SetMessageText(var AgentTaskMessage: Record "Agent Task Message"; MessageText: Text) + var + ContentOutStream: OutStream; + begin + Clear(AgentTaskMessage.Content); + AgentTaskMessage.Content.CreateOutStream(ContentOutStream, GetDefaultEncoding()); + ContentOutStream.Write(MessageText); + AgentTaskMessage.Modify(true); + end; + + procedure GetStepsDoneCount(var AgentTask: Record "Agent Task"): Integer + var + AgentTaskStep: Record "Agent Task Step"; + begin + AgentTaskStep.SetRange("Task ID", AgentTask."ID"); + AgentTaskStep.ReadIsolation := IsolationLevel::ReadCommitted; + exit(AgentTaskStep.Count()); + end; + + procedure GetDetailsForAgentTaskStep(var AgentTaskStep: Record "Agent Task Step"): Text + var + ContentInStream: InStream; + ContentText: Text; + begin + AgentTaskStep.CalcFields(Details); + AgentTaskStep.Details.CreateInStream(ContentInStream, GetDefaultEncoding()); + ContentInStream.Read(ContentText); + exit(ContentText); + end; + + procedure ShowTaskSteps(var AgentTask: Record "Agent Task") + var + AgentTaskStep: Record "Agent Task Step"; + begin + AgentTaskStep.SetRange("Task ID", AgentTask.ID); + Page.Run(Page::"Agent Task Step List", AgentTaskStep); + end; + + procedure CreateTaskMessage(From: Text[250]; MessageText: Text; var CurrentAgentTask: Record "Agent Task") + begin + CreateTaskMessage(From, MessageText, '', CurrentAgentTask); + end; + + procedure CreateTaskMessage(From: Text[250]; MessageText: Text; ExternalMessageId: Text[2048]; var CurrentAgentTask: Record "Agent Task") + var + AgentTask: Record "Agent Task"; + AgentTaskMessage: Record "Agent Task Message"; + begin + if MessageText = '' then + Error(MessageTextMustBeProvidedErr); + + if not AgentTask.Get(CurrentAgentTask.RecordId) then begin + AgentTask."Agent User Security ID" := CurrentAgentTask."Agent User Security ID"; + AgentTask."Created By" := UserSecurityId(); + AgentTask."Needs Attention" := false; + AgentTask.Status := AgentTask.Status::Paused; + AgentTask.Title := CurrentAgentTask.Title; + AgentTask."External ID" := CurrentAgentTask."External ID"; + AgentTask.Insert(); + end; + + AgentTaskMessage."Task ID" := AgentTask.ID; + AgentTaskMessage."Type" := AgentTaskMessage."Type"::Input; + AgentTaskMessage."External ID" := ExternalMessageId; + AgentTaskMessage.From := From; + AgentTaskMessage.Insert(); + + SetMessageText(AgentTaskMessage, MessageText); + + // Only change the status if the task is in a status where it can be started again. + // If the task is running, we should not change the state, as platform will pickup a new message automatically. + if ((AgentTask.Status = AgentTask.Status::Paused) or (AgentTask.Status = AgentTask.Status::Completed)) then begin + AgentTask.Status := AgentTask.Status::Ready; + AgentTask.Modify(true); + end; + end; + + procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step") + begin + CreateUserInterventionTaskStep(UserInterventionRequestStep, '', -1); + end; + + procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step"; UserInput: Text) + begin + CreateUserInterventionTaskStep(UserInterventionRequestStep, UserInput, -1); + end; + + procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step"; SelectedSuggestionId: Integer) + begin + CreateUserInterventionTaskStep(UserInterventionRequestStep, '', SelectedSuggestionId); + end; + + procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step"; UserInput: Text; SelectedSuggestionId: Integer) + var + AgentTask: Record "Agent Task"; + AgentTaskStep: Record "Agent Task Step"; + DetailsOutStream: OutStream; + DetailsJson: JsonObject; + begin + AgentTask.Get(UserInterventionRequestStep."Task ID"); + + AgentTaskStep."Task ID" := AgentTask.ID; + AgentTaskStep."Type" := AgentTaskStep."Type"::"User Intervention"; + AgentTaskStep.Description := 'User intervention'; + DetailsJson.Add('interventionRequestStepNumber', UserInterventionRequestStep."Step Number"); + if UserInput <> '' then + DetailsJson.Add('userInput', UserInput); + if SelectedSuggestionId >= 0 then + DetailsJson.Add('selectedSuggestionId', SelectedSuggestionId); + AgentTaskStep.CalcFields(Details); + Clear(AgentTaskStep.Details); + AgentTaskStep.Details.CreateOutStream(DetailsOutStream, GetDefaultEncoding()); + DetailsJson.WriteTo(DetailsOutStream); + AgentTaskStep.Insert(); + end; + + procedure StopTask(var AgentTask: Record "Agent Task"; AgentTaskStatus: enum "Agent Task Status"; UserConfirm: Boolean) + begin + if ((AgentTask.Status = AgentTaskStatus) and (AgentTask."Needs Attention" = false)) then + exit; // Task is already stopped and does not need attention. + + if UserConfirm then + if not Confirm(AreYouSureThatYouWantToStopTheTaskQst) then + exit; + + AgentTask.Status := AgentTaskStatus; + AgentTask."Needs Attention" := false; + AgentTask.Modify(true); + end; + + procedure RestartTask(var AgentTask: Record "Agent Task"; UserConfirm: Boolean) + begin + if UserConfirm then + if not Confirm(AreYouSureThatYouWantToRestartTheTaskQst) then + exit; + + AgentTask."Needs Attention" := false; + AgentTask.Status := AgentTask.Status::Ready; + AgentTask.Modify(true); + end; + + procedure TaskExists(AgentUserSecurityID: Guid; ConversationId: Text): Boolean + var + AgentTask: Record "Agent Task"; + begin + AgentTask.SetRange("Agent User Security ID", AgentUserSecurityID); + AgentTask.ReadIsolation(IsolationLevel::ReadCommitted); + AgentTask.SetRange("External ID", ConversationId); + exit(not AgentTask.IsEmpty()); + end; + + procedure GetDefaultEncoding(): TextEncoding + begin + exit(TextEncoding::UTF8); + end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"System Action Triggers", GetAgentTaskMessagePageId, '', true, true)] + local procedure OnGetAgentTaskMessagePageId(var PageId: Integer) + begin + PageId := Page::"Agent Task Message Card"; + end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"System Action Triggers", GetPageSummary, '', true, true)] + local procedure OnGetGetPageSummary(PageId: Integer; Bookmark: Text; var Summary: Text) + var + PageSummaryParameters: Record "Page Summary Parameters"; + PageSummaryProvider: Codeunit "Page Summary Provider"; + begin + if PageId = 0 then begin + Summary := ''; + exit; + end; + + PageSummaryParameters."Page ID" := PageId; +#pragma warning disable AA0139 + PageSummaryParameters.Bookmark := Bookmark; +#pragma warning restore AA0139 + PageSummaryParameters."Include Binary Data" := false; + Summary := PageSummaryProvider.GetPageSummary(PageSummaryParameters); + end; + + var + MessageTextMustBeProvidedErr: Label 'You must provide a message text.'; + AreYouSureThatYouWantToRestartTheTaskQst: Label 'Are you sure that you want to restart the task?'; + AreYouSureThatYouWantToStopTheTaskQst: Label 'Are you sure that you want to stop the task?'; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentTaskList.Page.al b/src/System Application/App/Agent/Interaction/AgentTaskList.Page.al new file mode 100644 index 0000000000..85c2b144ad --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentTaskList.Page.al @@ -0,0 +1,187 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4300 "Agent Task List" +{ + PageType = List; + ApplicationArea = All; + UsageCategory = Administration; + SourceTable = "Agent Task"; + Caption = 'Agent Tasks'; + InsertAllowed = false; + ModifyAllowed = false; + DeleteAllowed = false; + AdditionalSearchTerms = 'Agent Tasks, Agent Task, Agent, Agent Log, Agent Logs'; + SourceTableView = sorting("Last Step Timestamp") order(descending); + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(AgentConversations) + { + field(TaskID; Rec.ID) + { + Caption = 'Task ID'; + } + field(Title; Rec.Title) + { + Caption = 'Title'; + } + field(LastStepTimestamp; Rec."Last Step Timestamp") + { + Caption = 'Last Updated'; + } + field(LastStepNumber; Rec."Last Step Number") + { + } + field(Status; Rec.Status) + { + Caption = 'Status'; + ToolTip = 'Specifies the status of the agent task.'; + } + field(NeedsAttention; Rec."Needs Attention") + { + Caption = 'Needs Attention'; + ToolTip = 'Specifies whether the task needs attention.'; + } + field(CreatedAt; Rec.SystemCreatedAt) + { + Caption = 'Created at'; + ToolTip = 'Specifies the date and time when the agent task was created.'; + } + field(ID; Rec.ID) + { + Caption = 'ID'; + trigger OnDrillDown() + begin + ShowTaskMessages(); + end; + } + field(NumberOfStepsDone; NumberOfStepsDone) + { + Caption = 'Steps Done'; + ToolTip = 'Specifies the number of steps that have been done for the specific task.'; + + trigger OnDrillDown() + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + AgentTaskImpl.ShowTaskSteps(Rec); + end; + } + field("Created By"; Rec."Created By Full Name") + { + Caption = 'Created by'; + Tooltip = 'Specifies the full name of the user that created the agent task.'; + } + field("Agent Display Name"; Rec."Agent Display Name") + { + Caption = 'Agent'; + ToolTip = 'Specifies the agent that is associated with the task.'; + } + field(CreatedByID; Rec."Created By") + { + Visible = false; + } + field(AgentUserSecurityID; Rec."Agent User Security ID") + { + Visible = false; + } + } + } + } + actions + { + area(Processing) + { + action(ViewTaskMessage) + { + ApplicationArea = All; + Caption = 'View messages'; + ToolTip = 'Show messages for the selected task.'; + Image = ShowList; + + trigger OnAction() + begin + ShowTaskMessages(); + end; + } + action(ViewTaskSteps) + { + ApplicationArea = All; + Caption = 'View steps'; + ToolTip = 'Show steps for the selected task.'; + Image = TaskList; + + trigger OnAction() + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + AgentTaskImpl.ShowTaskSteps(Rec); + end; + } + action(Stop) + { + ApplicationArea = All; + Caption = 'Stop'; + ToolTip = 'Stop the selected task.'; + Image = Stop; + + trigger OnAction() + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + AgentTaskImpl.StopTask(Rec, Rec."Status"::"Stopped by User", true); + CurrPage.Update(false); + end; + } + } + area(Promoted) + { + group(Category_Process) + { + actionref(ViewTaskMessage_Promoted; ViewTaskMessage) + { + } + actionref(ViewTaskSteps_Promoted; ViewTaskSteps) + { + } + } + } + } + + trigger OnAfterGetRecord() + begin + UpdateControls(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateControls(); + end; + + local procedure UpdateControls() + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + NumberOfStepsDone := AgentTaskImpl.GetStepsDoneCount(Rec); + end; + + local procedure ShowTaskMessages() + var + AgentTaskMessage: Record "Agent Task Message"; + begin + AgentTaskMessage.SetRange("Task ID", Rec.ID); + Page.Run(Page::"Agent Task Message List", AgentTaskMessage); + end; + + var + NumberOfStepsDone: Integer; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentTaskMessageCard.Page.al b/src/System Application/App/Agent/Interaction/AgentTaskMessageCard.Page.al new file mode 100644 index 0000000000..24c02a6c2e --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentTaskMessageCard.Page.al @@ -0,0 +1,167 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4308 "Agent Task Message Card" +{ + PageType = Card; + ApplicationArea = All; + SourceTable = "Agent Task Message"; + InsertAllowed = false; + ModifyAllowed = true; + DeleteAllowed = false; + Caption = 'Agent Task Message'; + DataCaptionExpression = ''; + Extensible = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + group(General) + { + field(LastModifiedAt; Rec.SystemModifiedAt) + { + Caption = 'Last modified at'; + ToolTip = 'Specifies the date and time when the message was last modified.'; + } + field(CreatedAt; Rec.SystemCreatedAt) + { + Caption = 'Created at'; + ToolTip = 'Specifies the date and time when the message was created.'; + } + field(TaskID; Rec."Task Id") + { + Caption = 'Task ID'; + Visible = false; + } + field(MessageID; Rec."ID") + { + Caption = 'ID'; + Visible = false; + } + field(MessageType; Rec.Type) + { + Caption = 'Type'; + } + field(MessageFrom; Rec.From) + { + Visible = Rec.Type = Rec.Type::Input; + Caption = 'From'; + Editable = false; + } + field(Status; Rec.Status) + { + Caption = 'Status'; + Editable = false; + } + field(AttachmentsCount; AttachmentsCount) + { + Caption = 'Attachments'; + ToolTip = 'Specifies the number of attachments that are associated with the message.'; + Editable = false; + } + } + + group(Message) + { + Caption = 'Message'; + Editable = IsMessageEditable; + field(MessageText; GlobalMessageText) + { + ShowCaption = false; + Caption = 'Message'; + ToolTip = 'Specifies the message text.'; + MultiLine = true; + ExtendedDatatype = RichContent; + Editable = IsMessageEditable; + + trigger OnValidate() + var + AgentMessage: Codeunit "Agent Message"; + begin + AgentMessage.UpdateText(Rec, GlobalMessageText); + end; + + } + } + } + + } + + actions + { + area(Processing) + { + action(DownloadAttachment) + { + ApplicationArea = All; + Caption = 'Download attachments'; + ToolTip = 'Download the attachment.'; + Image = Download; + Enabled = AttachmentsCount > 0; + + trigger OnAction() + begin + DownloadAttachments(); + end; + } + } + area(Promoted) + { + group(Category_Process) + { + actionref(DownloadAttachment_Promoted; DownloadAttachment) + { + } + } + } + } + + trigger OnAfterGetRecord() + begin + UpdateControls(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateControls(); + end; + + local procedure UpdateControls() + var + AgentTaskMessageAttachment: Record "Agent Task Message Attachment"; + AgentMessage: Codeunit "Agent Message"; + begin + GlobalMessageText := AgentMessage.GetText(Rec); + IsMessageEditable := AgentMessage.IsEditable(Rec); + + AgentTaskMessageAttachment.SetRange("Task ID", Rec."Task ID"); + AgentTaskMessageAttachment.SetRange("Message ID", Rec.ID); + + AttachmentsCount := AgentTaskMessageAttachment.Count(); + if Rec.Type = Rec.Type::Output then + CurrPage.Caption(OutgoingMessageTxt); + if Rec.Type = Rec.Type::Input then + CurrPage.Caption(IncomingMessageTxt); + end; + + local procedure DownloadAttachments() + var + AgentMessage: Codeunit "Agent Message"; + begin + AgentMessage.DownloadAttachments(Rec); + end; + + var + GlobalMessageText: Text; + IsMessageEditable: Boolean; + AttachmentsCount: Integer; + OutgoingMessageTxt: Label 'Outgoing message'; + IncomingMessageTxt: Label 'Incoming message'; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentTaskMessageList.Page.al b/src/System Application/App/Agent/Interaction/AgentTaskMessageList.Page.al new file mode 100644 index 0000000000..ad3a375cc2 --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentTaskMessageList.Page.al @@ -0,0 +1,95 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4301 "Agent Task Message List" +{ + PageType = List; + ApplicationArea = All; + Caption = 'Agent Task Messages'; + UsageCategory = Administration; + SourceTable = "Agent Task Message"; + CardPageId = "Agent Task Message Card"; + InsertAllowed = false; + ModifyAllowed = false; + DeleteAllowed = false; + Editable = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(GroupName) + { + field(LastModifiedAt; Rec.SystemModifiedAt) + { + Caption = 'Last modified at'; + ToolTip = 'Specifies the date and time when the message was last modified.'; + } + field(CreatedAt; Rec.SystemCreatedAt) + { + Caption = 'Created at'; + ToolTip = 'Specifies the date and time when the message was created.'; + } + field(Status; Rec.Status) + { + Caption = 'Status'; + BlankZero = true; + BlankNumbers = BlankZero; + } + field("Created By Full Name"; Rec."Created By Full Name") + { + Caption = 'Created by'; + } + field(MessageType; Rec.Type) + { + Caption = 'Type'; + } + field(MessageText; GlobalMessageText) + { + Caption = 'Message'; + ToolTip = 'Specifies the message text.'; + + trigger OnDrillDown() + begin + Message(GlobalMessageText); + end; + } + field(TaskID; Rec."Task Id") + { + Visible = false; + Caption = 'Task ID'; + } + field(MessageId; Rec."ID") + { + Caption = 'ID'; + } + } + } + } + + trigger OnAfterGetRecord() + begin + UpdateControls(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateControls(); + end; + + local procedure UpdateControls() + var + AgentMessageImpl: Codeunit "Agent Message Impl."; + begin + GlobalMessageText := AgentMessageImpl.GetMessageText(Rec); + end; + + var + GlobalMessageText: Text; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Interaction/AgentTaskStepList.Page.al b/src/System Application/App/Agent/Interaction/AgentTaskStepList.Page.al new file mode 100644 index 0000000000..22c61dda7e --- /dev/null +++ b/src/System Application/App/Agent/Interaction/AgentTaskStepList.Page.al @@ -0,0 +1,81 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4303 "Agent Task Step List" +{ + PageType = List; + ApplicationArea = All; + UsageCategory = Administration; + SourceTable = "Agent Task Step"; + Caption = 'Agent Task Steps'; + InsertAllowed = false; + ModifyAllowed = false; + DeleteAllowed = false; + Editable = false; + SourceTableView = sorting("Step Number") order(descending); + Extensible = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(AgentConversationActionLog) + { + field(StepNumber; Rec."Step Number") + { + Caption = 'Step Number'; + } + field(TaskID; Rec."Task ID") + { + Visible = false; + Caption = 'Task ID'; + } + field(Description; Rec.Description) + { + Caption = 'Description'; + } + field(Details; DetailsTxt) + { + Caption = 'Details'; + ToolTip = 'Specifies the step details.'; + + trigger OnDrillDown() + begin + Message(DetailsTxt); + end; + } + field("User Full Name"; Rec."User Full Name") + { + Caption = 'User Full Name'; + Tooltip = 'Specifies the full name of the user that was involved in performing the step..'; + } + } + } + } + + trigger OnAfterGetRecord() + begin + UpdateControls(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateControls(); + end; + + local procedure UpdateControls() + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + DetailsTxt := AgentTaskImpl.GetDetailsForAgentTaskStep(Rec); + end; + + var + DetailsTxt: Text; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Permissions/AgentObjects.PermissionSet.al b/src/System Application/App/Agent/Permissions/AgentObjects.PermissionSet.al new file mode 100644 index 0000000000..4d8e02fc41 --- /dev/null +++ b/src/System Application/App/Agent/Permissions/AgentObjects.PermissionSet.al @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +permissionset 4300 "Agent - Objects" +{ + Access = Internal; + Assignable = false; + + Permissions = codeunit "Agent Task Impl." = X, + page "Agent Access Control" = X, + page "Agent Card" = X, + page "Agent List" = X, + page "Agent Task List" = X, + page "Agent Task Message Card" = X, + page "Agent Task Message List" = X, + page "Agent Task Step List" = X, + codeunit "Agent Impl." = X, + codeunit "Agent Task" = X; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Setup/Agent.Codeunit.al b/src/System Application/App/Agent/Setup/Agent.Codeunit.al new file mode 100644 index 0000000000..edf43ef83e --- /dev/null +++ b/src/System Application/App/Agent/Setup/Agent.Codeunit.al @@ -0,0 +1,174 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Reflection; +using System.Security.AccessControl; + +codeunit 4321 Agent +{ + InherentEntitlements = X; + InherentPermissions = X; + + /// + /// Creates a new agent. + /// The agent will be in the disabled state, with the users that can interact with the agent setup. + /// + /// The metadata provider of the agent. + /// User name for the agent. + /// Display name for the agent. + /// Instructions for the agent that will be used to complete the tasks. + /// The list of users that can configure or interact with the agent. + /// The ID of the agent. +#pragma warning disable AS0026 + [Scope('OnPrem')] + procedure Create(AgentMetadataProvider: Enum "Agent Metadata Provider"; UserName: Code[50]; UserDisplayName: Text[80]; var TempAgentAccessControl: Record "Agent Access Control" temporary): Guid +#pragma warning restore AS0026 + var + AgentImpl: Codeunit "Agent Impl."; + begin + exit(AgentImpl.CreateAgent(AgentMetadataProvider, UserName, UserDisplayName, TempAgentAccessControl)); + end; + + /// + /// Activates the agent + /// + /// The user security ID of the agent. + [Scope('OnPrem')] + procedure Activate(AgentUserSecurityID: Guid) + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.Activate(AgentUserSecurityID); + end; + + /// + /// Deactivates the agent + /// + /// The user security ID of the agent. + [Scope('OnPrem')] + procedure Deactivate(AgentUserSecurityID: Guid) + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.Deactivate(AgentUserSecurityID); + end; + + /// + /// Get the display name of the agent. + /// + /// The user security ID of the agent. + [Scope('OnPrem')] + procedure GetDisplayName(AgentUserSecurityID: Guid): Text[80] + var + AgentImpl: Codeunit "Agent Impl."; + begin + exit(AgentImpl.GetDisplayName(AgentUserSecurityID)); + end; + + /// + /// Get the user name of the agent. + /// + /// The user security ID of the agent. + [Scope('OnPrem')] + procedure GetUserName(AgentUserSecurityID: Guid): Code[50] + var + AgentImpl: Codeunit "Agent Impl."; + begin + exit(AgentImpl.GetUserName(AgentUserSecurityID)); + end; + + /// + /// Sets the display name of the agent. + /// + /// The user security ID of the agent. + /// The display name of the agent. + [Scope('OnPrem')] + procedure SetDisplayName(AgentUserSecurityID: Guid; DisplayName: Text[80]) + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.SetDisplayName(AgentUserSecurityID, DisplayName); + end; + + /// + /// Set the instructions which agent will use to complete the tasks. + /// + /// The agent which instructions will be set. + /// Instructions for the agent that will be used to complete the tasks. + [Scope('OnPrem')] + procedure SetInstructions(AgentUserSecurityID: Guid; Instructions: SecretText) + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.SetInstructions(AgentUserSecurityID, Instructions); + end; + + /// + /// Checks if the agent is active. + /// + /// The user security ID of the agent. + /// If the agent is active. + [Scope('OnPrem')] + procedure IsActive(AgentUserSecurityID: Guid): Boolean + var + AgentImpl: Codeunit "Agent Impl."; + begin + exit(AgentImpl.IsActive(AgentUserSecurityID)); + end; + + /// + /// Assigns the permission set to the agent. + /// + /// The user security ID of the agent. + /// Profile to set to the agent. + [Scope('OnPrem')] + procedure SetProfile(AgentUserSecurityID: Guid; var AllProfile: Record "All Profile") + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.SetProfile(AgentUserSecurityID, AllProfile); + end; + + /// + /// Assigns the permission set to the agent. + /// + /// The user security ID of the agent. + /// Permission sets to assign + [Scope('OnPrem')] + procedure AssignPermissionSet(AgentUserSecurityID: Guid; var AggregatePermissionSet: Record "Aggregate Permission Set") + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.AssignPermissionSets(AgentUserSecurityID, CompanyName(), AggregatePermissionSet); + end; + + /// + /// Gets the users that can manage or give tasks to the agent. + /// + /// Security ID of the agent. + /// List of users that can manage or give tasks to the agent. + [Scope('OnPrem')] + procedure GetUserAccess(AgentUserSecurityID: Guid; var TempAgentAccessControl: Record "Agent Access Control" temporary) + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.GetUserAccess(AgentUserSecurityID, TempAgentAccessControl); + end; + + /// + /// Sets the users that can manage or give tasks to the agent. Existing set of users will be replaced with a new set. + /// + /// Security ID of the agent. + /// List of users that can manage or give tasks to the agent. + [Scope('OnPrem')] + procedure UpdateAccess(AgentUserSecurityID: Guid; var TempAgentAccessControl: Record "Agent Access Control" temporary) + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.UpdateAgentAccessControl(AgentUserSecurityID, TempAgentAccessControl); + end; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Setup/AgentAccessControl.Page.al b/src/System Application/App/Agent/Setup/AgentAccessControl.Page.al new file mode 100644 index 0000000000..f9cc77b28a --- /dev/null +++ b/src/System Application/App/Agent/Setup/AgentAccessControl.Page.al @@ -0,0 +1,134 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Security.AccessControl; + +page 4320 "Agent Access Control" +{ + PageType = ListPart; + ApplicationArea = All; + SourceTable = "Agent Access Control"; + Caption = 'Agent Access Control'; + MultipleNewLines = false; + Extensible = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(Main) + { + field(UserName; UserName) + { + Caption = 'User Name'; + ToolTip = 'Specifies the name of the User that can access the agent.'; + TableRelation = User; + + trigger OnValidate() + begin + ValidateUserName(UserName); + end; + } + field(UserFullName; UserFullName) + { + Caption = 'User Full Name'; + ToolTip = 'Specifies the Full Name of the User that can access the agent.'; + Editable = false; + } + field(CanConfigureAgent; Rec."Can Configure Agent") + { + Caption = 'Can Configure'; + Tooltip = 'Specifies whether the user can configure the agent.'; + + trigger OnValidate() + var + AgentImpl: Codeunit "Agent Impl."; + begin + if not Rec."Can Configure Agent" then + AgentImpl.VerifyOwnerExists(Rec); + end; + } + } + } + } + + trigger OnAfterGetRecord() + begin + UpdateGlobalVariables(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateGlobalVariables(); + end; + + trigger OnDeleteRecord(): Boolean + var + AgentImpl: Codeunit "Agent Impl."; + begin + AgentImpl.VerifyOwnerExists(Rec); + end; + + local procedure ValidateUserName(NewUserName: Text) + var + User: Record "User"; + UserGuid: Guid; + begin + if Evaluate(UserGuid, NewUserName) then begin + User.Get(UserGuid); + UpdateUser(User."User Security ID"); + UpdateGlobalVariables(); + exit; + end; + + User.SetRange("User Name", NewUserName); + if not User.FindFirst() then begin + User.SetFilter("User Name", '@*''''' + NewUserName + '''''*'); + User.FindFirst(); + end; + + UpdateUser(User."User Security ID"); + UpdateGlobalVariables(); + end; + + local procedure UpdateUser(NewUserID: Guid) + var + RecordExists: Boolean; + begin + RecordExists := Rec.Find(); + + if RecordExists then + Error(CannotUpdateUserErr); + + Rec."User Security ID" := NewUserID; + Rec.Insert(true); + end; + + local procedure UpdateGlobalVariables() + var + User: Record "User"; + begin + Clear(UserFullName); + Clear(UserName); + + if IsNullGuid(Rec."User Security ID") then + exit; + + if not User.Get(Rec."User Security ID") then + exit; + + UserName := User."User Name"; + UserFullName := User."Full Name"; + end; + + var + UserFullName: Text[80]; + UserName: Code[50]; + CannotUpdateUserErr: Label 'You cannot change the User. Delete and create the entry again.'; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Setup/AgentCard.Page.al b/src/System Application/App/Agent/Setup/AgentCard.Page.al new file mode 100644 index 0000000000..1ec4a99eb6 --- /dev/null +++ b/src/System Application/App/Agent/Setup/AgentCard.Page.al @@ -0,0 +1,228 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Security.User; +using System.Environment.Configuration; + +page 4315 "Agent Card" +{ + PageType = Card; + ApplicationArea = All; + SourceTable = Agent; + Caption = 'Agent Card'; + RefreshOnActivate = true; + DataCaptionExpression = Rec."User Name"; + InsertAllowed = false; + DeleteAllowed = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + group(General) + { + Caption = 'General'; + field("Agent Metadata Provider"; Rec."Agent Metadata Provider") + { + ShowMandatory = true; + ApplicationArea = Basic, Suite; + Caption = 'Type'; + Tooltip = 'Specifies the type of the agent.'; + Editable = false; + } + field(UserName; Rec."User Name") + { + ShowMandatory = true; + ApplicationArea = Basic, Suite; + Caption = 'User Name'; + Tooltip = 'Specifies the name of the user that is associated with the agent.'; + Editable = false; + } + + field(DisplayName; Rec."Display Name") + { + ShowMandatory = true; + ApplicationArea = Basic, Suite; + Caption = 'Display Name'; + Tooltip = 'Specifies the display name of the user that is associated with the agent.'; + Editable = false; + } + group(UserSettingsGroup) + { + ShowCaption = false; + field(AgentProfile; ProfileDisplayName) + { + ApplicationArea = Basic, Suite; + Caption = 'Profile'; + ToolTip = 'Specifies the profile that is associated with the agent.'; + Editable = false; + + trigger OnAssistEdit() + var + AgentImpl: Codeunit "Agent Impl."; + begin + if AgentImpl.ProfileLookup(UserSettingsRecord) then + AgentImpl.UpdateAgentUserSettings(UserSettingsRecord); + end; + } + } + field(State; Rec.State) + { + ApplicationArea = Basic, Suite; + Importance = Standard; + Caption = 'State'; + ToolTip = 'Specifies if the agent is enabled or disabled.'; + + trigger OnValidate() + begin + ChangeState(); + UpdateControls(); + end; + } + } + + part(Permissions; "User Subform") + { + Editable = ControlsEditable; + ApplicationArea = Basic, Suite; + Caption = 'Agent Permission Sets'; + SubPageLink = "User Security ID" = field("User Security ID"); + } + part(UserAccess; "Agent Access Control") + { + Editable = ControlsEditable; + ApplicationArea = Basic, Suite; + Caption = 'User Access'; + SubPageLink = "Agent User Security ID" = field("User Security ID"); + } + } + } + actions + { + area(Navigation) + { + action(AgentSetup) + { + ApplicationArea = Basic, Suite; + Caption = 'Setup'; + ToolTip = 'Set up agent'; + Image = SetupLines; + + trigger OnAction() + begin + OpenSetupPage(); + end; + } + action(UserSettingsAction) + { + ApplicationArea = Basic, Suite; + Caption = 'User Settings'; + ToolTip = 'Set up the profile and regional settings for the agent.'; + Image = SetupLines; + + trigger OnAction() + var + UserSettings: Codeunit "User Settings"; + begin + Rec.TestField("User Security ID"); + UserSettings.GetUserSettings(Rec."User Security ID", UserSettingsRecord); + Page.RunModal(Page::"User Settings", UserSettingsRecord); + end; + } + action(AgentTasks) + { + ApplicationArea = All; + Caption = 'Agent Tasks'; + ToolTip = 'View agent tasks'; + Image = Log; + + trigger OnAction() + var + AgentTask: Record "Agent Task"; + begin + AgentTask.SetRange("Agent User Security ID", Rec."User Security ID"); + Page.Run(Page::"Agent Task List", AgentTask); + end; + } + } + area(Promoted) + { + group(Category_Process) + { + actionref(AgentSetup_Promoted; AgentSetup) + { + } + actionref(UserSettings_Promoted; UserSettingsAction) + { + } + actionref(AgentTasks_Promoted; AgentTasks) + { + } + } + } + } + + local procedure UpdateControls() + var + AgentImpl: Codeunit "Agent Impl."; + UserSettings: Codeunit "User Settings"; + begin + if not IsNullGuid(Rec."User Security ID") then begin + UserSettings.GetUserSettings(Rec."User Security ID", UserSettingsRecord); + ProfileDisplayName := AgentImpl.GetProfileName(UserSettingsRecord.Scope, UserSettingsRecord."App ID", UserSettingsRecord."Profile ID"); + end; + + ControlsEditable := Rec.State = Rec.State::Disabled; + end; + + local procedure ChangeState() + var + ConfirmOpenSetupPage: Boolean; + begin + if Rec."Setup Page ID" = 0 then + exit; + + if Rec.State = Rec.State::Disabled then + exit; + + ConfirmOpenSetupPage := false; + + if GuiAllowed() then + ConfirmOpenSetupPage := Confirm(OpenConfigurationPageQst); + + if not ConfirmOpenSetupPage then + Error(YouCannotEnableAgentWithoutUsingConfigurationPageErr); + + Rec.Find(); + OpenSetupPage(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateControls(); + end; + + local procedure OpenSetupPage() + var + TempAgent: Record Agent temporary; + begin + TempAgent.Copy(Rec); + TempAgent.Insert(); + Page.RunModal(Rec."Setup Page ID", TempAgent); + CurrPage.Update(false); + end; + + + var + UserSettingsRecord: Record "User Settings"; + ProfileDisplayName: Text; + ControlsEditable: Boolean; + OpenConfigurationPageQst: Label 'To activate the agent, use the setup page. Would you like to open this page now?'; + YouCannotEnableAgentWithoutUsingConfigurationPageErr: Label 'You can''t activate the agent from this page. Use the action to set up and activate the agent.'; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Setup/AgentImpl.Codeunit.al b/src/System Application/App/Agent/Setup/AgentImpl.Codeunit.al new file mode 100644 index 0000000000..8682edfa92 --- /dev/null +++ b/src/System Application/App/Agent/Setup/AgentImpl.Codeunit.al @@ -0,0 +1,429 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Environment.Configuration; +using System.Reflection; +using System.Environment; +using System.Security.AccessControl; + +codeunit 4301 "Agent Impl." +{ + Access = Internal; + InherentEntitlements = X; + InherentPermissions = X; + Permissions = tabledata Agent = rim, + tabledata "All Profile" = r, + tabledata Company = r, + tabledata "Agent Access Control" = d, + tabledata "Application User Settings" = rim, + tabledata User = r, + tabledata "User Personalization" = rim; + + internal procedure CreateAgent(AgentMetadataProvider: Enum "Agent Metadata Provider"; AgentUserName: Code[50]; AgentUserDisplayName: Text[80]; var TempAgentAccessControl: Record "Agent Access Control" temporary): Guid + var + Agent: Record Agent; + begin + Agent."Agent Metadata Provider" := AgentMetadataProvider; + Agent."User Name" := AgentUserName; + Agent."Display Name" := AgentUserDisplayName; + Agent.Insert(true); + + if TempAgentAccessControl.IsEmpty() then + GetUserAccess(Agent, TempAgentAccessControl, true); + + AssignCompany(Agent."User Security ID", CompanyName()); + UpdateAgentAccessControl(TempAgentAccessControl, Agent); + + exit(Agent."User Security ID"); + end; + + internal procedure Activate(AgentUserSecurityID: Guid) + begin + ChangeAgentState(AgentUserSecurityID, true); + end; + + internal procedure Deactivate(AgentUserSecurityID: Guid) + begin + ChangeAgentState(AgentUserSecurityID, false); + end; + + [NonDebuggable] + internal procedure SetInstructions(AgentUserSecurityID: Guid; Instructions: SecretText) + var + Agent: Record Agent; + InstructionsOutStream: OutStream; + begin + Agent.Get(AgentUserSecurityID); + Clear(Agent.Instructions); + Agent.Instructions.CreateOutStream(InstructionsOutStream, GetDefaultEncoding()); + InstructionsOutStream.Write(Instructions.Unwrap()); + Agent.Modify(true); + end; + + internal procedure GetInstructions(var Agent: Record Agent): Text + var + InstructionsInStream: InStream; + InstructionsText: Text; + begin + if IsNullGuid(Agent."User Security ID") then + exit; + + Agent.CalcFields(Instructions); + if not Agent.Instructions.HasValue() then + exit(''); + + Agent.Instructions.CreateInStream(InstructionsInStream, GetDefaultEncoding()); + InstructionsInStream.Read(InstructionsText); + exit(InstructionsText); + end; + + internal procedure InsertCurrentOwnerIfNoOwnersDefined(var Agent: Record Agent; var AgentAccessControl: Record "Agent Access Control") + begin + SetOwnerFilters(AgentAccessControl); + AgentAccessControl.SetRange("Agent User Security ID", Agent."User Security ID"); + if not AgentAccessControl.IsEmpty() then + exit; + InsertCurrentOwner(Agent."User Security ID", AgentAccessControl); + end; + + internal procedure InsertCurrentOwner(AgentUserSecurityID: Guid; var AgentAccessControl: Record "Agent Access Control") + begin + AgentAccessControl."Can Configure Agent" := true; + AgentAccessControl."Agent User Security ID" := AgentUserSecurityID; + AgentAccessControl."User Security ID" := UserSecurityId(); + AgentAccessControl.Insert(); + end; + + internal procedure VerifyOwnerExists(AgentAccessControlModified: Record "Agent Access Control") + var + ExistingAgentAccessControl: Record "Agent Access Control"; + begin + if (AgentAccessControlModified."Can Configure Agent") then + exit; + + SetOwnerFilters(ExistingAgentAccessControl); + ExistingAgentAccessControl.SetFilter("User Security ID", '<>%1', AgentAccessControlModified."User Security ID"); + ExistingAgentAccessControl.SetRange("Agent User Security ID", AgentAccessControlModified."Agent User Security ID"); + + if ExistingAgentAccessControl.IsEmpty() then + Error(OneOwnerMustBeDefinedForAgentErr); + end; + + internal procedure GetUserAccess(AgentUserSecurityID: Guid; var TempAgentAccessControl: Record "Agent Access Control" temporary) + var + Agent: Record Agent; + begin + GetAgent(Agent, AgentUserSecurityID); + + GetUserAccess(Agent, TempAgentAccessControl, false); + end; + + local procedure GetUserAccess(var Agent: Record Agent; var TempAgentAccessControl: Record "Agent Access Control" temporary; InsertCurrentUserAsOwner: Boolean) + var + AgentAccessControl: Record "Agent Access Control"; + begin + TempAgentAccessControl.Reset(); + TempAgentAccessControl.DeleteAll(); + + AgentAccessControl.SetRange("Agent User Security ID", Agent."User Security ID"); + if AgentAccessControl.IsEmpty() then begin + if not InsertCurrentUserAsOwner then + exit; + + InsertCurrentOwnerIfNoOwnersDefined(Agent, TempAgentAccessControl); + exit; + end; + + AgentAccessControl.FindSet(); + repeat + TempAgentAccessControl.Copy(AgentAccessControl); + TempAgentAccessControl.Insert(); + until AgentAccessControl.Next() = 0; + end; + + internal procedure SetProfile(AgentUserSecurityID: Guid; var AllProfile: Record "All Profile") + var + Agent: Record Agent; + UserSettingsRecord: Record "User Settings"; + UserSettings: Codeunit "User Settings"; + begin + GetAgent(Agent, AgentUserSecurityID); + + UserSettings.GetUserSettings(Agent."User Security ID", UserSettingsRecord); + UpdateProfile(AllProfile, UserSettingsRecord); + UpdateAgentUserSettings(UserSettingsRecord); + end; + + internal procedure AssignCompany(AgentUserSecurityID: Guid; CompanyName: Text) + var + Agent: Record Agent; + UserSettingsRecord: Record "User Settings"; + UserSettings: Codeunit "User Settings"; + begin + GetAgent(Agent, AgentUserSecurityID); + + UserSettings.GetUserSettings(Agent."User Security ID", UserSettingsRecord); +#pragma warning disable AA0139 + UserSettingsRecord.Company := CompanyName(); +#pragma warning restore AA0139 + UpdateAgentUserSettings(UserSettingsRecord); + end; + + internal procedure GetUserName(AgentUserSecurityID: Guid): Code[50] + var + Agent: Record Agent; + begin + GetAgent(Agent, AgentUserSecurityID); + + exit(Agent."User Name"); + end; + + internal procedure GetDisplayName(AgentUserSecurityID: Guid): Text[80] + var + Agent: Record Agent; + begin + GetAgent(Agent, AgentUserSecurityID); + + exit(Agent."Display Name") + end; + + internal procedure SetDisplayName(AgentUserSecurityID: Guid; DisplayName: Text[80]) + var + Agent: Record Agent; + begin + GetAgent(Agent, AgentUserSecurityID); + + Agent."Display Name" := DisplayName; + Agent.Modify(true); + end; + + internal procedure IsActive(AgentUserSecurityID: Guid): Boolean + var + Agent: Record Agent; + begin + GetAgent(Agent, AgentUserSecurityID); + + exit(Agent.State = Agent.State::Enabled); + end; + + internal procedure UpdateAgentAccessControl(AgentUserSecurityID: Guid; var TempAgentAccessControl: Record "Agent Access Control" temporary) + var + Agent: Record Agent; + begin + if not Agent.Get(AgentUserSecurityID) then + Error(AgentDoesNotExistErr); + + UpdateAgentAccessControl(TempAgentAccessControl, Agent); + end; + + # Region TODO: Update System App signatures to use the codeunit 9175 "User Settings Impl." + internal procedure UpdateAgentUserSettings(NewUserSettings: Record "User Settings") + var + UserPersonalization: Record "User Personalization"; + begin + UserPersonalization.Get(NewUserSettings."User Security ID"); + + UserPersonalization."Language ID" := NewUserSettings."Language ID"; + UserPersonalization."Locale ID" := NewUserSettings."Locale ID"; + UserPersonalization.Company := NewUserSettings.Company; + UserPersonalization."Time Zone" := NewUserSettings."Time Zone"; + UserPersonalization."Profile ID" := NewUserSettings."Profile ID"; +#pragma warning disable AL0432 // All profiles are now in the tenant scope + UserPersonalization.Scope := NewUserSettings.Scope; +#pragma warning restore AL0432 + UserPersonalization."App ID" := NewUserSettings."App ID"; + UserPersonalization.Modify(); + end; + + procedure ProfileLookup(var UserSettingsRec: Record "User Settings"): Boolean + var + TempAllProfile: Record "All Profile" temporary; + begin + PopulateProfiles(TempAllProfile); + + if TempAllProfile.Get(UserSettingsRec.Scope, UserSettingsRec."App ID", UserSettingsRec."Profile ID") then; + if Page.RunModal(Page::Roles, TempAllProfile) = Action::LookupOK then begin + UpdateProfile(TempAllProfile, UserSettingsRec); + exit(true); + end; + exit(false); + end; + + internal procedure UpdateProfile(var TempAllProfile: Record "All Profile" temporary; var UserSettingsRec: Record "User Settings") + begin + UserSettingsRec."Profile ID" := TempAllProfile."Profile ID"; + UserSettingsRec."App ID" := TempAllProfile."App ID"; + UserSettingsRec.Scope := TempAllProfile.Scope; + end; + + procedure PopulateProfiles(var TempAllProfile: Record "All Profile" temporary) + var + AllProfile: Record "All Profile"; + DescriptionFilterTxt: Label 'Navigation menu only.'; + UserCreatedAppNameTxt: Label '(User-created)'; + begin + TempAllProfile.Reset(); + TempAllProfile.DeleteAll(); + AllProfile.SetRange(Enabled, true); + AllProfile.SetFilter(Description, '<> %1', DescriptionFilterTxt); + if AllProfile.FindSet() then + repeat + TempAllProfile := AllProfile; + if IsNullGuid(TempAllProfile."App ID") then + TempAllProfile."App Name" := UserCreatedAppNameTxt; + TempAllProfile.Insert(); + until AllProfile.Next() = 0; + end; + + procedure GetProfileName(Scope: Option System,Tenant; AppID: Guid; ProfileID: Code[30]) ProfileName: Text + var + AllProfile: Record "All Profile"; + begin + // If current profile has been changed, then find it and update the description; else, get the default + if not AllProfile.Get(Scope, AppID, ProfileID) then + exit; + + ProfileName := AllProfile.Caption; + end; + + internal procedure AssignPermissionSets(var UserSID: Guid; PermissionCompanyName: Text; var AggregatePermissionSet: Record "Aggregate Permission Set") + var + AccessControl: Record "Access Control"; + begin + if not AggregatePermissionSet.FindSet() then + exit; + + repeat + AccessControl."App ID" := AggregatePermissionSet."App ID"; + AccessControl."User Security ID" := UserSID; + AccessControl."Role ID" := AggregatePermissionSet."Role ID"; + AccessControl.Scope := AggregatePermissionSet.Scope; +#pragma warning disable AA0139 + AccessControl."Company Name" := PermissionCompanyName; +#pragma warning restore AA0139 + AccessControl.Insert(); + until AggregatePermissionSet.Next() = 0; + end; + #endregion + + local procedure GetAgent(var Agent: Record Agent; UserSecurityID: Guid) + begin + Agent.SetAutoCalcFields(Instructions); + if not Agent.Get(UserSecurityID) then + Error(AgentDoesNotExistErr); + end; + + local procedure ChangeAgentState(UserSecurityID: Guid; Enabled: Boolean) + var + Agent: Record Agent; + + begin + GetAgent(Agent, UserSecurityId); + + if Enabled then + Agent.State := Agent.State::Enabled + else + Agent.State := Agent.State::Disabled; + + Agent.Modify(); + end; + + local procedure UpdateAgentAccessControl(var TempAgentAccessControl: Record "Agent Access Control" temporary; var Agent: Record Agent) + begin + // We must delete or update the user doing the change the last to avoid removing permissions that are needed to commit the change + UpdateUsersOtherThanMainUser(TempAgentAccessControl, Agent); + + // Update the user at the end + UpdateUserDoingTheChange(TempAgentAccessControl, Agent); + end; + + local procedure UpdateUsersOtherThanMainUser(var TempAgentAccessControl: Record "Agent Access Control" temporary; var Agent: Record Agent) + var + AgentAccessControl: Record "Agent Access Control"; + begin + AgentAccessControl.SetRange("Agent User Security ID", Agent."User Security ID"); + AgentAccessControl.SetFilter("User Security ID", '<>%1', UserSecurityId()); + if AgentAccessControl.FindSet() then + repeat + if not TempAgentAccessControl.Get(AgentAccessControl."Agent User Security ID", AgentAccessControl."User Security ID") then + AgentAccessControl.Delete(true); + until AgentAccessControl.Next() = 0; + + AgentAccessControl.Reset(); + TempAgentAccessControl.Reset(); + TempAgentAccessControl.SetFilter("User Security ID", '<>%1', UserSecurityId()); + if not TempAgentAccessControl.FindSet() then + exit; + + repeat + if AgentAccessControl.Get(Agent."User Security ID", TempAgentAccessControl."User Security ID") then begin + AgentAccessControl.TransferFields(TempAgentAccessControl, true); + AgentAccessControl."Agent User Security ID" := Agent."User Security ID"; + AgentAccessControl.Modify(); + end else begin + AgentAccessControl.TransferFields(TempAgentAccessControl, true); + AgentAccessControl."Agent User Security ID" := Agent."User Security ID"; + AgentAccessControl.Insert(); + end; + until TempAgentAccessControl.Next() = 0; + end; + + local procedure UpdateUserDoingTheChange(var TempAgentAccessControl: Record "Agent Access Control" temporary; var Agent: Record Agent) + var + AgentAccessControl: Record "Agent Access Control"; + begin + TempAgentAccessControl.SetFilter("User Security ID", UserSecurityId()); + if not TempAgentAccessControl.FindFirst() then begin + if AgentAccessControl.Get(Agent."User Security ID", UserSecurityId()) then + AgentAccessControl.Delete(); + + exit; + end; + + if AgentAccessControl.Get(Agent."User Security ID", UserSecurityId()) then begin + AgentAccessControl.TransferFields(TempAgentAccessControl, true); + AgentAccessControl."Agent User Security ID" := Agent."User Security ID"; + AgentAccessControl.Modify(); + exit; + end else begin + AgentAccessControl.TransferFields(TempAgentAccessControl, true); + AgentAccessControl."Agent User Security ID" := Agent."User Security ID"; + AgentAccessControl.Insert(); + exit; + end; + end; + + procedure SelectAgent(var Agent: Record "Agent") + begin + Agent.SetRange(State, Agent.State::Enabled); + if Agent.Count() = 0 then + Error(NoActiveAgentsErr); + + if Agent.Count() = 1 then begin + Agent.FindFirst(); + exit; + end; + + if not (Page.RunModal(Page::"Agent List", Agent) in [Action::LookupOK, Action::OK]) then + Error(''); + end; + + local procedure SetOwnerFilters(var AgentAccessControl: Record "Agent Access Control") + begin + AgentAccessControl.SetFilter("Can Configure Agent", '%1', true); + end; + + local procedure GetDefaultEncoding(): TextEncoding + begin + exit(TextEncoding::UTF8); + end; + + var + OneOwnerMustBeDefinedForAgentErr: Label 'One owner must be defined for the agent.'; + AgentDoesNotExistErr: Label 'Agent does not exist.'; + NoActiveAgentsErr: Label 'There are no active agents setup on the system.'; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Setup/AgentList.Page.al b/src/System Application/App/Agent/Setup/AgentList.Page.al new file mode 100644 index 0000000000..62bb45d7f6 --- /dev/null +++ b/src/System Application/App/Agent/Setup/AgentList.Page.al @@ -0,0 +1,93 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4316 "Agent List" +{ + PageType = List; + ApplicationArea = All; + UsageCategory = Administration; + SourceTable = "Agent"; + Caption = 'Agents'; + CardPageId = "Agent Card"; + AdditionalSearchTerms = 'Agent, Agents, Copilot, Automation, AI'; + Editable = false; + InsertAllowed = false; + DeleteAllowed = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(Main) + { + field(UserName; Rec."User Name") + { + Caption = 'User Name'; + } + field(DisplayName; Rec."Display Name") + { + Caption = 'Display Name'; + } + field(State; Rec.State) + { + Caption = 'State'; + } + } + } + } + actions + { + area(Processing) + { + action(AgentSetup) + { + ApplicationArea = Basic, Suite; + Caption = 'Setup'; + ToolTip = 'Set up the agent'; + Image = SetupLines; + + trigger OnAction() + var + TempAgent: Record Agent temporary; + begin + TempAgent.Copy(Rec); + TempAgent.Insert(); + Page.RunModal(Rec."Setup Page ID", TempAgent); + end; + } + action(AgentTasks) + { + ApplicationArea = All; + Caption = 'Agent Tasks'; + ToolTip = 'View agent tasks'; + Image = Log; + + trigger OnAction() + var + AgentTask: Record "Agent Task"; + begin + AgentTask.SetRange("Agent User Security ID", Rec."User Security ID"); + Page.Run(Page::"Agent Task List", AgentTask); + end; + } + } + area(Promoted) + { + group(Category_Process) + { + actionref(AgentSetup_Promoted; AgentSetup) + { + } + actionref(AgentTasks_Promoted; AgentTasks) + { + } + } + } + } +} \ No newline at end of file diff --git a/src/System Application/App/Agent/Setup/SelectAgentAccessControl.Page.al b/src/System Application/App/Agent/Setup/SelectAgentAccessControl.Page.al new file mode 100644 index 0000000000..5e2b143ecf --- /dev/null +++ b/src/System Application/App/Agent/Setup/SelectAgentAccessControl.Page.al @@ -0,0 +1,179 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Security.AccessControl; + +page 4321 "Select Agent Access Control" +{ + PageType = StandardDialog; + ApplicationArea = All; + SourceTable = "Agent Access Control"; + SourceTableTemporary = true; + Caption = 'Select users to manage tasks and configure the agent'; + MultipleNewLines = false; + Extensible = false; + DataCaptionExpression = ''; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(Main) + { + field(UserName; UserName) + { + Caption = 'User Name'; + ToolTip = 'Specifies the name of the User that can access the agent.'; + TableRelation = User; + + trigger OnValidate() + begin + ValidateUserName(UserName); + CurrPage.Update(true); + end; + } + field(UserFullName; UserFullName) + { + Caption = 'User Full Name'; + ToolTip = 'Specifies the Full Name of the User that can access the agent.'; + Editable = false; + } + field(CanConfigureAgent; Rec."Can Configure Agent") + { + Caption = 'Can configure'; + Tooltip = 'Specifies whether the user can configure the agent.'; + + trigger OnValidate() + begin + if not Rec."Can Configure Agent" then + VerifyOwnerExists(); + end; + } + } + } + } + + trigger OnAfterGetRecord() + begin + UpdateGlobalVariables(); + end; + + trigger OnAfterGetCurrRecord() + begin + UpdateGlobalVariables(); + end; + + trigger OnDeleteRecord(): Boolean + begin + VerifyOwnerExists(); + end; + + trigger OnOpenPage() + var + AgentImpl: Codeunit "Agent Impl."; + begin + if Rec.GetFilter("Agent User Security ID") <> '' then + Evaluate(AgentUserSecurityID, Rec.GetFilter("Agent User Security ID")); + + if Rec.Count() = 0 then + AgentImpl.InsertCurrentOwner(Rec."Agent User Security ID", Rec); + end; + + local procedure ValidateUserName(NewUserName: Text) + var + User: Record "User"; + UserGuid: Guid; + begin + if Evaluate(UserGuid, NewUserName) then begin + User.Get(UserGuid); + UpdateUser(User."User Security ID"); + UpdateGlobalVariables(); + exit; + end; + + User.SetRange("User Name", NewUserName); + if not User.FindFirst() then begin + User.SetFilter("User Name", '@*''''' + NewUserName + '''''*'); + User.FindFirst(); + end; + + UpdateUser(User."User Security ID"); + UpdateGlobalVariables(); + end; + + local procedure UpdateUser(NewUserID: Guid) + var + TempAgentAccessControl: Record "Agent Access Control" temporary; + RecordExists: Boolean; + begin + RecordExists := Rec.Find(); + + if RecordExists then begin + TempAgentAccessControl.Copy(Rec); + Rec.Delete(); + Rec.Copy(TempAgentAccessControl); + end; + + Rec."User Security ID" := NewUserID; + Rec."Agent User Security ID" := AgentUserSecurityID; + Rec.Insert(true); + VerifyOwnerExists(); + end; + + local procedure UpdateGlobalVariables() + var + User: Record "User"; + begin + Clear(UserFullName); + Clear(UserName); + + if IsNullGuid(Rec."User Security ID") then + exit; + + if not User.Get(Rec."User Security ID") then + exit; + + UserName := User."User Name"; + UserFullName := User."Full Name"; + end; + + [Scope('OnPrem')] + procedure GetAgentUserAccess(var TempAgentAccessControl: Record "Agent Access Control" temporary) + begin + TempAgentAccessControl.Reset(); + TempAgentAccessControl.DeleteAll(); + + if Rec.FindSet() then + repeat + TempAgentAccessControl.Copy(Rec); + TempAgentAccessControl.Insert(); + until Rec.Next() = 0; + end; + + local procedure VerifyOwnerExists() + var + TempAgentAccessControl: Record "Agent Access Control" temporary; + begin + TempAgentAccessControl.Copy(Rec); + Rec.SetFilter("Can Configure Agent", '%1', true); + Rec.SetFilter("User Security ID", '<>%1', Rec."User Security ID"); + if Rec.IsEmpty() then begin + Rec.Copy(TempAgentAccessControl); + Error(OneOwnerMustBeDefinedForAgentErr); + end; + + Rec.Copy(TempAgentAccessControl); + end; + + var + UserFullName: Text[80]; + UserName: Code[50]; + AgentUserSecurityID: Guid; + OneOwnerMustBeDefinedForAgentErr: Label 'One owner must be defined for the agent.'; +} \ No newline at end of file diff --git a/src/System Application/App/Agent/TaskPane/TaskDetails.Page.al b/src/System Application/App/Agent/TaskPane/TaskDetails.Page.al new file mode 100644 index 0000000000..de3f567f62 --- /dev/null +++ b/src/System Application/App/Agent/TaskPane/TaskDetails.Page.al @@ -0,0 +1,132 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4313 "Task Details" +{ + PageType = ListPart; + ApplicationArea = All; + SourceTable = "Agent Task Timeline Entry Step"; + Caption = 'Agent Task Timeline Entry Step'; + Editable = false; + InsertAllowed = false; + ModifyAllowed = false; + DeleteAllowed = false; + Extensible = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(content) + { + repeater(Steps) + { + field(ClientContext; ClientContext) + { + Caption = 'Client Context'; + ToolTip = 'Specifies the client context.'; + } + } + } + } + + actions + { + area(Processing) + { + +#pragma warning disable AW0005 + action(Confirm) +#pragma warning restore AW0005 + { + Caption = 'Confirm'; + ToolTip = 'Confirms the timeline entry.'; + + trigger OnAction() + begin + AddUserInterventionTaskStep(); + end; + } +#pragma warning disable AW0005 + action(DiscardStep) +#pragma warning restore AW0005 + { + Caption = 'Discard step'; + ToolTip = 'Discard the timeline entry.'; + trigger OnAction() + begin + SkipStep(); + end; + } + } + } + + trigger OnAfterGetRecord() + begin + SetClientContext(); + end; + + local procedure SetClientContext() + var + InStream: InStream; + begin + // Clear old value + Clear(ClientContext); + + if Rec.CalcFields("Client Context") then + if Rec."Client Context".HasValue() then begin + Rec."Client Context".CreateInStream(InStream); + ClientContext.Read(InStream); + end; + end; + + local procedure AddUserInterventionTaskStep() + var + UserInterventionRequestStep: Record "Agent Task Step"; + TaskTimelineEntry: Record "Agent Task Timeline Entry"; + UserInput: Text; + begin + TaskTimelineEntry.SetRange("Task ID", Rec."Task ID"); + TaskTimelineEntry.SetRange(ID, Rec."Timeline Entry ID"); + TaskTimelineEntry.SetRange("Last Step Type", TaskTimelineEntry."Last Step Type"::"User Intervention Request"); + if TaskTimelineEntry.FindLast() then begin + case TaskTimelineEntry."User Intervention Request Type" of + TaskTimelineEntry."User Intervention Request Type"::ReviewMessage: + UserInput := ''; + else + UserInput := UserMessage; //ToDo: Will be implemented when we have a message field. + end; + if UserInterventionRequestStep.Get(TaskTimelineEntry."Task ID", TaskTimelineEntry."Last Step Number") then + AgentTaskImpl.CreateUserInterventionTaskStep(UserInterventionRequestStep, UserInput); + end; + end; + + local procedure SkipStep() + var + TaskTimelineEntry: Record "Agent Task Timeline Entry"; + AgentTaskMessage: Record "Agent Task Message"; + begin + + if not TaskTimelineEntry.Get(Rec."Task ID", Rec."Timeline Entry ID") then + exit; + + case TaskTimelineEntry.Type of + TaskTimelineEntry.Type::OutputMessage: + if AgentTaskMessage.Get(TaskTimelineEntry."Primary Page Record ID") then begin + AgentTaskMessage.Status := AgentTaskMessage.Status::Discarded; + AgentTaskMessage.Modify(true); + end; + end; + end; + + var + AgentTaskImpl: Codeunit "Agent Task Impl."; + ClientContext: BigText; + UserMessage: Text; +} + + diff --git a/src/System Application/App/Agent/TaskPane/TaskTimeline.Page.al b/src/System Application/App/Agent/TaskPane/TaskTimeline.Page.al new file mode 100644 index 0000000000..ad7eb7fb1e --- /dev/null +++ b/src/System Application/App/Agent/TaskPane/TaskTimeline.Page.al @@ -0,0 +1,270 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +using System.Security.AccessControl; + +page 4307 "Task Timeline" +{ + PageType = ListPart; + ApplicationArea = All; + SourceTable = "Agent Task Timeline Entry"; + Caption = 'Agent Task Timeline'; + InsertAllowed = false; + DeleteAllowed = false; + Extensible = false; + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(content) + { + field(SelectedSuggestionId; SelectedSuggestionId) + { + Editable = true; + Caption = 'Selected Suggestion ID'; + ToolTip = 'Specifies the selected suggestion ID for the user intervention request.'; + } + repeater(TaskTimeline) + { + field(Header; Rec.Title) + { + Caption = 'Header'; + ToolTip = 'Specifies the header of the timeline entry.'; + } + field(Summary; GlobalPageSummary) + { + Caption = 'Summary'; + ToolTip = 'Specifies the summary of the timeline entry.'; + } + field(PrimaryPageQuery; GlobalPageQuery) + { + Caption = 'Primary Page Query'; + ToolTip = 'Specifies the primary page query of the timeline entry.'; + } + field(Description; GlobalDescription) + { + Caption = 'Description'; + ToolTip = 'Specifies the description of the timeline entry.'; + } + field(Category; Rec.Category) + { + } + field(Type; Rec.Type) + { + } + field(ConfirmationStatus; ConfirmationStatusOption) + { + Caption = 'Confirmation Status'; + ToolTip = 'Specifies the confirmation status of the timeline entry.'; + OptionCaption = ' ,ConfirmationNotRequired,ReviewConfirmationRequired,ReviewConfirmed,StopConfirmationRequired,StopConfirmed,Discarded'; + } + field(ConfirmedBy; GlobalConfirmedBy) + { + Caption = 'Confirmed By'; + ToolTip = 'Specifies the user who confirmed the timeline entry.'; + } + field(ConfirmedAt; GlobalConfirmedAt) + { + Caption = 'Confirmed At'; + ToolTip = 'Specifies the date and time when the timeline entry was confirmed.'; + } + field(Annotations; GlobalAnnotations) + { + Caption = 'Annotations'; + Tooltip = 'Specifies the annotations for the timeline entry, such as additional messages to surface to the user.'; + } + field(Importance; Rec.Importance) + { + } + field(UserInterventionRequestType; Rec."User Intervention Request Type") + { + Caption = 'User Intervention Request Type'; + ToolTip = 'Specifies the type of user intervention request when this entry is an intervention request.'; + } + field(Suggestions; GlobalSuggestions) + { + Caption = 'Suggestions'; + ToolTip = 'Specifies the suggestions for the user intervention request.'; + } + field(CreatedAt; Rec.SystemCreatedAt) + { + Caption = 'First Step Created At'; + ToolTip = 'Specifies the date and time when the timeline entry was created.'; + } + } + } + } + actions + { + area(Processing) + { +#pragma warning disable AW0005 + action(Send) +#pragma warning restore AW0005 + { + Caption = 'Send'; + ToolTip = 'Sends the selected instructions to the agent.'; + Scope = Repeater; + trigger OnAction() + var + UserInterventionRequestStep: Record "Agent Task Step"; + AgentTaskImpl: Codeunit "Agent Task Impl."; + SelectedSuggestionIdInt: Integer; + begin + if UserInterventionRequestStep.Get(Rec."Task ID", Rec."Last Step Number") then + if UserInterventionRequestStep.Type = "Agent Task Step Type"::"User Intervention Request" then + if Evaluate(SelectedSuggestionIdInt, SelectedSuggestionId) then + AgentTaskImpl.CreateUserInterventionTaskStep(UserInterventionRequestStep, SelectedSuggestionIdInt); + end; + } + +#pragma warning disable AW0005 + action(Retry) +#pragma warning restore AW0005 + { + Caption = 'Retry'; + ToolTip = 'Retries the task.'; + Scope = Repeater; + trigger OnAction() + var + UserInterventionRequestStep: Record "Agent Task Step"; + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + if UserInterventionRequestStep.Get(Rec."Task ID", Rec."Last Step Number") then + if UserInterventionRequestStep.Type = "Agent Task Step Type"::"User Intervention Request" then + AgentTaskImpl.CreateUserInterventionTaskStep(UserInterventionRequestStep); + end; + + } + } + } + + trigger OnOpenPage() + begin + SelectedSuggestionId := ''; + Rec.SetRange(Importance, Rec.Importance::Primary); + end; + + trigger OnAfterGetRecord() + begin + SetTaskTimelineDetails(); + end; + + local procedure SetTaskTimelineDetails() + var + InStream: InStream; + ConfirmationStepType: Enum "Agent Task Step Type"; + StepNumber: Integer; + begin + // Clear old values + GlobalConfirmedBy := ''; + GlobalConfirmedAt := 0DT; + Clear(GlobalPageSummary); + Clear(GlobalPageQuery); + Clear(GlobalAnnotations); + Clear(GlobalSuggestions); + + GlobalDescription := Rec.Description; + + if Rec.CalcFields("Primary Page Summary", "Primary Page Query", "Annotations") then begin + if Rec."Primary Page Summary".HasValue then begin + Rec."Primary Page Summary".CreateInStream(InStream, TextEncoding::UTF8); + GlobalPageSummary.Read(InStream); + Clear(InStream); + end; + if Rec."Primary Page Query".HasValue then begin + Rec."Primary Page Query".CreateInStream(InStream, TextEncoding::UTF8); + GlobalPageQuery.Read(InStream); + Clear(InStream); + end; + if Rec."Annotations".HasValue then begin + Rec."Annotations".CreateInStream(InStream, TextEncoding::UTF8); + GlobalAnnotations.Read(InStream); + Clear(InStream); + end; + end; + + if Rec.Type = Rec.Type::UserInterventionRequest then begin + Rec.CalcFields("Suggestions"); + if Rec.Suggestions.HasValue then begin + Rec.Suggestions.CreateInStream(InStream, TextEncoding::UTF8); + GlobalSuggestions.Read(InStream); + Clear(InStream); + end; + end; + + ConfirmationStatusOption := ConfirmationStatusOption::ConfirmationNotRequired; + StepNumber := Rec."Last Step Number"; + if (Rec."Last Step Type" <> "Agent Task Step Type"::Stop) and (Rec."Last User Intervention Step" > 0) then + StepNumber := Rec."Last User Intervention Step" + else + if Rec."Last Step Type" <> "Agent Task Step Type"::Stop then + // We know that there is no user intervention step for this timeline entry, and the last step is not a stop step. + exit; + if not TryGetConfirmationDetails(StepNumber, GlobalConfirmedBy, GlobalConfirmedAt, ConfirmationStepType) then + exit; + + case + ConfirmationStepType of + "Agent Task Step Type"::"User Intervention Request": + ConfirmationStatusOption := ConfirmationStatusOption::ReviewConfirmationRequired; + "Agent Task Step Type"::"User Intervention": + ConfirmationStatusOption := ConfirmationStatusOption::ReviewConfirmed; + "Agent Task Step Type"::Stop: + ConfirmationStatusOption := ConfirmationStatusOption::StopConfirmed; + else + ConfirmationStatusOption := ConfirmationStatusOption::ConfirmationNotRequired; + end; + end; + + local procedure TryGetConfirmationDetails(StepNumber: Integer; var By: Text[250]; var At: DateTime; var ConfirmationStepType: Enum "Agent Task Step Type"): Boolean + var + TaskTimelineEntryStep: Record "Agent Task Timeline Entry Step"; + User: Record User; + begin + if StepNumber <= 0 then + exit(false); + + TaskTimelineEntryStep.SetRange("Task ID", Rec."Task ID"); + TaskTimelineEntryStep.SetRange("Timeline Entry ID", Rec.ID); + TaskTimelineEntryStep.SetRange("Step Number", StepNumber); + if not TaskTimelineEntryStep.FindLast() then + exit(false); + + ConfirmationStepType := TaskTimelineEntryStep.Type; + if TaskTimelineEntryStep.Type = "Agent Task Step Type"::"User Intervention Request" then + exit(true); + + if ((TaskTimelineEntryStep.Type <> "Agent Task Step Type"::"User Intervention") and + (TaskTimelineEntryStep.Type <> "Agent Task Step Type"::Stop)) then + exit(false); + + User.SetRange("User Security ID", TaskTimelineEntryStep."User Security ID"); + if User.FindFirst() then + if User."Full Name" <> '' then + By := User."Full Name" + else + By := User."User Name"; + + At := Rec.SystemModifiedAt; + exit(true); + end; + + var + GlobalPageSummary: BigText; + GlobalPageQuery: BigText; + GlobalAnnotations: BigText; + GlobalSuggestions: BigText; + GlobalDescription: Text[2048]; + GlobalConfirmedBy: Text[250]; + GlobalConfirmedAt: DateTime; + ConfirmationStatusOption: Option " ",ConfirmationNotRequired,ReviewConfirmationRequired,ReviewConfirmed,StopConfirmationRequired,StopConfirmed,Discarded; + SelectedSuggestionId: Text[3]; +} + + diff --git a/src/System Application/App/Agent/TaskPane/Tasks.Page.al b/src/System Application/App/Agent/TaskPane/Tasks.Page.al new file mode 100644 index 0000000000..92ed3dbf1b --- /dev/null +++ b/src/System Application/App/Agent/TaskPane/Tasks.Page.al @@ -0,0 +1,131 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Agents; + +page 4306 Tasks +{ + PageType = ListPlus; + ApplicationArea = All; + SourceTable = "Agent Task Pane Entry"; + Caption = 'Agent Tasks'; + Editable = true; + InsertAllowed = false; + DeleteAllowed = false; + Extensible = false; + SourceTableView = sorting("Last Step Timestamp") order(descending); + InherentEntitlements = X; + InherentPermissions = X; + + layout + { + area(Content) + { + repeater(AgentTasks) + { + Editable = false; + field(TaskId; Rec."Task ID") + { + } + field(TaskNeedsAttention; Rec."Needs Attention") + { + } + field(TaskIndicator; Rec.Indicator) + { + } + field(TaskStatus; Rec.Status) + { + } + field(TaskHeader; Rec.Title) + { + Caption = 'Header'; + ToolTip = 'Specifies the header of the task.'; + } + field(TaskSummary; TaskSummary) + { + Caption = 'Summary'; + ToolTip = 'Specifies the summary of the task.'; + } + field(TaskStartedOn; Rec.SystemCreatedAt) + { + Caption = 'Started On'; + ToolTip = 'Specifies the date and time when the task was started.'; + } + field(TaskLastStepCompletedOn; Rec."Last Step Timestamp") + { + Caption = 'Last Step Completed On'; + } + field(TaskStepType; Rec."Current Entry Type") + { + Caption = 'Step Type'; + ToolTip = 'Specifies the type of the last step.'; + } + } + } + + area(FactBoxes) + { + part(Timeline; "Task Timeline") + { + SubPageLink = "Task ID" = field("Task ID"); + UpdatePropagation = Both; + Editable = true; + } + + part(Details; "Task Details") + { + Provider = Timeline; + SubPageLink = "Task ID" = field("Task ID"), "Timeline Entry ID" = field(ID); + Editable = true; + } + } + } + actions + { + area(Processing) + { +#pragma warning disable AW0005 + action(StopTask) +#pragma warning restore AW0005 + { + Caption = 'Stop task'; + ToolTip = 'Stops the task.'; + Enabled = true; + Scope = Repeater; + trigger OnAction() + var + AgentTask: Record "Agent Task"; + AgentTaskImpl: Codeunit "Agent Task Impl."; + begin + AgentTask.Get(Rec."Task ID"); + AgentTaskImpl.StopTask(AgentTask, AgentTask."Status"::"Stopped by User", false); + end; + } + } + } + + trigger OnAfterGetRecord() + begin + SetTaskDetails(); + end; + + local procedure SetTaskDetails() + var + InStream: InStream; + begin + // Clear old values + Clear(TaskSummary); + + Rec.CalcFields("Summary"); + if Rec."Summary".HasValue() then begin + Rec."Summary".CreateInStream(InStream); + TaskSummary.Read(InStream); + end; + end; + + var + TaskSummary: BigText; +} + diff --git a/src/System Application/App/Agent/app.json b/src/System Application/App/Agent/app.json new file mode 100644 index 0000000000..d7410592a5 --- /dev/null +++ b/src/System Application/App/Agent/app.json @@ -0,0 +1,48 @@ +{ + "id": "95f7c0f8-d9b8-4538-80f9-6e17f6f7b91a", + "name": "Agent", + "publisher": "Microsoft", + "brief": "Enables managing of agents", + "description": "Provides functionality for setting up, enabling and disabling, interacting and auditing agents.", + "version": "25.2.0.0", + "privacyStatement": "https://go.microsoft.com/fwlink/?LinkId=724009", + "EULA": "https://go.microsoft.com/fwlink/?LinkId=847985", + "help": "https://go.microsoft.com/fwlink/?linkid=868966", + "url": "https://go.microsoft.com/fwlink/?LinkId=724011", + "contextSensitiveHelpUrl": "https://go.microsoft.com/fwlink/?linkid=868966", + "logo": "ExtensionLogo.png", + "screenshots": [], + "platform": "25.2.0.0", + "target": "OnPrem", + "idRanges": [ + { + "from": 3000, + "to": 5000 + } + ], + "dependencies": [ + { + "id": "dd4b9f8a-b018-4f69-a614-efdb744c5330", + "name": "Page Summary Provider", + "publisher": "Microsoft", + "version": "25.2.0.0" + }, + { + "id": "7b9b59f5-a68d-4271-b11a-0d3b9c0938dd", + "name": "User Settings", + "publisher": "Microsoft", + "version": "25.2.0.0" + }, + { + "id": "c56e3ef4-7ab0-4636-ae87-013a62f12213", + "name": "User Permissions", + "publisher": "Microsoft", + "version": "25.2.0.0" + } + ], + "propagateDependencies": true, + "features": [ + "TranslationFile", + "NoImplicitWith" + ] +} \ No newline at end of file diff --git a/src/System Application/App/Permission Sets/src/UserSubformPermissions.PageExt.al b/src/System Application/App/Permission Sets/src/UserSubformPermissions.PageExt.al new file mode 100644 index 0000000000..f80238aa2f --- /dev/null +++ b/src/System Application/App/Permission Sets/src/UserSubformPermissions.PageExt.al @@ -0,0 +1,32 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Security.AccessControl; + +using System.Security.User; + +pageextension 9862 "User Subform Permissions" extends "User Subform" +{ + actions + { + addlast(Processing) + { + action(Permissions) + { + ApplicationArea = Basic, Suite; + Caption = 'Permissions'; + Image = Permission; + ToolTip = 'View or edit which feature objects that users need to access and set up the related permissions in permission sets that you can assign to the users of the database.'; + + trigger OnAction() + var + PermissionSetRelation: Codeunit "Permission Set Relation"; + begin + PermissionSetRelation.OpenPermissionSetPage(Rec."Role Name", Rec."Role ID", Rec."App ID", Rec.Scope); + end; + } + } + } +} \ No newline at end of file diff --git a/src/System Application/App/Security Groups/app.json b/src/System Application/App/Security Groups/app.json index e7cdfdfd83..b507edc791 100644 --- a/src/System Application/App/Security Groups/app.json +++ b/src/System Application/App/Security Groups/app.json @@ -76,6 +76,14 @@ "from": 9031, "to": 9031 }, + { + "from": 9821, + "to": 9821 + }, + { + "from": 9848, + "to": 9848 + }, { "from": 9866, "to": 9877 diff --git a/src/System Application/App/Security Groups/permissions/SecurityGroupsObjects.PermissionSet.al b/src/System Application/App/Security Groups/permissions/SecurityGroupsObjects.PermissionSet.al index 84d6002b02..1a60bc6f31 100644 --- a/src/System Application/App/Security Groups/permissions/SecurityGroupsObjects.PermissionSet.al +++ b/src/System Application/App/Security Groups/permissions/SecurityGroupsObjects.PermissionSet.al @@ -20,5 +20,7 @@ permissionset 9031 "Security Groups - Objects" page "Security Group Members Part" = X, page "Security Group Permission Sets" = X, page "Security Groups" = X, + page "User Security Groups Part" = X, + page "Inherited Permission Sets Part" = X, xmlport "Export/Import Security Groups" = X; } diff --git a/src/System Application/App/Security Groups/src/InheritedPermissionSetsPart.Page.al b/src/System Application/App/Security Groups/src/InheritedPermissionSetsPart.Page.al new file mode 100644 index 0000000000..0a35ee6f88 --- /dev/null +++ b/src/System Application/App/Security Groups/src/InheritedPermissionSetsPart.Page.al @@ -0,0 +1,120 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Security.AccessControl; + +page 9821 "Inherited Permission Sets Part" +{ + Caption = 'Permission Sets from Security Groups'; + Editable = false; + PageType = ListPart; + SourceTable = "Access Control"; + SourceTableTemporary = true; + + layout + { + area(content) + { + repeater(Group) + { + Caption = 'User Permissions'; + field(PermissionSet; Rec."Role ID") + { + ApplicationArea = Basic, Suite; + Caption = 'Permission Set'; + ToolTip = 'Specifies the ID of a permission set.'; + Style = Unfavorable; + StyleExpr = PermissionSetNotFound; + + trigger OnDrillDown() + var + PermissionSetRelation: Codeunit "Permission Set Relation"; + begin + PermissionSetRelation.OpenPermissionSetPage('', Rec."Role ID", Rec."App ID", Rec.Scope); + end; + } + field(Company; Rec."Company Name") + { + ApplicationArea = Basic, Suite; + Caption = 'Company'; + ToolTip = 'Specifies the company that the permission set applies to.'; + } + } + } + } + + trigger OnAfterGetRecord() + var + AggregatePermissionSet: Record "Aggregate Permission Set"; + begin + PermissionSetNotFound := not AggregatePermissionSet.Get(Rec.Scope, Rec."App ID", Rec."Role ID"); + end; + + trigger OnOpenPage() + begin + if not IsInitializedByCaller then + Refresh(); + end; + + [Scope('OnPrem')] + procedure Refresh() + var + SecurityGroupMemberBuffer: Record "Security Group Member Buffer"; + SecurityGroup: Codeunit "Security Group"; + begin + SecurityGroup.GetMembers(SecurityGroupMemberBufferToRefresh); + SecurityGroupMemberBuffer.Copy(SecurityGroupMemberBufferToRefresh, true); + Refresh(SecurityGroupMemberBuffer); + end; + + [Scope('OnPrem')] + procedure Refresh(var SecurityGroupMemberBuffer: Record "Security Group Member Buffer") + var + AccessControl: Record "Access Control"; + TempDummyAccessControl: Record "Access Control" temporary; + SecurityGroup: Codeunit "Security Group"; + GroupUserSecId: Guid; + begin + if not SecurityGroupMemberBuffer.FindSet() then + exit; + + TempDummyAccessControl.Copy(Rec, true); + TempDummyAccessControl.Reset(); + TempDummyAccessControl.DeleteAll(); + + repeat + GroupUserSecId := SecurityGroup.GetGroupUserSecurityId(SecurityGroupMemberBuffer."Security Group Code"); + AccessControl.SetRange("User Security ID", GroupUserSecId); + if AccessControl.FindSet() then + repeat + if not Rec.Get(SecurityGroupMemberBuffer."User Security ID", AccessControl."Role ID", AccessControl."Company Name", AccessControl.Scope, AccessControl."App ID") then begin + Rec.TransferFields(AccessControl); + Rec."User Security ID" := SecurityGroupMemberBuffer."User Security ID"; + Rec.Insert(); + end; + until AccessControl.Next() = 0; + until SecurityGroupMemberBuffer.Next() = 0; + + CurrPage.Update(false); + end; + + [Scope('OnPrem')] + procedure SetRecordToRefresh(var SecurityGroupMemberBuffer: Record "Security Group Member Buffer") + begin + SecurityGroupMemberBufferToRefresh.Copy(SecurityGroupMemberBuffer, true); + end; + + [Scope('OnPrem')] + procedure SetInitializedByCaller() + begin + IsInitializedByCaller := true; + end; + + var + SecurityGroupMemberBufferToRefresh: Record "Security Group Member Buffer"; + PermissionSetNotFound: Boolean; + IsInitializedByCaller: Boolean; +} + diff --git a/src/System Application/App/Security Groups/src/SecurityGroupPermissionSets.Page.al b/src/System Application/App/Security Groups/src/SecurityGroupPermissionSets.Page.al index ffbb182476..cc3826a7bb 100644 --- a/src/System Application/App/Security Groups/src/SecurityGroupPermissionSets.Page.al +++ b/src/System Application/App/Security Groups/src/SecurityGroupPermissionSets.Page.al @@ -5,6 +5,8 @@ namespace System.Security.AccessControl; +using System.Security.User; + /// /// View and edit the permission sets associated with a security group. /// @@ -81,22 +83,13 @@ page 9868 "Security Group Permission Sets" trigger OnAction() var TempAggregatePermissionSet: Record "Aggregate Permission Set" temporary; - AccessControl: Record "Access Control"; PermissionSetRelation: Codeunit "Permission Set Relation"; + UserPermissions: Codeunit "User Permissions"; begin if not PermissionSetRelation.LookupPermissionSet(true, TempAggregatePermissionSet) then exit; - if TempAggregatePermissionSet.FindSet() then - repeat - if not AccessControl.Get(Rec."User Security ID", TempAggregatePermissionSet."Role ID", '', TempAggregatePermissionSet.Scope, TempAggregatePermissionSet."App ID") then begin - AccessControl."User Security ID" := Rec."User Security ID"; - AccessControl."Role ID" := TempAggregatePermissionSet."Role ID"; - AccessControl.Scope := TempAggregatePermissionSet.Scope; - AccessControl."App ID" := TempAggregatePermissionSet."App ID"; - AccessControl.Insert(); - end; - until TempAggregatePermissionSet.Next() = 0; + UserPermissions.AssignPermissionSets(Rec."User Security ID", '', TempAggregatePermissionSet); end; } } diff --git a/src/System Application/App/Security Groups/src/UserSecurityGroupsPart.Page.al b/src/System Application/App/Security Groups/src/UserSecurityGroupsPart.Page.al new file mode 100644 index 0000000000..139e9db825 --- /dev/null +++ b/src/System Application/App/Security Groups/src/UserSecurityGroupsPart.Page.al @@ -0,0 +1,79 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace System.Security.AccessControl; + +page 9848 "User Security Groups Part" +{ + Caption = 'Security Groups'; + PageType = ListPart; + PopulateAllFields = true; + SourceTable = "Security Group Member Buffer"; + Editable = false; + + layout + { + area(content) + { + repeater(Group) + { + field(SecurityGroupCode; Rec."Security Group Code") + { + ApplicationArea = Basic, Suite; + Caption = 'Code'; + ToolTip = 'Specifies the security group code.'; + + trigger OnDrillDown() + var + SecurityGroupBuffer: Record "Security Group Buffer"; + SecurityGroups: Page "Security Groups"; + begin + SecurityGroupBuffer.SetRange(Code, Rec."Security Group Code"); + SecurityGroups.SetTableView(SecurityGroupBuffer); + SecurityGroups.Run(); + end; + } + field("Security Group Name"; Rec."Security Group Name") + { + ApplicationArea = Basic, Suite; + Caption = 'Name'; + ToolTip = 'Specifies the name of the security group.'; + } + } + } + } + + trigger OnOpenPage() + var + SecurityGroup: Codeunit "Security Group"; + begin + if not IsInitializedByCaller then + SecurityGroup.GetMembers(Rec); + end; + + [Scope('OnPrem')] + procedure Refresh(var SecurityGroupMemberBuffer: Record "Security Group Member Buffer") + begin + Rec.Copy(SecurityGroupMemberBuffer, true); + CurrPage.Update(false); + end; + + [Scope('OnPrem')] + procedure GetSourceRecord(var SecurityGroupMemberBuffer: Record "Security Group Member Buffer") + begin + IsInitializedByCaller := true; + SecurityGroupMemberBuffer.Copy(Rec, true); + end; + + [Scope('OnPrem')] + procedure SetInitializedByCaller() + begin + IsInitializedByCaller := true; + end; + + var + IsInitializedByCaller: Boolean; +} + diff --git a/src/System Application/App/User Permissions/app.json b/src/System Application/App/User Permissions/app.json index e210779236..dc18fb3a56 100644 --- a/src/System Application/App/User Permissions/app.json +++ b/src/System Application/App/User Permissions/app.json @@ -42,6 +42,10 @@ "from": 166, "to": 166 }, + { + "from": 9801, + "to": 9801 + }, { "from": 9854, "to": 9854 diff --git a/src/System Application/App/User Permissions/permissions/UserPermissionsObjects.PermissionSet.al b/src/System Application/App/User Permissions/permissions/UserPermissionsObjects.PermissionSet.al index c8f06ab217..6048d250b1 100644 --- a/src/System Application/App/User Permissions/permissions/UserPermissionsObjects.PermissionSet.al +++ b/src/System Application/App/User Permissions/permissions/UserPermissionsObjects.PermissionSet.al @@ -12,5 +12,6 @@ permissionset 166 "User Permissions - Objects" Access = Internal; Assignable = false; - Permissions = page "Lookup Permission Set" = X; + Permissions = page "Lookup Permission Set" = X, + page "User Subform" = X; } diff --git a/src/System Application/App/User Permissions/src/UserPermissions.Codeunit.al b/src/System Application/App/User Permissions/src/UserPermissions.Codeunit.al index 101b67dc0b..97ca5b74f6 100644 --- a/src/System Application/App/User Permissions/src/UserPermissions.Codeunit.al +++ b/src/System Application/App/User Permissions/src/UserPermissions.Codeunit.al @@ -84,6 +84,19 @@ codeunit 152 "User Permissions" end; #endif + /// + /// Assign a permission set to a given user + /// + /// The user's security ID. + /// The company for which to give the permission + /// Permission sets to assign + procedure AssignPermissionSets(var UserSecurityId: Guid; CompanyName: Text; var AggregatePermissionSet: Record "Aggregate Permission Set") + var + UserPermissionsImpl: Codeunit "User Permissions Impl."; + begin + UserPermissionsImpl.AssignPermissionSets(UserSecurityId, CompanyName, AggregatePermissionSet); + end; + /// /// Gets the effective permissions for the current user in the current company. /// diff --git a/src/System Application/App/User Permissions/src/UserPermissionsImpl.Codeunit.al b/src/System Application/App/User Permissions/src/UserPermissionsImpl.Codeunit.al index c25d9a25cd..372e08079c 100644 --- a/src/System Application/App/User Permissions/src/UserPermissionsImpl.Codeunit.al +++ b/src/System Application/App/User Permissions/src/UserPermissionsImpl.Codeunit.al @@ -290,6 +290,32 @@ codeunit 153 "User Permissions Impl." Evaluate(TempExpandedPermission."Execute Permission", SelectStr(5, PermissionMask)); end; + procedure AssignPermissionSets(var UserSecurityId: Guid; CompanyName: Text; var AggregatePermissionSet: Record "Aggregate Permission Set") + begin + if not AggregatePermissionSet.FindSet() then + exit; + + repeat + AssignPermissionSet(UserSecurityId, CompanyName, AggregatePermissionSet); + until AggregatePermissionSet.Next() = 0; + end; + + procedure AssignPermissionSet(var UserSecurityId: Guid; CompanyName: Text; var AggregatePermissionSet: Record "Aggregate Permission Set") + var + AccessControl: Record "Access Control"; + begin + if AccessControl.Get(UserSecurityId, AggregatePermissionSet."Role ID", '', AggregatePermissionSet.Scope, AggregatePermissionSet."App ID") then + exit; + + AccessControl."App ID" := AggregatePermissionSet."App ID"; + AccessControl."User Security ID" := UserSecurityId; + AccessControl."Role ID" := AggregatePermissionSet."Role ID"; + AccessControl.Scope := AggregatePermissionSet.Scope; +#pragma warning disable AA0139 + AccessControl."Company Name" := CompanyName; +#pragma warning restore AA0139 + AccessControl.Insert(); + end; /// /// An event that indicates that subscribers should set the result that should be returned when the CanManageUsersOnTenant is called. /// diff --git a/src/System Application/App/User Permissions/src/UserSubform.Page.al b/src/System Application/App/User Permissions/src/UserSubform.Page.al new file mode 100644 index 0000000000..dee79309e6 --- /dev/null +++ b/src/System Application/App/User Permissions/src/UserSubform.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 System.Security.User; + +using System.Security.AccessControl; + +page 9801 "User Subform" +{ + Caption = 'User Permission Sets'; + DelayedInsert = true; + PageType = ListPart; + SourceTable = "Access Control"; + + layout + { + area(content) + { + repeater(Group) + { + Caption = 'User Permissions'; + field(PermissionSet; Rec."Role ID") + { + ApplicationArea = Basic, Suite; + Caption = 'Permission Set'; + ToolTip = 'Specifies the ID of a security role that has been assigned to this Windows login in the current database.'; + Style = Unfavorable; + StyleExpr = PermissionSetNotFound; + + trigger OnLookup(var Text: Text): Boolean + var + LookupPermissionSet: Page "Lookup Permission Set"; + begin + LookupPermissionSet.LookupMode := true; + if LookupPermissionSet.RunModal() = ACTION::LookupOK then begin + LookupPermissionSet.GetRecord(PermissionSetLookupRecord); + Text := PermissionSetLookupRecord."Role ID"; + PermissionSetLookupRecord.SetRecFilter(); + exit(true); + end; + end; + + trigger OnValidate() + begin + PermissionSetLookupRecord.SetRange("Role ID", Rec."Role ID"); + PermissionSetLookupRecord.FindFirst(); + + if PermissionSetLookupRecord.Count > 1 then + Error(MultipleRoleIDErr, Rec."Role ID"); + + Rec.Scope := PermissionSetLookupRecord.Scope; + Rec."App ID" := PermissionSetLookupRecord."App ID"; + PermissionScope := Format(PermissionSetLookupRecord.Scope); + + Rec.CalcFields("App Name", "Role Name"); + PermissionSetLookupRecord.Reset(); + end; + } + field(Description; Rec."Role Name") + { + ApplicationArea = Basic, Suite; + Caption = 'Description'; + DrillDown = false; + Editable = false; + ToolTip = 'Specifies the name of the security role that has been given to this Windows login in the current database.'; + } + field(Company; Rec."Company Name") + { + ApplicationArea = Basic, Suite; + Caption = 'Company'; + ToolTip = 'Specifies the name of the company that this role is limited to for this Windows login.'; + } + field(ExtensionName; Rec."App Name") + { + ApplicationArea = Basic, Suite; + Caption = 'Extension Name'; + DrillDown = false; + Editable = false; + ToolTip = 'Specifies the name of the extension.'; + } + field(PermissionScope; PermissionScope) + { + ApplicationArea = Basic, Suite; + Caption = 'Permission Scope'; + Editable = false; + ToolTip = 'Specifies the scope of the permission set.'; + } + } + } + } + + var + PermissionSetLookupRecord: Record "Aggregate Permission Set"; + User: Record User; + MultipleRoleIDErr: Label 'The permission set %1 is defined multiple times in this context. Use the lookup button to select the relevant permission set.', Comment = '%1 will be replaced with a Role ID code value from the Permission Set table'; + PermissionScope: Text; + PermissionSetNotFound: Boolean; + + trigger OnAfterGetRecord() + var + AggregatePermissionSet: Record "Aggregate Permission Set"; + begin + if User."User Name" <> '' then + CurrPage.Caption := User."User Name"; + + PermissionScope := Format(Rec.Scope); + + PermissionSetNotFound := false; + if not (Rec."Role ID" in ['SUPER', 'SECURITY']) then begin + PermissionSetNotFound := not AggregatePermissionSet.Get(Rec.Scope, Rec."App ID", Rec."Role ID"); + + if PermissionSetNotFound then + OnPermissionSetNotFound(); + end; + end; + + trigger OnInsertRecord(BelowxRec: Boolean): Boolean + begin + User.TestField("User Name"); + Rec.CalcFields("App Name", Rec."Role Name"); + end; + + trigger OnModifyRecord(): Boolean + begin + Rec.CalcFields("App Name", Rec."Role Name"); + end; + + trigger OnNewRecord(BelowxRec: Boolean) + begin + if User.Get(Rec."User Security ID") then; + Rec.CalcFields("App Name", Rec."Role Name"); + PermissionScope := ''; + end; + + [IntegrationEvent(false, false)] + local procedure OnPermissionSetNotFound() + begin + end; +} + diff --git a/src/System Application/App/User Settings/src/UserSettings.Codeunit.al b/src/System Application/App/User Settings/src/UserSettings.Codeunit.al index 669284a383..39c1cd98aa 100644 --- a/src/System Application/App/User Settings/src/UserSettings.Codeunit.al +++ b/src/System Application/App/User Settings/src/UserSettings.Codeunit.al @@ -91,6 +91,40 @@ codeunit 9176 "User Settings" UserSettingsImpl.GetAllowedCompaniesForCurrentUser(TempCompany); end; + /// + /// Allows the user to select the new profile for given User Settings + /// + /// User settings to update with the new profile + procedure LookupProfile(var UserSettingsRec: Record "User Settings") + var + UserSettingsImpl: Codeunit "User Settings Impl."; + begin + UserSettingsImpl.ProfileLookup(UserSettingsRec); + end; + + /// + /// Gets a profile name for the given user settings. + /// + /// User settings to get the profile name. + /// + procedure GetProfileName(UserSettingsRec: Record "User Settings"): Text + var + UserSettingsImpl: Codeunit "User Settings Impl."; + begin + UserSettingsImpl.GetProfileName(UserSettingsRec.Scope, UserSettingsRec."App ID", UserSettingsRec."Profile ID"); + end; + + /// + /// Updates the user settings for given user + /// + /// + procedure UpdateUserSettings(var UserSettings: Record "User Settings") + var + UserSettingsImpl: Codeunit "User Settings Impl."; + begin + UserSettingsImpl.UpdateUserSettings(UserSettings); + end; + /// /// Integration event to get the default profile. /// diff --git a/src/System Application/App/User Settings/src/UserSettingsImpl.Codeunit.al b/src/System Application/App/User Settings/src/UserSettingsImpl.Codeunit.al index fc0d340a00..09beb6ba96 100644 --- a/src/System Application/App/User Settings/src/UserSettingsImpl.Codeunit.al +++ b/src/System Application/App/User Settings/src/UserSettingsImpl.Codeunit.al @@ -154,6 +154,14 @@ codeunit 9175 "User Settings Impl." GetUserSettings(UserSettings."User Security ID", UserSettings); end; + procedure UpdateUserSettings(NewUserSettings: Record "User Settings") + var + CurrentUserSettings: Record "User Settings"; + begin + GetUserSettings(NewUserSettings."User Security ID", CurrentUserSettings); + UpdateCurrentUsersSettings(CurrentUserSettings, NewUserSettings); + end; + procedure UpdateUserSettings(OldUserSettings: Record "User Settings"; NewUserSettings: Record "User Settings") var UserSettings: Codeunit "User Settings"; diff --git a/src/System Application/App/app.json b/src/System Application/App/app.json index 048dfb3fa9..fc6413da93 100644 --- a/src/System Application/App/app.json +++ b/src/System Application/App/app.json @@ -21,6 +21,11 @@ "id": "9856ae4f-d1a7-46ef-89bb-6ef056398228", "name": "System Application Test Library", "publisher": "Microsoft" + }, + { + "id": "1a3ac64b-0e25-2345-8e9b-eab2a74b9e9a", + "name": "Agent Developer Toolkit", + "publisher": "Microsoft" } ], "screenshots": [], From f6a67789b5d9914068b2e77efd9c22156d662d96 Mon Sep 17 00:00:00 2001 From: Maria Zhelezova <43066499+mazhelez@users.noreply.github.com> Date: Wed, 4 Dec 2024 15:34:30 +0100 Subject: [PATCH 14/14] [releases/25.x] Limit the minor version for baselines to 5 (#2441) This pull request backports #2438 to releases/25.x Fixes [AB#555469](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/555469) --- build/scripts/EnlistmentHelperFunctions.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/EnlistmentHelperFunctions.psm1 b/build/scripts/EnlistmentHelperFunctions.psm1 index 3015c32a5a..320fb65273 100644 --- a/build/scripts/EnlistmentHelperFunctions.psm1 +++ b/build/scripts/EnlistmentHelperFunctions.psm1 @@ -237,7 +237,7 @@ function Get-PackageLatestVersion() { if ($PackageName -eq "AppBaselines-BCArtifacts") { # For app baselines, use the previous minor version as minimum version if ($majorMinorVersion.Minor -gt 0) { - $minimumVersion = "$($majorMinorVersion.Major).$($majorMinorVersion.Minor - 1)" + $minimumVersion = "$($majorMinorVersion.Major).$([Math]::Min($majorMinorVersion.Minor - 1, 5))" # limit the minor version to 5, as it is the maximum minor version for SaaS } else { $minimumVersion = "$($majorMinorVersion.Major - 1)" }