From a57ed2f8cd61d27ec8bf79f5878a5b9ec155575a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:59:11 +0000 Subject: [PATCH 1/5] Initial plan From a980e9e0664b8a1505faa90848ac8da5b20fd4db Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:03:20 +0000 Subject: [PATCH 2/5] Fix e-document draft UX: show error factbox and allow finalize from Ready for Draft state Co-authored-by: Groenbech96 <17690329+Groenbech96@users.noreply.github.com> --- .../Import/Purchase/EDocumentPurchaseDraft.Page.al | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al b/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al index e1234e674b..cba3e4b1b9 100644 --- a/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al +++ b/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al @@ -272,7 +272,7 @@ page 6181 "E-Document Purchase Draft" } part(ErrorMessagesFactBox; "Error Messages Part") { - Visible = false; + Visible = HasErrorsOrWarnings; ShowFilter = false; UpdatePropagation = Both; } @@ -524,7 +524,7 @@ page 6181 "E-Document Purchase Draft" SetPageCaption(); Rec.CalcFields("Import Processing Status"); - ShowFinalizeDraftAction := Rec."Import Processing Status" = Enum::"Import E-Doc. Proc. Status"::"Draft Ready"; + ShowFinalizeDraftAction := Rec."Import Processing Status" in [Enum::"Import E-Doc. Proc. Status"::"Ready for draft", Enum::"Import E-Doc. Proc. Status"::"Draft Ready"]; ShowAnalyzeDocumentAction := (Rec."Import Processing Status" = Enum::"Import E-Document Steps"::"Structure received data") and (Rec.Status = Enum::"E-Document Status"::Error); @@ -613,6 +613,13 @@ page 6181 "E-Document Purchase Draft" if not GlobalEDocumentHelper.EnsureInboundEDocumentHasService(Rec) then exit; + Rec.CalcFields("Import Processing Status"); + if Rec."Import Processing Status" = Enum::"Import E-Doc. Proc. Status"::"Ready for draft" then begin + EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Prepare draft"; + EDocImport.ProcessIncomingEDocument(Rec, EDocImportParameters); + Rec.Get(Rec."Entry No"); + end; + EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Finish draft"; EDocImport.ProcessIncomingEDocument(Rec, EDocImportParameters); Rec.Get(Rec."Entry No"); From 0320e15a1f3e4c6330ef6324927cb3b2b94ab65b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:04:55 +0000 Subject: [PATCH 3/5] Add status check after Prepare draft step before proceeding to Finish draft Co-authored-by: Groenbech96 <17690329+Groenbech96@users.noreply.github.com> --- .../Import/Purchase/EDocumentPurchaseDraft.Page.al | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al b/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al index cba3e4b1b9..d0b2556308 100644 --- a/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al +++ b/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al @@ -618,6 +618,18 @@ page 6181 "E-Document Purchase Draft" EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Prepare draft"; EDocImport.ProcessIncomingEDocument(Rec, EDocImportParameters); Rec.Get(Rec."Entry No"); + Rec.CalcFields("Import Processing Status"); + if Rec."Import Processing Status" <> Enum::"Import E-Doc. Proc. Status"::"Draft Ready" then begin + // Draft preparation failed, show errors to user + if EDocumentErrorHelper.HasErrors(Rec) then begin + ErrorMessage.SetRange("Context Record ID", Rec.RecordId); + ErrorMessage.CopyToTemp(TempErrorMessage); + Commit(); + TempErrorMessage.ThrowError(); + end; + CurrPage.Update(); + exit; + end; end; EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Finish draft"; From 631e3e9c5d54033174d1cf0201e6aaa33106bf4c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 29 Jan 2026 12:54:31 +0000 Subject: [PATCH 4/5] Remove extra reprocessing logic and add test for finalize from Ready for Draft state Co-authored-by: Groenbech96 <17690329+Groenbech96@users.noreply.github.com> --- .../Purchase/EDocumentPurchaseDraft.Page.al | 19 -------- .../Processing/EDocProcessTest.Codeunit.al | 44 +++++++++++++++++++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al b/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al index d0b2556308..0d99ba8b25 100644 --- a/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al +++ b/src/Apps/W1/EDocument/App/src/Processing/Import/Purchase/EDocumentPurchaseDraft.Page.al @@ -613,25 +613,6 @@ page 6181 "E-Document Purchase Draft" if not GlobalEDocumentHelper.EnsureInboundEDocumentHasService(Rec) then exit; - Rec.CalcFields("Import Processing Status"); - if Rec."Import Processing Status" = Enum::"Import E-Doc. Proc. Status"::"Ready for draft" then begin - EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Prepare draft"; - EDocImport.ProcessIncomingEDocument(Rec, EDocImportParameters); - Rec.Get(Rec."Entry No"); - Rec.CalcFields("Import Processing Status"); - if Rec."Import Processing Status" <> Enum::"Import E-Doc. Proc. Status"::"Draft Ready" then begin - // Draft preparation failed, show errors to user - if EDocumentErrorHelper.HasErrors(Rec) then begin - ErrorMessage.SetRange("Context Record ID", Rec.RecordId); - ErrorMessage.CopyToTemp(TempErrorMessage); - Commit(); - TempErrorMessage.ThrowError(); - end; - CurrPage.Update(); - exit; - end; - end; - EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Finish draft"; EDocImport.ProcessIncomingEDocument(Rec, EDocImportParameters); Rec.Get(Rec."Entry No"); diff --git a/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al b/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al index 25d665dc35..6f7ef0a958 100644 --- a/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al +++ b/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al @@ -332,6 +332,50 @@ codeunit 139883 "E-Doc Process Test" Assert.RecordIsEmpty(PurchaseHeader); end; + [Test] + procedure FinishDraftFromReadyForDraftStateSucceeds() + var + EDocument: Record "E-Document"; + EDocImportParameters: Record "E-Doc. Import Parameters"; + PurchaseHeader: Record "Purchase Header"; + EDocLogRecord: Record "E-Document Log"; + EDocImport: Codeunit "E-Doc. Import"; + EDocumentLog: Codeunit "E-Document Log"; + EDocumentProcessing: Codeunit "E-Document Processing"; + begin + // [SCENARIO] When finalize action is invoked from Ready for draft state, the system should automatically run Prepare draft first and then Finish draft + Initialize(Enum::"Service Integration"::"Mock"); + LibraryEDoc.CreateInboundEDocument(EDocument, EDocumentService); + EDocument."Document Type" := "E-Document Type"::"Purchase Invoice"; + EDocument.Modify(); + EDocumentService."Import Process" := "E-Document Import Process"::"Version 2.0"; + EDocumentService.Modify(); + + EDocumentLog.SetBlob('Test', Enum::"E-Doc. File Format"::XML, 'Data'); + EDocumentLog.SetFields(EDocument, EDocumentService); + EDocLogRecord := EDocumentLog.InsertLog(Enum::"E-Document Service Status"::Imported, Enum::"Import E-Doc. Proc. Status"::Readable); + + EDocument."Structured Data Entry No." := EDocLogRecord."E-Doc. Data Storage Entry No."; + EDocument.Modify(); + + // [GIVEN] E-Document is in Ready for draft state + EDocumentProcessing.ModifyEDocumentProcessingStatus(EDocument, "Import E-Doc. Proc. Status"::"Ready for draft"); + EDocument.CalcFields("Import Processing Status"); + Assert.AreEqual(Enum::"Import E-Doc. Proc. Status"::"Ready for draft", EDocument."Import Processing Status", 'The status should be Ready for draft before processing.'); + + // [WHEN] Finish draft step is executed (simulating finalize action) + EDocImportParameters."Step to Run" := "Import E-Document Steps"::"Finish draft"; + EDocImportParameters."Processing Customizations" := "E-Doc. Proc. Customizations"::"Mock Create Purchase Invoice"; + EDocImport.ProcessIncomingEDocument(EDocument, EDocImportParameters); + + // [THEN] The document is processed (the system ran Prepare draft automatically and then Finish draft) + EDocument.CalcFields("Import Processing Status"); + Assert.AreEqual(Enum::"Import E-Doc. Proc. Status"::Processed, EDocument."Import Processing Status", 'The status should be Processed after finalize action from Ready for draft state.'); + + PurchaseHeader.SetRange("E-Document Link", EDocument.SystemId); + Assert.IsTrue(PurchaseHeader.FindFirst(), 'The purchase header should be created.'); + end; + #region HistoricalMatchingTest [Test] From c25a9629f8d2ccb4e569521f0c181c953060120d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Hartvig=20Gr=C3=B8nbech?= Date: Fri, 30 Jan 2026 15:25:59 +0100 Subject: [PATCH 5/5] fix test --- .../Test/src/Processing/EDocProcessTest.Codeunit.al | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al b/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al index 6f7ef0a958..ae7ca0130a 100644 --- a/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al +++ b/src/Apps/W1/EDocument/Test/src/Processing/EDocProcessTest.Codeunit.al @@ -339,6 +339,8 @@ codeunit 139883 "E-Doc Process Test" EDocImportParameters: Record "E-Doc. Import Parameters"; PurchaseHeader: Record "Purchase Header"; EDocLogRecord: Record "E-Document Log"; + EDocumentPurchaseHeader: Record "E-Document Purchase Header"; + EDocumentPurchaseLine: Record "E-Document Purchase Line"; EDocImport: Codeunit "E-Doc. Import"; EDocumentLog: Codeunit "E-Document Log"; EDocumentProcessing: Codeunit "E-Document Processing"; @@ -351,6 +353,14 @@ codeunit 139883 "E-Doc Process Test" EDocumentService."Import Process" := "E-Document Import Process"::"Version 2.0"; EDocumentService.Modify(); + EDocumentPurchaseHeader."E-Document Entry No." := EDocument."Entry No"; + EDocumentPurchaseHeader."Vendor VAT Id" := Vendor."VAT Registration No."; + EDocumentPurchaseHeader.Insert(); + EDocumentPurchaseLine."E-Document Entry No." := EDocument."Entry No"; + EDocumentPurchaseLine."Product Code" := '1234'; + EDocumentPurchaseLine.Description := 'Test description'; + EDocumentPurchaseLine.Insert(); + EDocumentLog.SetBlob('Test', Enum::"E-Doc. File Format"::XML, 'Data'); EDocumentLog.SetFields(EDocument, EDocumentService); EDocLogRecord := EDocumentLog.InsertLog(Enum::"E-Document Service Status"::Imported, Enum::"Import E-Doc. Proc. Status"::Readable);