Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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 @@ -20,6 +20,7 @@ codeunit 11035 "EDoc PEPPOL BIS 3.0 DE" implements "E-Document"

var
EDocPEPPOLBIS30: Codeunit "EDoc PEPPOL BIS 3.0";
EDocPEPPOLValidationDE: Codeunit "EDoc PEPPOL Validation DE";
UBLInvoiceNamespaceTxt: Label 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2', Locked = true;
UBLCrMemoNamespaceTxt: Label 'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2', Locked = true;
UBLCACNamespaceTxt: Label 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2', Locked = true;
Expand All @@ -28,7 +29,9 @@ codeunit 11035 "EDoc PEPPOL BIS 3.0 DE" implements "E-Document"
procedure Check(var SourceDocumentHeader: RecordRef; EDocumentService: Record "E-Document Service"; EDocumentProcessingPhase: Enum "E-Document Processing Phase")
begin
CheckBuyerReferenceMandatory(EDocumentService, SourceDocumentHeader);
BindSubscription(EDocPEPPOLValidationDE);
EDocPEPPOLBIS30.Check(SourceDocumentHeader, EDocumentService, EDocumentProcessingPhase);
UnbindSubscription(EDocPEPPOLValidationDE);
end;

procedure Create(EDocumentService: Record "E-Document Service"; var EDocument: Record "E-Document"; var SourceDocumentHeader: RecordRef; var SourceDocumentLines: RecordRef; var TempBlob: Codeunit "Temp Blob")
Expand Down Expand Up @@ -231,12 +234,6 @@ codeunit 11035 "EDoc PEPPOL BIS 3.0 DE" implements "E-Document"
begin
end;

[EventSubscriber(ObjectType::Codeunit, Codeunit::"PEPPOL Validation", 'OnCheckSalesDocumentOnBeforeCheckYourReference', '', false, false)]
local procedure SkipCheckOnCheckSalesDocumentOnBeforeCheckYourReference(SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
begin
IsHandled := true;
end;

[EventSubscriber(ObjectType::Codeunit, Codeunit::"PEPPOL Management", 'OnAfterGetBuyerReference', '', false, false)]
local procedure SetReferenceOnAfterGetBuyerReference(SalesHeader: Record "Sales Header"; var BuyerReference: Text)
begin
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace Microsoft.eServices.EDocument.IO.Peppol;

using Microsoft.Sales.Document;
using Microsoft.Sales.Peppol;

codeunit 13921 "EDoc PEPPOL Validation DE"
{
EventSubscriberInstance = Manual;

[EventSubscriber(ObjectType::Codeunit, Codeunit::"PEPPOL Validation", 'OnCheckSalesDocumentOnBeforeCheckYourReference', '', false, false)]
local procedure SkipCheckOnCheckSalesDocumentOnBeforeCheckYourReference(SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
begin
IsHandled := true;
end;

[EventSubscriber(ObjectType::Codeunit, Codeunit::"PEPPOL Validation", 'OnAfterCheckSalesDocument', '', false, false)]
local procedure OnAfterCheckSalesDocument(SalesHeader: Record "Sales Header")
begin
SalesHeader.TestField("Sell-to E-Mail");
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,25 @@ using System.IO;
using Microsoft.Sales.Customer;
using Microsoft.Foundation.Company;
using Microsoft.eServices.EDocument;
using Microsoft.eServices.EDocument.IO.Peppol;

codeunit 13914 "XRechnung Format" implements "E-Document"
{
InherentEntitlements = X;
InherentPermissions = X;

var
EDocPEPPOLBIS30: Codeunit "EDoc PEPPOL BIS 3.0";
EDocPEPPOLValidationDE: Codeunit "EDoc PEPPOL Validation DE";
EDocImportXRechnung: Codeunit "Import XRechnung Document";

procedure Check(var SourceDocumentHeader: RecordRef; EDocumentService: Record "E-Document Service"; EDocumentProcessingPhase: Enum "E-Document Processing Phase")
begin
CheckCompanyInfoMandatory();
CheckBuyerReferenceMandatory(EDocumentService, SourceDocumentHeader);
BindSubscription(EDocPEPPOLValidationDE);
EDocPEPPOLBIS30.Check(SourceDocumentHeader, EDocumentService, EDocumentProcessingPhase);
UnbindSubscription(EDocPEPPOLValidationDE);
end;

procedure Create(EDocumentService: Record "E-Document Service"; var EDocument: Record "E-Document"; var SourceDocumentHeader: RecordRef; var SourceDocumentLines: RecordRef; var TempBlob: Codeunit "Temp Blob")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -644,14 +644,12 @@ codeunit 13917 "Export ZUGFeRD Document"
PaymentTermsDescriptionElement: XmlElement;
DueDateElement: XmlElement;
begin
if PaymentTermsCode = '' then
exit;
if not PaymentTerms.Get(PaymentTermsCode) then
exit;

PaymentTermsElement := XmlElement.Create('SpecifiedTradePaymentTerms', XmlNamespaceRAM);
PaymentTermsDescriptionElement := XmlElement.Create('Description', XmlNamespaceRAM, PaymentTerms.Description);
PaymentTermsElement.Add(PaymentTermsDescriptionElement);
if PaymentTermsCode <> '' then
if PaymentTerms.Get(PaymentTermsCode) then begin
PaymentTermsDescriptionElement := XmlElement.Create('Description', XmlNamespaceRAM, PaymentTerms.Description);
PaymentTermsElement.Add(PaymentTermsDescriptionElement);
end;

DueDateElement := XmlElement.Create('DueDateDateTime', XmlNamespaceRAM);
DueDateElement.Add(XmlElement.Create('DateTimeString', XmlNamespaceUDT, XmlAttribute.Create('format', '102'), FormatDate(DueDate)));
Expand All @@ -674,7 +672,7 @@ codeunit 13917 "Export ZUGFeRD Document"
end;

if CompanyInformation."SWIFT Code" <> '' then begin
PaymentMethodBICElement := XmlElement.Create('PayeePartyCreditorFinancialAccount', XmlNamespaceRAM);
PaymentMethodBICElement := XmlElement.Create('PayeeSpecifiedCreditorFinancialInstitution', XmlNamespaceRAM);
PaymentMethodBICElement.Add(XmlElement.Create('BICID', XmlNamespaceRAM, GetIBAN(CompanyInformation."SWIFT Code")));
PaymentMethodElement.Add(PaymentMethodBICElement);
end;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,25 @@ using Microsoft.Sales.History;
using Microsoft.Purchases.Document;
using Microsoft.eServices.EDocument;
using System.IO;
using Microsoft.eServices.EDocument.IO.Peppol;

codeunit 13920 "ZUGFeRD Format" implements "E-Document"
{
InherentEntitlements = X;
InherentPermissions = X;

var
EDocPEPPOLBIS30: Codeunit "EDoc PEPPOL BIS 3.0";
EDocPEPPOLValidationDE: Codeunit "EDoc PEPPOL Validation DE";
EDocImportZUGFeRD: Codeunit "Import ZUGFeRD Document";

procedure Check(var SourceDocumentHeader: RecordRef; EDocumentService: Record "E-Document Service"; EDocumentProcessingPhase: Enum "E-Document Processing Phase")
begin
CheckCompanyInfoMandatory();
CheckBuyerReferenceMandatory(EDocumentService, SourceDocumentHeader);
BindSubscription(EDocPEPPOLValidationDE);
EDocPEPPOLBIS30.Check(SourceDocumentHeader, EDocumentService, EDocumentProcessingPhase);
UnbindSubscription(EDocPEPPOLValidationDE);
end;

procedure Create(EDocumentService: Record "E-Document Service"; var EDocument: Record "E-Document"; var SourceDocumentHeader: RecordRef; var SourceDocumentLines: RecordRef; var TempBlob: Codeunit "Temp Blob")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,27 @@ codeunit 13922 "ZUGFeRD XML Document Tests"
VerifyPaymentTerms(SalesInvoiceHeader."Payment Terms Code", SalesInvoiceHeader."Due Date", TempXMLBuffer, '/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms');
end;

[Test]
procedure ExportPostedSalesInvoiceInZUGFeRDFormatVerifyDueDate();
var
SalesHeader: Record "Sales Header";
SalesInvoiceHeader: Record "Sales Invoice Header";
TempXMLBuffer: Record "XML Buffer" temporary;
begin
// [SCENARIO] Export "Due Date" when no "Payment Terms" are defined for the customer, ensuring a valid ZUGFeRD format.
Initialize();

// [GIVEN] Create and Post Sales Invoice without Payment Terms.
SalesHeader.Get("Sales Document Type"::Invoice, CreateSalesDocumentWithLine("Sales Document Type"::Invoice, Enum::"Sales Line Type"::Item, false));
SalesInvoiceHeader.Get(LibrarySales.PostSalesDocument(SalesHeader, true, true));

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

// [THEN] ZUGFeRD Electronic Document is created with due date
VerifyDueDate(SalesInvoiceHeader."Due Date", TempXMLBuffer, '/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms');
end;

[Test]
procedure ExportPostedSalesInvoiceInZUGFeRDFormatVerifyTaxTotal();
var
Expand Down Expand Up @@ -445,6 +466,27 @@ codeunit 13922 "ZUGFeRD XML Document Tests"
VerifyPaymentTerms(SalesCrMemoHeader."Payment Terms Code", SalesCrMemoHeader."Due Date", TempXMLBuffer, '/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms');
end;

[Test]
procedure ExportPostedSalesCrMemoInZUGFeRDFormatVerifyDueDate();
var
SalesHeader: Record "Sales Header";
SalesCrMemoHeader: Record "Sales Cr.Memo Header";
TempXMLBuffer: Record "XML Buffer" temporary;
begin
// [SCENARIO] Export "Due Date" when no "Payment Terms" are defined for the customer, ensuring a valid ZUGFeRD format.
Initialize();

// [GIVEN] Create and Post Credit Memo without Payment Terms.
SalesHeader.Get("Sales Document Type"::"Credit Memo", CreateSalesDocumentWithLine("Sales Document Type"::"Credit Memo", Enum::"Sales Line Type"::Item, false));
SalesCrMemoHeader.Get(LibrarySales.PostSalesDocument(SalesHeader, true, true));

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

// [THEN] ZUGFeRD Electronic Document is created with due date
VerifyDueDate(SalesCrMemoHeader."Due Date", TempXMLBuffer, '/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms');
end;

[Test]
procedure ExportPostedSalesCrMemoInZUGFeRDFormatVerifyTaxTotal();
var
Expand Down Expand Up @@ -807,6 +849,14 @@ codeunit 13922 "ZUGFeRD XML Document Tests"
Assert.AreEqual(FormatDate(DueDate), GetNodeByPathWithError(TempXMLBuffer, Path), StrSubstNo(IncorrectValueErr, Path));
end;

local procedure VerifyDueDate(DueDate: Date; var TempXMLBuffer: Record "XML Buffer" temporary; DocumentTok: Text);
var
Path: Text;
begin
Path := DocumentTok + '/ram:DueDateDateTime/udt:DateTimeString';
Assert.AreEqual(FormatDate(DueDate), GetNodeByPathWithError(TempXMLBuffer, Path), StrSubstNo(IncorrectValueErr, Path));
end;

local procedure VerifyTaxTotals(SalesInvoiceHeader: Record "Sales Invoice Header"; var TempXMLBuffer: Record "XML Buffer" temporary);
var
DocumentTaxTotalTok: Label '/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax', Locked = true;
Expand Down