Skip to content
Open
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
@@ -0,0 +1,20 @@
// ------------------------------------------------------------------------------------------------
// 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;

enum 6162 "E-Doc. Purch.Def. Posting Date"
{
Extensible = false;
Caption = 'Purchase Invoice Posting Date (E-Docs)';

value(0; "Work Date")
{
Caption = 'Work Date';
}
value(1; "Document Date")
{
Caption = 'Document Date';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ pageextension 6162 "E-Doc. Purch. Payables Setup" extends "Purchases & Payables
ApplicationArea = All;
ToolTip = 'Specifies whether Copilot E-Document line matchings are learned by default (Item References and Text To Account Mappings). This can be overwritten on the matching page.';
}
field("E-Doc. Def. Posting Date"; Rec."E-Doc. Def. Posting Date")
{
ApplicationArea = All;
ToolTip = 'Specifies how the posting date is set on purchase invoices created from e-documents. Work Date uses the current work date. Document Date uses the document date from the e-document.';
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,10 @@ tableextension 6162 "E-Doc. Purch. Payables Setup" extends "Purchases & Payables
Caption = 'E-Document Learn Copilot Matchings';
DataClassification = SystemMetadata;
}
field(6102; "E-Doc. Def. Posting Date"; Enum "E-Doc. Purch.Def. Posting Date")
{
Caption = 'E-Document Default Posting Date';
DataClassification = CustomerContent;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ codeunit 6404 "E-Doc. Create Purch. Cr. Memo" implements IEDocumentFinishDraft,
if EDocumentPurchaseHeader."Purchase Order No." <> '' then
PurchaseHeader."Vendor Order No." := CopyStr(EDocumentPurchaseHeader."Purchase Order No.", 1, MaxStrLen(PurchaseHeader."Vendor Order No."));
PurchaseHeader.Insert(true);
EDocPurchaseDocumentHelper.ApplyDefaultPostingDateFromSetup(PurchaseHeader, EDocumentPurchaseHeader);
PurchaseHeader.Modify();

GLSetup.GetRecordOnce();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ codeunit 6117 "E-Doc. Create Purchase Invoice" implements IEDocumentFinishDraft,
PurchaseHeader."Vendor Order No." := CopyStr(EDocumentPurchaseHeader."Purchase Order No.", 1, MaxStrLen(PurchaseHeader."Vendor Order No."));
PurchaseHeader.Insert(true);

EDocPurchaseDocumentHelper.ApplyDefaultPostingDateFromSetup(PurchaseHeader, EDocumentPurchaseHeader);
PurchaseHeader."Invoice Received Date" := PurchaseHeader."Document Date";
PurchaseHeader.Modify();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ using Microsoft.Finance.Dimension;
using Microsoft.Foundation.Attachment;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Posting;
using Microsoft.Purchases.Setup;

/// <summary>
/// Shared logic for creating BC purchase documents (invoices and credit memos) from e-document draft data.
Expand Down Expand Up @@ -137,4 +138,16 @@ codeunit 6402 "E-Doc. Purch. Doc. Helper"
Clear(PurchaseHeader."E-Document Link");
PurchaseHeader.Modify();
end;

procedure ApplyDefaultPostingDateFromSetup(var PurchaseHeader: Record "Purchase Header"; EDocumentPurchaseHeader: Record "E-Document Purchase Header")
var
PurchasesPayablesSetup: Record "Purchases & Payables Setup";
begin
PurchasesPayablesSetup.GetRecordOnce();
if (PurchasesPayablesSetup."E-Doc. Def. Posting Date" <> PurchasesPayablesSetup."E-Doc. Def. Posting Date"::"Document Date") then
exit;
if EDocumentPurchaseHeader."Document Date" = 0D then
exit;
PurchaseHeader.Validate("Posting Date", EDocumentPurchaseHeader."Document Date");
Comment thread
ventselartur marked this conversation as resolved.
end;
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ using Microsoft.Inventory.Location;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.History;
using Microsoft.Purchases.Payables;
using Microsoft.Purchases.Setup;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using System.IO;
Expand Down Expand Up @@ -884,6 +885,138 @@ codeunit 139883 "E-Doc Process Test"
Assert.RecordCount(PurchaseLine, 2);
end;

[Test]
procedure InvoicePostingDateDefaultsToWorkDateWhenSettingIsWorkDate()
var
EDocument: Record "E-Document";
TempEDocImportParams: Record "E-Doc. Import Parameters";
PurchaseHeader: Record "Purchase Header";
PurchasesPayablesSetup: Record "Purchases & Payables Setup";
SavedWorkDate: Date;
begin
// [SCENARIO] When "E-Doc. Def. Posting Date" is "Work Date" (default), the created purchase invoice Posting Date equals WorkDate
Initialize(Enum::"Service Integration"::"Mock");
EDocumentService."Read into Draft Impl." := "E-Doc. Read into Draft"::PEPPOL;
EDocumentService.Modify();

// [GIVEN] Setup has "E-Doc. Def. Posting Date" = "Work Date" (default)
PurchasesPayablesSetup.GetRecordOnce();
PurchasesPayablesSetup."E-Doc. Def. Posting Date" := "E-Doc. Purch.Def. Posting Date"::"Work Date";
PurchasesPayablesSetup.Modify();

// [WHEN] A PEPPOL invoice (IssueDate = 2026-01-22) is processed with WorkDate = 2027-01-01
TempEDocImportParams."Step to Run" := "Import E-Document Steps"::"Finish draft";
SavedWorkDate := WorkDate();
WorkDate(DMY2Date(1, 1, 2027));
Assert.IsTrue(LibraryEDoc.CreateInboundPEPPOLDocumentToState(EDocument, EDocumentService, 'peppol/peppol-invoice-0.xml', TempEDocImportParams), 'The e-document should be processed');

// [THEN] Posting Date is WorkDate, not the document date
EDocument.Get(EDocument."Entry No");
PurchaseHeader.Get(EDocument."Document Record ID");
Assert.AreEqual(DMY2Date(1, 1, 2027), PurchaseHeader."Posting Date", 'Posting Date should be WorkDate when setting is Work Date.');

WorkDate(SavedWorkDate);
end;

[Test]
procedure InvoicePostingDateUsesDocumentDateWhenSettingIsDocumentDate()
var
EDocument: Record "E-Document";
TempEDocImportParams: Record "E-Doc. Import Parameters";
PurchaseHeader: Record "Purchase Header";
PurchasesPayablesSetup: Record "Purchases & Payables Setup";
SavedWorkDate: Date;
begin
// [SCENARIO] When "E-Doc. Def. Posting Date" is "Document Date", the created purchase invoice Posting Date equals the e-document's Document Date
Initialize(Enum::"Service Integration"::"Mock");
EDocumentService."Read into Draft Impl." := "E-Doc. Read into Draft"::PEPPOL;
EDocumentService.Modify();

// [GIVEN] Setup has "E-Doc. Def. Posting Date" = "Document Date"
PurchasesPayablesSetup.GetRecordOnce();
PurchasesPayablesSetup."E-Doc. Def. Posting Date" := "E-Doc. Purch.Def. Posting Date"::"Document Date";
PurchasesPayablesSetup.Modify();

// [WHEN] A PEPPOL invoice (IssueDate = 2026-01-22) is processed with WorkDate = 2027-01-01
TempEDocImportParams."Step to Run" := "Import E-Document Steps"::"Finish draft";
SavedWorkDate := WorkDate();
WorkDate(DMY2Date(1, 1, 2027));
Assert.IsTrue(LibraryEDoc.CreateInboundPEPPOLDocumentToState(EDocument, EDocumentService, 'peppol/peppol-invoice-no-currency.xml', TempEDocImportParams), 'The e-document should be processed');

// [THEN] Posting Date equals the Document Date from the PEPPOL file
EDocument.Get(EDocument."Entry No");
PurchaseHeader.Get(EDocument."Document Record ID");
Assert.AreEqual(DMY2Date(22, 1, 2026), PurchaseHeader."Posting Date", 'Posting Date should be Document Date when setting is Document Date.');

WorkDate(SavedWorkDate);
end;

[Test]
procedure CreditMemoPostingDateDefaultsToWorkDateWhenSettingIsWorkDate()
var
EDocument: Record "E-Document";
TempEDocImportParams: Record "E-Doc. Import Parameters";
PurchaseHeader: Record "Purchase Header";
PurchasesPayablesSetup: Record "Purchases & Payables Setup";
SavedWorkDate: Date;
begin
// [SCENARIO] When "E-Doc. Def. Posting Date" is "Work Date", the created purchase credit memo Posting Date equals WorkDate
Initialize(Enum::"Service Integration"::"Mock");
EDocumentService."Read into Draft Impl." := "E-Doc. Read into Draft"::PEPPOL;
EDocumentService.Modify();

// [GIVEN] Setup has "E-Doc. Def. Posting Date" = "Work Date"
PurchasesPayablesSetup.GetRecordOnce();
PurchasesPayablesSetup."E-Doc. Def. Posting Date" := "E-Doc. Purch.Def. Posting Date"::"Work Date";
PurchasesPayablesSetup.Modify();

// [WHEN] A PEPPOL credit note (IssueDate = 2026-02-15) is processed with WorkDate = 2027-01-01
TempEDocImportParams."Step to Run" := "Import E-Document Steps"::"Finish draft";
SavedWorkDate := WorkDate();
WorkDate(DMY2Date(1, 1, 2027));
Assert.IsTrue(LibraryEDoc.CreateInboundPEPPOLDocumentToState(EDocument, EDocumentService, 'peppol/peppol-creditnote-0.xml', TempEDocImportParams), 'The credit note e-document should be processed');

// [THEN] Posting Date is WorkDate
EDocument.Get(EDocument."Entry No");
PurchaseHeader.Get(EDocument."Document Record ID");
Assert.AreEqual(DMY2Date(1, 1, 2027), PurchaseHeader."Posting Date", 'Posting Date should be WorkDate when setting is Work Date.');

WorkDate(SavedWorkDate);
end;

[Test]
procedure CreditMemoPostingDateUsesDocumentDateWhenSettingIsDocumentDate()
var
EDocument: Record "E-Document";
TempEDocImportParams: Record "E-Doc. Import Parameters";
PurchaseHeader: Record "Purchase Header";
PurchasesPayablesSetup: Record "Purchases & Payables Setup";
SavedWorkDate: Date;
begin
// [SCENARIO] When "E-Doc. Def. Posting Date" is "Document Date", the created purchase credit memo Posting Date equals the e-document's Document Date
Initialize(Enum::"Service Integration"::"Mock");
EDocumentService."Read into Draft Impl." := "E-Doc. Read into Draft"::PEPPOL;
EDocumentService.Modify();

// [GIVEN] Setup has "E-Doc. Def. Posting Date" = "Document Date"
PurchasesPayablesSetup.GetRecordOnce();
PurchasesPayablesSetup."E-Doc. Def. Posting Date" := "E-Doc. Purch.Def. Posting Date"::"Document Date";
PurchasesPayablesSetup.Modify();

// [WHEN] A PEPPOL credit note (IssueDate = 2026-01-22) is processed with WorkDate = 2027-01-01
TempEDocImportParams."Step to Run" := "Import E-Document Steps"::"Finish draft";
SavedWorkDate := WorkDate();
WorkDate(DMY2Date(1, 1, 2027));
Assert.IsTrue(LibraryEDoc.CreateInboundPEPPOLDocumentToState(EDocument, EDocumentService, 'peppol/peppol-invoice-no-currency.xml', TempEDocImportParams), 'The credit note e-document should be processed');

// [THEN] Posting Date equals the Document Date from the PEPPOL file
EDocument.Get(EDocument."Entry No");
PurchaseHeader.Get(EDocument."Document Record ID");
Assert.AreEqual(DMY2Date(22, 1, 2026), PurchaseHeader."Posting Date", 'Posting Date should be Document Date when setting is Document Date.');

WorkDate(SavedWorkDate);
end;

local procedure Initialize(Integration: Enum "Service Integration")
var
TransformationRule: Record "Transformation Rule";
Expand All @@ -893,6 +1026,7 @@ codeunit 139883 "E-Doc Process Test"
EDocPurchLineFieldSetup: Record "ED Purchase Line Field Setup";
PurchInvHeader: Record "Purch. Inv. Header";
VendorLedgerEntry: Record "Vendor Ledger Entry";
PurchasesPayablesSetup: Record "Purchases & Payables Setup";
GLSetup: Record "General Ledger Setup";
Currency: Record Currency;
LibraryERM: Codeunit "Library - ERM";
Expand All @@ -902,6 +1036,10 @@ codeunit 139883 "E-Doc Process Test"
Clear(EDocImplState);
EDocPurchLineFieldSetup.DeleteAll();

PurchasesPayablesSetup.GetRecordOnce();
PurchasesPayablesSetup."E-Doc. Def. Posting Date" := "E-Doc. Purch.Def. Posting Date"::"Work Date";
PurchasesPayablesSetup.Modify();

PurchInvHeader.DeleteAll();
VendorLedgerEntry.DeleteAll();

Expand Down
Loading