Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,25 @@
// ------------------------------------------------------------------------------------------------
namespace Microsoft.eServices.EDocument.Formats;

using Microsoft.Foundation.Company;
using Microsoft.Foundation.Attachment;
using System.Text;
using Microsoft.Finance.VAT.Setup;
using System.Utilities;
using System.Telemetry;
using Microsoft.eServices.EDocument;
using Microsoft.Finance.Currency;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.VAT.Setup;
using Microsoft.Foundation.Address;
using Microsoft.Foundation.Attachment;
using Microsoft.Foundation.Company;
using Microsoft.Foundation.PaymentTerms;
using Microsoft.Sales.Customer;
using Microsoft.eServices.EDocument;
using Microsoft.Foundation.Reporting;
using Microsoft.Foundation.UOM;
using Microsoft.Foundation.Address;
using Microsoft.Finance.Currency;
using System.IO;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Sales.History;
using Microsoft.Foundation.Reporting;
using Microsoft.Sales.Peppol;
using System.IO;
using System.Reflection;
using System.Telemetry;
using System.Text;
using System.Utilities;

codeunit 13916 "Export XRechnung Document"
{
Expand Down Expand Up @@ -108,6 +111,7 @@ codeunit 13916 "Export XRechnung Document"

InsertHeaderData(RootXMLNode, SalesInvoiceHeader, CurrencyCode);
InsertOrderReference(RootXMLNode, SalesInvoiceHeader);
InsertEmbeddedDocument(RootXMLNode, SalesInvoiceHeader);
InsertAttachment(RootXMLNode, Database::"Sales Invoice Header", SalesInvoiceHeader."No.");
CalculateLineAmounts(SalesInvoiceHeader, SalesInvLine, Currency, LineAmounts);
InsertAccountingSupplierParty(RootXMLNode);
Expand Down Expand Up @@ -152,6 +156,7 @@ codeunit 13916 "Export XRechnung Document"

InsertHeaderData(RootXMLNode, SalesCrMemoHeader, CurrencyCode);
InsertOrderReference(RootXMLNode, SalesCrMemoHeader);
InsertEmbeddedDocument(RootXMLNode, SalesCrMemoHeader);
InsertAttachment(RootXMLNode, Database::"Sales Cr.Memo Header", SalesCrMemoHeader."No.");
CalculateLineAmounts(SalesCrMemoHeader, SalesCrMemoLine, Currency, LineAmounts);
InsertAccountingSupplierParty(RootXMLNode);
Expand Down Expand Up @@ -881,6 +886,61 @@ codeunit 13916 "Export XRechnung Document"
end;
end;

local procedure InsertEmbeddedDocument(RootElement: XmlElement; RecordVariant: Variant)
var
SalesHeader: Record "Sales Header";
SalesInvoiceHeader: Record "Sales Invoice Header";
SalesCrMemoHeader: Record "Sales Cr.Memo Header";
PEPPOLMgt: Codeunit "PEPPOL Management";
DataTypeManagement: Codeunit "Data Type Management";
HeaderRecordRef: RecordRef;
AttachmentElement: XmlElement;
AttachmentObjectElement: XmlElement;
AdditionalDocumentReferenceID: Text;
AdditionalDocRefDocumentType: Text;
URI: Text;
filename: Text;
mimeCode: Text;
EmbeddedDocumentBinaryObject: Text;
begin
if not EDocumentService."Embed PDF in export" then
exit;
if not DataTypeManagement.GetRecordRef(RecordVariant, HeaderRecordRef) then
exit;
case HeaderRecordRef.Number of
Database::"Sales Invoice Header":
begin
HeaderRecordRef.SetTable(SalesInvoiceHeader);
PEPPOLMgt.FindNextSalesInvoiceRec(SalesInvoiceHeader, SalesHeader, 1);
end;
Database::"Sales Cr.Memo Header":
begin
HeaderRecordRef.SetTable(SalesCrMemoHeader);
PEPPOLMgt.FindNextSalesCreditMemoRec(SalesCrMemoHeader, SalesHeader, 1);
end;
end;
PEPPOLMgt.GeneratePDFAttachmentAsAdditionalDocRef(
SalesHeader,
AdditionalDocumentReferenceID,
AdditionalDocRefDocumentType,
URI,
filename,
mimeCode,
EmbeddedDocumentBinaryObject);
AttachmentElement := XmlElement.Create('AdditionalDocumentReference', XmlNamespaceCAC);
AttachmentElement.Add(XmlElement.Create('ID', XmlNamespaceCBC, filename));
AttachmentObjectElement := XmlElement.Create('Attachment', XmlNamespaceCAC);
AttachmentObjectElement.Add(
XmlElement.Create(
'EmbeddedDocumentBinaryObject',
XmlNamespaceCBC,
XmlAttribute.Create('mimeCode', mimeCode),
XmlAttribute.Create('filename', filename),
EmbeddedDocumentBinaryObject));
AttachmentElement.Add(AttachmentObjectElement);
RootElement.Add(AttachmentElement);
end;

procedure InsertAttachment(var RootElement: XmlElement; TableNo: Integer; DocumentNo: Code[20]);
var
DocumentAttachment: Record "Document Attachment";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,28 @@ codeunit 13918 "XRechnung XML Document Tests"
VerifyInvoiceWithInvDiscount(SalesInvoiceHeader, TempXMLBuffer);
VerifyInvoiceLineWithDiscount(SalesInvoiceHeader, TempXMLBuffer);
end;

[Test]
procedure ExportPostedSalesInvoiceInXRechnungFormatVerifyPDFEmbeddedToXML()
var
SalesInvoiceHeader: Record "Sales Invoice Header";
TempXMLBuffer: Record "XML Buffer" temporary;
begin
// [SCENARIO] Export posted sales invoice creates electronic document in XRechnung format with embedded PDF
Initialize();

// [GIVEN] Enable Embedding of PDF in export
SetEdocumentServiceEmbedPDFInExport(true);

// [GIVEN] Create and Post Sales Invoice.
SalesInvoiceHeader.Get(CreateAndPostSalesDocument("Sales Document Type"::Invoice, Enum::"Sales Line Type"::Item, false));

// [WHEN] Export XRechnung Electronic Document.
ExportInvoice(SalesInvoiceHeader, TempXMLBuffer);

// [THEN] PDF is embedded in the XML
VerifyInvoicePDFEmbeddedToXML(TempXMLBuffer);
end;
#endregion

#region SalesCreditMemo
Expand Down Expand Up @@ -585,6 +607,28 @@ codeunit 13918 "XRechnung XML Document Tests"
VerifyCrMemoWithInvDiscount(SalesCrMemoHeader, TempXMLBuffer);
VerifyCrMemoLineWithDiscounts(SalesCrMemoHeader, TempXMLBuffer);
end;

[Test]
procedure ExportPostedSalesCrMemoInXRechnungFormatVerifyPDFEmbeddedToXML()
var
SalesCrMemoHeader: Record "Sales Cr.Memo Header";
TempXMLBuffer: Record "XML Buffer" temporary;
begin
// [SCENARIO] Export posted sales cr. memo creates electronic document in XRechnung format with embedded PDF
Initialize();

// [GIVEN] Enable Embedding of PDF in export
SetEdocumentServiceEmbedPDFInExport(true);

// [GIVEN] Create and Post Sales Cr. Memo.
SalesCrMemoHeader.Get(CreateAndPostSalesDocument("Sales Document Type"::"Credit Memo", Enum::"Sales Line Type"::Item, false));

// [WHEN] Export XRechnung Electronic Document.
ExportCreditMemo(SalesCrMemoHeader, TempXMLBuffer);

// [THEN] PDF is embedded in the XML
VerifyCrMemoPDFEmbeddedToXML(TempXMLBuffer);
end;
#endregion

#region PurchaseInvoice
Expand Down Expand Up @@ -1131,6 +1175,18 @@ codeunit 13918 "XRechnung XML Document Tests"
Assert.AreEqual(FormatDecimal(SalesCrMemoHeader."Invoice Discount Amount" + SalesCrMemoHeader.Amount), GetNodeByPathWithError(TempXMLBuffer, Path), StrSubstNo(IncorrectValueErr, Path));
end;

local procedure VerifyInvoicePDFEmbeddedToXML(var TempXMLBuffer: Record "XML Buffer" temporary)
begin
TempXMLBuffer.SetRange(Path, '/ubl:Invoice/cac:AdditionalDocumentReference/cac:Attachment/cbc:EmbeddedDocumentBinaryObject');
Assert.RecordIsNotEmpty(TempXMLBuffer, '');
end;

local procedure VerifyCrMemoPDFEmbeddedToXML(var TempXMLBuffer: Record "XML Buffer" temporary)
begin
TempXMLBuffer.SetRange(Path, '/ns0:CreditNote/cac:AdditionalDocumentReference/cac:Attachment/cbc:EmbeddedDocumentBinaryObject');
Assert.RecordIsNotEmpty(TempXMLBuffer, '');
end;

local procedure GetCurrencyCode(CurrencyCode: Code[10]): Code[10];
begin
if CurrencyCode <> '' then
Expand All @@ -1139,6 +1195,12 @@ codeunit 13918 "XRechnung XML Document Tests"
exit(GeneralLedgerSetup."LCY Code");
end;

local procedure SetEdocumentServiceEmbedPDFInExport(NewEmbedPDFInExport: Boolean);
begin
EDocumentService."Embed PDF in export" := NewEmbedPDFInExport;
EDocumentService.Modify();
end;

local procedure SetEdocumentServiceBuyerReference(EInvoiceBuyerReference: Enum "E-Document Buyer Reference");
begin
EDocumentService."Buyer Reference Mandatory" := true;
Expand Down
Loading