Codeunit 1322 Correct PstdSalesInv (Yes/No)

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

Procedures, 1Events, 4

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Sales/History/CorrectPstdSalesInvYesNo.Codeunit.al146 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.History;

using Microsoft.Sales.Document;
using System.Utilities;

/// <summary>
/// Provides user confirmation dialog before correcting a posted sales invoice.
/// </summary>
codeunit 1322 "Correct PstdSalesInv (Yes/No)"
{
    Permissions = TableData "Sales Invoice Header" = rm,
                  TableData "Sales Cr.Memo Header" = rm;
    TableNo = "Sales Invoice Header";

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

    var
        CorrectPostedInvoiceQst: Label 'The posted sales invoice will be canceled, and a new version of the sales invoice will automatically be created by the system so that you can make the correction.\ \Do you want to continue?';
        CorrectPostedInvoiceFromSingleOrderQst: Label 'The invoice was posted from an order. The invoice will be cancelled, and the order will open so that you can make the correction.\ \Do you want to continue?';
        CorrectPostedInvoiceFromDeletedOrderQst: Label 'The invoice was posted from an order. The order has been deleted, and the invoice will be cancelled. You can create a new invoice or order by using the Copy Document action.\ \Do you want to continue?';
        CorrectPostedInvoiceFromMultipleOrderQst: Label 'The invoice was posted from multiple orders. It will now be cancelled, and you can make a correction manually in the original orders.\ \Do you want to continue?';

    /// <summary>
    /// Corrects the posted sales invoice after user confirmation by canceling it and opening the appropriate document for correction.
    /// </summary>
    /// <param name="SalesInvoiceHeader">Specifies the posted sales invoice to correct.</param>
    /// <returns>True if the invoice was successfully corrected, otherwise false.</returns>
    procedure CorrectInvoice(var SalesInvoiceHeader: Record "Sales Invoice Header"): Boolean
    var
        SalesHeader: Record "Sales Header";
        CorrectPostedSalesInvoice: Codeunit "Correct Posted Sales Invoice";
        RelatedOrderNo: Code[20];
        MultipleOrderRelated: Boolean;
        SalesHeaderExists: Boolean;
    begin
        CorrectPostedSalesInvoice.TestCorrectInvoiceIsAllowed(SalesInvoiceHeader, false);
        GetRelatedOrder(SalesInvoiceHeader, RelatedOrderNo, MultipleOrderRelated);
        if RelatedOrderNo = '' then
            exit(CancelPostedInvoiceAndOpenNewSalesInvoice(SalesInvoiceHeader));

        SalesHeaderExists := SalesHeader.Get(SalesHeader."Document Type"::Order, RelatedOrderNo);
        case true of
            MultipleOrderRelated:
                exit(CancelPostedInvoice(SalesInvoiceHeader, Format(CorrectPostedInvoiceFromMultipleOrderQst)));
            not SalesHeaderExists:
                exit(CancelPostedInvoice(SalesInvoiceHeader, Format(CorrectPostedInvoiceFromDeletedOrderQst)));
            else
                exit(CancelPostedInvoiceAndOpenSalesOrder(SalesInvoiceHeader, SalesHeader))
        end;

        exit(false);
    end;

    local procedure CancelPostedInvoiceAndOpenNewSalesInvoice(var SalesInvoiceHeader: Record "Sales Invoice Header"): Boolean
    var
        SalesHeader: Record "Sales Header";
        ConfirmManagement: Codeunit "Confirm Management";
        CorrectPostedSalesInvoice: Codeunit "Correct Posted Sales Invoice";
        IsHandled: Boolean;
    begin
        if ConfirmManagement.GetResponse(CorrectPostedInvoiceQst, false) then begin
            CorrectPostedSalesInvoice.CancelPostedInvoiceCreateNewInvoice(SalesInvoiceHeader, SalesHeader);
            IsHandled := false;
            OnCorrectInvoiceOnBeforeOpenSalesInvoicePage(SalesHeader, IsHandled, SalesInvoiceHeader);
            if not IsHandled then
                PAGE.Run(PAGE::"Sales Invoice", SalesHeader);
            exit(true);
        end;

        exit(false);
    end;

    local procedure CancelPostedInvoiceAndOpenSalesOrder(var SalesInvoiceHeader: Record "Sales Invoice Header"; var SalesHeader: Record "Sales Header"): Boolean
    var
        ConfirmManagement: Codeunit "Confirm Management";
        CorrectPostedSalesInvoice: Codeunit "Correct Posted Sales Invoice";
        IsHandled: Boolean;
        ConfirmQuestion: Text;
    begin
        ConfirmQuestion := CorrectPostedInvoiceFromSingleOrderQst;
        OnCancelPostedInvoiceAndOpenSalesOrderOnBeforeConfirm(SalesInvoiceHeader, SalesHeader, ConfirmQuestion);
        if ConfirmManagement.GetResponse(ConfirmQuestion, false) then begin
            if not CorrectPostedSalesInvoice.CancelPostedInvoice(SalesInvoiceHeader) then
                exit(false);

            SalesHeader.Find();
            OnCorrectInvoiceOnBeforeOpenSalesOrderPage(SalesHeader, IsHandled);
            if not IsHandled then
                PAGE.Run(PAGE::"Sales Order", SalesHeader);
            exit(true);
        end;

        exit(false);
    end;

    local procedure CancelPostedInvoice(var SalesInvoiceHeader: Record "Sales Invoice Header"; ConfirmationText: Text): Boolean
    var
        ConfirmManagement: Codeunit "Confirm Management";
        CorrectPostedSalesInvoice: Codeunit "Correct Posted Sales Invoice";
    begin
        if ConfirmManagement.GetResponse(ConfirmationText, true) then
            exit(CorrectPostedSalesInvoice.CancelPostedInvoice(SalesInvoiceHeader));

        exit(false);
    end;

    local procedure GetRelatedOrder(SalesInvoiceHeader: Record "Sales Invoice Header"; var RelatedOrderNo: Code[20]; var MultipleOrderRelated: Boolean)
    var
        SalesInvoiceLine: Record "Sales Invoice Line";
    begin
        MultipleOrderRelated := false;
        RelatedOrderNo := '';

        SalesInvoiceLine.SetRange("Document No.", SalesInvoiceHeader."No.");
        SalesInvoiceLine.SetFilter("Order No.", '<>''''');
        if SalesInvoiceLine.FindFirst() then begin
            RelatedOrderNo := SalesInvoiceLine."Order No.";
            SalesInvoiceLine.SetFilter("Order No.", '<>''''&<>%1', SalesInvoiceLine."Order No.");
            MultipleOrderRelated := not SalesInvoiceLine.IsEmpty();
        end;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCorrectInvoiceOnBeforeOpenSalesInvoicePage(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean; var SalesInvoiceHeader: Record "Sales Invoice Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCorrectInvoiceOnBeforeOpenSalesOrderPage(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCancelPostedInvoiceAndOpenSalesOrderOnBeforeConfirm(var SalesInvoiceHeader: Record "Sales Invoice Header"; var SalesHeader: Record "Sales Header"; var ConfirmQuestion: Text)
    begin
    end;
}