Codeunit 3999 Reten. Pol. Install - BaseApp

App
Base Application
Namespace
System.DataAdministration
Versions
17-28

Procedures, 2Events, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/OtherCapabilities/RetentionPolicy/RetenPolInstallBaseApp.Codeunit.al495 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.DataAdministration;

using Microsoft.EServices.EDocument;
using Microsoft.Finance.FinancialReports;
using Microsoft.Foundation.Company;
using Microsoft.Integration.Dataverse;
using Microsoft.Integration.SyncEngine;
using Microsoft.Projects.Project.Archive;
using Microsoft.Purchases.Archive;
using Microsoft.Sales.Archive;
using Microsoft.Utilities;
using Microsoft.Warehouse.Activity.History;
using Microsoft.Warehouse.History;
using Microsoft.Warehouse.InventoryDocument;
using System.Automation;
using System.Diagnostics;
using System.Environment.Configuration;
using System.IO;
using System.Threading;
using System.Upgrade;
using System.Utilities;

#pragma warning disable AA0235
codeunit 3999 "Reten. Pol. Install - BaseApp"
#pragma warning restore AA0235
{
    Subtype = Install;
    Access = Internal;
    Permissions = tabledata "Retention Period" = ri, tabledata "Retention Policy Setup" = ri;

    trigger OnInstallAppPerCompany()
    begin
        AddAllowedTables();
    end;

    procedure AddAllowedTables()
    begin
        AddAllowedTables(false);
    end;

    procedure AddAllowedTables(ForceUpdate: Boolean)
    var
        JobQueueLogEntry: Record "Job Queue Log Entry";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
        UpgradeTag: Codeunit "Upgrade Tag";
        IsInitialSetup: Boolean;
    begin
        // if you add a new table here, also update codeunit 3995 "Base Application Logs Delete"
        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolBaseAppTablesUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddChangeLogEntryToAllowedTables(IsInitialSetup);
            RetenPolAllowedTables.AddAllowedTable(Database::"Job Queue Log Entry", JobQueueLogEntry.FieldNo("End Date/Time"));
            RetenPolAllowedTables.AddAllowedTable(Database::"Workflow Step Instance Archive");
            RetenPolAllowedTables.AddAllowedTable(Database::"Report Inbox");
            RetenPolAllowedTables.AddAllowedTable(Database::"Error Message");
            RetenPolAllowedTables.AddAllowedTable(Database::"Error Message Register");
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolBaseAppTablesUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolDocArchivesTablesUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddDocumentArchiveTablesToAllowedTables();
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolDocArchivesTablesUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolDataverseEntityChangeUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddDataverseEntityChange(IsInitialSetup);
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolDataverseEntityChangeUpgradeTag());
        end;

        if (not UpgradeTag.HasUpgradeTag(GetRetenPolActivityLogUpgradeTag())) or ForceUpdate then begin
            RetenPolAllowedTables.AddAllowedTable(Database::"Activity Log");
            if not UpgradeTag.HasUpgradeTag(GetRetenPolActivityLogUpgradeTag()) then
                UpgradeTag.SetUpgradeTag(GetRetenPolActivityLogUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolProtectedChangeLogUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddChangeLogEntryToAllowedTables(IsInitialSetup);
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolProtectedChangeLogUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolPostedWhseTablesUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddRegisteredWhseActivityHdrToAllowedTables(IsInitialSetup);
            AddPostedWhseShipmentHeaderToAllowedTables(IsInitialSetup);
            AddPostedWhseReceiptHeaderToAllowedTables();
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolPostedWhseTablesUpgradeTag());

            IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolSentNotifcationEntryUpgradeTag());
            if IsInitialSetup or ForceUpdate then begin
                AddSentNotifcationEntryToAllowedTables();
                if IsInitialSetup then
                    UpgradeTag.SetUpgradeTag(GetRetenPolSentNotifcationEntryUpgradeTag());
            end;
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolCRMIntegrationSynchUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddCRMIntegrationSynch(IsInitialSetup);
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolCRMIntegrationSynchUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolInventoryTablesUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddPostedInvtPickHeaderToAllowedTables(IsInitialSetup);
            AddPostedInvtPutawayHeaderToAllowedTables(IsInitialSetup);
            AddRegisteredInvtMovementHdrToAllowedTables(IsInitialSetup);
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolInventoryTablesUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolDataExchUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddDataExchangeToAllowedTables();
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolDataExchUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolFinancialReportExportLogUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            AddFinancialReportExportLogToAllowedTables();
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolFinancialReportExportLogUpgradeTag());
        end;

        IsInitialSetup := not UpgradeTag.HasUpgradeTag(GetRetenPolTruncateAllowedUpgradeTag());
        if IsInitialSetup or ForceUpdate then begin
            SetTruncateAllowedIfTableExists(Database::"Change Log Entry");
            SetTruncateAllowedIfTableExists(Database::"Error Message");
            SetTruncateAllowedIfTableExists(Database::"Error Message Register");
            SetTruncateAllowedIfTableExists(Database::"Integration Synch. Job Errors");
            if IsInitialSetup then
                UpgradeTag.SetUpgradeTag(GetRetenPolTruncateAllowedUpgradeTag());
        end;
    end;

    local procedure SetTruncateAllowedIfTableExists(TableId: Integer)
    var
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        if not RetenPolAllowedTables.IsAllowedTable(TableId) then
            exit;
        RetenPolAllowedTables.SetTruncateAllowed(TableId, true);
    end;

    local procedure AddChangeLogEntryToAllowedTables(IsInitialSetup: Boolean)
    var
        ChangeLogEntry: Record "Change Log Entry";
        RetentionPolicySetup: Record "Retention Policy Setup";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
        RecRef: RecordRef;
        TableFilters: JsonArray;
    begin
        ChangeLogEntry.SetRange(Protected, true);
        RecRef.GetTable(ChangeLogEntry);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"1 Year", ChangeLogEntry.FieldNo(SystemCreatedAt), true, true, RecRef);

        ChangeLogEntry.Reset();
        ChangeLogEntry.SetFilter("Field Log Entry Feature", '%1|%2', ChangeLogEntry."Field Log Entry Feature"::"Monitor Sensitive Fields", ChangeLogEntry."Field Log Entry Feature"::All);
        RecRef.GetTable(ChangeLogEntry);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"28 Days", ChangeLogEntry.FieldNo(SystemCreatedAt), true, true, RecRef);

        ChangeLogEntry.Reset();
        ChangeLogEntry.SetRange(Protected, false);
        RecRef.GetTable(ChangeLogEntry);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"1 Year", ChangeLogEntry.FieldNo(SystemCreatedAt), true, false, RecRef);

        RetenPolAllowedTables.AddAllowedTable(Database::"Change Log Entry", ChangeLogEntry.FieldNo(SystemCreatedAt), TableFilters);

        if not IsInitialSetup then
            exit;

        if RetentionPolicySetup.Get(Database::"Change Log Entry") then
            exit;

        RetentionPolicySetup.Validate("Table Id", Database::"Change Log Entry");
        RetentionPolicySetup.Insert(true);
    end;

    local procedure AddRegisteredWhseActivityHdrToAllowedTables(IsInitialSetup: Boolean)
    var
        RegisteredWhseActivityHdr: Record "Registered Whse. Activity Hdr.";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Registered Whse. Activity Hdr.", RegisteredWhseActivityHdr.FieldNo("Registering Date"));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Registered Whse. Activity Hdr.", FindOrCreateRetentionPeriod(Enum::"Retention Period Enum"::"1 Year"));
    end;

    local procedure AddPostedWhseShipmentHeaderToAllowedTables(IsInitialSetup: Boolean)
    var
        PostedWhseShipmentHeader: Record "Posted Whse. Shipment Header";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin

        RetenPolAllowedTables.AddAllowedTable(Database::"Posted Whse. Shipment Header", PostedWhseShipmentHeader.FieldNo("Posting Date"));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Posted Whse. Shipment Header", FindOrCreateRetentionPeriod(Enum::"Retention Period Enum"::"1 Year"));
    end;

    local procedure AddPostedWhseReceiptHeaderToAllowedTables()
    var
        PostedWhseReceiptHeader: Record "Posted Whse. Receipt Header";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
        RecRef: RecordRef;
        RetentionPeriod: Enum "Retention Period Enum";
        TableFilters: JsonArray;
    begin
        PostedWhseReceiptHeader.SetRange("Document Status", PostedWhseReceiptHeader."Document Status"::"Partially Put Away");
        RecRef.GetTable(PostedWhseReceiptHeader);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, RetentionPeriod::"Never Delete", PostedWhseReceiptHeader.FieldNo("Posting Date"), true, true, RecRef);  // locked
        PostedWhseReceiptHeader.Reset();
        PostedWhseReceiptHeader.SetRange("Document Status", PostedWhseReceiptHeader."Document Status"::"Completely Put Away");
        RecRef.GetTable(PostedWhseReceiptHeader);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, RetentionPeriod::"1 Year", PostedWhseReceiptHeader.FieldNo("Posting Date"), true, false, RecRef);  // not locked
        RetenPolAllowedTables.AddAllowedTable(Database::"Posted Whse. Receipt Header", PostedWhseReceiptHeader.FieldNo("Posting Date"), TableFilters);
    end;

    local procedure AddDocumentArchiveTablesToAllowedTables()
    var
        SalesHeaderArchive: Record "Sales Header Archive";
        PurchaseHeaderArchive: Record "Purchase Header Archive";
        JobArchive: Record "Job Archive";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
        RecRef: RecordRef;
        TableFilters: JsonArray;
    begin
        SalesHeaderArchive.SetRange("Source Doc. Exists", true);
        RecRef.GetTable(SalesHeaderArchive);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"Never Delete", SalesHeaderArchive.FieldNo("Last Archived Date"), true, true, RecRef); // locked
        SalesHeaderArchive.Reset();
        SalesHeaderArchive.SetRange("Interaction Exist", true);
        RecRef.GetTable(SalesHeaderArchive);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"Never Delete", SalesHeaderArchive.FieldNo("Last Archived Date"), true, false, RecRef); // not locked
        RetenPolAllowedTables.AddAllowedTable(Database::"Sales Header Archive", SalesHeaderArchive.FieldNo("Last Archived Date"), 0, "Reten. Pol. Filtering"::"Document Archive Filtering", "Reten. Pol. Deleting"::Default, TableFilters);

        Clear(TableFilters);
        PurchaseHeaderArchive.SetRange("Source Doc. Exists", true);
        RecRef.GetTable(PurchaseHeaderArchive);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"Never Delete", PurchaseHeaderArchive.FieldNo("Last Archived Date"), true, true, RecRef); // locked
        PurchaseHeaderArchive.Reset();
        PurchaseHeaderArchive.SetRange("Interaction Exist", true);
        RecRef.GetTable(PurchaseHeaderArchive);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"Never Delete", PurchaseHeaderArchive.FieldNo("Last Archived Date"), true, false, RecRef); // not locked
        RetenPolAllowedTables.AddAllowedTable(Database::"Purchase Header Archive", PurchaseHeaderArchive.FieldNo("Last Archived Date"), 0, "Reten. Pol. Filtering"::"Document Archive Filtering", "Reten. Pol. Deleting"::Default, TableFilters);

        Clear(TableFilters);
        JobArchive.SetFilter(Status, '<>%1', JobArchive.Status::"Completed");
        RecRef.GetTable(JobArchive);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, "Retention Period Enum"::"Never Delete", JobArchive.FieldNo("Last Archived Date"), true, true, RecRef); // locked
        RetenPolAllowedTables.AddAllowedTable(Database::"Job Archive", JobArchive.FieldNo("Last Archived Date"), 0, "Reten. Pol. Filtering"::"Document Archive Filtering", "Reten. Pol. Deleting"::Default, TableFilters);

        OnAfterAddDocumentArchiveTablesToAllowedTables();
    end;

    local procedure AddPostedInvtPickHeaderToAllowedTables(IsInitialSetup: Boolean)
    var
        PostedInvtPickHeader: Record "Posted Invt. Pick Header";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Posted Invt. Pick Header", PostedInvtPickHeader.FieldNo("Registering Date"));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Posted Invt. Pick Header", FindOrCreateRetentionPeriod(Enum::"Retention Period Enum"::"1 Year"));
    end;

    local procedure AddPostedInvtPutawayHeaderToAllowedTables(IsInitialSetup: Boolean)
    var
        PostedInvtPutawayHeader: Record "Posted Invt. Put-away Header";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Posted Invt. Put-away Header", PostedInvtPutawayHeader.FieldNo("Registering Date"));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Posted Invt. Put-away Header", FindOrCreateRetentionPeriod(Enum::"Retention Period Enum"::"1 Year"));
    end;

    local procedure AddRegisteredInvtMovementHdrToAllowedTables(IsInitialSetup: Boolean)
    var
        RegisteredInvtMovementHdr: Record "Registered Invt. Movement Hdr.";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Registered Invt. Movement Hdr.", RegisteredInvtMovementHdr.FieldNo("Registering Date"));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Registered Invt. Movement Hdr.", FindOrCreateRetentionPeriod(Enum::"Retention Period Enum"::"1 Year"));
    end;

    local procedure AddDataverseEntityChange(IsInitialSetup: Boolean)
    var
        DataverseEntityChange: Record "Dataverse Entity Change";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Dataverse Entity Change", DataverseEntityChange.FieldNo(SystemCreatedAt));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Dataverse Entity Change", FindOrCreateRetentionPeriod("Retention Period Enum"::"1 Week"));
        EnableRetentionPolicySetup(Database::"Dataverse Entity Change");
    end;

    local procedure AddSentNotifcationEntryToAllowedTables()
    var
        SentNotificationEntry: Record "Sent Notification Entry";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
        RecRef: RecordRef;
        TableFilters: JsonArray;
    begin
        RecRef.GetTable(SentNotificationEntry);
        RetenPolAllowedTables.AddTableFilterToJsonArray(TableFilters, Enum::"Retention Period Enum"::"6 Months", SentNotificationEntry.FieldNo("Sent Date-Time"), true, false, RecRef);  // not locked
        RetenPolAllowedTables.AddAllowedTable(Database::"Sent Notification Entry", SentNotificationEntry.FieldNo("Sent Date-Time"), TableFilters);
    end;

    local procedure AddCRMIntegrationSynch(IsInitialSetup: Boolean)
    var
        IntegrationSyncJob: Record "Integration Synch. Job";
        IntegrationSynchJobErrors: Record "Integration Synch. Job Errors";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Integration Synch. Job", IntegrationSyncJob.FieldNo("Finish Date/Time"));
        RetenPolAllowedTables.AddAllowedTable(Database::"Integration Synch. Job Errors", IntegrationSynchJobErrors.FieldNo("Date/Time"));

        if not IsInitialSetup then
            exit;

        CreateRetentionPolicySetup(Database::"Integration Synch. Job", FindOrCreateRetentionPeriod("Retention Period Enum"::"1 Month"));
        EnableRetentionPolicySetup(Database::"Integration Synch. Job");

        CreateRetentionPolicySetup(Database::"Integration Synch. Job Errors", FindOrCreateRetentionPeriod("Retention Period Enum"::"1 Month"));
        EnableRetentionPolicySetup(Database::"Integration Synch. Job Errors");
    end;

    local procedure AddDataExchangeToAllowedTables()
    var
        DataExch: Record "Data Exch.";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Data Exch.", DataExch.FieldNo(SystemCreatedAt));
    end;

    local procedure AddFinancialReportExportLogToAllowedTables()
    var
        FinancialReportExportLog: Record "Financial Report Export Log";
        RetenPolAllowedTables: Codeunit "Reten. Pol. Allowed Tables";
    begin
        RetenPolAllowedTables.AddAllowedTable(Database::"Financial Report Export Log", FinancialReportExportLog.FieldNo("Start Date/Time"));
    end;

    local procedure FindOrCreateRetentionPeriod(RetentionPeriodEnum: Enum "Retention Period Enum"): Code[20]
    var
        RetentionPolicySetup: Codeunit "Retention Policy Setup";
    begin
        exit(RetentionPolicySetup.FindOrCreateRetentionPeriod(RetentionPeriodEnum))
    end;

    local procedure CreateRetentionPolicySetup(TableId: Integer; RetentionPeriodCode: Code[20])
    var
        RetentionPolicySetup: Record "Retention Policy Setup";
    begin
        if RetentionPolicySetup.Get(TableId) then
            exit;
        RetentionPolicySetup.Validate("Table Id", TableId);
        RetentionPolicySetup.Validate("Apply to all records", true);
        RetentionPolicySetup.Validate("Retention Period", RetentionPeriodCode);
        RetentionPolicySetup.Validate(Enabled, false);
        RetentionPolicySetup.Insert(true);
    end;

    local procedure EnableRetentionPolicySetup(TableId: Integer)
    var
        RetentionPolicySetup: Record "Retention Policy Setup";
        [SecurityFiltering(SecurityFilter::Ignored)]
        JobQueueEntry: Record "Job Queue Entry";
    begin
        if not TaskScheduler.CanCreateTask() then
            exit;

        if not (JobQueueEntry.ReadPermission() and JobQueueEntry.WritePermission()) then
            exit;

        if not JobQueueEntry.HasRequiredPermissions() then
            exit;

        if not RetentionPolicySetup.Get(TableId) then
            exit;

        RetentionPolicySetup.Validate(Enabled, true);
        RetentionPolicySetup.Modify(true);
    end;

    local procedure GetRetenPolBaseAppTablesUpgradeTag(): Code[250]
    begin
        exit('MS-334067-RetenPolBaseAppTables-20200801');
    end;

    local procedure GetRetenPolDocArchivesTablesUpgradeTag(): Code[250]
    begin
        exit('MS-378964-RetenPolDocArchives-20210423');
    end;

    local procedure GetRetenPolDataverseEntityChangeUpgradeTag(): Code[250]
    begin
        exit('MS-434662-RetenPolDataverseEntityChange-20220428');
    end;

    local procedure GetRetenPolActivityLogUpgradeTag(): Code[250]
    begin
        exit('MS-436257-RetenPolActivityLog-20220526');
    end;

    local procedure GetRetenPolProtectedChangeLogUpgradeTag(): Code[250]
    begin
        exit('MS-447066-RetenPolProtectedChangeLog-20221003');
    end;

    local procedure GetRetenPolPostedWhseTablesUpgradeTag(): Code[250]
    begin
        exit('MS-GIT-9-RetenPolPostedWhseTables-20230823');
    end;

    local procedure GetRetenPolSentNotifcationEntryUpgradeTag(): Code[250]
    begin
        exit('MS-GIT-422-RetenPolSentNotifcationEntry-20230829');
    end;

    local procedure GetRetenPolCRMIntegrationSynchUpgradeTag(): Code[250]
    begin
        exit('MS-542758-RetenPolCRMIntegrationSynch-20240820');
    end;

    local procedure GetRetenPolInventoryTablesUpgradeTag(): Code[250]
    begin
        exit('MS-GIT-1268-RetenPolInventoryTables-20250608');
    end;

    local procedure GetRetenPolDataExchUpgradeTag(): Code[250]
    begin
        exit('MS-GIT-704-RetenPolDataExch-20250713');
    end;

    local procedure GetRetenPolFinancialReportExportLogUpgradeTag(): Code[250]
    begin
        exit('MS-GIT-RetenPolFinRptExportLog-20260521');
    end;

    local procedure GetRetenPolTruncateAllowedUpgradeTag(): Code[250]
    begin
        exit('MS-596204-RetenPolTruncateAllowed-20260407');
    end;

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

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Reten. Pol. Allowed Tables", 'OnRefreshAllowedTables', '', false, false)]
    local procedure AddAllowedTablesOnRefreshAllowedTables()
    begin
        AddAllowedTables(true);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Company-Initialize", 'OnBeforeOnRun', '', false, false)]
    local procedure AddAllowedTablesOnBeforeCompanyInit()
    begin
        AddAllowedTables();
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAddDocumentArchiveTablesToAllowedTables()
    begin
    end;
}