Codeunit 5467 PDF Document Management, source in 29
Source29
src/Layers/W1/BaseApp/eServices/EDocument/PDFDocumentManagement.Codeunit.al187 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.EServices.EDocument;
using Microsoft.Foundation.Company;
using Microsoft.Foundation.Reporting;
using Microsoft.Integration.Entity;
using Microsoft.Integration.Graph;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.History;
using Microsoft.Sales.Document;
using Microsoft.Sales.History;
using System.EMail;
using System.Utilities;
codeunit 5467 "PDF Document Management"
{
trigger OnRun()
begin
end;
var
CannotFindDocumentErr: Label 'The document %1 cannot be found.', Comment = '%1 - Error Message';
CannotOpenFileErr: Label 'Opening the file failed because of the following error: \%1.', Comment = '%1 - Error Message';
UnpostedSalesCreditMemoErr: Label 'You must post sales credit memo %1 before generating the PDF document.', Comment = '%1 - sales credit memo id';
UnpostedPurchaseInvoiceErr: Label 'You must post purchase invoice %1 before generating the PDF document.', Comment = '%1 - sales credit memo id';
BlobEmptyErr: Label 'Opening the file failed.';
CreditMemoTxt: Label 'Credit Memo';
PurchaseInvoiceTxt: Label 'Purchase Invoice';
[Scope('OnPrem')]
procedure GeneratePdf(DocumentId: Guid; var TempAttachmentEntityBuffer: Record "Attachment Entity Buffer" temporary): Boolean
var
CompanyInformation: Record "Company Information";
SalesInvoiceHeader: Record "Sales Invoice Header";
SalesCrMemoHeader: Record "Sales Cr.Memo Header";
SalesHeader: Record "Sales Header";
PurchaseHeader: Record "Purchase Header";
PurchInvHeader: Record "Purch. Inv. Header";
ReportSelections: Record "Report Selections";
DocumentMailing: Codeunit "Document-Mailing";
SalesInvoiceAggregator: Codeunit "Sales Invoice Aggregator";
PurchInvAggregator: Codeunit "Purch. Inv. Aggregator";
GraphMgtSalCrMemoBuf: Codeunit "Graph Mgt - Sal. Cr. Memo Buf.";
File: File;
InStream: InStream;
OutStream: OutStream;
Path: Text[250];
Name: Text[250];
ReportUsage: Enum "Report Selection Usage";
DocumentFound: Boolean;
begin
CompanyInformation.Get();
if SalesHeader.GetBySystemId(DocumentId) then begin
SalesHeader.SetRange("No.", SalesHeader."No.");
SalesHeader.SetRange("Document Type", SalesHeader."Document Type");
case SalesHeader."Document Type" of
SalesHeader."Document Type"::Invoice:
begin
ReportUsage := "Report Selection Usage"::"S.Invoice Draft";
ReportSelections.GetPdfReportForCust(Path, ReportUsage, SalesHeader, SalesHeader."Sell-to Customer No.");
DocumentMailing.GetAttachmentFileName(Name, SalesHeader."No.", SalesHeader.GetDocTypeTxt(), ReportUsage.AsInteger());
end;
SalesHeader."Document Type"::Quote:
begin
ReportUsage := "Report Selection Usage"::"S.Quote";
ReportSelections.GetPdfReportForCust(Path, ReportUsage, SalesHeader, SalesHeader."Sell-to Customer No.");
DocumentMailing.GetAttachmentFileName(Name, SalesHeader."No.", SalesHeader.GetDocTypeTxt(), ReportUsage.AsInteger());
end;
SalesHeader."Document Type"::"Credit Memo":
Error(UnpostedSalesCreditMemoErr, DocumentId);
else
Error(CannotFindDocumentErr, DocumentId);
end;
DocumentFound := true;
end;
if not DocumentFound then
if SalesInvoiceAggregator.GetSalesInvoiceHeaderFromId(DocumentId, SalesInvoiceHeader) then begin
SalesInvoiceHeader.SetRange("No.", SalesInvoiceHeader."No.");
ReportUsage := "Report Selection Usage"::"S.Invoice";
ReportSelections.GetPdfReportForCust(Path, ReportUsage, SalesInvoiceHeader, SalesInvoiceHeader."Sell-to Customer No.");
DocumentMailing.GetAttachmentFileName(Name, SalesInvoiceHeader."No.", SalesInvoiceHeader.GetDocTypeTxt(), ReportUsage.AsInteger());
DocumentFound := true;
end;
if not DocumentFound then
if GraphMgtSalCrMemoBuf.GetSalesCrMemoHeaderFromId(DocumentId, SalesCrMemoHeader) then begin
SalesCrMemoHeader.SetRange("No.", SalesCrMemoHeader."No.");
ReportUsage := "Report Selection Usage"::"S.Cr.Memo";
ReportSelections.GetPdfReportForCust(Path, ReportUsage, SalesCrMemoHeader, SalesCrMemoHeader."Sell-to Customer No.");
DocumentMailing.GetAttachmentFileName(Name, SalesCrMemoHeader."No.", CreditMemoTxt, ReportUsage.AsInteger());
DocumentFound := true;
end;
if not DocumentFound then
if PurchaseHeader.GetBySystemId(DocumentId) and (PurchaseHeader."Document Type" = PurchaseHeader."Document Type"::Invoice) then
Error(UnpostedPurchaseInvoiceErr, DocumentId);
if not DocumentFound then
if PurchInvAggregator.GetPurchaseInvoiceHeaderFromId(DocumentId, PurchInvHeader) then begin
PurchInvHeader.SetRange("No.", PurchInvHeader."No.");
if PurchInvHeader."Self-Billing Invoice" then
ReportUsage := "Report Selection Usage"::"P.Self Billing Invoice"
else
ReportUsage := "Report Selection Usage"::"P.Invoice";
ReportSelections.GetPdfReportForCust(Path, ReportUsage, PurchInvHeader, PurchInvHeader."Buy-from Vendor No.");
DocumentMailing.GetAttachmentFileName(Name, PurchInvHeader."No.", PurchaseInvoiceTxt, ReportUsage.AsInteger());
DocumentFound := true;
end;
if not DocumentFound then
Error(CannotFindDocumentErr, DocumentId);
if not File.Open(Path) then
Error(CannotOpenFileErr, GetLastErrorText);
TempAttachmentEntityBuffer.Init();
TempAttachmentEntityBuffer.Id := DocumentId;
TempAttachmentEntityBuffer."Document Id" := DocumentId;
TempAttachmentEntityBuffer."File Name" := Name;
TempAttachmentEntityBuffer.Type := TempAttachmentEntityBuffer.Type::PDF;
TempAttachmentEntityBuffer.Content.CreateOutStream(OutStream);
File.CreateInStream(InStream);
CopyStream(OutStream, InStream);
File.Close();
if Erase(Path) then;
TempAttachmentEntityBuffer.Insert(true);
exit(true);
end;
procedure GeneratePdfBlobWithDocumentType(ParentId: Guid; DocumentId: Guid; DocumentType: Enum "Attachment Entity Buffer Document Type"; var TempAttachmentEntityBuffer: Record "Attachment Entity Buffer" temporary): Boolean
begin
if GeneratePdfBlobWithDocumentType(DocumentId, DocumentType, TempAttachmentEntityBuffer) then begin
TempAttachmentEntityBuffer.Rename(TempAttachmentEntityBuffer.Id, ParentId);
TempAttachmentEntityBuffer.Modify();
exit(true);
end;
end;
procedure GeneratePdfBlobWithDocumentType(DocumentId: Guid; DocumentType: Enum "Attachment Entity Buffer Document Type"; var TempAttachmentEntityBuffer: Record "Attachment Entity Buffer" temporary) DocumentFound: Boolean
var
IPdfDocumentHandler: Interface IPdfDocumentHandler;
begin
IPdfDocumentHandler := DocumentType;
DocumentFound := IPdfDocumentHandler.GeneratePdfBlobWithDocumentType(DocumentId, DocumentType, TempAttachmentEntityBuffer);
if not DocumentFound then
Error(CannotFindDocumentErr, DocumentId);
end;
/// <summary>
/// Inits and adds generated report to the buffer
/// </summary>
/// <param name="DocumentId">The printed document</param>
/// <param name="DocumentType">Document type</param>
/// <param name="TempBlob">Generated PDF file</param>
/// <param name="Name">File Name</param>
/// <param name="TempAttachmentEntityBuffer">Returns buffer containing printed document</param>
/// <returns>True if TempAttachmentEntityBuffer is inserted, otherwise false.</returns>
internal procedure AddToTempAttachmentEntityBuffer(DocumentId: Guid; DocumentType: Enum "Attachment Entity Buffer Document Type"; TempBlob: Codeunit "Temp Blob"; Name: Text[250]; var TempAttachmentEntityBuffer: Record "Attachment Entity Buffer" temporary): Boolean
var
InStream: InStream;
OutStream: OutStream;
begin
if not TempBlob.HasValue() then
Error(BlobEmptyErr);
TempAttachmentEntityBuffer.Init();
TempAttachmentEntityBuffer.Id := DocumentId;
TempAttachmentEntityBuffer."Document Id" := DocumentId;
TempAttachmentEntityBuffer."File Name" := Name;
TempAttachmentEntityBuffer."Document Type" := DocumentType;
TempAttachmentEntityBuffer.Type := TempAttachmentEntityBuffer.Type::PDF;
TempAttachmentEntityBuffer.Content.CreateOutStream(OutStream);
TempBlob.CreateInStream(InStream);
CopyStream(OutStream, InStream);
exit(TempAttachmentEntityBuffer.Insert(true));
end;
}