Repository navigation
FOUR-26628 | Fix Error When Opening a Task with an Imported Assignment Rule - #9110
mcraeteisha wants to merge 3 commits into
Conversation
This change rebinds imported rule_expression assignee records to valid users/groups in the target environment, clearing stale unresolved assignees and marking them for re-selection. It also adds guarded user/group fetches in the picker to avoid noisy 404s when stale assignees remain, and surfaces explicit warnings in the assignment expression inspector when an imported assignee cannot be resolved.
PR SummaryMedium Risk Overview A new On the UI side, Reviewed by Cursor Bugbot for commit 6386cf3. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 6c4f656. Configure here.
Group assignees can be stored as either numeric IDs or strings like group-<id>. This change centralizes normalization so default and special assignments consistently use the plain ID value before string operations, comparisons, and persisted assignment data.
|
| */ | ||
| public static function markRuleUnresolved(object|array $rule): object|array | ||
| { | ||
| $rule = self::ruleSet($rule, 'assignee', null); |
There was a problem hiding this comment.
[P1] Prevent unresolved rules from bypassing the default assignment
When an imported rule is marked unresolved, its expression remains executable with assignee=null. A matching unresolved user rule caused the task to be assigned to the Process Manager instead of the valid Default Assignment. Please skip unresolved rules during evaluation or prevent execution until they are resolved.
| $this->importScripts(); | ||
| $this->importSubprocesses(); | ||
| $this->importAssignments(); | ||
| $this->importAssignmentRules(); |
There was a problem hiding this comment.
[P2] Reconcile assignment rules in the model-only template editor
This call runs only for saveAllAssets, so opening a saveModelOnly template preserves source assignee IDs. Confirmed with an ID collision: the expression row displayed the exported user, while its edit picker loaded a different target user. Creating a process from that template subsequently reconciled the reference, so the confirmed issue is limited to template editing. Please reconcile assignment rules independently of the asset-import mode and cover this template editing path.
| return null; | ||
| } | ||
|
|
||
| $username = trim(preg_replace('/\s+-\s+Inactive$/i', '', trim($matches[1]))); |
There was a problem hiding this comment.
[P2] Handle translated inactive-user suffixes
The picker generates the inactive suffix using $t('Inactive'), but this parser strips only the English text. Confirmed with the Spanish formatter output: Name (username - inactivo) is parsed as username - inactivo, causing an existing target user to be marked unresolved and its assignee cleared. Please support the localized label format generated by the picker.






Issue
Ticket: FOUR-26628
After importing a Process that contains a task with a Rule Expression assignment, clicking the task in the Modeler displays an error message. In the reported case, opening the task triggered a request for a user ID from the source environment that did not exist in the target environment, resulting in a visible 404 error.
The imported
pm:assignmentRulesdata preserved the source environment's numeric user and group IDs. Neither the current nor legacy import flow reconciled those IDs, so the task inspector attempted to load the stale assignees when the task was opened. If the numeric ID belonged to a different user or group in the target environment, the inspector could also display the wrong assignee.This change affects imported Rule Expression assignments for users and groups. Regular user and group assignments continue to use the existing assignment import behavior.
Solution
processmaker
AssignmentRulesReconciliationto reconcilepm:assignmentRulesduring import without trusting the exported numeric assignee ID.- Inactivesuffix.assignmentNameonly when exactly one matching group exists.ProcessExporterand to legacy process imports throughImportProcess.SelectUserGroupso missing assignees do not produce a global 404 alert, do not leave the picker in a loading state, and are handled locally.AssignExpressionso unresolved assignees are not passed to the user/group picker and instead display “This assignee was not found in this environment. Select a user or group.” under Default Assignment and in the edit card.How To Test
Automated Tests
php vendor/bin/phpunit --filter AssignmentRulesReconciliationTest tests/Feature/ImportExport/AssignmentRulesReconciliationTest.phpphp vendor/bin/phpunit --filter ImportProcessAssignmentRulesTest tests/Feature/Jobs/ImportProcessAssignmentRulesTest.phpManual Tests
ci:deploy
Code Review Checklist