Codeunit 9069 Check Sales Document Line, source in 29

Source29

src/Layers/W1/BaseApp/Sales/Document/CheckSalesDocumentLine.Codeunit.al79 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.Sales.Document;

using Microsoft.Inventory.Item;
using Microsoft.Sales.Posting;

/// <summary>
/// Validates sales document lines before posting to ensure data integrity.
/// </summary>
codeunit 9069 "Check Sales Document Line"
{
    TableNo = "Sales Line";

    trigger OnRun()
    begin
        RunCheck(Rec);
    end;

    var
        SalesHeader: Record "Sales Header";
#pragma warning disable AA0470
        CannotDeleteItemIfSalesDocExistErr: Label 'You cannot delete %1 %2 because there is at least one outstanding Sales %3 that includes this item.', Comment = '1: Type, 2 Item No. and 3 : Type of document Order,Invoice';
#pragma warning restore AA0470

    /// <summary>
    /// Sets the sales header context for validating sales lines.
    /// </summary>
    /// <param name="NewSalesHeader">The sales header to use as context during line validation.</param>
    procedure SetSalesHeader(NewSalesHeader: Record "Sales Header")
    begin
        SalesHeader := NewSalesHeader;
    end;

    local procedure RunCheck(var SalesLine: Record "Sales Line")
    var
        SalesPost: Codeunit "Sales-Post";
    begin
        SalesPost.TestSalesLine(SalesHeader, SalesLine);
    end;

    [EventSubscriber(ObjectType::Table, Database::Item, 'OnAfterCheckDocuments', '', false, false)]
    local procedure ItemOnBeforeCheckDocuments(Item: Record Item; CurrentFieldNo: Integer; CheckFieldNo: Integer; CheckFieldCaption: Text);
    begin
        CheckSalesLines(Item, CurrentFieldNo, CheckFieldNo, CheckFieldCaption);
    end;

    internal procedure CheckSalesLines(Item: Record Item; CurrentFieldNo: Integer; CheckFieldNo: Integer; CheckFieldCaption: Text)
    var
        SalesLine: Record "Sales Line";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckSalesLines(Item, CurrentFieldNo, CheckFieldNo, CheckFieldCaption, IsHandled);
        if IsHandled then
            exit;

        SalesLine.SetCurrentKey(Type, "No.");
        SalesLine.SetRange(Type, SalesLine.Type::Item);
        SalesLine.SetRange("No.", Item."No.");
        SalesLine.SetLoadFields("Document Type");
        if SalesLine.FindFirst() then begin
            if CurrentFieldNo = 0 then
                Error(
                    CannotDeleteItemIfSalesDocExistErr, Item.TableCaption(), Item."No.", SalesLine."Document Type");
            if CurrentFieldNo = CheckFieldNo then
                Error(
                    Item.GetCannotChangeItemWithExistingDocumentLinesErr(),
                    CheckFieldCaption, Item.TableCaption(), Item."No.", SalesLine.TableCaption());
        end;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckSalesLines(Item: Record Item; CurrentFieldNo: Integer; CheckFieldNo: Integer; CheckFieldCaption: Text; var IsHandled: Boolean)
    begin
    end;
}