Codeunit 2103 O365 Sales Cancel Invoice, source in 29

Source29

src/Layers/W1/BaseApp/Invoicing/O365SalesCancelInvoice.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.
// ------------------------------------------------------------------------------------------------
#pragma warning disable AA0247
codeunit 2103 "O365 Sales Cancel Invoice"
{
    TableNo = "Job Queue Entry";

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

    var
        EmailSubjectTxt: Label 'Your invoice has been canceled.';
        GreetingTxt: Label 'Hello %1,', Comment = '%1 - customer name';
        CanceletionEmailBodyTxt: Label 'Thank you for your business. Your invoice has been canceled.';
        CancelationEmailSubjectTxt: Label 'Invoice %1 of amount %2%3, that was due on %4 has been canceled. ', Comment = '%1 = Invoice No,%2 = Currency code, %3 = Total amount including tax , %4 = Due date';

    [Scope('OnPrem')]
    procedure SendInvoiceCancelationEmail(SalesInvoiceHeader: Record "Sales Invoice Header")
    var
        ReportSelections: Record "Report Selections";
        Customer: Record "Customer";
        DocumentMailing: Codeunit "Document-Mailing";
        TempBlob: Codeunit "Temp Blob";
        EmailBodyTempBlob: Codeunit "Temp Blob";
        SourceReference: RecordRef;
        RecordVariant: Variant;
        CustomerAddress: Text[250];
        EmailBodyTxt: Text;
        AttachmentStream: InStream;
        SourceTableIDs, SourceRelationTypes : List of [Integer];
        SourceIDs: List of [Guid];
    begin
        if not IsInvoiceCanceled(SalesInvoiceHeader) then
            exit;

        RecordVariant := SalesInvoiceHeader;
        CustomerAddress := GetEmailAddress(SalesInvoiceHeader);
        EmailBodyTxt := GetEmailBody(SalesInvoiceHeader);
        ReportSelections.GetEmailBodyTextForCust(
          EmailBodyTempBlob, "Report Selection Usage"::"S.Invoice", RecordVariant, SalesInvoiceHeader."Bill-to Customer No.",
          CustomerAddress, EmailBodyTxt);

        TempBlob.CreateInStream(AttachmentStream);
        SourceReference := RecordVariant;

        SourceTableIDs.Add(SourceReference.Number());
        SourceIDs.Add(SourceReference.Field(SourceReference.SystemIdNo).Value());
        SourceRelationTypes.Add(Enum::"Email Relation Type"::"Primary Source".AsInteger());

        if Customer.Get(SalesInvoiceHeader."Sell-to Customer No.") then begin
            SourceTableIDs.Add(Database::Customer);
            SourceIDs.Add(Customer.SystemId);
            SourceRelationTypes.Add(Enum::"Email Relation Type"::"Related Entity".AsInteger());
        end;

        DocumentMailing.EmailFile(AttachmentStream, '', EmailBodyTempBlob, EmailSubjectTxt, SalesInvoiceHeader."No.", CustomerAddress, SalesInvoiceHeader.GetDocTypeTxt(), true, Enum::"Report Selection Usage"::"S.Invoice".AsInteger(), SourceTableIDs, SourceIDs, SourceRelationTypes);
    end;

    local procedure SendInvoiceCancelationEmailFromJobQueue(JobQueueEntry: Record "Job Queue Entry")
    var
        SalesInvoiceHeader: Record "Sales Invoice Header";
    begin
        if not SalesInvoiceHeader.Get(JobQueueEntry."Record ID to Process") then
            exit;

        SendInvoiceCancelationEmail(SalesInvoiceHeader);
    end;

    local procedure GetCustomerEmailAddress(SalesInvoiceHeader: Record "Sales Invoice Header"): Text[80]
    var
        Customer: Record Customer;
    begin
        if Customer.Get(SalesInvoiceHeader."Sell-to Customer No.") then
            exit(Customer."E-Mail");
    end;

    local procedure GetDocumentEmailAddress(var SalesInvoiceHeader: Record "Sales Invoice Header"): Text[250]
    var
        EmailParameter: Record "Email Parameter";
    begin
        if EmailParameter.Get(
             SalesInvoiceHeader."No.", EmailParameter."Document Type"::Invoice, EmailParameter."Parameter Type"::Address)
        then
            exit(EmailParameter."Parameter Value");
        exit('');
    end;

    procedure GetEmailAddress(var SalesInvoiceHeader: Record "Sales Invoice Header"): Text[250]
    var
        EmailAddress: Text[250];
    begin
        EmailAddress := GetDocumentEmailAddress(SalesInvoiceHeader);
        if EmailAddress <> '' then
            exit(EmailAddress);

        EmailAddress := GetCustomerEmailAddress(SalesInvoiceHeader);
        exit(EmailAddress);
    end;

    procedure GetEmailSubject(var SalesInvoiceHeader: Record "Sales Invoice Header"): Text[250]
    var
        EmailSubject: Text[250];
    begin
        SalesInvoiceHeader.CalcFields("Amount Including VAT");
        EmailSubject := StrSubstNo(
            CancelationEmailSubjectTxt, SalesInvoiceHeader."No.", ResolveCurrency(SalesInvoiceHeader."Currency Code"),
            SalesInvoiceHeader."Amount Including VAT", SalesInvoiceHeader."Due Date");
        exit(EmailSubject);
    end;

    procedure IsInvoiceCanceled(SalesInvoiceHeader: Record "Sales Invoice Header"): Boolean
    var
        CancelledDocument: Record "Cancelled Document";
    begin
        exit(CancelledDocument.FindSalesCancelledInvoice(SalesInvoiceHeader."No."));
    end;

    local procedure ResolveCurrency(CurrencyCode: Code[10]): Text
    var
        GeneralLedgerSetup: Record "General Ledger Setup";
    begin
        if CurrencyCode = '' then begin
            GeneralLedgerSetup.Get();
            exit(GeneralLedgerSetup."LCY Code" + ' ');
        end;
        exit(CurrencyCode + ' ');
    end;

    local procedure GetEmailBody(SalesInvoiceHeader: Record "Sales Invoice Header"): Text
    var
        CR: Text[1];
        EmailBodyTxt: Text;
    begin
        CR[1] := 10;

        // Create cancel invoice body message
        EmailBodyTxt := StrSubstNo(GreetingTxt, SalesInvoiceHeader."Sell-to Customer Name") + CR + CR + CanceletionEmailBodyTxt;

        exit(EmailBodyTxt)
    end;
}