Codeunit 452 Report Distribution Management, source in 29

Source29

src/Layers/W1/BaseApp/Foundation/Reporting/ReportDistributionManagement.Codeunit.al578 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.Foundation.Reporting;

using Microsoft.EServices.EDocument;
using Microsoft.Foundation.Company;
using Microsoft.Projects.Project.Job;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.History;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Sales.FinanceCharge;
using Microsoft.Sales.History;
using Microsoft.Sales.Reminder;
using System.Email;
using System.IO;
using System.Reflection;
using System.Utilities;

codeunit 452 "Report Distribution Management"
{
    EventSubscriberInstance = Manual;

    trigger OnRun()
    begin
    end;

    var
        HideDialog: Boolean;
        SalesInvoiceDocTypeTxt: Label 'Sales Invoice';
        SalesCrMemoDocTypeTxt: Label 'Sales Credit Memo';
        SalesQuoteDocTypeTxt: Label 'Sales Quote';
        SalesOrderDocTypeTxt: Label 'Sales Order';
        SalesBlanketOrderDocTypeTxt: Label 'Sales Blanket Order';
        SalesReturnOrderDocTypeTxt: Label 'Sales Return Order';
        SalesShipmentDocTypeTxt: Label 'Sales Shipment';
        SalesReturnRcptDocTypeTxt: Label 'Sales Receipt';
        PurchaseInvoiceDocTypeTxt: Label 'Purchase Invoice';
        PurchaseCrMemoDocTypeTxt: Label 'Purchase Credit Memo';
        PurchaseQuoteDocTypeTxt: Label 'Purchase Quote';
        PurchaseOrderDocTypeTxt: Label 'Purchase Order';
        PurchaseBlanketOrderDocTypeTxt: Label 'Purchase Blanket Order';
        PurchaseReturnOrderDocTypeTxt: Label 'Purchase Return Order';
        JobQuoteDocTypeTxt: Label 'Project Quote';
        JobTaskQuoteDocTypeTxt: Label 'Project No %1 Project Task';
        IssuedReminderDocTypeTxt: Label 'Issued Reminder';
        IssuedFinChargeMemoDocTypeTxt: Label 'Issued Finance Charge Memo';

    [Scope('OnPrem')]
    procedure VANDocumentReport(HeaderDoc: Variant; TempDocumentSendingProfile: Record "Document Sending Profile" temporary)
    var
        ElectronicDocumentFormat: Record "Electronic Document Format";
        RecordExportBuffer: Record "Record Export Buffer";
        DocExchServiceMgt: Codeunit "Doc. Exch. Service Mgt.";
        TempBlob: Codeunit "Temp Blob";
        RecordRef: RecordRef;
        SpecificRecordRef: RecordRef;
        ClientFileName: Text[250];
    begin
        OnBeforeVANDocumentReport(HeaderDoc, TempDocumentSendingProfile, ElectronicDocumentFormat);
        RecordRef.GetTable(HeaderDoc);
        if RecordRef.FindSet() then
            repeat
                OnVANDocumentReportOnBeforeLoopIteration(RecordRef, HeaderDoc);
                SpecificRecordRef.Get(RecordRef.RecordId);
                SpecificRecordRef.SetRecFilter();
                ElectronicDocumentFormat.SendElectronically(
                    TempBlob, ClientFileName, SpecificRecordRef, TempDocumentSendingProfile."Electronic Format");
                if ElectronicDocumentFormat."Delivery Codeunit ID" = 0 then
                    DocExchServiceMgt.SendDocument(SpecificRecordRef, TempBlob)
                else begin
                    RecordExportBuffer.RecordID := SpecificRecordRef.RecordId;
                    RecordExportBuffer.ClientFileName := ClientFileName;
                    RecordExportBuffer.SetFileContent(TempBlob);
                    RecordExportBuffer."Electronic Document Format" := TempDocumentSendingProfile."Electronic Format";
                    RecordExportBuffer."Document Sending Profile" := TempDocumentSendingProfile.Code;
                    OnVANDocumentReportOnBeforeRunDeliveryCodeunit(RecordExportBuffer);
                    CODEUNIT.Run(ElectronicDocumentFormat."Delivery Codeunit ID", RecordExportBuffer);
                end;
            until RecordRef.Next() = 0;
    end;

    procedure DownloadPdfOnClient(ServerPdfFilePath: Text): Text
    var
        FileManagement: Codeunit "File Management";
        ClientPdfFilePath: Text;
    begin
        ClientPdfFilePath := FileManagement.DownloadTempFile(ServerPdfFilePath);
        Erase(ServerPdfFilePath);
        exit(ClientPdfFilePath);
    end;

    procedure InitializeFrom(NewHideDialog: Boolean)
    begin
        HideDialog := NewHideDialog;
    end;

    procedure GetFullDocumentTypeText(DocumentVariant: Variant) DocumentTypeText: Text[50]
    var
        JobTask: Record "Job Task";
        SalesHeader: Record "Sales Header";
        PurchaseHeader: Record "Purchase Header";
        TranslationHelper: Codeunit "Translation Helper";
        DocumentRecordRef: RecordRef;
    begin
        if DocumentVariant.IsRecord then
            DocumentRecordRef.GetTable(DocumentVariant)
        else
            if DocumentVariant.IsRecordRef then
                DocumentRecordRef := DocumentVariant;

        TranslationHelper.SetGlobalLanguageByCode(GetDocumentLanguageCode(DocumentVariant));

        case DocumentRecordRef.Number of
            DATABASE::"Sales Invoice Header":
                DocumentTypeText := SalesInvoiceDocTypeTxt;
            DATABASE::"Sales Cr.Memo Header":
                DocumentTypeText := SalesCrMemoDocTypeTxt;
            Database::"Sales Shipment Header":
                DocumentTypeText := SalesShipmentDocTypeTxt;
            Database::"Purch. Inv. Header":
                DocumentTypeText := PurchaseInvoiceDocTypeTxt;
            Database::"Purch. Cr. Memo Hdr.":
                DocumentTypeText := PurchaseCrMemoDocTypeTxt;
            DATABASE::Job:
                DocumentTypeText := JobQuoteDocTypeTxt;
            Database::"Return Receipt Header":
                DocumentTypeText := SalesReturnRcptDocTypeTxt;
            Database::"Issued Reminder Header":
                DocumentTypeText := IssuedReminderDocTypeTxt;
            Database::"Issued Fin. Charge Memo Header":
                DocumentTypeText := IssuedFinChargeMemoDocTypeTxt;
            DATABASE::"Sales Header":
                begin
                    DocumentRecordRef.SetTable(SalesHeader);
                    case SalesHeader."Document Type" of
                        SalesHeader."Document Type"::Invoice:
                            DocumentTypeText := SalesInvoiceDocTypeTxt;
                        SalesHeader."Document Type"::"Credit Memo":
                            DocumentTypeText := SalesCrMemoDocTypeTxt;
                        SalesHeader."Document Type"::Quote:
                            DocumentTypeText := SalesQuoteDocTypeTxt;
                        SalesHeader."Document Type"::Order:
                            DocumentTypeText := SalesOrderDocTypeTxt;
                        SalesHeader."Document Type"::"Blanket Order":
                            DocumentTypeText := SalesBlanketOrderDocTypeTxt;
                        SalesHeader."Document Type"::"Return Order":
                            DocumentTypeText := SalesReturnOrderDocTypeTxt;
                    end;
                end;
            DATABASE::"Purchase Header":
                begin
                    DocumentRecordRef.SetTable(PurchaseHeader);
                    case PurchaseHeader."Document Type" of
                        PurchaseHeader."Document Type"::Invoice:
                            DocumentTypeText := PurchaseInvoiceDocTypeTxt;
                        PurchaseHeader."Document Type"::"Credit Memo":
                            DocumentTypeText := PurchaseCrMemoDocTypeTxt;
                        PurchaseHeader."Document Type"::Quote:
                            DocumentTypeText := PurchaseQuoteDocTypeTxt;
                        PurchaseHeader."Document Type"::Order:
                            DocumentTypeText := PurchaseOrderDocTypeTxt;
                        PurchaseHeader."Document Type"::"Blanket Order":
                            DocumentTypeText := PurchaseBlanketOrderDocTypeTxt;
                        PurchaseHeader."Document Type"::"Return Order":
                            DocumentTypeText := PurchaseReturnOrderDocTypeTxt;
                    end;
                end;
            DATABASE::"Job Task":
                begin
                    DocumentRecordRef.SetTable(JobTask);
                    DocumentTypeText := (StrSubstNo(JobTaskQuoteDocTypeTxt, JobTask."Job No."));
                end;
            else
                OnGetFullDocumentTypeTextElseCase(DocumentRecordRef, DocumentTypeText);
        end;

        TranslationHelper.RestoreGlobalLanguage();

        OnAfterGetFullDocumentTypeText(DocumentVariant, DocumentTypeText, DocumentRecordRef);
    end;

    procedure GetDocumentLanguageCode(DocumentVariant: Variant) LanguageCode: Code[10]
    var
        SalesInvoiceHeader: Record "Sales Invoice Header";
        SalesCrMemoHeader: Record "Sales Cr.Memo Header";
        SalesHeader: Record "Sales Header";
        PurchaseHeader: Record "Purchase Header";
        Job: Record Job;
        JobTask: Record "Job Task";
        CompanyInformationMgt: Codeunit "Company Information Mgt.";
        DocumentRecordRef: RecordRef;
    begin
        if DocumentVariant.IsRecord then
            DocumentRecordRef.GetTable(DocumentVariant)
        else
            if DocumentVariant.IsRecordRef then
                DocumentRecordRef := DocumentVariant;

        case DocumentRecordRef.Number of
            DATABASE::"Sales Invoice Header":
                begin
                    DocumentRecordRef.SetTable(SalesInvoiceHeader);
                    LanguageCode := SalesInvoiceHeader."Language Code";
                end;
            DATABASE::"Sales Cr.Memo Header":
                begin
                    DocumentRecordRef.SetTable(SalesCrMemoHeader);
                    LanguageCode := SalesCrMemoHeader."Language Code";
                end;
            DATABASE::"Sales Header":
                begin
                    DocumentRecordRef.SetTable(SalesHeader);
                    LanguageCode := SalesHeader."Language Code";
                end;
            DATABASE::"Purchase Header":
                begin
                    DocumentRecordRef.SetTable(PurchaseHeader);
                    LanguageCode := PurchaseHeader."Language Code";
                end;
            DATABASE::Job:
                begin
                    DocumentRecordRef.SetTable(Job);
                    LanguageCode := Job."Language Code";
                end;
            DATABASE::"Job Task":
                begin
                    DocumentRecordRef.SetTable(JobTask);
                    LanguageCode := JobTask."Language Code";
                end;
            else
                OnGetDocumentLanguageCodeCaseElse(DocumentRecordRef, LanguageCode);
        end;
        CompanyInformationMgt.GetLanguageDefault(LanguageCode);
    end;

    procedure GetReportCaption(ReportID: Integer; LanguageCode: Code[10]) ReportCaption: Text[250]
    var
        AllObjWithCaption: Record AllObjWithCaption;
        TranslationHelper: Codeunit "Translation Helper";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetReportCaption(ReportID, LanguageCode, ReportCaption, IsHandled);
        if IsHandled then
            exit;

        TranslationHelper.SetGlobalLanguageByCode(LanguageCode);

        if AllObjWithCaption.Get(AllObjWithCaption."Object Type"::Report, ReportID) then
            ReportCaption := AllObjWithCaption."Object Caption";

        TranslationHelper.RestoreGlobalLanguage();
    end;

    local procedure GetBillToCustomer(var Customer: Record Customer; DocumentVariant: Variant)
    var
        SalesInvoiceHeader: Record "Sales Invoice Header";
        SalesCrMemoHeader: Record "Sales Cr.Memo Header";
        SalesHeader: Record "Sales Header";
        Job: Record Job;
        DocumentRecordRef: RecordRef;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetBillToCustomer(Customer, DocumentVariant, IsHandled);
        if IsHandled then
            exit;

        DocumentRecordRef.GetTable(DocumentVariant);
        case DocumentRecordRef.Number of
            DATABASE::"Sales Invoice Header":
                begin
                    SalesInvoiceHeader := DocumentVariant;
                    Customer.Get(SalesInvoiceHeader."Bill-to Customer No.");
                end;
            DATABASE::"Sales Cr.Memo Header":
                begin
                    SalesCrMemoHeader := DocumentVariant;
                    Customer.Get(SalesCrMemoHeader."Bill-to Customer No.");
                end;
            DATABASE::"Sales Header":
                begin
                    SalesHeader := DocumentVariant;
                    Customer.Get(SalesHeader."Bill-to Customer No.");
                end;
            DATABASE::Job:
                begin
                    Job := DocumentVariant;
                    Customer.Get(Job."Bill-to Customer No.");
                end;
            else
                OnGetBillToCustomerOnUnhandledTableNo(DocumentRecordRef, Customer);
        end;

        OnAfterGetBillToCustomer(Customer, DocumentVariant, DocumentRecordRef);
    end;

    local procedure GetBuyFromVendor(var Vendor: Record Vendor; DocumentVariant: Variant)
    var
        PurchaseHeader: Record "Purchase Header";
        DocumentRecordRef: RecordRef;
    begin
        DocumentRecordRef.GetTable(DocumentVariant);
        case DocumentRecordRef.Number of
            DATABASE::"Purchase Header":
                begin
                    PurchaseHeader := DocumentVariant;
                    Vendor.Get(PurchaseHeader."Buy-from Vendor No.");
                end;
        end;
    end;

    procedure SaveFileOnClient(var TempBlob: Codeunit "Temp Blob"; ClientFileName: Text)
    var
        FileManagement: Codeunit "File Management";
    begin
        FileManagement.BLOBExport(TempBlob, ClientFileName, true);
    end;

    local procedure SendAttachment(PostedDocumentNo: Code[20]; SendEmailAddress: Text[250]; var AttachmentTempBlob: Codeunit "Temp Blob"; AttachmentFileName: Text[250]; DocumentVariant: Variant; SendTo: Enum "Doc. Sending Profile Send To"; var EmailBodyTempBlob: Codeunit "Temp Blob"; ReportUsage: Enum "Report Selection Usage"; var ReceiverRecord: RecordRef)
    var
        DocumentMailing: Codeunit "Document-Mailing";
        FileManagement: Codeunit "File Management";
        SourceReference: RecordRef;
        DocumentType: Text[50];
        AttachmentStream: Instream;
        SourceTableIDs, SourceRelationTypes : List of [Integer];
        SourceIDs: List of [Guid];
    begin
        DocumentType := GetFullDocumentTypeText(DocumentVariant);

        if SendTo = SendTo::Disk then begin
            FileManagement.BLOBExport(AttachmentTempBlob, AttachmentFileName, true);
            exit;
        end;

        if AttachmentTempBlob.HasValue() then
            AttachmentTempBlob.CreateInStream(AttachmentStream);
        SourceReference.GetTable(DocumentVariant);

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

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

        DocumentMailing.EmailFile(
          AttachmentStream, AttachmentFileName, EmailBodyTempBlob, PostedDocumentNo,
          SendEmailAddress, DocumentType, HideDialog, ReportUsage.AsInteger(), SourceTableIDs, SourceIDs, SourceRelationTypes);
    end;

    internal procedure GetIssuedReminderDocTypeTxt(): Text
    begin
        exit(IssuedReminderDocTypeTxt);
    end;

#if not CLEAN27
    [Scope('OnPrem')]
    [Obsolete('Replaced with SendXmlEmailAttachment that accepts a TempBlob as additional parameter.', '27.0')]
    procedure SendXmlEmailAttachment(DocumentVariant: Variant; DocumentFormat: Code[20]; ServerEmailBodyFilePath: Text[250]; SendToEmailAddress: Text[250]; ReportUsage: Enum "Report Selection Usage")
    var
        FileManagement: Codeunit "File Management";
        EmailBodyTempBlob: Codeunit "Temp Blob";
    begin
        if ServerEmailBodyFilePath <> '' then
            FileManagement.BLOBImportFromServerFile(EmailBodyTempBlob, ServerEmailBodyFilePath);
        SendXmlEmailAttachment(DocumentVariant, DocumentFormat, EmailBodyTempBlob, SendToEmailAddress, ReportUsage);
    end;
#endif

    procedure SendXmlEmailAttachment(DocumentVariant: Variant; DocumentFormat: Code[20]; var EmailBodyTempBlob: Codeunit "Temp Blob"; SendToEmailAddress: Text[250]; ReportUsage: Enum "Report Selection Usage")
    var
        ElectronicDocumentFormat: Record "Electronic Document Format";
        Customer: Record Customer;
        DocumentSendingProfile: Record "Document Sending Profile";
        ReportSelections: Record "Report Selections";
        TempBlob: Codeunit "Temp Blob";
        DocumentMailing: Codeunit "Document-Mailing";
        ReceiverRecord: RecordRef;
        ClientFileName: Text[250];
    begin
        OnBeforeSendXmlEmailAttachment(ElectronicDocumentFormat, Customer, DocumentSendingProfile);

        GetBillToCustomer(Customer, DocumentVariant);

        if SendToEmailAddress = '' then
            SendToEmailAddress := DocumentMailing.GetToAddressFromCustomer(Customer."No.");

        DocumentSendingProfile.Get(Customer."Document Sending Profile");
        if DocumentSendingProfile.Usage = "Document Sending Profile Usage"::"Job Quote" then
            ReportUsage := ReportSelections.Usage::JQ;

        ElectronicDocumentFormat.SendElectronically(TempBlob, ClientFileName, DocumentVariant, DocumentFormat);
        Commit();
        ReceiverRecord.Open(Database::Customer);
        ReceiverRecord.GetBySystemId(Customer.SystemId);
        SendAttachment(
          ElectronicDocumentFormat.GetDocumentNo(DocumentVariant),
          SendToEmailAddress,
          TempBlob,
          ClientFileName,
          DocumentVariant,
          Enum::"Doc. Sending Profile Send To"::"Electronic Document",
          EmailBodyTempBlob, ReportUsage, ReceiverRecord);
    end;

#if not CLEAN27
    [Scope('OnPrem')]
    [Obsolete('Replaced with SendXmlEmailAttachmentVendor that accepts a TempBlob as additional parameter.', '27.0')]
    procedure SendXmlEmailAttachmentVendor(DocumentVariant: Variant; DocumentFormat: Code[20]; ServerEmailBodyFilePath: Text[250]; SendToEmailAddress: Text[250])
    var
        FileManagement: Codeunit "File Management";
        EmailBodyTempBlob: Codeunit "Temp Blob";
    begin
        if ServerEmailBodyFilePath <> '' then
            FileManagement.BLOBImportFromServerFile(EmailBodyTempBlob, ServerEmailBodyFilePath);
        SendXmlEmailAttachmentVendor(DocumentVariant, DocumentFormat, EmailBodyTempBlob, SendToEmailAddress);
    end;
#endif

    procedure SendXmlEmailAttachmentVendor(DocumentVariant: Variant; DocumentFormat: Code[20]; var EmailBodyTempBlob: Codeunit "Temp Blob"; SendToEmailAddress: Text[250])
    var
        ElectronicDocumentFormat: Record "Electronic Document Format";
        Vendor: Record Vendor;
        DocumentSendingProfile: Record "Document Sending Profile";
        ReportSelections: Record "Report Selections";
        DocumentMailing: Codeunit "Document-Mailing";
        TempBlob: Codeunit "Temp Blob";
        ReceiverRecord: RecordRef;
        ClientFileName: Text[250];
        ReportUsage: Enum "Report Selection Usage";
    begin
        GetBuyFromVendor(Vendor, DocumentVariant);

        if SendToEmailAddress = '' then
            SendToEmailAddress := DocumentMailing.GetToAddressFromVendor(Vendor."No.");

        DocumentSendingProfile.Get(Vendor."Document Sending Profile");
        if DocumentSendingProfile.Usage = "Document Sending Profile Usage"::"Job Quote" then
            ReportUsage := ReportSelections.Usage::JQ;

        ElectronicDocumentFormat.SendElectronically(TempBlob, ClientFileName, DocumentVariant, DocumentFormat);
        Commit();
        ReceiverRecord.Open(Database::Vendor);
        ReceiverRecord.GetBySystemId(Vendor.SystemId);
        SendAttachment(
          ElectronicDocumentFormat.GetDocumentNo(DocumentVariant),
          SendToEmailAddress,
          TempBlob,
          ClientFileName,
          DocumentVariant,
          Enum::"Doc. Sending Profile Send To"::"Electronic Document",
          EmailBodyTempBlob, ReportUsage, ReceiverRecord);
    end;

    [Scope('OnPrem')]
    procedure RunDefaultCheckSalesElectronicDocument(SalesHeader: Record "Sales Header")
    var
        ElectronicDocumentFormat: Record "Electronic Document Format";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeRunDefaultCheckSalesElectronicDocument(SalesHeader, IsHandled);
        if IsHandled then
            exit;
        GetElectronicDocumentFormat(ElectronicDocumentFormat, SalesHeader);

        ElectronicDocumentFormat.ValidateElectronicSalesDocument(SalesHeader, ElectronicDocumentFormat.Code);
    end;


    procedure GetElectronicDocumentFormat(var ElectronicDocumentFormat: Record "Electronic Document Format"; DocumentVariant: Variant)
    var
        Customer: Record Customer;
        DocumentSendingProfile: Record "Document Sending Profile";
    begin
        GetBillToCustomer(Customer, DocumentVariant);

        if not DocumentSendingProfile.Get(Customer."Document Sending Profile") then
            exit;

        if DocumentSendingProfile.Disk in
           [DocumentSendingProfile.Disk::"Electronic Document", DocumentSendingProfile.Disk::"PDF & Electronic Document"]
        then
            if not ElectronicDocumentFormat.Get(DocumentSendingProfile."Disk Format") then
                exit;

        if DocumentSendingProfile."Electronic Document" = DocumentSendingProfile."Electronic Document"::"Through Document Exchange Service" then
            if not ElectronicDocumentFormat.Get(DocumentSendingProfile."Electronic Format") then
                exit;
    end;

    [Scope('OnPrem')]
    procedure CreateOrAppendZipFile(var DataCompression: Codeunit "Data Compression"; var ServerTempBlob: Codeunit "Temp Blob"; ClientFileName: Text[250]; var ClientZipFileName: Text[250])
    var
        FileManagement: Codeunit "File Management";
        FileContentInStream: InStream;
        IsGZip: Boolean;
    begin
        ServerTempBlob.CreateInStream(FileContentInStream);
        IsGZip := DataCompression.IsGZip(FileContentInStream);
        if IsGZip then begin
            DataCompression.OpenZipArchive(FileContentInStream, true);
            ClientZipFileName := ClientFileName;
        end else begin
            DataCompression.CreateZipArchive();
            DataCompression.AddEntry(FileContentInStream, ClientFileName);
            ClientZipFileName := CopyStr(FileManagement.GetFileNameWithoutExtension(ClientFileName) + '.zip', 1, 250);
        end;
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetBillToCustomer(var Customer: Record Customer; DocumentVariant: Variant; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetReportCaption(ReportID: Integer; LanguageCode: Code[10]; var ReportCaption: Text[250]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSendXmlEmailAttachment(var ElectronicDocumentFormat: Record "Electronic Document Format"; var Customer: Record Customer; var DocumentSendingProfile: Record "Document Sending Profile")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeVANDocumentReport(HeaderDoc: Variant; var TempDocumentSendingProfile: Record "Document Sending Profile" temporary; var ElectronicDocumentFormat: Record "Electronic Document Format");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetBillToCustomer(var Customer: Record Customer; DocumentVariant: Variant; DocumentRecordRef: RecordRef)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetFullDocumentTypeText(DocumentVariant: Variant; var DocumentTypeText: Text[50]; var DocumentRecordRef: RecordRef)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetDocumentLanguageCodeCaseElse(DocumentRecordRef: RecordRef; var LanguageCode: Code[10])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnVANDocumentReportOnBeforeLoopIteration(var RecordRef: RecordRef; var HeaderDoc: Variant);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnVANDocumentReportOnBeforeRunDeliveryCodeunit(var RecordExportBuffer: Record "Record Export Buffer")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetFullDocumentTypeTextElseCase(DocumentRecordRef: RecordRef; var DocumentTypeText: Text[50])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetBillToCustomerOnUnhandledTableNo(DocumentRecordRef: RecordRef; var Customer: Record Customer)
    begin
    end;
}