Creazione dell'oggetto codeunit della logica di installazione di Premi clienti

Completato

Una codeunit è un oggetto che può essere usato per incapsulare una serie di funzionalità correlate rappresentate da procedure e variabili. Una codeunit di installazione è una codeunit con la proprietà Subtype impostata su Install. Questa codeunit fornisce una serie di trigger che vengono eseguiti quando l'estensione viene installata per la prima volta o quando viene reinstallata la stessa versione.

Nell'estensione Premi clienti si desidera impostare la codeunit predefinita per la gestione automatica degli eventi quando si installa l'estensione. Creare la codeunit di installazione di Premi clienti con il codice seguente.

codeunit 50100 "Customer Rewards Installation"
{
    // Customer Rewards Install Logic 
    Subtype = Install;

    trigger OnInstallAppPerCompany();
    var
        myAppInfo: ModuleInfo;
    begin
        NavApp.GetCurrentModuleInfo(myAppInfo); // Get info about the currently executing module

        if myAppInfo.DataVersion = Version.Create(0, 0, 0, 0) then // A 'DataVersion' of 0.0.0.0 indicates a 'fresh/new' install
            HandleFreshInstall()
        else
            HandleReinstall(); // If not a fresh install, then we are Re-installing the same version of the extension
    end;

    local procedure HandleFreshInstall();
    begin
        // Do work needed the first time this extension is ever installed for this tenant.
        // Some possible usages:
        // - Service callback/telemetry indicating that extension was installed
        // - Initial data setup for use
        SetDefaultCustomerRewardsExtMgtCodeunit();
        InsertDefaultRewardLevels();
        InitializeRewardsForExistingCustomers();
    end;

    local procedure HandleReinstall();
    begin
        // Do work needed when reinstalling the same version of this extension back on this tenant.
        // Some possible usages:
        // - Service callback/telemetry indicating that extension was reinstalled
        // - Data 'patchup' work, for example, detecting if new 'base' records have been changed while you have been working 'offline'.
        // - Set up 'welcome back' messaging for next user access.
    end;

    procedure SetDefaultCustomerRewardsExtMgtCodeunit();
    var
        CustomerRewardsMgtSetup: Record "Customer Rewards Mgt Setup";
    begin
        CustomerRewardsMgtSetup.DeleteAll();
        CustomerRewardsMgtSetup.Init();
        // Default Customer Rewards Ext. Mgt codeunit to use for handling events  
        CustomerRewardsMgtSetup."Cust. Rew. Ext. Mgt. Cod. ID" := Codeunit::"Customer Rewards Ext Mgt";
        CustomerRewardsMgtSetup.Insert();
    end;

    procedure InsertDefaultRewardLevels()
    var
        RewardLevels: Record "Reward Level";
    begin
        Clear(RewardLevels);
        if not RewardLevels.IsEmpty then
            exit;
        InsertRewardLevel('Bronze', 10);
        InsertRewardLevel('Silver', 20);
        InsertRewardLevel('Gold', 30);
        InsertRewardLevel('Platinum', 40);

    end;

    local procedure InsertRewardLevel(Level: Text[20]; Points: integer)
    var
        RewardLevel: Record "Reward Level";
    begin
        Clear(RewardLevel);
        RewardLevel.Level := Level;
        RewardLevel."Minimum Reward Points" := Points;
        RewardLevel.Insert();
    end;

    local procedure InitializeRewardsForExistingCustomers()
    var
        Customer: Record Customer;
        SalesHeader: Record "Sales Header";
    begin
        Clear(SalesHeader);
        SalesHeader.SetCurrentKey("Sell-to Customer No.");
        SalesHeader.SetRange(Status, SalesHeader.Status::Released);
        if SalesHeader.FindSet() then
            repeat
                if not Customer.Get(SalesHeader."Sell-to Customer No.") then
                    exit;
                Customer.RewardPoints += 1; // Add a point for each new sales order 
                Customer.Modify();
            until SalesHeader.Next() = 0;
    end;
}

La proprietà Subtype di questa codeunit di installazione è impostata su Install. Il trigger OnInstallAppPerCompany viene eseguito quando l'estensione viene installata per la prima volta o viene reinstallata la stessa versione.

Ogni versione dell'estensione ha un set di proprietà che contengono informazioni sull'estensione, tra cui AppVersion, DataVersion, Dependencies, ID, Name e Publisher. Queste informazioni possono essere utili durante l'installazione. Ad esempio, una delle proprietà più importanti è DataVersion, che indica la versione dei dati in uso. Queste proprietà sono incapsulate in un tipo di dati ModuleInfo. È possibile accedere a queste proprietà usando i metodi NavApp.GetCurrentModuleInfo e NavApp.GetModuleInfo.

Questo esempio utilizza il trigger OnInstallAppPerCompany per verificare se la versione dei dati della precedente versione dell'estensione è compatibile per l'aggiornamento.

    // Customer Rewards Install Logic 
    Subtype = Install;

    trigger OnInstallAppPerCompany();
    var
        myAppInfo: ModuleInfo;
    begin
        NavApp.GetCurrentModuleInfo(myAppInfo); // Get info about the currently executing module

        if myAppInfo.DataVersion = Version.Create(0, 0, 0, 0) then // A 'DataVersion' of 0.0.0.0 indicates a 'fresh/new' install
            HandleFreshInstall()
        else
            HandleReinstall(); // If not a fresh install, then we are Re-installing the same version of the extension
    end; 

Se la proprietà DataVersion è uguale a Version.Create(0,0,0,0), è la prima volta che l'estensione viene installata poiché non esistono dati nell'archivio.

La codeunit esegue tre procedure durante l'installazione dell'estensione Premi clienti:

  • SetDefaultCustomerRewardsExtMgtCodeunit: imposta il valore predefinito della codeunit Gestione estensione Premi clienti da usare per la gestione di eventi.

  • InsertDefaultRewardLevels: inserisce i livelli di premi predefiniti nella tabella del livello di premi.

  • InitializeRewardsForExistingCustomers: ripete tutti gli ordini vendita rilasciati e assegna i punti premio corrispondenti ai clienti.