From b23b1d6984f4efc357cc002255defe393c5789c9 Mon Sep 17 00:00:00 2001 From: Dusan Jakovljevic <134404137+JakovljevicDusan@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:54:55 +0200 Subject: [PATCH 1/6] Initial changes --- .../Workflow/QltyWorkflowSetup.Codeunit.al | 105 ++++++++++++++---- .../test/src/QltyTestsWorkflows.Codeunit.al | 36 ++++++ 2 files changed, 119 insertions(+), 22 deletions(-) diff --git a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al index 0c1462d3a5..7517f6e454 100644 --- a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al +++ b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al @@ -397,11 +397,6 @@ codeunit 20423 "Qlty. Workflow Setup" OptionalSuffix: Text; begin WorkflowResponse.SetFilter("Function Name", QltyPrefixTok + '*'); - if WorkflowResponse.FindSet() then - repeat - WorkflowResponse.MakeDependentOnAllEvents(); - until WorkflowResponse.Next() = 0; - WorkflowResponse.DeleteAll(false); WorkflowResponse.Reset(); WorkflowResponse.SetRange(Description, QMWorkflowResponseDescriptionCreateAQltyInspectionLbl); @@ -413,43 +408,109 @@ codeunit 20423 "Qlty. Workflow Setup" QualityEventIds.Add(GetInspectionHasChangedEvent()); QualityEventIds.Add(GetInspectionReopenedEvent()); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreateInspection(), 1, 128), 0, QMWorkflowResponseDescriptionCreateAQltyInspectionLbl + OptionalSuffix, CopyStr(GetWorkflowResponseCreateInspection(), 1, 20)); + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreateInspection(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionCreateAQltyInspectionLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseCreateInspection(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseCreateInspection(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseFinishInspection(), 1, 128), 0, QMWorkflowResponseDescriptionFinishTheQltyInspectionLbl + OptionalSuffix, CopyStr(GetWorkflowResponseFinishInspection(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseFinishInspection(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionFinishTheQltyInspectionLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseFinishInspection(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseFinishInspection(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseReopenInspection(), 1, 128), 0, QMWorkflowResponseDescriptionReopenTheQltyInspectionLbl + OptionalSuffix, CopyStr(GetWorkflowResponseReopenInspection(), 1, 20)); + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseReopenInspection(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionReopenTheQltyInspectionLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseReopenInspection(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseReopenInspection(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreateReinspection(), 1, 128), 0, QMWorkflowResponseDescriptionCreateReinspectionLbl + OptionalSuffix, CopyStr(GetWorkflowResponseCreateReinspection(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreateReinspection(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionCreateReinspectionLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseCreateReinspection(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseCreateReinspection(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseBlockLot(), 1, 128), 0, QMWorkflowResponseDescriptionBlockLotLbl + OptionalSuffix, CopyStr(GetWorkflowResponseBlockLot(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseBlockLot(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionBlockLotLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseBlockLot(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseBlockLot(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseBlockSerial(), 1, 128), 0, QMWorkflowResponseDescriptionBlockSerialLbl + OptionalSuffix, CopyStr(GetWorkflowResponseBlockSerial(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseBlockSerial(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionBlockSerialLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseBlockSerial(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseBlockSerial(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseUnblockLot(), 1, 128), 0, QMWorkflowResponseDescriptionUnblockLotLbl + OptionalSuffix, CopyStr(GetWorkflowResponseUnblockLot(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseUnblockLot(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionUnblockLotLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseUnblockLot(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseUnblockLot(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseUnblockSerial(), 1, 128), 0, QMWorkflowResponseDescriptionUnblockSerialLbl + OptionalSuffix, CopyStr(GetWorkflowResponseUnblockSerial(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseUnblockSerial(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionUnblockSerialLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseUnblockSerial(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseUnblockSerial(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseMoveInventory(), 1, 128), 0, QMWorkflowResponseDescriptionMoveInventoryLbl + OptionalSuffix, CopyStr(GetWorkflowResponseMoveInventory(), 1, 20)); + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseMoveInventory(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionMoveInventoryLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseMoveInventory(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseMoveInventory(), 1, 128)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseUnQuarantineLicensePlate(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseInternalPutAway(), 1, 128), 0, QMWorkflowResponseDescriptionCreateInternalPutAwayLbl + OptionalSuffix, CopyStr(GetWorkflowResponseInternalPutAway(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseInternalPutAway(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionCreateInternalPutAwayLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseInternalPutAway(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseInternalPutAway(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseSetDatabaseValue(), 1, 128), 0, QMWorkflowResponseDescriptionSetDatabaseValueLbl + OptionalSuffix, CopyStr(GetWorkflowResponseSetDatabaseValue(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseSetDatabaseValue(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionSetDatabaseValueLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseSetDatabaseValue(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseSetDatabaseValue(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseInventoryAdjustment(), 1, 128), 0, QMWorkflowResponseDescriptionCreateNegativeAdjustmentLbl + OptionalSuffix, CopyStr(GetWorkflowResponseInventoryAdjustment(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseInventoryAdjustment(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionCreateNegativeAdjustmentLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseInventoryAdjustment(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseInventoryAdjustment(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseChangeItemTracking(), 1, 128), 0, QMWorkflowResponseDescriptionChangeItemTrackingInformationLbl + OptionalSuffix, CopyStr(GetWorkflowResponseChangeItemTracking(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseChangeItemTracking(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionChangeItemTrackingInformationLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseChangeItemTracking(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseChangeItemTracking(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreateTransfer(), 1, 128), 0, QMWorkflowResponseDescriptionCreateTransferOrderLbl + OptionalSuffix, CopyStr(GetWorkflowResponseCreateTransfer(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreateTransfer(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionCreateTransferOrderLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseCreateTransfer(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseCreateTransfer(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreatePurchaseReturn(), 1, 128), 0, QMWorkflowResponseDescriptionCreatePurchaseReturnOrderLbl + OptionalSuffix, CopyStr(GetWorkflowResponseCreatePurchaseReturn(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseCreatePurchaseReturn(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionCreatePurchaseReturnOrderLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseCreatePurchaseReturn(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseCreatePurchaseReturn(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseBlockPackage(), 1, 128), 0, QMWorkflowResponseDescriptionBlockPackageLbl + OptionalSuffix, CopyStr(GetWorkflowResponseBlockPackage(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseBlockPackage(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionBlockPackageLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseBlockPackage(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseBlockPackage(), 1, 128)); - WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseUnblockPackage(), 1, 128), 0, QMWorkflowResponseDescriptionUnblockPackageLbl + OptionalSuffix, CopyStr(GetWorkflowResponseUnblockPackage(), 1, 20)); + + WorkflowResponseHandling.AddResponseToLibrary(CopyStr(GetWorkflowResponseUnblockPackage(), 1, 128), + 0, + CopyStr(QMWorkflowResponseDescriptionUnblockPackageLbl + OptionalSuffix, 1, 250), + CopyStr(GetWorkflowResponseUnblockPackage(), 1, 20)); QualityResponseIdsToAdd.Add(CopyStr(GetWorkflowResponseUnblockPackage(), 1, 128)); + foreach QualityResponse in QualityResponseIdsToAdd do foreach QualityEvent in QualityEventIds do WorkflowResponseHandling.AddResponsePredecessor(CopyStr(QualityResponse, 1, 128), CopyStr(QualityEvent, 1, 128)); diff --git a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al index fcbdfbf3de..95ff8cb278 100644 --- a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al +++ b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al @@ -53,6 +53,7 @@ codeunit 139969 "Qlty. Tests - Workflows" EventFilterTok: Label 'Where("Result Code"=Filter(%1))', Comment = '%1=result code.'; DefaultResult1FailCodeTok: Label 'FAIL', Locked = true; DefaultResult2PassCodeTok: Label 'PASS', Locked = true; + QMResponseNotPredecessorOfNonQMEventErr: Label 'QM response %1 should not be a predecessor of non-QM event %2.', Comment = '%1=response function name, %2=predecessor function name.'; IsInitialized: Boolean; [Test] @@ -1816,6 +1817,41 @@ codeunit 139969 "Qlty. Tests - Workflows" SpecificQltyInspectSrcFldConf.Insert(); end; + [Test] + procedure QltyResponsesAreNotPredecessorsOfNonQltyEvents() + var + WFEventResponseCombination: Record "WF Event/Response Combination"; + WorkflowEventHandling: Codeunit "Workflow Event Handling"; + WorkflowResponseHandling: Codeunit "Workflow Response Handling"; + QltyPrefix: Text; + begin + // [SCENARIO] QM workflow responses should only be predecessors of QM events, not of any unrelated event + Initialize(); + + // [GIVEN] The workflow events and responses libraries are initialized + WorkflowEventHandling.CreateEventsLibrary(); + WorkflowResponseHandling.CreateResponsesLibrary(); + + // [WHEN] We look at all event/response combinations where the response is a QM response + QltyPrefix := 'QLTY-*'; + WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); + WFEventResponseCombination.FindSet(); + + // [THEN] Every linked predecessor event must also be a QM event + repeat + LibraryAssert.IsTrue( + WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", + 'Expected predecessor type to be Event.'); + LibraryAssert.IsTrue( + CopyStr(WFEventResponseCombination."Predecessor Function Name", 1, 5) = 'QLTY-', + StrSubstNo(QMResponseNotPredecessorOfNonQMEventErr, + WFEventResponseCombination."Function Name", + WFEventResponseCombination."Predecessor Function Name")); + until WFEventResponseCombination.Next() = 0; + + DeleteWorkflows(); + end; + [ConfirmHandler] procedure ConfirmHandler(Question: Text; var Reply: Boolean) begin From 3833ed1736250701f6906d370e608563feed433b Mon Sep 17 00:00:00 2001 From: Dusan Jakovljevic <134404137+JakovljevicDusan@users.noreply.github.com> Date: Fri, 29 May 2026 18:13:19 +0200 Subject: [PATCH 2/6] Styling improvements --- .../app/src/Workflow/QltyWorkflowSetup.Codeunit.al | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al index 7517f6e454..537b996632 100644 --- a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al +++ b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al @@ -319,8 +319,8 @@ codeunit 20423 "Qlty. Workflow Setup" WorkflowSetup: Codeunit "Workflow Setup"; begin WorkflowSetup.InsertTableRelation(Database::"User", User.FieldNo("User Name"), Database::"Qlty. Inspection Header", QltyInspectionHeader.FieldNo("Assigned User ID")); - WorkflowSetup.InsertTableRelation(Database::"Qlty. Inspection Header", QltyInspectionHeader.FieldNo("No."), database::"Approval Entry", ApprovalEntry.FieldNo("Document No.")); - WorkflowSetup.InsertTableRelation(Database::"Qlty. Inspection Line", QltyInspectionLine.FieldNo("Inspection No."), database::"Approval Entry", ApprovalEntry.FieldNo("Document No.")); + WorkflowSetup.InsertTableRelation(Database::"Qlty. Inspection Header", QltyInspectionHeader.FieldNo("No."), Database::"Approval Entry", ApprovalEntry.FieldNo("Document No.")); + WorkflowSetup.InsertTableRelation(Database::"Qlty. Inspection Line", QltyInspectionLine.FieldNo("Inspection No."), Database::"Approval Entry", ApprovalEntry.FieldNo("Document No.")); end; [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Event Handling", 'OnAddWorkflowEventsToLibrary', '', true, true)] @@ -398,6 +398,7 @@ codeunit 20423 "Qlty. Workflow Setup" begin WorkflowResponse.SetFilter("Function Name", QltyPrefixTok + '*'); WorkflowResponse.DeleteAll(false); + WorkflowResponse.Reset(); WorkflowResponse.SetRange(Description, QMWorkflowResponseDescriptionCreateAQltyInspectionLbl); if not WorkflowResponse.IsEmpty() then From 65277b956445b39ea018e4ffc9e281d59c235680 Mon Sep 17 00:00:00 2001 From: Dusan Jakovljevic <134404137+JakovljevicDusan@users.noreply.github.com> Date: Fri, 29 May 2026 19:43:11 +0200 Subject: [PATCH 3/6] Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../test/src/QltyTestsWorkflows.Codeunit.al | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al index 95ff8cb278..833cef7202 100644 --- a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al +++ b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al @@ -1834,10 +1834,28 @@ codeunit 139969 "Qlty. Tests - Workflows" // [WHEN] We look at all event/response combinations where the response is a QM response QltyPrefix := 'QLTY-*'; - WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); +WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); +LibraryAssert.IsTrue(WFEventResponseCombination.FindSet(), 'Expected QM event/response combinations to exist.'); + +// [THEN] Every linked predecessor event must also be a QM event +repeat + LibraryAssert.IsTrue( + WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", + 'Expected predecessor type to be Event.'); + LibraryAssert.IsTrue( + CopyStr(WFEventResponseCombination."Predecessor Function Name", 1, 5) = 'QLTY-', + StrSubstNo(QMResponseNotPredecessorOfNonQMEventErr, + WFEventResponseCombination."Function Name", + WFEventResponseCombination."Predecessor Function Name")); +until WFEventResponseCombination.Next() = 0; WFEventResponseCombination.FindSet(); - // [THEN] Every linked predecessor event must also be a QM event +WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); +LibraryAssert.IsFalse(WFEventResponseCombination.IsEmpty(), 'Expected at least one QM response/event combination to exist.'); +if WFEventResponseCombination.FindSet() then + repeat + // assertions + until WFEventResponseCombination.Next() = 0; repeat LibraryAssert.IsTrue( WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", From f0af2bfe478c92f17111219d11028b34d85115cf Mon Sep 17 00:00:00 2001 From: Dusan Jakovljevic <134404137+JakovljevicDusan@users.noreply.github.com> Date: Fri, 29 May 2026 19:45:09 +0200 Subject: [PATCH 4/6] Apply suggestion --- .../Workflow/QltyWorkflowSetup.Codeunit.al | 2 +- .../test/src/QltyTestsWorkflows.Codeunit.al | 22 ++----------------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al index 537b996632..5b001ae473 100644 --- a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al +++ b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al @@ -397,7 +397,7 @@ codeunit 20423 "Qlty. Workflow Setup" OptionalSuffix: Text; begin WorkflowResponse.SetFilter("Function Name", QltyPrefixTok + '*'); - WorkflowResponse.DeleteAll(false); + WorkflowResponse.DeleteAll(true); WorkflowResponse.Reset(); WorkflowResponse.SetRange(Description, QMWorkflowResponseDescriptionCreateAQltyInspectionLbl); diff --git a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al index 833cef7202..95ff8cb278 100644 --- a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al +++ b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al @@ -1834,28 +1834,10 @@ codeunit 139969 "Qlty. Tests - Workflows" // [WHEN] We look at all event/response combinations where the response is a QM response QltyPrefix := 'QLTY-*'; -WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); -LibraryAssert.IsTrue(WFEventResponseCombination.FindSet(), 'Expected QM event/response combinations to exist.'); - -// [THEN] Every linked predecessor event must also be a QM event -repeat - LibraryAssert.IsTrue( - WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", - 'Expected predecessor type to be Event.'); - LibraryAssert.IsTrue( - CopyStr(WFEventResponseCombination."Predecessor Function Name", 1, 5) = 'QLTY-', - StrSubstNo(QMResponseNotPredecessorOfNonQMEventErr, - WFEventResponseCombination."Function Name", - WFEventResponseCombination."Predecessor Function Name")); -until WFEventResponseCombination.Next() = 0; + WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); WFEventResponseCombination.FindSet(); -WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); -LibraryAssert.IsFalse(WFEventResponseCombination.IsEmpty(), 'Expected at least one QM response/event combination to exist.'); -if WFEventResponseCombination.FindSet() then - repeat - // assertions - until WFEventResponseCombination.Next() = 0; + // [THEN] Every linked predecessor event must also be a QM event repeat LibraryAssert.IsTrue( WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", From 53a7247df86969a84a6c7ca2426b434d7cd7bceb Mon Sep 17 00:00:00 2001 From: Dusan Jakovljevic <134404137+JakovljevicDusan@users.noreply.github.com> Date: Sat, 30 May 2026 01:12:54 +0200 Subject: [PATCH 5/6] Fix --- .../app/src/Workflow/QltyWorkflowSetup.Codeunit.al | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al index 5b001ae473..537b996632 100644 --- a/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al +++ b/src/Apps/W1/Quality Management/app/src/Workflow/QltyWorkflowSetup.Codeunit.al @@ -397,7 +397,7 @@ codeunit 20423 "Qlty. Workflow Setup" OptionalSuffix: Text; begin WorkflowResponse.SetFilter("Function Name", QltyPrefixTok + '*'); - WorkflowResponse.DeleteAll(true); + WorkflowResponse.DeleteAll(false); WorkflowResponse.Reset(); WorkflowResponse.SetRange(Description, QMWorkflowResponseDescriptionCreateAQltyInspectionLbl); From 79358ad6a2d323b17359892ee41c92fe627fc49e Mon Sep 17 00:00:00 2001 From: Dusan Jakovljevic <134404137+JakovljevicDusan@users.noreply.github.com> Date: Sun, 31 May 2026 10:08:37 +0200 Subject: [PATCH 6/6] Test fix --- .../test/src/QltyTestsWorkflows.Codeunit.al | 74 +++++++++---------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al index 95ff8cb278..0d99bb2332 100644 --- a/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al +++ b/src/Apps/W1/Quality Management/test/src/QltyTestsWorkflows.Codeunit.al @@ -56,6 +56,39 @@ codeunit 139969 "Qlty. Tests - Workflows" QMResponseNotPredecessorOfNonQMEventErr: Label 'QM response %1 should not be a predecessor of non-QM event %2.', Comment = '%1=response function name, %2=predecessor function name.'; IsInitialized: Boolean; + [Test] + procedure QltyResponsesAreNotPredecessorsOfNonQltyEvents() + var + WFEventResponseCombination: Record "WF Event/Response Combination"; + WorkflowEventHandling: Codeunit "Workflow Event Handling"; + WorkflowResponseHandling: Codeunit "Workflow Response Handling"; + QltyPrefix: Text; + begin + // [SCENARIO] QM workflow responses should only be predecessors of QM events, not of any unrelated event + Initialize(); + + // [GIVEN] The workflow events and responses libraries are initialized + WorkflowEventHandling.CreateEventsLibrary(); + WorkflowResponseHandling.CreateResponsesLibrary(); + + // [WHEN] We look at all event/response combinations where the response is a QM response + QltyPrefix := 'QLTY-*'; + WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); + WFEventResponseCombination.FindSet(); + + // [THEN] Every linked predecessor event must also be a QM event + repeat + LibraryAssert.IsTrue( + WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", + 'Expected predecessor type to be Event.'); + LibraryAssert.IsTrue( + CopyStr(WFEventResponseCombination."Predecessor Function Name", 1, 5) = 'QLTY-', + StrSubstNo(QMResponseNotPredecessorOfNonQMEventErr, + WFEventResponseCombination."Function Name", + WFEventResponseCombination."Predecessor Function Name")); + until WFEventResponseCombination.Next() = 0; + end; + [Test] procedure PurchaseReturnWorkflow_OnInspectionFinished() var @@ -1781,11 +1814,7 @@ codeunit 139969 "Qlty. Tests - Workflows" var Workflow: Record Workflow; begin - Workflow.FindSet(); - repeat - Workflow.Enabled := false; - Workflow.Modify(); - until Workflow.Next() = 0; + Workflow.ModifyAll(Enabled, false); Workflow.DeleteAll(); end; @@ -1817,41 +1846,6 @@ codeunit 139969 "Qlty. Tests - Workflows" SpecificQltyInspectSrcFldConf.Insert(); end; - [Test] - procedure QltyResponsesAreNotPredecessorsOfNonQltyEvents() - var - WFEventResponseCombination: Record "WF Event/Response Combination"; - WorkflowEventHandling: Codeunit "Workflow Event Handling"; - WorkflowResponseHandling: Codeunit "Workflow Response Handling"; - QltyPrefix: Text; - begin - // [SCENARIO] QM workflow responses should only be predecessors of QM events, not of any unrelated event - Initialize(); - - // [GIVEN] The workflow events and responses libraries are initialized - WorkflowEventHandling.CreateEventsLibrary(); - WorkflowResponseHandling.CreateResponsesLibrary(); - - // [WHEN] We look at all event/response combinations where the response is a QM response - QltyPrefix := 'QLTY-*'; - WFEventResponseCombination.SetFilter("Function Name", QltyPrefix); - WFEventResponseCombination.FindSet(); - - // [THEN] Every linked predecessor event must also be a QM event - repeat - LibraryAssert.IsTrue( - WFEventResponseCombination."Predecessor Type" = WFEventResponseCombination."Predecessor Type"::"Event", - 'Expected predecessor type to be Event.'); - LibraryAssert.IsTrue( - CopyStr(WFEventResponseCombination."Predecessor Function Name", 1, 5) = 'QLTY-', - StrSubstNo(QMResponseNotPredecessorOfNonQMEventErr, - WFEventResponseCombination."Function Name", - WFEventResponseCombination."Predecessor Function Name")); - until WFEventResponseCombination.Next() = 0; - - DeleteWorkflows(); - end; - [ConfirmHandler] procedure ConfirmHandler(Question: Text; var Reply: Boolean) begin