Codeunit 364 PostPurch-Delete

App
Base Application
Namespace
Microsoft.Purchases.History
Versions
17-28

Procedures, 7Events, 11

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Purchases/History/PostPurchDelete.Codeunit.al370 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.Purchases.History;

using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Inventory.Tracking;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Setup;
using Microsoft.Utilities;

codeunit 364 "PostPurch-Delete"
{
    Permissions = TableData "Purch. Rcpt. Header" = ri,
                  TableData "Purch. Rcpt. Line" = rid,
                  TableData "Purch. Inv. Header" = ri,
                  TableData "Purch. Inv. Line" = rid,
                  TableData "Purch. Cr. Memo Hdr." = ri,
                  TableData "Purch. Cr. Memo Line" = rid,
                  TableData "Return Shipment Header" = ri,
                  TableData "Return Shipment Line" = rid;

    trigger OnRun()
    begin
    end;

    var
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        MoveEntries: Codeunit MoveEntries;
        DocumentDeletionErr: Label 'You cannot delete posted purchase documents that are posted after %1. \\The date is defined by the Allow Document Deletion Before field in the Purchases & Payables Setup window.', Comment = '%1 - Posting Date';
        AllowDocumentDeletionBeforeBlankErr: Label 'The date %1 must be set on the page %2 before deleting purchase documents.', Comment = '%1 = Field name, %2 = Page name';

    procedure DeleteHeader(PurchHeader: Record "Purchase Header"; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchInvHeader: Record "Purch. Inv. Header"; var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var ReturnShptHeader: Record "Return Shipment Header"; var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; var PurchCrMemoHdrPrepmt: Record "Purch. Cr. Memo Hdr.")
    var
        PurchInvLine: Record "Purch. Inv. Line";
        PurchCrMemoLine: Record "Purch. Cr. Memo Line";
        PurchRcptLine: Record "Purch. Rcpt. Line";
        ReturnShptLine: Record "Return Shipment Line";
        SourceCode: Record "Source Code";
        SourceCodeSetup: Record "Source Code Setup";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeDeleteHeader(PurchHeader, IsHandled, PurchRcptHeader, PurchInvHeader, PurchCrMemoHdr, ReturnShptHeader, PurchInvHeaderPrepmt, PurchCrMemoHdrPrepmt);
        if IsHandled then
            exit;

        SourceCodeSetup.Get();
        SourceCodeSetup.TestField("Deleted Document");
        SourceCode.Get(SourceCodeSetup."Deleted Document");

        InitDeleteHeader(
          PurchHeader, PurchRcptHeader, PurchInvHeader, PurchCrMemoHdr,
          ReturnShptHeader, PurchInvHeaderPrepmt, PurchCrMemoHdrPrepmt, SourceCode.Code);
        if PurchRcptHeader."No." <> '' then begin
            PurchRcptHeader.Insert();
            PurchRcptLine.Init();
            PurchRcptLine."Document No." := PurchRcptHeader."No.";
            PurchRcptLine."Line No." := 10000;
            PurchRcptLine.Description := SourceCode.Description;
            PurchRcptLine.Insert();
        end;

        if ReturnShptHeader."No." <> '' then begin
            ReturnShptHeader.Insert();
            ReturnShptLine.Init();
            ReturnShptLine."Document No." := ReturnShptHeader."No.";
            ReturnShptLine."Line No." := 10000;
            ReturnShptLine.Description := SourceCode.Description;
            ReturnShptLine.Insert();
        end;

        if PurchInvHeader."No." <> '' then begin
            PurchInvHeader.Insert();
            PurchInvLine.Init();
            PurchInvLine."Document No." := PurchInvHeader."No.";
            PurchInvLine."Line No." := 10000;
            PurchInvLine.Description := SourceCode.Description;
            PurchInvLine.Insert();
        end;

        if PurchCrMemoHdr."No." <> '' then begin
            PurchCrMemoHdr.Insert(true);
            PurchCrMemoLine.Init();
            PurchCrMemoLine."Document No." := PurchCrMemoHdr."No.";
            PurchCrMemoLine."Line No." := 10000;
            PurchCrMemoLine.Description := SourceCode.Description;
            PurchCrMemoLine.Insert();
        end;

        if PurchInvHeaderPrepmt."No." <> '' then begin
            PurchInvHeaderPrepmt.Insert();
            PurchInvLine."Document No." := PurchInvHeaderPrepmt."No.";
            PurchInvLine."Line No." := 10000;
            PurchInvLine.Description := SourceCode.Description;
            PurchInvLine.Insert();
        end;

        if PurchCrMemoHdrPrepmt."No." <> '' then begin
            PurchCrMemoHdrPrepmt.Insert();
            PurchCrMemoLine.Init();
            PurchCrMemoLine."Document No." := PurchCrMemoHdrPrepmt."No.";
            PurchCrMemoLine."Line No." := 10000;
            PurchCrMemoLine.Description := SourceCode.Description;
            PurchCrMemoLine.Insert();
        end;

        OnAfterDeleteHeader(
          PurchHeader, PurchRcptHeader, PurchInvHeader, PurchCrMemoHdr, ReturnShptHeader, PurchInvHeaderPrepmt, PurchCrMemoHdrPrepmt);
    end;

    procedure DeletePurchRcptLines(PurchRcptHeader: Record "Purch. Rcpt. Header")
    var
        PurchRcptLine: Record "Purch. Rcpt. Line";
        ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)";
    begin
        PurchRcptLine.SetRange("Document No.", PurchRcptHeader."No.");
        if PurchRcptLine.Find('-') then
            repeat
                OnBeforeDeletePurchRcptLines(PurchRcptLine);
                PurchRcptLine.TestField("Quantity Invoiced", PurchRcptLine.Quantity);
                PurchRcptLine.Delete();
            until PurchRcptLine.Next() = 0;

        ItemChargeAssignmentPurch.CheckAssignment(
            Enum::"Purchase Applies-to Document Type"::Receipt, PurchRcptLine."Document No.", PurchRcptLine."Line No.");

        ItemTrackingMgt.DeleteItemEntryRelation(
            DATABASE::"Purch. Rcpt. Line", 0, PurchRcptHeader."No.", '', 0, 0, true);

        MoveEntries.MoveDocRelatedEntries(DATABASE::"Purch. Rcpt. Header", PurchRcptHeader."No.");
    end;

    procedure DeletePurchInvLines(PurchInvHeader: Record "Purch. Inv. Header")
    var
        PurchInvLine: Record "Purch. Inv. Line";
    begin
        PurchInvLine.SetRange("Document No.", PurchInvHeader."No.");
        if PurchInvLine.Find('-') then
            repeat
                OnBeforeDeletePurchInvLines(PurchInvLine);
                PurchInvLine.Delete();
                ItemTrackingMgt.DeleteValueEntryRelation(PurchInvLine.RowID1());
            until PurchInvLine.Next() = 0;

        MoveEntries.MoveDocRelatedEntries(DATABASE::"Purch. Inv. Header", PurchInvHeader."No.");
    end;

    procedure DeletePurchCrMemoLines(PurchCrMemoHeader: Record "Purch. Cr. Memo Hdr.")
    var
        PurchCrMemoLine: Record "Purch. Cr. Memo Line";
    begin
        PurchCrMemoLine.SetRange("Document No.", PurchCrMemoHeader."No.");
        if PurchCrMemoLine.Find('-') then
            repeat
                OnBeforeDeletePurchCrMemoLines(PurchCrMemoLine);
                PurchCrMemoLine.Delete();
            until PurchCrMemoLine.Next() = 0;
        ItemTrackingMgt.DeleteItemEntryRelation(
          DATABASE::"Purch. Cr. Memo Line", 0, PurchCrMemoHeader."No.", '', 0, 0, true);

        MoveEntries.MoveDocRelatedEntries(DATABASE::"Purch. Cr. Memo Hdr.", PurchCrMemoHeader."No.");
    end;

    procedure DeletePurchShptLines(ReturnShptHeader: Record "Return Shipment Header")
    var
        ReturnShipmentLine: Record "Return Shipment Line";
        ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)";
    begin
        ReturnShipmentLine.SetRange("Document No.", ReturnShptHeader."No.");
        if ReturnShipmentLine.Find('-') then
            repeat
                OnBeforeDeletePurchShptLines(ReturnShipmentLine);
                ReturnShipmentLine.TestField("Quantity Invoiced", ReturnShipmentLine.Quantity);
                ReturnShipmentLine.Delete();
            until ReturnShipmentLine.Next() = 0;

        ItemChargeAssignmentPurch.CheckAssignment(
            Enum::"Purchase Applies-to Document Type"::"Return Shipment", ReturnShipmentLine."Document No.", ReturnShipmentLine."Line No.");

        ItemTrackingMgt.DeleteItemEntryRelation(
          DATABASE::"Return Shipment Line", 0, ReturnShptHeader."No.", '', 0, 0, true);

        MoveEntries.MoveDocRelatedEntries(DATABASE::"Return Shipment Header", ReturnShptHeader."No.");
    end;

    procedure InitDeleteHeader(PurchHeader: Record "Purchase Header"; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchInvHeader: Record "Purch. Inv. Header"; var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var ReturnShptHeader: Record "Return Shipment Header"; var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; var PurchCrMemoHdrPrepmt: Record "Purch. Cr. Memo Hdr."; SourceCode: Code[10])
    var
        PurchSetup: Record "Purchases & Payables Setup";
    begin
        OnBeforeInitDeleteHeader(
          PurchHeader, PurchRcptHeader, PurchInvHeader, PurchCrMemoHdr, ReturnShptHeader, PurchInvHeaderPrepmt, PurchCrMemoHdrPrepmt,
          SourceCode);

        Clear(PurchRcptHeader);
        Clear(PurchInvHeader);
        Clear(PurchCrMemoHdr);
        Clear(ReturnShptHeader);
        PurchSetup.Get();

        if (PurchHeader."Receiving No. Series" <> '') and (PurchHeader."Receiving No." <> '') then begin
            PurchRcptHeader.TransferFields(PurchHeader);
            PurchRcptHeader."No." := PurchHeader."Receiving No.";
            PurchRcptHeader."Posting Date" := Today;
            PurchRcptHeader."User ID" := CopyStr(UserId(), 1, MaxStrLen(PurchRcptHeader."User ID"));
            PurchRcptHeader."Source Code" := SourceCode;
        end;

        if (PurchHeader."Return Shipment No. Series" <> '') and (PurchHeader."Return Shipment No." <> '') then begin
            ReturnShptHeader.TransferFields(PurchHeader);
            ReturnShptHeader."No." := PurchHeader."Return Shipment No.";
            ReturnShptHeader."Posting Date" := Today;
            ReturnShptHeader."User ID" := CopyStr(UserId(), 1, MaxStrLen(ReturnShptHeader."User ID"));
            ReturnShptHeader."Source Code" := SourceCode;
        end;

        if (PurchHeader."Posting No. Series" <> '') and
           ((PurchHeader."Document Type" in [PurchHeader."Document Type"::Order, PurchHeader."Document Type"::Invoice]) and
            (PurchHeader."Posting No." <> '') or
            (PurchHeader."Document Type" = PurchHeader."Document Type"::Invoice) and
            (PurchHeader."No. Series" = PurchHeader."Posting No. Series"))
        then
            InitPurchInvHeader(PurchInvHeader, PurchHeader, SourceCode);

        if (PurchHeader."Posting No. Series" <> '') and
           ((PurchHeader."Document Type" in [PurchHeader."Document Type"::"Return Order", PurchHeader."Document Type"::"Credit Memo"]) and
            (PurchHeader."Posting No." <> '') or
            (PurchHeader."Document Type" = PurchHeader."Document Type"::"Credit Memo") and
            (PurchHeader."No. Series" = PurchHeader."Posting No. Series"))
        then begin
            PurchCrMemoHdr.TransferFields(PurchHeader);
            if PurchHeader."Posting No." <> '' then
                PurchCrMemoHdr."No." := PurchHeader."Posting No.";
            PurchCrMemoHdr."Pre-Assigned No. Series" := PurchHeader."No. Series";
            PurchCrMemoHdr."Pre-Assigned No." := PurchHeader."No.";
            PurchCrMemoHdr."Posting Date" := Today;
            PurchCrMemoHdr."User ID" := CopyStr(UserId(), 1, MaxStrLen(PurchCrMemoHdr."User ID"));
            PurchCrMemoHdr."Source Code" := SourceCode;
        end;

        if (PurchHeader."Prepayment No. Series" <> '') and (PurchHeader."Prepayment No." <> '') then begin
            PurchHeader.TestField("Document Type", PurchHeader."Document Type"::Order);
            InitPurchInvHeaderPrepmt(PurchInvHeaderPrepmt, PurchHeader, SourceCode);
        end;

        if (PurchHeader."Prepmt. Cr. Memo No. Series" <> '') and (PurchHeader."Prepmt. Cr. Memo No." <> '') then begin
            PurchHeader.TestField("Document Type", PurchHeader."Document Type"::Order);
            PurchCrMemoHdrPrepmt.TransferFields(PurchHeader);
            PurchCrMemoHdrPrepmt."No." := PurchHeader."Prepmt. Cr. Memo No.";
            PurchCrMemoHdrPrepmt."Prepayment Order No." := PurchHeader."No.";
            PurchCrMemoHdrPrepmt."Posting Date" := Today;
            PurchCrMemoHdrPrepmt."Pre-Assigned No. Series" := '';
            PurchCrMemoHdrPrepmt."Pre-Assigned No." := '';
            PurchCrMemoHdrPrepmt."User ID" := CopyStr(UserId(), 1, MaxStrLen(PurchCrMemoHdrPrepmt."User ID"));
            PurchCrMemoHdrPrepmt."Source Code" := SourceCode;
            PurchCrMemoHdrPrepmt."Prepayment Credit Memo" := true;
        end;

        OnAfterInitDeleteHeader(
          PurchHeader, PurchRcptHeader, PurchInvHeader, PurchCrMemoHdr, ReturnShptHeader, PurchInvHeaderPrepmt, PurchCrMemoHdrPrepmt);
    end;

    local procedure InitPurchInvHeader(var PurchInvHeader: Record "Purch. Inv. Header"; PurchHeader: Record "Purchase Header"; SourceCode: Code[10])
    begin
        PurchInvHeader.TransferFields(PurchHeader);
        if PurchHeader."Posting No." <> '' then
            PurchInvHeader."No." := PurchHeader."Posting No.";
        if PurchHeader."Document Type" = PurchHeader."Document Type"::Invoice then begin
            PurchInvHeader."Pre-Assigned No. Series" := PurchHeader."No. Series";
            PurchInvHeader."Pre-Assigned No." := PurchHeader."No.";
        end else begin
            PurchInvHeader."Pre-Assigned No. Series" := '';
            PurchInvHeader."Pre-Assigned No." := '';
            PurchInvHeader."Order No. Series" := PurchHeader."No. Series";
            PurchInvHeader."Order No." := PurchHeader."No.";
        end;
        PurchInvHeader."Posting Date" := Today;
        PurchInvHeader."User ID" := CopyStr(UserId(), 1, MaxStrLen(PurchInvHeader."User ID"));
        PurchInvHeader."Source Code" := SourceCode;

        OnAfterInitPurchInvHeader(PurchInvHeader, PurchHeader);
    end;

    local procedure InitPurchInvHeaderPrepmt(var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; PurchHeader: Record "Purchase Header"; SourceCode: Code[10])
    begin
        PurchInvHeaderPrepmt.TransferFields(PurchHeader);
        PurchInvHeaderPrepmt."No." := PurchHeader."Prepayment No.";
        PurchInvHeaderPrepmt."Order No. Series" := PurchHeader."No. Series";
        PurchInvHeaderPrepmt."Prepayment Order No." := PurchHeader."No.";
        PurchInvHeaderPrepmt."Posting Date" := Today;
        PurchInvHeaderPrepmt."Pre-Assigned No. Series" := '';
        PurchInvHeaderPrepmt."Pre-Assigned No." := '';
        PurchInvHeaderPrepmt."User ID" := CopyStr(UserId(), 1, MaxStrLen(PurchInvHeaderPrepmt."User ID"));
        PurchInvHeaderPrepmt."Source Code" := SourceCode;
        PurchInvHeaderPrepmt."Prepayment Invoice" := true;

        OnAfterInitPurchInvHeaderPrepmt(PurchInvHeaderPrepmt, PurchHeader);
    end;

    procedure IsDocumentDeletionAllowed(PostingDate: Date)
    var
        PurchSetup: Record "Purchases & Payables Setup";
        GeneralLedgerSetup: Record "General Ledger Setup";
        DocumentsRetentionPeriod: Interface "Documents - Retention Period";
    begin
        GeneralLedgerSetup.Get();
        DocumentsRetentionPeriod := GeneralLedgerSetup."Document Retention Period";
        DocumentsRetentionPeriod.CheckDocumentDeletionAllowedByLaw(PostingDate);

        PurchSetup.Get();
        if PurchSetup."Allow Document Deletion Before" = 0D then
            Error(AllowDocumentDeletionBeforeBlankErr, PurchSetup.FieldCaption("Allow Document Deletion Before"), PurchSetup.TableCaption);
        if PostingDate >= PurchSetup."Allow Document Deletion Before" then
            Error(DocumentDeletionErr, PurchSetup."Allow Document Deletion Before");
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterDeleteHeader(var PurchaseHeader: Record "Purchase Header"; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchInvHeader: Record "Purch. Inv. Header"; var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var ReturnShipmentHeader: Record "Return Shipment Header"; var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; var PurchCrMemoHdrPrepmt: Record "Purch. Cr. Memo Hdr.")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitDeleteHeader(var PurchHeader: Record "Purchase Header"; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchInvHeader: Record "Purch. Inv. Header"; var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var ReturnShptHeader: Record "Return Shipment Header"; var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; var PurchCrMemoHdrPrepmt: Record "Purch. Cr. Memo Hdr.")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitPurchInvHeader(var PurchInvHeader: Record "Purch. Inv. Header"; PurchHeader: Record "Purchase Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitPurchInvHeaderPrepmt(var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; PurchHeader: Record "Purchase Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteHeader(var PurchHeader: Record "Purchase Header"; var IsHandled: Boolean; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchInvHeader: Record "Purch. Inv. Header"; var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var ReturnShipmentHeader: Record "Return Shipment Header"; var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; var PurchCrMemoHdrPrepmt: Record "Purch. Cr. Memo Hdr.")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeletePurchRcptLines(PurchRcptLine: Record "Purch. Rcpt. Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeletePurchInvLines(PurchInvLine: Record "Purch. Inv. Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeletePurchCrMemoLines(PurchCrMemoLine: Record "Purch. Cr. Memo Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeletePurchShptLines(ReturnShptLine: Record "Return Shipment Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInitDeleteHeader(var PurchHeader: Record "Purchase Header"; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchInvHeader: Record "Purch. Inv. Header"; var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var ReturnShptHeader: Record "Return Shipment Header"; var PurchInvHeaderPrepmt: Record "Purch. Inv. Header"; var PurchCrMemoHdrPrepmt: Record "Purch. Cr. Memo Hdr."; var SourceCode: Code[10])
    begin
    end;
}