@open-mercato/core 0.6.8-develop.6925.1.cefa200fa4 → 0.6.8-develop.6930.1.1e5976efc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/eudr_due_diligence_statement/index.js +47 -0
  3. package/dist/generated/entities/eudr_due_diligence_statement/index.js.map +7 -0
  4. package/dist/generated/entities/eudr_evidence_submission/index.js +51 -0
  5. package/dist/generated/entities/eudr_evidence_submission/index.js.map +7 -0
  6. package/dist/generated/entities/eudr_mitigation_action/index.js +31 -0
  7. package/dist/generated/entities/eudr_mitigation_action/index.js.map +7 -0
  8. package/dist/generated/entities/eudr_plot/index.js +39 -0
  9. package/dist/generated/entities/eudr_plot/index.js.map +7 -0
  10. package/dist/generated/entities/eudr_product_mapping/index.js +31 -0
  11. package/dist/generated/entities/eudr_product_mapping/index.js.map +7 -0
  12. package/dist/generated/entities/eudr_risk_assessment/index.js +35 -0
  13. package/dist/generated/entities/eudr_risk_assessment/index.js.map +7 -0
  14. package/dist/generated/entities.ids.generated.js +9 -0
  15. package/dist/generated/entities.ids.generated.js.map +2 -2
  16. package/dist/generated/entity-fields-registry.js +120 -0
  17. package/dist/generated/entity-fields-registry.js.map +2 -2
  18. package/dist/modules/attachments/fields/attachment.js +5 -1
  19. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  20. package/dist/modules/attachments/lib/crud.js +3 -1
  21. package/dist/modules/attachments/lib/crud.js.map +2 -2
  22. package/dist/modules/eudr/acl.js +43 -0
  23. package/dist/modules/eudr/acl.js.map +7 -0
  24. package/dist/modules/eudr/ai-agents.js +205 -0
  25. package/dist/modules/eudr/ai-agents.js.map +7 -0
  26. package/dist/modules/eudr/ai-tools/compliance-pack.js +495 -0
  27. package/dist/modules/eudr/ai-tools/compliance-pack.js.map +7 -0
  28. package/dist/modules/eudr/ai-tools/types.js +10 -0
  29. package/dist/modules/eudr/ai-tools/types.js.map +7 -0
  30. package/dist/modules/eudr/ai-tools.js +10 -0
  31. package/dist/modules/eudr/ai-tools.js.map +7 -0
  32. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +386 -0
  33. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +7 -0
  34. package/dist/modules/eudr/api/evidence-submissions/route.js +318 -0
  35. package/dist/modules/eudr/api/evidence-submissions/route.js.map +7 -0
  36. package/dist/modules/eudr/api/mitigation-actions/route.js +249 -0
  37. package/dist/modules/eudr/api/mitigation-actions/route.js.map +7 -0
  38. package/dist/modules/eudr/api/openapi.js +27 -0
  39. package/dist/modules/eudr/api/openapi.js.map +7 -0
  40. package/dist/modules/eudr/api/plots/import/route.js +294 -0
  41. package/dist/modules/eudr/api/plots/import/route.js.map +7 -0
  42. package/dist/modules/eudr/api/plots/route.js +279 -0
  43. package/dist/modules/eudr/api/plots/route.js.map +7 -0
  44. package/dist/modules/eudr/api/product-mappings/route.js +257 -0
  45. package/dist/modules/eudr/api/product-mappings/route.js.map +7 -0
  46. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +298 -0
  47. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +7 -0
  48. package/dist/modules/eudr/api/product-mappings/suggestions/route.js +132 -0
  49. package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +7 -0
  50. package/dist/modules/eudr/api/reports/annual/route.js +266 -0
  51. package/dist/modules/eudr/api/reports/annual/route.js.map +7 -0
  52. package/dist/modules/eudr/api/risk-assessments/route.js +300 -0
  53. package/dist/modules/eudr/api/risk-assessments/route.js.map +7 -0
  54. package/dist/modules/eudr/api/statements/[id]/export/route.js +631 -0
  55. package/dist/modules/eudr/api/statements/[id]/export/route.js.map +7 -0
  56. package/dist/modules/eudr/api/statements/[id]/readiness/route.js +111 -0
  57. package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +7 -0
  58. package/dist/modules/eudr/api/statements/route.js +314 -0
  59. package/dist/modules/eudr/api/statements/route.js.map +7 -0
  60. package/dist/modules/eudr/api/suppliers/compliance/route.js +173 -0
  61. package/dist/modules/eudr/api/suppliers/compliance/route.js.map +7 -0
  62. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +468 -0
  63. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +7 -0
  64. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +16 -0
  65. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +7 -0
  66. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +351 -0
  67. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +7 -0
  68. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +17 -0
  69. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +7 -0
  70. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +313 -0
  71. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +7 -0
  72. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +16 -0
  73. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +7 -0
  74. package/dist/modules/eudr/backend/eudr/page.js +360 -0
  75. package/dist/modules/eudr/backend/eudr/page.js.map +7 -0
  76. package/dist/modules/eudr/backend/eudr/page.meta.js +16 -0
  77. package/dist/modules/eudr/backend/eudr/page.meta.js.map +7 -0
  78. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +346 -0
  79. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +7 -0
  80. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +16 -0
  81. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +7 -0
  82. package/dist/modules/eudr/backend/eudr/plots/create/page.js +253 -0
  83. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +7 -0
  84. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +17 -0
  85. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +7 -0
  86. package/dist/modules/eudr/backend/eudr/plots/page.js +386 -0
  87. package/dist/modules/eudr/backend/eudr/plots/page.js.map +7 -0
  88. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +16 -0
  89. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +7 -0
  90. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +253 -0
  91. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +7 -0
  92. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +16 -0
  93. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +7 -0
  94. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +174 -0
  95. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +7 -0
  96. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +17 -0
  97. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +7 -0
  98. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +306 -0
  99. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +7 -0
  100. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +16 -0
  101. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +7 -0
  102. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +335 -0
  103. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +7 -0
  104. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +16 -0
  105. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +7 -0
  106. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +220 -0
  107. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +7 -0
  108. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +17 -0
  109. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +7 -0
  110. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +324 -0
  111. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +7 -0
  112. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +16 -0
  113. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +7 -0
  114. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +648 -0
  115. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +7 -0
  116. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +16 -0
  117. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +7 -0
  118. package/dist/modules/eudr/backend/eudr/statements/create/page.js +432 -0
  119. package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +7 -0
  120. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +17 -0
  121. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +7 -0
  122. package/dist/modules/eudr/backend/eudr/statements/page.js +309 -0
  123. package/dist/modules/eudr/backend/eudr/statements/page.js.map +7 -0
  124. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +16 -0
  125. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +7 -0
  126. package/dist/modules/eudr/ce.js +56 -0
  127. package/dist/modules/eudr/ce.js.map +7 -0
  128. package/dist/modules/eudr/commands/evidence-submissions.js +571 -0
  129. package/dist/modules/eudr/commands/evidence-submissions.js.map +7 -0
  130. package/dist/modules/eudr/commands/index.js +7 -0
  131. package/dist/modules/eudr/commands/index.js.map +7 -0
  132. package/dist/modules/eudr/commands/lifecycle-events.js +19 -0
  133. package/dist/modules/eudr/commands/lifecycle-events.js.map +7 -0
  134. package/dist/modules/eudr/commands/mitigation-actions.js +488 -0
  135. package/dist/modules/eudr/commands/mitigation-actions.js.map +7 -0
  136. package/dist/modules/eudr/commands/plots.js +517 -0
  137. package/dist/modules/eudr/commands/plots.js.map +7 -0
  138. package/dist/modules/eudr/commands/product-mappings.js +468 -0
  139. package/dist/modules/eudr/commands/product-mappings.js.map +7 -0
  140. package/dist/modules/eudr/commands/risk-assessments.js +599 -0
  141. package/dist/modules/eudr/commands/risk-assessments.js.map +7 -0
  142. package/dist/modules/eudr/commands/statements.js +747 -0
  143. package/dist/modules/eudr/commands/statements.js.map +7 -0
  144. package/dist/modules/eudr/components/CountrySelectField.js +64 -0
  145. package/dist/modules/eudr/components/CountrySelectField.js.map +7 -0
  146. package/dist/modules/eudr/components/GeometryInput.js +133 -0
  147. package/dist/modules/eudr/components/GeometryInput.js.map +7 -0
  148. package/dist/modules/eudr/components/MappingSuggestionsDialog.js +307 -0
  149. package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +7 -0
  150. package/dist/modules/eudr/components/MitigationActionsSection.js +345 -0
  151. package/dist/modules/eudr/components/MitigationActionsSection.js.map +7 -0
  152. package/dist/modules/eudr/components/OrderSelectField.js +88 -0
  153. package/dist/modules/eudr/components/OrderSelectField.js.map +7 -0
  154. package/dist/modules/eudr/components/PlotImportDialog.js +229 -0
  155. package/dist/modules/eudr/components/PlotImportDialog.js.map +7 -0
  156. package/dist/modules/eudr/components/PlotMapPreview.js +35 -0
  157. package/dist/modules/eudr/components/PlotMapPreview.js.map +7 -0
  158. package/dist/modules/eudr/components/PlotMapPreviewImpl.js +97 -0
  159. package/dist/modules/eudr/components/PlotMapPreviewImpl.js.map +7 -0
  160. package/dist/modules/eudr/components/PlotMultiSelectField.js +198 -0
  161. package/dist/modules/eudr/components/PlotMultiSelectField.js.map +7 -0
  162. package/dist/modules/eudr/components/RiskCriteriaField.js +128 -0
  163. package/dist/modules/eudr/components/RiskCriteriaField.js.map +7 -0
  164. package/dist/modules/eudr/components/StatementLifecycleBar.js +274 -0
  165. package/dist/modules/eudr/components/StatementLifecycleBar.js.map +7 -0
  166. package/dist/modules/eudr/components/StatementReadinessChecklist.js +56 -0
  167. package/dist/modules/eudr/components/StatementReadinessChecklist.js.map +7 -0
  168. package/dist/modules/eudr/components/StatementRiskSection.js +179 -0
  169. package/dist/modules/eudr/components/StatementRiskSection.js.map +7 -0
  170. package/dist/modules/eudr/components/crudErrorI18n.js +31 -0
  171. package/dist/modules/eudr/components/crudErrorI18n.js.map +7 -0
  172. package/dist/modules/eudr/components/formConfig.js +593 -0
  173. package/dist/modules/eudr/components/formConfig.js.map +7 -0
  174. package/dist/modules/eudr/components/plotForm.js +68 -0
  175. package/dist/modules/eudr/components/plotForm.js.map +7 -0
  176. package/dist/modules/eudr/data/enrichers.js +62 -0
  177. package/dist/modules/eudr/data/enrichers.js.map +7 -0
  178. package/dist/modules/eudr/data/entities.js +437 -0
  179. package/dist/modules/eudr/data/entities.js.map +7 -0
  180. package/dist/modules/eudr/data/validators.js +271 -0
  181. package/dist/modules/eudr/data/validators.js.map +7 -0
  182. package/dist/modules/eudr/encryption.js +33 -0
  183. package/dist/modules/eudr/encryption.js.map +7 -0
  184. package/dist/modules/eudr/events.js +38 -0
  185. package/dist/modules/eudr/events.js.map +7 -0
  186. package/dist/modules/eudr/index.js +15 -0
  187. package/dist/modules/eudr/index.js.map +7 -0
  188. package/dist/modules/eudr/lib/annual-report.js +104 -0
  189. package/dist/modules/eudr/lib/annual-report.js.map +7 -0
  190. package/dist/modules/eudr/lib/completeness.js +64 -0
  191. package/dist/modules/eudr/lib/completeness.js.map +7 -0
  192. package/dist/modules/eudr/lib/detail-read-scope.js +16 -0
  193. package/dist/modules/eudr/lib/detail-read-scope.js.map +7 -0
  194. package/dist/modules/eudr/lib/geometry.js +142 -0
  195. package/dist/modules/eudr/lib/geometry.js.map +7 -0
  196. package/dist/modules/eudr/lib/notifications.js +56 -0
  197. package/dist/modules/eudr/lib/notifications.js.map +7 -0
  198. package/dist/modules/eudr/lib/plural.js +26 -0
  199. package/dist/modules/eudr/lib/plural.js.map +7 -0
  200. package/dist/modules/eudr/lib/reference-data.js +240 -0
  201. package/dist/modules/eudr/lib/reference-data.js.map +7 -0
  202. package/dist/modules/eudr/lib/species.js +10 -0
  203. package/dist/modules/eudr/lib/species.js.map +7 -0
  204. package/dist/modules/eudr/lib/statement-lifecycle.js +84 -0
  205. package/dist/modules/eudr/lib/statement-lifecycle.js.map +7 -0
  206. package/dist/modules/eudr/lib/statement-seeding.js +49 -0
  207. package/dist/modules/eudr/lib/statement-seeding.js.map +7 -0
  208. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js +15 -0
  209. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js.map +7 -0
  210. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js +24 -0
  211. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js.map +7 -0
  212. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js +15 -0
  213. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js.map +7 -0
  214. package/dist/modules/eudr/notifications.js +58 -0
  215. package/dist/modules/eudr/notifications.js.map +7 -0
  216. package/dist/modules/eudr/search.js +186 -0
  217. package/dist/modules/eudr/search.js.map +7 -0
  218. package/dist/modules/eudr/setup.js +12 -0
  219. package/dist/modules/eudr/setup.js.map +7 -0
  220. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js +34 -0
  221. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js.map +7 -0
  222. package/dist/modules/eudr/subscribers/notify-risk-concluded.js +35 -0
  223. package/dist/modules/eudr/subscribers/notify-risk-concluded.js.map +7 -0
  224. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js +37 -0
  225. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js.map +7 -0
  226. package/dist/modules/eudr/subscribers/notify-statement-submitted.js +34 -0
  227. package/dist/modules/eudr/subscribers/notify-statement-submitted.js.map +7 -0
  228. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js +34 -0
  229. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js.map +7 -0
  230. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js +124 -0
  231. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js.map +7 -0
  232. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js +22 -0
  233. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js.map +7 -0
  234. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js +203 -0
  235. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js.map +7 -0
  236. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js +23 -0
  237. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js.map +7 -0
  238. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js +19 -0
  239. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js.map +7 -0
  240. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js +31 -0
  241. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js.map +7 -0
  242. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js +100 -0
  243. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js.map +7 -0
  244. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js +17 -0
  245. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js.map +7 -0
  246. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js +116 -0
  247. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js.map +7 -0
  248. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js +17 -0
  249. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js.map +7 -0
  250. package/dist/modules/eudr/widgets/injection-table.js +32 -0
  251. package/dist/modules/eudr/widgets/injection-table.js.map +7 -0
  252. package/dist/modules/notifications/lib/notificationService.js +67 -3
  253. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  254. package/dist/modules/query_index/lib/engine.js +121 -48
  255. package/dist/modules/query_index/lib/engine.js.map +2 -2
  256. package/dist/modules/sales/api/documents/factory.js +17 -0
  257. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  258. package/dist/modules/sales/commands/documents.js +32 -18
  259. package/dist/modules/sales/commands/documents.js.map +2 -2
  260. package/dist/modules/sales/data/entities.js +1 -0
  261. package/dist/modules/sales/data/entities.js.map +2 -2
  262. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js +17 -0
  263. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js.map +7 -0
  264. package/generated/entities/eudr_due_diligence_statement/index.ts +22 -0
  265. package/generated/entities/eudr_evidence_submission/index.ts +24 -0
  266. package/generated/entities/eudr_mitigation_action/index.ts +14 -0
  267. package/generated/entities/eudr_plot/index.ts +18 -0
  268. package/generated/entities/eudr_product_mapping/index.ts +14 -0
  269. package/generated/entities/eudr_risk_assessment/index.ts +16 -0
  270. package/generated/entities.ids.generated.ts +9 -0
  271. package/generated/entity-fields-registry.ts +120 -0
  272. package/package.json +7 -7
  273. package/src/modules/attachments/fields/attachment.tsx +5 -0
  274. package/src/modules/attachments/lib/crud.ts +2 -0
  275. package/src/modules/eudr/acl.ts +39 -0
  276. package/src/modules/eudr/ai-agents.ts +258 -0
  277. package/src/modules/eudr/ai-tools/compliance-pack.ts +618 -0
  278. package/src/modules/eudr/ai-tools/types.ts +44 -0
  279. package/src/modules/eudr/ai-tools.ts +15 -0
  280. package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +481 -0
  281. package/src/modules/eudr/api/evidence-submissions/route.ts +335 -0
  282. package/src/modules/eudr/api/mitigation-actions/route.ts +263 -0
  283. package/src/modules/eudr/api/openapi.ts +28 -0
  284. package/src/modules/eudr/api/plots/import/route.ts +369 -0
  285. package/src/modules/eudr/api/plots/route.ts +296 -0
  286. package/src/modules/eudr/api/product-mappings/route.ts +269 -0
  287. package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +382 -0
  288. package/src/modules/eudr/api/product-mappings/suggestions/route.ts +169 -0
  289. package/src/modules/eudr/api/reports/annual/route.ts +457 -0
  290. package/src/modules/eudr/api/risk-assessments/route.ts +323 -0
  291. package/src/modules/eudr/api/statements/[id]/export/route.ts +713 -0
  292. package/src/modules/eudr/api/statements/[id]/readiness/route.ts +129 -0
  293. package/src/modules/eudr/api/statements/route.ts +329 -0
  294. package/src/modules/eudr/api/suppliers/compliance/route.ts +241 -0
  295. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +12 -0
  296. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +545 -0
  297. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +13 -0
  298. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +383 -0
  299. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +12 -0
  300. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +379 -0
  301. package/src/modules/eudr/backend/eudr/page.meta.ts +12 -0
  302. package/src/modules/eudr/backend/eudr/page.tsx +477 -0
  303. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +12 -0
  304. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +404 -0
  305. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +13 -0
  306. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +267 -0
  307. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +12 -0
  308. package/src/modules/eudr/backend/eudr/plots/page.tsx +442 -0
  309. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +12 -0
  310. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +311 -0
  311. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +13 -0
  312. package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +190 -0
  313. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +12 -0
  314. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +344 -0
  315. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +12 -0
  316. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +421 -0
  317. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +13 -0
  318. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +247 -0
  319. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +12 -0
  320. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +383 -0
  321. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +12 -0
  322. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +777 -0
  323. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +13 -0
  324. package/src/modules/eudr/backend/eudr/statements/create/page.tsx +511 -0
  325. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +12 -0
  326. package/src/modules/eudr/backend/eudr/statements/page.tsx +372 -0
  327. package/src/modules/eudr/ce.ts +52 -0
  328. package/src/modules/eudr/commands/evidence-submissions.ts +699 -0
  329. package/src/modules/eudr/commands/index.ts +6 -0
  330. package/src/modules/eudr/commands/lifecycle-events.ts +28 -0
  331. package/src/modules/eudr/commands/mitigation-actions.ts +574 -0
  332. package/src/modules/eudr/commands/plots.ts +627 -0
  333. package/src/modules/eudr/commands/product-mappings.ts +556 -0
  334. package/src/modules/eudr/commands/risk-assessments.ts +728 -0
  335. package/src/modules/eudr/commands/statements.ts +933 -0
  336. package/src/modules/eudr/components/CountrySelectField.tsx +77 -0
  337. package/src/modules/eudr/components/GeometryInput.tsx +170 -0
  338. package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +385 -0
  339. package/src/modules/eudr/components/MitigationActionsSection.tsx +417 -0
  340. package/src/modules/eudr/components/OrderSelectField.tsx +116 -0
  341. package/src/modules/eudr/components/PlotImportDialog.tsx +277 -0
  342. package/src/modules/eudr/components/PlotMapPreview.tsx +46 -0
  343. package/src/modules/eudr/components/PlotMapPreviewImpl.tsx +111 -0
  344. package/src/modules/eudr/components/PlotMultiSelectField.tsx +238 -0
  345. package/src/modules/eudr/components/RiskCriteriaField.tsx +173 -0
  346. package/src/modules/eudr/components/StatementLifecycleBar.tsx +363 -0
  347. package/src/modules/eudr/components/StatementReadinessChecklist.tsx +82 -0
  348. package/src/modules/eudr/components/StatementRiskSection.tsx +242 -0
  349. package/src/modules/eudr/components/crudErrorI18n.ts +36 -0
  350. package/src/modules/eudr/components/formConfig.tsx +717 -0
  351. package/src/modules/eudr/components/plotForm.ts +75 -0
  352. package/src/modules/eudr/data/enrichers.ts +82 -0
  353. package/src/modules/eudr/data/entities.ts +369 -0
  354. package/src/modules/eudr/data/validators.ts +357 -0
  355. package/src/modules/eudr/encryption.ts +31 -0
  356. package/src/modules/eudr/events.ts +38 -0
  357. package/src/modules/eudr/i18n/de.json +747 -0
  358. package/src/modules/eudr/i18n/en.json +747 -0
  359. package/src/modules/eudr/i18n/es.json +747 -0
  360. package/src/modules/eudr/i18n/ko.json +747 -0
  361. package/src/modules/eudr/i18n/pl.json +747 -0
  362. package/src/modules/eudr/index.ts +13 -0
  363. package/src/modules/eudr/lib/annual-report.ts +120 -0
  364. package/src/modules/eudr/lib/completeness.ts +90 -0
  365. package/src/modules/eudr/lib/detail-read-scope.ts +44 -0
  366. package/src/modules/eudr/lib/geometry.ts +191 -0
  367. package/src/modules/eudr/lib/notifications.ts +85 -0
  368. package/src/modules/eudr/lib/plural.ts +36 -0
  369. package/src/modules/eudr/lib/reference-data.ts +128 -0
  370. package/src/modules/eudr/lib/species.ts +12 -0
  371. package/src/modules/eudr/lib/statement-lifecycle.ts +109 -0
  372. package/src/modules/eudr/lib/statement-seeding.ts +86 -0
  373. package/src/modules/eudr/migrations/.snapshot-open-mercato.json +2046 -0
  374. package/src/modules/eudr/migrations/Migration20260706102002_eudr.ts +16 -0
  375. package/src/modules/eudr/migrations/Migration20260706152612_eudr.ts +30 -0
  376. package/src/modules/eudr/migrations/Migration20260722100000_eudr.ts +17 -0
  377. package/src/modules/eudr/notifications.ts +56 -0
  378. package/src/modules/eudr/search.ts +212 -0
  379. package/src/modules/eudr/setup.ts +10 -0
  380. package/src/modules/eudr/subscribers/notify-mitigation-completed.ts +56 -0
  381. package/src/modules/eudr/subscribers/notify-risk-concluded.ts +58 -0
  382. package/src/modules/eudr/subscribers/notify-statement-reference-issued.ts +59 -0
  383. package/src/modules/eudr/subscribers/notify-statement-submitted.ts +49 -0
  384. package/src/modules/eudr/subscribers/notify-statement-withdrawn.ts +49 -0
  385. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-created.ts +189 -0
  386. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.ts +31 -0
  387. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.client.tsx +271 -0
  388. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts +24 -0
  389. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx +37 -0
  390. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.ts +30 -0
  391. package/src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx +131 -0
  392. package/src/modules/eudr/widgets/injection/order-compliance/widget.ts +16 -0
  393. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx +168 -0
  394. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.ts +16 -0
  395. package/src/modules/eudr/widgets/injection-table.ts +31 -0
  396. package/src/modules/notifications/lib/notificationService.ts +83 -4
  397. package/src/modules/query_index/lib/engine.ts +139 -51
  398. package/src/modules/sales/api/documents/factory.ts +29 -0
  399. package/src/modules/sales/commands/documents.ts +65 -18
  400. package/src/modules/sales/data/entities.ts +1 -0
  401. package/src/modules/sales/migrations/.snapshot-open-mercato.json +10 -0
  402. package/src/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.ts +59 -0
@@ -0,0 +1,7 @@
1
+ import "./product-mappings.js";
2
+ import "./evidence-submissions.js";
3
+ import "./statements.js";
4
+ import "./plots.js";
5
+ import "./risk-assessments.js";
6
+ import "./mitigation-actions.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/eudr/commands/index.ts"],
4
+ "sourcesContent": ["import './product-mappings'\nimport './evidence-submissions'\nimport './statements'\nimport './plots'\nimport './risk-assessments'\nimport './mitigation-actions'\n"],
5
+ "mappings": "AAAA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ const logger = createLogger("eudr").child({ component: "lifecycle-events" });
3
+ async function emitEudrLifecycleEvent(container, eventId, payload) {
4
+ try {
5
+ const eventBus = container.resolve("eventBus");
6
+ if (!eventBus) return;
7
+ await eventBus.emitEvent(
8
+ eventId,
9
+ { ...payload, occurredAt: (/* @__PURE__ */ new Date()).toISOString() },
10
+ { persistent: true }
11
+ );
12
+ } catch (err) {
13
+ logger.warn("EUDR lifecycle event emit failed", { eventId, err });
14
+ }
15
+ }
16
+ export {
17
+ emitEudrLifecycleEvent
18
+ };
19
+ //# sourceMappingURL=lifecycle-events.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/eudr/commands/lifecycle-events.ts"],
4
+ "sourcesContent": ["import { createLogger } from '@open-mercato/shared/lib/logger'\nimport type { EudrEventId } from '../events'\n\nconst logger = createLogger('eudr').child({ component: 'lifecycle-events' })\n\ntype LifecycleEventBus = {\n emitEvent(event: string, payload: unknown, options?: unknown): Promise<void>\n}\n\ntype LifecycleContainer = { resolve: (name: string) => unknown }\n\nexport async function emitEudrLifecycleEvent(\n container: LifecycleContainer,\n eventId: EudrEventId,\n payload: Record<string, unknown>,\n): Promise<void> {\n try {\n const eventBus = container.resolve('eventBus') as LifecycleEventBus | undefined\n if (!eventBus) return\n await eventBus.emitEvent(\n eventId,\n { ...payload, occurredAt: new Date().toISOString() },\n { persistent: true },\n )\n } catch (err) {\n logger.warn('EUDR lifecycle event emit failed', { eventId, err })\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAG7B,MAAM,SAAS,aAAa,MAAM,EAAE,MAAM,EAAE,WAAW,mBAAmB,CAAC;AAQ3E,eAAsB,uBACpB,WACA,SACA,SACe;AACf,MAAI;AACF,UAAM,WAAW,UAAU,QAAQ,UAAU;AAC7C,QAAI,CAAC,SAAU;AACf,UAAM,SAAS;AAAA,MACb;AAAA,MACA,EAAE,GAAG,SAAS,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,MACnD,EAAE,YAAY,KAAK;AAAA,IACrB;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,oCAAoC,EAAE,SAAS,IAAI,CAAC;AAAA,EAClE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,488 @@
1
+ import { registerCommand } from "@open-mercato/shared/lib/commands";
2
+ import {
3
+ parseWithCustomFields,
4
+ emitCrudSideEffects,
5
+ emitCrudUndoSideEffects,
6
+ requireId,
7
+ setCustomFieldsIfAny,
8
+ snapshotsEqual
9
+ } from "@open-mercato/shared/lib/commands/helpers";
10
+ import { extractUndoPayload } from "@open-mercato/shared/lib/commands/undo";
11
+ import { makeCreateRedo } from "@open-mercato/shared/lib/commands/redo";
12
+ import { runCrudCommandWrite } from "@open-mercato/shared/lib/commands/runCrudCommandWrite";
13
+ import { ensureOrganizationScope, ensureTenantScope } from "@open-mercato/shared/lib/commands/scope";
14
+ import { emitEudrLifecycleEvent } from "./lifecycle-events.js";
15
+ import {
16
+ loadCustomFieldSnapshot,
17
+ buildCustomFieldResetMap
18
+ } from "@open-mercato/shared/lib/commands/customFieldSnapshots";
19
+ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
20
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
21
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
22
+ import { E } from "../../../generated/entities.ids.generated.js";
23
+ import { randomUUID } from "crypto";
24
+ import { z } from "zod";
25
+ import { EudrMitigationAction, EudrRiskAssessment } from "../data/entities.js";
26
+ import {
27
+ mitigationActionCreateSchema,
28
+ mitigationActionUpdateSchema
29
+ } from "../data/validators.js";
30
+ const MITIGATION_ACTION_ENTITY_ID = "eudr:eudr_mitigation_action";
31
+ const scopedCommandInputSchema = z.object({
32
+ tenantId: z.string().uuid(),
33
+ organizationId: z.string().uuid()
34
+ });
35
+ const mitigationActionCrudIndexer = {
36
+ entityType: E.eudr.eudr_mitigation_action
37
+ };
38
+ const mitigationActionCrudEvents = {
39
+ module: "eudr",
40
+ entity: "mitigation_action",
41
+ persistent: true,
42
+ buildPayload: (emitContext) => ({
43
+ id: emitContext.identifiers.id,
44
+ entityId: emitContext.entity?.id ?? emitContext.identifiers.id,
45
+ organizationId: emitContext.identifiers.organizationId,
46
+ tenantId: emitContext.identifiers.tenantId
47
+ })
48
+ };
49
+ function parseScopedCommandInput(input) {
50
+ return scopedCommandInputSchema.parse(input);
51
+ }
52
+ function toDate(value) {
53
+ return value ? new Date(value) : null;
54
+ }
55
+ async function requireRiskAssessmentInScope(em, riskAssessmentId, scope) {
56
+ const assessment = await findOneWithDecryption(
57
+ em,
58
+ EudrRiskAssessment,
59
+ {
60
+ id: riskAssessmentId,
61
+ tenantId: scope.tenantId,
62
+ organizationId: scope.organizationId,
63
+ deletedAt: null
64
+ },
65
+ void 0,
66
+ scope
67
+ );
68
+ if (!assessment) throw new CrudHttpError(400, { error: "eudr.errors.riskAssessmentNotFound" });
69
+ return assessment;
70
+ }
71
+ function mitigationActionSeedFromSnapshot(snapshot) {
72
+ return {
73
+ id: snapshot.id,
74
+ organizationId: snapshot.organizationId,
75
+ tenantId: snapshot.tenantId,
76
+ riskAssessmentId: snapshot.riskAssessmentId,
77
+ actionType: snapshot.actionType,
78
+ title: snapshot.title,
79
+ description: snapshot.description,
80
+ status: snapshot.status,
81
+ dueDate: toDate(snapshot.dueDate),
82
+ completedAt: toDate(snapshot.completedAt),
83
+ notes: snapshot.notes,
84
+ createdAt: new Date(snapshot.createdAt),
85
+ updatedAt: new Date(snapshot.updatedAt),
86
+ deletedAt: toDate(snapshot.deletedAt)
87
+ };
88
+ }
89
+ async function findMitigationAction(em, entityId, includeDeleted = true) {
90
+ return includeDeleted ? findOneWithDecryption(em, EudrMitigationAction, { id: entityId }) : findOneWithDecryption(em, EudrMitigationAction, { id: entityId, deletedAt: null });
91
+ }
92
+ async function loadMitigationActionSnapshot(em, entityId) {
93
+ const record = await findMitigationAction(em, entityId);
94
+ if (!record) return null;
95
+ const custom = await loadCustomFieldSnapshot(em, {
96
+ entityId: MITIGATION_ACTION_ENTITY_ID,
97
+ recordId: record.id,
98
+ tenantId: record.tenantId,
99
+ organizationId: record.organizationId
100
+ });
101
+ return {
102
+ id: record.id,
103
+ organizationId: record.organizationId,
104
+ tenantId: record.tenantId,
105
+ riskAssessmentId: record.riskAssessmentId,
106
+ actionType: record.actionType,
107
+ title: record.title,
108
+ description: record.description ?? null,
109
+ status: record.status,
110
+ dueDate: record.dueDate ? record.dueDate.toISOString() : null,
111
+ completedAt: record.completedAt ? record.completedAt.toISOString() : null,
112
+ notes: record.notes ?? null,
113
+ createdAt: record.createdAt.toISOString(),
114
+ updatedAt: record.updatedAt.toISOString(),
115
+ deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,
116
+ custom: Object.keys(custom).length ? custom : null
117
+ };
118
+ }
119
+ function restoreMitigationAction(record, snapshot) {
120
+ record.organizationId = snapshot.organizationId;
121
+ record.tenantId = snapshot.tenantId;
122
+ record.riskAssessmentId = snapshot.riskAssessmentId;
123
+ record.actionType = snapshot.actionType;
124
+ record.title = snapshot.title;
125
+ record.description = snapshot.description;
126
+ record.status = snapshot.status;
127
+ record.dueDate = toDate(snapshot.dueDate);
128
+ record.completedAt = toDate(snapshot.completedAt);
129
+ record.notes = snapshot.notes;
130
+ record.createdAt = new Date(snapshot.createdAt);
131
+ record.updatedAt = new Date(snapshot.updatedAt);
132
+ record.deletedAt = toDate(snapshot.deletedAt);
133
+ }
134
+ async function setMitigationActionCustomFields(dataEngine, entityId, organizationId, tenantId, values) {
135
+ await setCustomFieldsIfAny({
136
+ dataEngine,
137
+ entityId: MITIGATION_ACTION_ENTITY_ID,
138
+ recordId: entityId,
139
+ organizationId,
140
+ tenantId,
141
+ values,
142
+ notify: false
143
+ });
144
+ }
145
+ const createMitigationActionCommand = {
146
+ id: "eudr.mitigation_actions.create",
147
+ async execute(rawInput, ctx) {
148
+ const { parsed, custom } = parseWithCustomFields(mitigationActionCreateSchema, rawInput);
149
+ const scope = parseScopedCommandInput(rawInput);
150
+ ensureTenantScope(ctx, scope.tenantId);
151
+ ensureOrganizationScope(ctx, scope.organizationId);
152
+ const entityManager = ctx.container.resolve("em").fork();
153
+ let record;
154
+ await runCrudCommandWrite({
155
+ ctx,
156
+ em: entityManager,
157
+ entityId: MITIGATION_ACTION_ENTITY_ID,
158
+ action: "created",
159
+ scope,
160
+ customFields: custom,
161
+ events: mitigationActionCrudEvents,
162
+ indexer: mitigationActionCrudIndexer,
163
+ sideEffect: () => ({
164
+ entity: record,
165
+ identifiers: {
166
+ id: record.id,
167
+ organizationId: record.organizationId,
168
+ tenantId: record.tenantId
169
+ }
170
+ }),
171
+ phases: [
172
+ async () => {
173
+ await requireRiskAssessmentInScope(entityManager, parsed.riskAssessmentId, scope);
174
+ const status = parsed.status ?? "planned";
175
+ record = entityManager.create(EudrMitigationAction, {
176
+ id: randomUUID(),
177
+ organizationId: scope.organizationId,
178
+ tenantId: scope.tenantId,
179
+ riskAssessmentId: parsed.riskAssessmentId,
180
+ actionType: parsed.actionType ?? "other",
181
+ title: parsed.title,
182
+ description: parsed.description ?? null,
183
+ status,
184
+ dueDate: parsed.dueDate ?? null,
185
+ completedAt: status === "completed" ? /* @__PURE__ */ new Date() : null,
186
+ notes: parsed.notes ?? null
187
+ });
188
+ entityManager.persist(record);
189
+ }
190
+ ]
191
+ });
192
+ if (record.status === "completed") {
193
+ await emitEudrLifecycleEvent(ctx.container, "eudr.mitigation_action.completed", {
194
+ id: record.id,
195
+ tenantId: record.tenantId,
196
+ organizationId: record.organizationId,
197
+ title: record.title,
198
+ riskAssessmentId: record.riskAssessmentId
199
+ });
200
+ }
201
+ return { entityId: record.id };
202
+ },
203
+ captureAfter: async (_rawInput, result, ctx) => {
204
+ const entityManager = ctx.container.resolve("em").fork();
205
+ return loadMitigationActionSnapshot(entityManager, result.entityId);
206
+ },
207
+ buildLog: async ({ snapshots }) => {
208
+ const after = snapshots.after;
209
+ if (!after) return null;
210
+ const { translate } = await resolveTranslations();
211
+ return {
212
+ actionLabel: translate("eudr.audit.mitigation_actions.create", "Create EUDR mitigation action"),
213
+ resourceKind: "eudr.mitigation_action",
214
+ resourceId: after.id,
215
+ tenantId: after.tenantId,
216
+ organizationId: after.organizationId,
217
+ snapshotAfter: after,
218
+ payload: {
219
+ undo: { after }
220
+ }
221
+ };
222
+ },
223
+ undo: async ({ logEntry, ctx }) => {
224
+ const payload = extractUndoPayload(logEntry);
225
+ const after = payload?.after;
226
+ if (!after) return;
227
+ const entityManager = ctx.container.resolve("em").fork();
228
+ const record = await findMitigationAction(entityManager, after.id);
229
+ if (!record) return;
230
+ ensureTenantScope(ctx, record.tenantId);
231
+ ensureOrganizationScope(ctx, record.organizationId);
232
+ record.deletedAt = /* @__PURE__ */ new Date();
233
+ await entityManager.flush();
234
+ const dataEngine = ctx.container.resolve("dataEngine");
235
+ const resetValues = buildCustomFieldResetMap(void 0, after.custom ?? void 0);
236
+ await setMitigationActionCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues);
237
+ await emitCrudUndoSideEffects({
238
+ dataEngine,
239
+ action: "deleted",
240
+ entity: record,
241
+ identifiers: {
242
+ id: record.id,
243
+ organizationId: record.organizationId,
244
+ tenantId: record.tenantId
245
+ },
246
+ indexer: mitigationActionCrudIndexer,
247
+ events: mitigationActionCrudEvents
248
+ });
249
+ },
250
+ redo: makeCreateRedo({
251
+ entityClass: EudrMitigationAction,
252
+ seedFromSnapshot: mitigationActionSeedFromSnapshot,
253
+ buildResult: (entity) => ({ entityId: entity.id }),
254
+ indexer: mitigationActionCrudIndexer,
255
+ events: mitigationActionCrudEvents,
256
+ findRow: ({ em, id }) => findMitigationAction(em, id),
257
+ afterRestore: async ({ ctx, entity, snapshot }) => {
258
+ if (!snapshot.custom || !Object.keys(snapshot.custom).length) return;
259
+ await setMitigationActionCustomFields(
260
+ ctx.container.resolve("dataEngine"),
261
+ entity.id,
262
+ entity.organizationId,
263
+ entity.tenantId,
264
+ snapshot.custom
265
+ );
266
+ }
267
+ })
268
+ };
269
+ const updateMitigationActionCommand = {
270
+ id: "eudr.mitigation_actions.update",
271
+ async prepare(rawInput, ctx) {
272
+ const { parsed } = parseWithCustomFields(mitigationActionUpdateSchema, rawInput);
273
+ const entityManager = ctx.container.resolve("em").fork();
274
+ const snapshot = await loadMitigationActionSnapshot(entityManager, parsed.id);
275
+ if (snapshot) {
276
+ ensureTenantScope(ctx, snapshot.tenantId);
277
+ ensureOrganizationScope(ctx, snapshot.organizationId);
278
+ }
279
+ return snapshot ? { before: snapshot } : {};
280
+ },
281
+ async execute(rawInput, ctx) {
282
+ const { parsed, custom } = parseWithCustomFields(mitigationActionUpdateSchema, rawInput);
283
+ const entityManager = ctx.container.resolve("em").fork();
284
+ const record = await findMitigationAction(entityManager, parsed.id, false);
285
+ if (!record) throw new CrudHttpError(404, { error: "eudr.errors.mitigationActionNotFound" });
286
+ ensureTenantScope(ctx, record.tenantId);
287
+ ensureOrganizationScope(ctx, record.organizationId);
288
+ const scope = { tenantId: record.tenantId, organizationId: record.organizationId };
289
+ const wasCompleted = record.status === "completed";
290
+ await runCrudCommandWrite({
291
+ ctx,
292
+ em: entityManager,
293
+ entityId: MITIGATION_ACTION_ENTITY_ID,
294
+ action: "updated",
295
+ scope,
296
+ customFields: custom,
297
+ events: mitigationActionCrudEvents,
298
+ indexer: mitigationActionCrudIndexer,
299
+ sideEffect: () => ({
300
+ entity: record,
301
+ identifiers: {
302
+ id: record.id,
303
+ organizationId: record.organizationId,
304
+ tenantId: record.tenantId
305
+ }
306
+ }),
307
+ phases: [
308
+ async () => {
309
+ const nextRiskAssessmentId = parsed.riskAssessmentId ?? record.riskAssessmentId;
310
+ await requireRiskAssessmentInScope(entityManager, nextRiskAssessmentId, scope);
311
+ if (parsed.riskAssessmentId !== void 0) record.riskAssessmentId = parsed.riskAssessmentId;
312
+ if (parsed.actionType !== void 0) record.actionType = parsed.actionType ?? "other";
313
+ if (parsed.title !== void 0) record.title = parsed.title;
314
+ if (parsed.description !== void 0) record.description = parsed.description ?? null;
315
+ if (parsed.status !== void 0) {
316
+ const previousStatus = record.status;
317
+ record.status = parsed.status;
318
+ if (record.status === "completed" && previousStatus !== "completed") {
319
+ record.completedAt = /* @__PURE__ */ new Date();
320
+ } else if (record.status !== "completed") {
321
+ record.completedAt = null;
322
+ }
323
+ }
324
+ if (parsed.dueDate !== void 0) record.dueDate = parsed.dueDate ?? null;
325
+ if (parsed.notes !== void 0) record.notes = parsed.notes ?? null;
326
+ }
327
+ ]
328
+ });
329
+ if (record.status === "completed" && !wasCompleted) {
330
+ await emitEudrLifecycleEvent(ctx.container, "eudr.mitigation_action.completed", {
331
+ id: record.id,
332
+ tenantId: record.tenantId,
333
+ organizationId: record.organizationId,
334
+ title: record.title,
335
+ riskAssessmentId: record.riskAssessmentId
336
+ });
337
+ }
338
+ return { entityId: record.id, updatedAt: record.updatedAt };
339
+ },
340
+ captureAfter: async (_rawInput, result, ctx) => {
341
+ const entityManager = ctx.container.resolve("em").fork();
342
+ return loadMitigationActionSnapshot(entityManager, result.entityId);
343
+ },
344
+ buildLog: async ({ snapshots }) => {
345
+ const before = snapshots.before;
346
+ const after = snapshots.after;
347
+ if (!before) return null;
348
+ if (after && snapshotsEqual(before, after)) return { skipLog: true };
349
+ const { translate } = await resolveTranslations();
350
+ return {
351
+ actionLabel: translate("eudr.audit.mitigation_actions.update", "Update EUDR mitigation action"),
352
+ resourceKind: "eudr.mitigation_action",
353
+ resourceId: before.id,
354
+ tenantId: before.tenantId,
355
+ organizationId: before.organizationId,
356
+ snapshotBefore: before,
357
+ snapshotAfter: after ?? null,
358
+ payload: {
359
+ undo: { before, after: after ?? null }
360
+ }
361
+ };
362
+ },
363
+ undo: async ({ logEntry, ctx }) => {
364
+ const payload = extractUndoPayload(logEntry);
365
+ const before = payload?.before;
366
+ if (!before) return;
367
+ const entityManager = ctx.container.resolve("em").fork();
368
+ let record = await findMitigationAction(entityManager, before.id);
369
+ if (!record) {
370
+ record = entityManager.create(EudrMitigationAction, mitigationActionSeedFromSnapshot(before));
371
+ entityManager.persist(record);
372
+ } else {
373
+ ensureTenantScope(ctx, before.tenantId);
374
+ ensureOrganizationScope(ctx, before.organizationId);
375
+ restoreMitigationAction(record, before);
376
+ }
377
+ await entityManager.flush();
378
+ const dataEngine = ctx.container.resolve("dataEngine");
379
+ const resetValues = buildCustomFieldResetMap(before.custom ?? void 0, payload?.after?.custom ?? void 0);
380
+ await setMitigationActionCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues);
381
+ await emitCrudUndoSideEffects({
382
+ dataEngine,
383
+ action: "updated",
384
+ entity: record,
385
+ identifiers: {
386
+ id: record.id,
387
+ organizationId: record.organizationId,
388
+ tenantId: record.tenantId
389
+ },
390
+ indexer: mitigationActionCrudIndexer,
391
+ events: mitigationActionCrudEvents
392
+ });
393
+ }
394
+ };
395
+ const deleteMitigationActionCommand = {
396
+ id: "eudr.mitigation_actions.delete",
397
+ async prepare(input, ctx) {
398
+ const entityId = requireId(input, "eudr.errors.mitigationActionIdRequired");
399
+ const entityManager = ctx.container.resolve("em").fork();
400
+ const snapshot = await loadMitigationActionSnapshot(entityManager, entityId);
401
+ if (snapshot) {
402
+ ensureTenantScope(ctx, snapshot.tenantId);
403
+ ensureOrganizationScope(ctx, snapshot.organizationId);
404
+ }
405
+ return snapshot ? { before: snapshot } : {};
406
+ },
407
+ async execute(input, ctx) {
408
+ const entityId = requireId(input, "eudr.errors.mitigationActionIdRequired");
409
+ const entityManager = ctx.container.resolve("em").fork();
410
+ const record = await findMitigationAction(entityManager, entityId, false);
411
+ if (!record) throw new CrudHttpError(404, { error: "eudr.errors.mitigationActionNotFound" });
412
+ ensureTenantScope(ctx, record.tenantId);
413
+ ensureOrganizationScope(ctx, record.organizationId);
414
+ const snapshot = await loadMitigationActionSnapshot(entityManager, entityId);
415
+ record.deletedAt = /* @__PURE__ */ new Date();
416
+ await entityManager.flush();
417
+ const dataEngine = ctx.container.resolve("dataEngine");
418
+ if (snapshot?.custom) {
419
+ const resetValues = buildCustomFieldResetMap(snapshot.custom, void 0);
420
+ await setMitigationActionCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues);
421
+ }
422
+ await emitCrudSideEffects({
423
+ dataEngine,
424
+ action: "deleted",
425
+ entity: record,
426
+ identifiers: {
427
+ id: record.id,
428
+ organizationId: record.organizationId,
429
+ tenantId: record.tenantId
430
+ },
431
+ indexer: mitigationActionCrudIndexer,
432
+ events: mitigationActionCrudEvents
433
+ });
434
+ return { entityId: record.id, updatedAt: record.updatedAt };
435
+ },
436
+ buildLog: async ({ snapshots }) => {
437
+ const before = snapshots.before;
438
+ if (!before) return null;
439
+ const { translate } = await resolveTranslations();
440
+ return {
441
+ actionLabel: translate("eudr.audit.mitigation_actions.delete", "Delete EUDR mitigation action"),
442
+ resourceKind: "eudr.mitigation_action",
443
+ resourceId: before.id,
444
+ tenantId: before.tenantId,
445
+ organizationId: before.organizationId,
446
+ snapshotBefore: before,
447
+ payload: {
448
+ undo: { before }
449
+ }
450
+ };
451
+ },
452
+ undo: async ({ logEntry, ctx }) => {
453
+ const payload = extractUndoPayload(logEntry);
454
+ const before = payload?.before;
455
+ if (!before) return;
456
+ const entityManager = ctx.container.resolve("em").fork();
457
+ let record = await findMitigationAction(entityManager, before.id);
458
+ if (!record) {
459
+ record = entityManager.create(EudrMitigationAction, mitigationActionSeedFromSnapshot(before));
460
+ entityManager.persist(record);
461
+ } else {
462
+ ensureTenantScope(ctx, before.tenantId);
463
+ ensureOrganizationScope(ctx, before.organizationId);
464
+ restoreMitigationAction(record, before);
465
+ }
466
+ await entityManager.flush();
467
+ const dataEngine = ctx.container.resolve("dataEngine");
468
+ if (before.custom) {
469
+ await setMitigationActionCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom);
470
+ }
471
+ await emitCrudUndoSideEffects({
472
+ dataEngine,
473
+ action: "created",
474
+ entity: record,
475
+ identifiers: {
476
+ id: record.id,
477
+ organizationId: record.organizationId,
478
+ tenantId: record.tenantId
479
+ },
480
+ indexer: mitigationActionCrudIndexer,
481
+ events: mitigationActionCrudEvents
482
+ });
483
+ }
484
+ };
485
+ registerCommand(createMitigationActionCommand);
486
+ registerCommand(updateMitigationActionCommand);
487
+ registerCommand(deleteMitigationActionCommand);
488
+ //# sourceMappingURL=mitigation-actions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/eudr/commands/mitigation-actions.ts"],
4
+ "sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { RequiredEntityData } from '@mikro-orm/core'\nimport {\n parseWithCustomFields,\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n requireId,\n setCustomFieldsIfAny,\n snapshotsEqual,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport { runCrudCommandWrite } from '@open-mercato/shared/lib/commands/runCrudCommandWrite'\nimport { ensureOrganizationScope, ensureTenantScope } from '@open-mercato/shared/lib/commands/scope'\nimport { emitEudrLifecycleEvent } from './lifecycle-events'\nimport {\n loadCustomFieldSnapshot,\n buildCustomFieldResetMap,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport type { CrudEventsConfig, CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { E } from '#generated/entities.ids.generated'\nimport { randomUUID } from 'crypto'\nimport { z } from 'zod'\nimport { EudrMitigationAction, EudrRiskAssessment } from '../data/entities'\nimport {\n mitigationActionCreateSchema,\n mitigationActionUpdateSchema,\n type MitigationActionCreateInput,\n type MitigationActionUpdateInput,\n} from '../data/validators'\n\nconst MITIGATION_ACTION_ENTITY_ID = 'eudr:eudr_mitigation_action'\n\ntype ScopedCommandInput = {\n tenantId: string\n organizationId: string\n}\n\ntype MitigationActionSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n riskAssessmentId: string\n actionType: string\n title: string\n description: string | null\n status: string\n dueDate: string | null\n completedAt: string | null\n notes: string | null\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n custom?: Record<string, unknown> | null\n}\n\ntype MitigationActionUndoPayload = {\n before?: MitigationActionSnapshot | null\n after?: MitigationActionSnapshot | null\n}\n\ntype ScopedMitigationActionCreateInput = MitigationActionCreateInput & ScopedCommandInput\ntype ScopedMitigationActionUpdateInput = MitigationActionUpdateInput & Partial<ScopedCommandInput>\n\ntype MitigationActionCommandResult = {\n entityId: string\n updatedAt?: Date\n}\n\nconst scopedCommandInputSchema = z.object({\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n})\n\nconst mitigationActionCrudIndexer: CrudIndexerConfig<EudrMitigationAction> = {\n entityType: E.eudr.eudr_mitigation_action,\n}\n\nconst mitigationActionCrudEvents: CrudEventsConfig<EudrMitigationAction> = {\n module: 'eudr',\n entity: 'mitigation_action',\n persistent: true,\n buildPayload: (emitContext) => ({\n id: emitContext.identifiers.id,\n entityId: emitContext.entity?.id ?? emitContext.identifiers.id,\n organizationId: emitContext.identifiers.organizationId,\n tenantId: emitContext.identifiers.tenantId,\n }),\n}\n\nfunction parseScopedCommandInput(input: unknown): ScopedCommandInput {\n return scopedCommandInputSchema.parse(input)\n}\n\nfunction toDate(value: string | null): Date | null {\n return value ? new Date(value) : null\n}\n\nasync function requireRiskAssessmentInScope(\n em: EntityManager,\n riskAssessmentId: string,\n scope: ScopedCommandInput,\n): Promise<EudrRiskAssessment> {\n const assessment = await findOneWithDecryption(\n em,\n EudrRiskAssessment,\n {\n id: riskAssessmentId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n if (!assessment) throw new CrudHttpError(400, { error: 'eudr.errors.riskAssessmentNotFound' })\n return assessment\n}\n\nfunction mitigationActionSeedFromSnapshot(snapshot: MitigationActionSnapshot): RequiredEntityData<EudrMitigationAction> {\n return {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n riskAssessmentId: snapshot.riskAssessmentId,\n actionType: snapshot.actionType,\n title: snapshot.title,\n description: snapshot.description,\n status: snapshot.status,\n dueDate: toDate(snapshot.dueDate),\n completedAt: toDate(snapshot.completedAt),\n notes: snapshot.notes,\n createdAt: new Date(snapshot.createdAt),\n updatedAt: new Date(snapshot.updatedAt),\n deletedAt: toDate(snapshot.deletedAt),\n }\n}\n\nasync function findMitigationAction(\n em: EntityManager,\n entityId: string,\n includeDeleted = true,\n): Promise<EudrMitigationAction | null> {\n return includeDeleted\n ? findOneWithDecryption(em, EudrMitigationAction, { id: entityId })\n : findOneWithDecryption(em, EudrMitigationAction, { id: entityId, deletedAt: null })\n}\n\nasync function loadMitigationActionSnapshot(em: EntityManager, entityId: string): Promise<MitigationActionSnapshot | null> {\n const record = await findMitigationAction(em, entityId)\n if (!record) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: MITIGATION_ACTION_ENTITY_ID,\n recordId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n })\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n riskAssessmentId: record.riskAssessmentId,\n actionType: record.actionType,\n title: record.title,\n description: record.description ?? null,\n status: record.status,\n dueDate: record.dueDate ? record.dueDate.toISOString() : null,\n completedAt: record.completedAt ? record.completedAt.toISOString() : null,\n notes: record.notes ?? null,\n createdAt: record.createdAt.toISOString(),\n updatedAt: record.updatedAt.toISOString(),\n deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,\n custom: Object.keys(custom).length ? custom : null,\n }\n}\n\nfunction restoreMitigationAction(record: EudrMitigationAction, snapshot: MitigationActionSnapshot): void {\n record.organizationId = snapshot.organizationId\n record.tenantId = snapshot.tenantId\n record.riskAssessmentId = snapshot.riskAssessmentId\n record.actionType = snapshot.actionType\n record.title = snapshot.title\n record.description = snapshot.description\n record.status = snapshot.status\n record.dueDate = toDate(snapshot.dueDate)\n record.completedAt = toDate(snapshot.completedAt)\n record.notes = snapshot.notes\n record.createdAt = new Date(snapshot.createdAt)\n record.updatedAt = new Date(snapshot.updatedAt)\n record.deletedAt = toDate(snapshot.deletedAt)\n}\n\nasync function setMitigationActionCustomFields(\n dataEngine: DataEngine,\n entityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>,\n): Promise<void> {\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: MITIGATION_ACTION_ENTITY_ID,\n recordId: entityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\nconst createMitigationActionCommand: CommandHandler<ScopedMitigationActionCreateInput, MitigationActionCommandResult> = {\n id: 'eudr.mitigation_actions.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(mitigationActionCreateSchema, rawInput)\n const scope = parseScopedCommandInput(rawInput)\n ensureTenantScope(ctx, scope.tenantId)\n ensureOrganizationScope(ctx, scope.organizationId)\n\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record!: EudrMitigationAction\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: MITIGATION_ACTION_ENTITY_ID,\n action: 'created',\n scope,\n customFields: custom,\n events: mitigationActionCrudEvents,\n indexer: mitigationActionCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n async () => {\n await requireRiskAssessmentInScope(entityManager, parsed.riskAssessmentId, scope)\n const status = parsed.status ?? 'planned'\n record = entityManager.create(EudrMitigationAction, {\n id: randomUUID(),\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n riskAssessmentId: parsed.riskAssessmentId,\n actionType: parsed.actionType ?? 'other',\n title: parsed.title,\n description: parsed.description ?? null,\n status,\n dueDate: parsed.dueDate ?? null,\n completedAt: status === 'completed' ? new Date() : null,\n notes: parsed.notes ?? null,\n })\n entityManager.persist(record)\n },\n ],\n })\n\n if (record.status === 'completed') {\n await emitEudrLifecycleEvent(ctx.container, 'eudr.mitigation_action.completed', {\n id: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n title: record.title,\n riskAssessmentId: record.riskAssessmentId,\n })\n }\n\n return { entityId: record.id }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadMitigationActionSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const after = snapshots.after as MitigationActionSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.mitigation_actions.create', 'Create EUDR mitigation action'),\n resourceKind: 'eudr.mitigation_action',\n resourceId: after.id,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: {\n undo: { after } satisfies MitigationActionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<MitigationActionUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await findMitigationAction(entityManager, after.id)\n if (!record) return\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(undefined, after.custom ?? undefined)\n await setMitigationActionCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: mitigationActionCrudIndexer,\n events: mitigationActionCrudEvents,\n })\n },\n redo: makeCreateRedo<EudrMitigationAction, MitigationActionSnapshot, ScopedMitigationActionCreateInput, MitigationActionCommandResult>({\n entityClass: EudrMitigationAction,\n seedFromSnapshot: mitigationActionSeedFromSnapshot,\n buildResult: (entity) => ({ entityId: entity.id }),\n indexer: mitigationActionCrudIndexer,\n events: mitigationActionCrudEvents,\n findRow: ({ em, id }) => findMitigationAction(em, id),\n afterRestore: async ({ ctx, entity, snapshot }) => {\n if (!snapshot.custom || !Object.keys(snapshot.custom).length) return\n await setMitigationActionCustomFields(\n ctx.container.resolve('dataEngine') as DataEngine,\n entity.id,\n entity.organizationId,\n entity.tenantId,\n snapshot.custom,\n )\n },\n }),\n}\n\nconst updateMitigationActionCommand: CommandHandler<ScopedMitigationActionUpdateInput, MitigationActionCommandResult> = {\n id: 'eudr.mitigation_actions.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(mitigationActionUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadMitigationActionSnapshot(entityManager, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(mitigationActionUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await findMitigationAction(entityManager, parsed.id, false)\n if (!record) throw new CrudHttpError(404, { error: 'eudr.errors.mitigationActionNotFound' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n const scope = { tenantId: record.tenantId, organizationId: record.organizationId }\n const wasCompleted = record.status === 'completed'\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: MITIGATION_ACTION_ENTITY_ID,\n action: 'updated',\n scope,\n customFields: custom,\n events: mitigationActionCrudEvents,\n indexer: mitigationActionCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n async () => {\n const nextRiskAssessmentId = parsed.riskAssessmentId ?? record.riskAssessmentId\n await requireRiskAssessmentInScope(entityManager, nextRiskAssessmentId, scope)\n if (parsed.riskAssessmentId !== undefined) record.riskAssessmentId = parsed.riskAssessmentId\n if (parsed.actionType !== undefined) record.actionType = parsed.actionType ?? 'other'\n if (parsed.title !== undefined) record.title = parsed.title\n if (parsed.description !== undefined) record.description = parsed.description ?? null\n if (parsed.status !== undefined) {\n const previousStatus = record.status\n record.status = parsed.status\n if (record.status === 'completed' && previousStatus !== 'completed') {\n record.completedAt = new Date()\n } else if (record.status !== 'completed') {\n record.completedAt = null\n }\n }\n if (parsed.dueDate !== undefined) record.dueDate = parsed.dueDate ?? null\n if (parsed.notes !== undefined) record.notes = parsed.notes ?? null\n },\n ],\n })\n\n if (record.status === 'completed' && !wasCompleted) {\n await emitEudrLifecycleEvent(ctx.container, 'eudr.mitigation_action.completed', {\n id: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n title: record.title,\n riskAssessmentId: record.riskAssessmentId,\n })\n }\n\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadMitigationActionSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as MitigationActionSnapshot | undefined\n const after = snapshots.after as MitigationActionSnapshot | undefined\n if (!before) return null\n if (after && snapshotsEqual(before, after)) return { skipLog: true }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.mitigation_actions.update', 'Update EUDR mitigation action'),\n resourceKind: 'eudr.mitigation_action',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: { before, after: after ?? null } satisfies MitigationActionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<MitigationActionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await findMitigationAction(entityManager, before.id)\n if (!record) {\n record = entityManager.create(EudrMitigationAction, mitigationActionSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreMitigationAction(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(before.custom ?? undefined, payload?.after?.custom ?? undefined)\n await setMitigationActionCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'updated',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: mitigationActionCrudIndexer,\n events: mitigationActionCrudEvents,\n })\n },\n}\n\nconst deleteMitigationActionCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, MitigationActionCommandResult> = {\n id: 'eudr.mitigation_actions.delete',\n async prepare(input, ctx) {\n const entityId = requireId(input, 'eudr.errors.mitigationActionIdRequired')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadMitigationActionSnapshot(entityManager, entityId)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const entityId = requireId(input, 'eudr.errors.mitigationActionIdRequired')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await findMitigationAction(entityManager, entityId, false)\n if (!record) throw new CrudHttpError(404, { error: 'eudr.errors.mitigationActionNotFound' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n\n const snapshot = await loadMitigationActionSnapshot(entityManager, entityId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (snapshot?.custom) {\n const resetValues = buildCustomFieldResetMap(snapshot.custom, undefined)\n await setMitigationActionCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues)\n }\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: mitigationActionCrudIndexer,\n events: mitigationActionCrudEvents,\n })\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as MitigationActionSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.mitigation_actions.delete', 'Delete EUDR mitigation action'),\n resourceKind: 'eudr.mitigation_action',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: { before } satisfies MitigationActionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<MitigationActionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await findMitigationAction(entityManager, before.id)\n if (!record) {\n record = entityManager.create(EudrMitigationAction, mitigationActionSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreMitigationAction(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (before.custom) {\n await setMitigationActionCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom)\n }\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'created',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: mitigationActionCrudIndexer,\n events: mitigationActionCrudEvents,\n })\n },\n}\n\nregisterCommand(createMitigationActionCommand)\nregisterCommand(updateMitigationActionCommand)\nregisterCommand(deleteMitigationActionCommand)\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }