Codeunit 104062 Mfg. Upgrade BaseApp

App
Base Application
Namespace
Microsoft.Upgrade
Versions
26-28

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Manufacturing/Upgrade/MfgUpgradeBaseApp.Codeunit.al311 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Upgrade;

#if not CLEANSCHEMA29
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Planning;
using Microsoft.Manufacturing.Document;
using Microsoft.Manufacturing.Setup;
#endif

codeunit 104062 "Mfg. Upgrade BaseApp"
{
    Subtype = Upgrade;

    var
        HybridDeployment: Codeunit System.Environment."Hybrid Deployment";
#if not CLEANSCHEMA29
        UpgradeTag: Codeunit System.Upgrade."Upgrade Tag";
        UpgradeTagDefinitions: Codeunit "Upgrade Tag Definitions";
#endif

    trigger OnUpgradePerCompany()
    begin
        if not HybridDeployment.VerifyCanStartUpgrade(CompanyName()) then
            exit;

#if not CLEAN27
        UpgradeInventoryPlanningFields();
#endif

#if not CLEANSCHEMA29
        UpgradeFlushingMethod();
#endif

#if not CLEAN27
        UpgradeGranularWarehouseHandlingSetup();
#endif
    end;

#if not CLEANSCHEMA29
    local procedure UpgradeFlushingMethod()
    begin
        if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetManufacturingFlushingMethodActivateManualWithoutPickUpgradeTag()) then
            exit;

        // Data upgrade is not required if there are no records in Production Order table.
        if CheckProductionOrderIsEmpty() then begin
            SetUpgradeTag(false, UpgradeTagDefinitions.GetManufacturingFlushingMethodActivateManualWithoutPickUpgradeTag());
            exit;
        end;

        // Data upgrade is not required if there are no records to update
        if not CheckRecordsToUpdateExist() then begin
            SetUpgradeTag(false, UpgradeTagDefinitions.GetManufacturingFlushingMethodActivateManualWithoutPickUpgradeTag());
            exit;
        end;

        UpdateFromManualToPickPlusManualFlushingMethod_Item();
        UpdateFromManualToPickPlusManualFlushingMethod_ItemTemplate();
        UpdateFromManualToPickPlusManualFlushingMethod_StockkeepingUnit();
        UpdateFromManualToPickPlusManualFlushingMethod_ProdOrderComponent();
        UpdateFromManualToPickPlusManualFlushingMethod_PlanningComponent();
        UpdateFromManualToPickPlusManualFlushingMethod_ManufacturingSetup();

        SetUpgradeTag(true, UpgradeTagDefinitions.GetManufacturingFlushingMethodActivateManualWithoutPickUpgradeTag());
    end;
#endif

#if not CLEANSCHEMA29
    local procedure CheckProductionOrderIsEmpty(): Boolean;
    var
        ProductionOrder: Record "Production Order";
    begin
        exit(ProductionOrder.IsEmpty());
    end;

    local procedure CheckRecordsToUpdateExist(): Boolean
    var
        Item: Record Item;
        ItemTempl: Record "Item Templ.";
        StockkeepingUnit: Record "Stockkeeping Unit";
        ProdOrderComponent: Record "Prod. Order Component";
        PlanningComponent: Record "Planning Component";
        ManufacturingSetup: Record "Manufacturing Setup";
    begin
        Item.SetRange("Flushing Method", Item."Flushing Method"::Manual);
        if not Item.IsEmpty() then
            exit(true);

        ItemTempl.SetRange("Flushing Method", ItemTempl."Flushing Method"::Manual);
        if not ItemTempl.IsEmpty() then
            exit(true);

        StockkeepingUnit.SetRange("Flushing Method", StockkeepingUnit."Flushing Method"::Manual);
        if not StockkeepingUnit.IsEmpty() then
            exit(true);

        ProdOrderComponent.SetRange("Flushing Method", ProdOrderComponent."Flushing Method"::Manual);
        if not ProdOrderComponent.IsEmpty() then
            exit(true);

        PlanningComponent.SetRange("Flushing Method", PlanningComponent."Flushing Method"::Manual);
        if not PlanningComponent.IsEmpty() then
            exit(true);

        ManufacturingSetup.SetRange("Default Flushing Method", ManufacturingSetup."Default Flushing Method"::Manual);
        if not ManufacturingSetup.IsEmpty() then
            exit(true);
    end;
#endif

#if not CLEANSCHEMA29
    local procedure SetUpgradeTag(DataUpgradeExecuted: Boolean; UpgradeTagCode: Code[250])
    begin
        UpgradeTag.SetUpgradeTag(UpgradeTagCode);
        if not DataUpgradeExecuted then
            UpgradeTag.SetSkippedUpgrade(UpgradeTagCode, true);
    end;
#endif

#if not CLEANSCHEMA29
    local procedure UpdateFromManualToPickPlusManualFlushingMethod_Item()
    var
        Item: Record Item;
        ItemDataTransfer: DataTransfer;
    begin
        Item.SetRange("Flushing Method", Item."Flushing Method"::Manual);
        if not Item.IsEmpty() then begin
            ItemDataTransfer.SetTables(Database::"Item", Database::"Item");
            ItemDataTransfer.AddSourceFilter(Item.FieldNo("Flushing Method"), '=%1', Item."Flushing Method"::Manual);
            ItemDataTransfer.AddConstantValue(Item."Flushing Method"::"Pick + Manual", Item.FieldNo("Flushing Method"));
            ItemDataTransfer.UpdateAuditFields := false;
            ItemDataTransfer.CopyFields();
        end;
    end;

    local procedure UpdateFromManualToPickPlusManualFlushingMethod_ItemTemplate()
    var
        ItemTempl: Record "Item Templ.";
        ItemTemplDataTransfer: DataTransfer;
    begin
        ItemTempl.SetRange("Flushing Method", ItemTempl."Flushing Method"::Manual);
        if not ItemTempl.IsEmpty() then begin
            ItemTemplDataTransfer.SetTables(Database::"Item Templ.", Database::"Item Templ.");
            ItemTemplDataTransfer.AddSourceFilter(ItemTempl.FieldNo("Flushing Method"), '=%1', ItemTempl."Flushing Method"::Manual);
            ItemTemplDataTransfer.AddConstantValue(ItemTempl."Flushing Method"::"Pick + Manual", ItemTempl.FieldNo("Flushing Method"));
            ItemTemplDataTransfer.UpdateAuditFields := false;
            ItemTemplDataTransfer.CopyFields();
        end;
    end;

    local procedure UpdateFromManualToPickPlusManualFlushingMethod_StockkeepingUnit()
    var
        StockkeepingUnit: Record "Stockkeeping Unit";
        StockkeepingUnitDataTransfer: DataTransfer;
    begin
        StockkeepingUnit.SetRange("Flushing Method", StockkeepingUnit."Flushing Method"::Manual);
        if not StockkeepingUnit.IsEmpty() then begin
            StockkeepingUnitDataTransfer.SetTables(Database::"Stockkeeping Unit", Database::"Stockkeeping Unit");
            StockkeepingUnitDataTransfer.AddSourceFilter(StockkeepingUnit.FieldNo("Flushing Method"), '=%1', StockkeepingUnit."Flushing Method"::Manual);
            StockkeepingUnitDataTransfer.AddConstantValue(StockkeepingUnit."Flushing Method"::"Pick + Manual", StockkeepingUnit.FieldNo("Flushing Method"));
            StockkeepingUnitDataTransfer.UpdateAuditFields := false;
            StockkeepingUnitDataTransfer.CopyFields();
        end;
    end;

    local procedure UpdateFromManualToPickPlusManualFlushingMethod_ProdOrderComponent()
    var
        ProdOrderComponent: Record "Prod. Order Component";
        ProdOrderComponentDataTransfer: DataTransfer;
    begin
        ProdOrderComponent.SetRange("Flushing Method", ProdOrderComponent."Flushing Method"::Manual);
        if not ProdOrderComponent.IsEmpty() then begin
            ProdOrderComponentDataTransfer.SetTables(Database::"Prod. Order Component", Database::"Prod. Order Component");
            ProdOrderComponentDataTransfer.AddSourceFilter(ProdOrderComponent.FieldNo("Flushing Method"), '=%1', ProdOrderComponent."Flushing Method"::Manual);
            ProdOrderComponentDataTransfer.AddConstantValue(ProdOrderComponent."Flushing Method"::"Pick + Manual", ProdOrderComponent.FieldNo("Flushing Method"));
            ProdOrderComponentDataTransfer.UpdateAuditFields := false;
            ProdOrderComponentDataTransfer.CopyFields();
        end;
    end;

    local procedure UpdateFromManualToPickPlusManualFlushingMethod_PlanningComponent()
    var
        PlanningComponent: Record "Planning Component";
        PlanningComponentDataTransfer: DataTransfer;
    begin
        PlanningComponent.SetRange("Flushing Method", PlanningComponent."Flushing Method"::Manual);
        if not PlanningComponent.IsEmpty() then begin
            PlanningComponentDataTransfer.SetTables(Database::"Planning Component", Database::"Planning Component");
            PlanningComponentDataTransfer.AddSourceFilter(PlanningComponent.FieldNo("Flushing Method"), '=%1', PlanningComponent."Flushing Method"::Manual);
            PlanningComponentDataTransfer.AddConstantValue(PlanningComponent."Flushing Method"::"Pick + Manual", PlanningComponent.FieldNo("Flushing Method"));
            PlanningComponentDataTransfer.UpdateAuditFields := false;
            PlanningComponentDataTransfer.CopyFields();
        end;
    end;

    local procedure UpdateFromManualToPickPlusManualFlushingMethod_ManufacturingSetup()
    var
        ManufacturingSetup: Record "Manufacturing Setup";
    begin
        ManufacturingSetup.SetRange("Default Flushing Method", ManufacturingSetup."Default Flushing Method"::Manual);
        if ManufacturingSetup.FindSet(true) then
            repeat
                ManufacturingSetup."Default Flushing Method" := ManufacturingSetup."Default Flushing Method"::"Pick + Manual";
                ManufacturingSetup.Modify();
            until ManufacturingSetup.Next() = 0;
    end;
#endif

#if not CLEAN27
    local procedure UpgradeInventoryPlanningFields()
    var
        InventorySetup: Record Microsoft.Inventory.Setup."Inventory Setup";
        ManufacturingSetup: Record Microsoft.Manufacturing.Setup."Manufacturing Setup";
    begin
        if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetInventoryPlanningSetupUpgradeTag()) then
            exit;

        if not ManufacturingSetup.Get() then
            exit;

        if InventorySetup.Get() then begin
            InventorySetup."Current Demand Forecast" := ManufacturingSetup."Current Production Forecast";
            InventorySetup."Use Forecast on Variants" := ManufacturingSetup."Use Forecast on Variants";
            InventorySetup."Use Forecast on Locations" := ManufacturingSetup."Use Forecast on Locations";
            InventorySetup."Default Safety Lead Time" := ManufacturingSetup."Default Safety Lead Time";
            InventorySetup."Combined MPS/MRP Calculation" := ManufacturingSetup."Combined MPS/MRP Calculation";
            InventorySetup."Default Dampener %" := ManufacturingSetup."Default Dampener %";
            InventorySetup."Default Dampener Period" := ManufacturingSetup."Default Dampener Period";
            InventorySetup."Blank Overflow Level" := ManufacturingSetup."Blank Overflow Level";
            InventorySetup.Modify();
        end;

        SetUpgradeTag(true, UpgradeTagDefinitions.GetInventoryPlanningSetupUpgradeTag());
    end;
#endif

#if not CLEAN27
    local procedure UpgradeGranularWarehouseHandlingSetup()
    var
        Location: Record Location;
        LocationDataTransfer: DataTransfer;
    begin
        if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetLocationGranularWarehouseHandlingSetupsUpgradeTag()) then
            exit;

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Pick"), '=%1', false);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Shipment"), '=%1', false);
        LocationDataTransfer.AddConstantValue("Prod. Consump. Whse. Handling"::"Warehouse Pick (optional)", Location.FieldNo("Prod. Consump. Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Pick"), '=%1', false);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Shipment"), '=%1', true);
        LocationDataTransfer.AddConstantValue("Prod. Consump. Whse. Handling"::"Warehouse Pick (optional)", Location.FieldNo("Prod. Consump. Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Pick"), '=%1', true);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Shipment"), '=%1', false);
        LocationDataTransfer.AddConstantValue("Prod. Consump. Whse. Handling"::"Inventory Pick/Movement", Location.FieldNo("Prod. Consump. Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Pick"), '=%1', true);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Shipment"), '=%1', true);
        LocationDataTransfer.AddConstantValue("Prod. Consump. Whse. Handling"::"Warehouse Pick (mandatory)", Location.FieldNo("Prod. Consump. Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Put-away"), '=%1', false);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Receive"), '=%1', false);
        LocationDataTransfer.AddConstantValue("Prod. Output Whse. Handling"::"No Warehouse Handling", Location.FieldNo("Prod. Output Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Put-away"), '=%1', false);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Receive"), '=%1', true);
        LocationDataTransfer.AddConstantValue("Prod. Output Whse. Handling"::"No Warehouse Handling", Location.FieldNo("Prod. Output Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Put-away"), '=%1', true);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Receive"), '=%1', true);
        LocationDataTransfer.AddConstantValue("Prod. Output Whse. Handling"::"No Warehouse Handling", Location.FieldNo("Prod. Output Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        LocationDataTransfer.SetTables(Database::Location, Database::Location);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Put-away"), '=%1', true);
        LocationDataTransfer.AddSourceFilter(Location.FieldNo("Require Receive"), '=%1', false);
        LocationDataTransfer.AddConstantValue("Prod. Output Whse. Handling"::"Inventory Put-away", Location.FieldNo("Prod. Output Whse. Handling"));
        LocationDataTransfer.CopyFields();
        Clear(LocationDataTransfer);

        UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetLocationGranularWarehouseHandlingSetupsUpgradeTag());
    end;
#endif
}