Codeunit 5943 Lock-OpenServContract

App
Base Application
Namespace
Microsoft.Service.Contract
Versions
17-28

Procedures, 2Events, 9

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Service/Contract/LockOpenServContract.Codeunit.al177 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.Service.Contract;

using System.Utilities;

codeunit 5943 "Lock-OpenServContract"
{

    trigger OnRun()
    begin
    end;

    var
        SignServContractDoc: Codeunit SignServContractDoc;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'It is not possible to lock this %1 Service %2 because some lines have zero %3.';
        Text001: Label 'It is not possible to open a %1 service contract';
#pragma warning restore AA0470
        Text002: Label 'New lines have been added to this contract.\Would you like to continue?';
        Text003: Label 'You cannot lock service contract with negative annual amount.';
        Text004: Label 'You cannot lock service contract with zero annual amount when invoice period is different from None.';
#pragma warning restore AA0074

    procedure LockServContract(FromServContractHeader: Record "Service Contract Header")
    var
        ServContractHeader: Record "Service Contract Header";
        ServContractLine: Record "Service Contract Line";
        RaiseError: Boolean;
        IsHandled: Boolean;
    begin
        OnBeforeLockServContract(FromServContractHeader);

        ServContractHeader := FromServContractHeader;
        if ServContractHeader."Change Status" = ServContractHeader."Change Status"::Locked then
            exit;

        IsHandled := false;
        OnLockServContractOnBeforeCheckAmounts(ServContractHeader, IsHandled);
        if not IsHandled then begin
            ServContractHeader.CalcFields("Calcd. Annual Amount");
            ServContractHeader.TestField("Annual Amount", ServContractHeader."Calcd. Annual Amount");
            if ServContractHeader."Annual Amount" < 0 then
                Error(Text003);
        end;

        IsHandled := false;
        OnLockServContractOnBeforeCheckZeroAnnualAmount(ServContractHeader, IsHandled);
        if not IsHandled then
            if ServContractHeader.IsInvoicePeriodInTimeSegment() then
                if ServContractHeader."Annual Amount" = 0 then
                    Error(Text004);

        CheckServiceItemBlockedForServiceContractAndItemServiceBlocked(ServContractHeader);

        ServContractHeader.LockTable();
        IsHandled := false;
        OnLockServContractOnAfterLockTable(ServContractHeader, IsHandled);
        if not IsHandled then
            if (ServContractHeader."Contract Type" = ServContractHeader."Contract Type"::Contract) and (ServContractHeader.Status = ServContractHeader.Status::Signed) then begin
                ServContractLine.Reset();
                ServContractLine.SetRange("Contract Type", ServContractHeader."Contract Type");
                ServContractLine.SetRange("Contract No.", ServContractHeader."Contract No.");
                ServContractLine.SetRange("Line Amount", 0);
                ServContractLine.SetFilter("Line Discount %", '<%1', 100);
                RaiseError := not ServContractLine.IsEmpty();
                OnErrorIfServContractLinesHaveZeroAmount(ServContractHeader, ServContractLine, RaiseError);
                if RaiseError then
                    Error(Text000, ServContractHeader.Status, ServContractHeader."Contract Type", ServContractLine.FieldCaption("Line Amount"));
                ServContractLine.Reset();
                ServContractLine.SetRange("Contract Type", ServContractHeader."Contract Type");
                ServContractLine.SetRange("Contract No.", ServContractHeader."Contract No.");
                ServContractLine.SetRange("New Line", true);
                if not ServContractLine.IsEmpty() then
                    if not SignServContract(ServContractHeader) then
                        exit;
            end;
        ServContractHeader.Get(FromServContractHeader."Contract Type", FromServContractHeader."Contract No.");
        ServContractHeader."Change Status" := ServContractHeader."Change Status"::Locked;
        ServContractHeader.Modify();

        OnAfterLockServContract(ServContractHeader, FromServContractHeader);
    end;

    procedure OpenServContract(ServContractHeader: Record "Service Contract Header")
    begin
        if ServContractHeader."Change Status" = ServContractHeader."Change Status"::Open then
            exit;
        ServContractHeader.LockTable();
        if (ServContractHeader.Status = ServContractHeader.Status::Cancelled) and (ServContractHeader."Contract Type" = ServContractHeader."Contract Type"::Contract) then
            Error(Text001, ServContractHeader.Status);
        ServContractHeader."Change Status" := ServContractHeader."Change Status"::Open;
        ServContractHeader.Modify();

        OnAfterOpenServContract(ServContractHeader);
    end;

    local procedure SignServContract(ServContractHeader: Record "Service Contract Header"): Boolean
    var
        ConfirmManagement: Codeunit "Confirm Management";
        AutoSign: Boolean;
        IsHandled: Boolean;
    begin
        AutoSign := false;
        IsHandled := false;
        OnBeforeSignServContract(ServContractHeader, AutoSign, IsHandled);
        if IsHandled then
            exit(true);

        if not AutoSign then
            if not ConfirmManagement.GetResponseOrDefault(Text002, true) then
                exit(false);

        SignServContractDoc.AddendumToContract(ServContractHeader);
        exit(true);
    end;

    local procedure CheckServiceItemBlockedForServiceContractAndItemServiceBlocked(var ServiceContractHeader: Record "Service Contract Header")
    var
        ServiceContractLine: Record "Service Contract Line";
        ServContractManagement: Codeunit ServContractManagement;
    begin
        ServiceContractLine.SetRange("Contract Type", ServiceContractHeader."Contract Type");
        ServiceContractLine.SetRange("Contract No.", ServiceContractHeader."Contract No.");
        ServiceContractLine.SetFilter("Service Item No.", '<>%1', '');
        if ServiceContractLine.FindSet() then
            repeat
                ServContractManagement.CheckServiceItemBlockedForServiceContract(ServiceContractLine);
                ServContractManagement.CheckItemServiceBlocked(ServiceContractLine);
            until ServiceContractLine.Next() = 0;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeLockServContract(var ServiceContractHeader: Record "Service Contract Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnErrorIfServContractLinesHaveZeroAmount(ServiceContractHeader: Record "Service Contract Header"; ServiceContractLine: Record "Service Contract Line"; var RaiseError: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterLockServContract(var ServiceContractHeader: Record "Service Contract Header"; var FromServiceContractHeader: Record "Service Contract Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterOpenServContract(var ServiceContractHeader: Record "Service Contract Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLockServContractOnBeforeCheckZeroAnnualAmount(ServContractHeader: Record "Service Contract Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSignServContract(ServContractHeader: Record "Service Contract Header"; var AutoSign: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLockServContractOnBeforeCheckAmounts(var ServiceContractHeader: Record "Service Contract Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLockServContractOnAfterLockTable(var ServiceContractHeader: Record "Service Contract Header"; var IsHandled: Boolean)
    begin
    end;
}