@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,599 @@
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, findWithDecryption } 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 {
26
+ EudrDueDiligenceStatement,
27
+ EudrEvidenceSubmission,
28
+ EudrMitigationAction,
29
+ EudrRiskAssessment
30
+ } from "../data/entities.js";
31
+ import {
32
+ riskAssessmentCreateSchema,
33
+ riskAssessmentUpdateSchema
34
+ } from "../data/validators.js";
35
+ import { getCountryRiskTier } from "../lib/reference-data.js";
36
+ const RISK_ASSESSMENT_ENTITY_ID = "eudr:eudr_risk_assessment";
37
+ const scopedCommandInputSchema = z.object({
38
+ tenantId: z.string().uuid(),
39
+ organizationId: z.string().uuid()
40
+ });
41
+ const riskAssessmentCrudIndexer = {
42
+ entityType: E.eudr.eudr_risk_assessment
43
+ };
44
+ const riskAssessmentCrudEvents = {
45
+ module: "eudr",
46
+ entity: "risk_assessment",
47
+ persistent: true,
48
+ buildPayload: (emitContext) => ({
49
+ id: emitContext.identifiers.id,
50
+ entityId: emitContext.entity?.id ?? emitContext.identifiers.id,
51
+ organizationId: emitContext.identifiers.organizationId,
52
+ tenantId: emitContext.identifiers.tenantId
53
+ })
54
+ };
55
+ function parseScopedCommandInput(input) {
56
+ return scopedCommandInputSchema.parse(input);
57
+ }
58
+ function toDate(value) {
59
+ return value ? new Date(value) : null;
60
+ }
61
+ function cloneCountryRisks(value) {
62
+ return value.map((risk) => ({ country: risk.country, tier: risk.tier }));
63
+ }
64
+ function cloneCriteria(value) {
65
+ return Object.fromEntries(
66
+ Object.entries(value).map(([key, entry]) => [
67
+ key,
68
+ {
69
+ answer: entry.answer,
70
+ ...entry.note !== void 0 ? { note: entry.note } : {}
71
+ }
72
+ ])
73
+ );
74
+ }
75
+ function defaultReviewDueAt(assessedAt) {
76
+ return new Date(Date.UTC(
77
+ assessedAt.getUTCFullYear() + 1,
78
+ assessedAt.getUTCMonth(),
79
+ assessedAt.getUTCDate()
80
+ ));
81
+ }
82
+ function assertNotFuture(date, errorKey) {
83
+ if (date.getTime() > Date.now()) {
84
+ throw new CrudHttpError(400, { error: errorKey });
85
+ }
86
+ }
87
+ function resolveActorDisplayName(ctx) {
88
+ const auth = ctx.auth;
89
+ if (!auth) return null;
90
+ const record = auth;
91
+ for (const key of ["displayName", "name", "email"]) {
92
+ const value = record[key];
93
+ if (typeof value === "string" && value.trim().length > 0) return value.trim();
94
+ }
95
+ return null;
96
+ }
97
+ function hasConcernAnswer(criteria) {
98
+ return Object.values(criteria).some((entry) => entry.answer === "concern");
99
+ }
100
+ function computeOverallTier(countryRisks) {
101
+ if (countryRisks.length === 0) return "unknown";
102
+ const tiers = countryRisks.map((risk) => risk.tier);
103
+ if (tiers.includes("unknown")) return "unknown";
104
+ if (tiers.includes("high")) return "high";
105
+ const uniqueTiers = new Set(tiers);
106
+ if (uniqueTiers.size > 1) return "mixed";
107
+ return tiers[0] ?? "unknown";
108
+ }
109
+ async function requireStatementInScope(em, statementId, scope) {
110
+ const statement = await em.findOne(EudrDueDiligenceStatement, {
111
+ id: statementId,
112
+ tenantId: scope.tenantId,
113
+ organizationId: scope.organizationId,
114
+ deletedAt: null
115
+ });
116
+ if (!statement) throw new CrudHttpError(400, { error: "eudr.errors.statementNotFound" });
117
+ return statement;
118
+ }
119
+ async function computeRiskSummary(em, statementId, scope) {
120
+ const submissions = await findWithDecryption(
121
+ em,
122
+ EudrEvidenceSubmission,
123
+ {
124
+ statementId,
125
+ tenantId: scope.tenantId,
126
+ organizationId: scope.organizationId,
127
+ deletedAt: null
128
+ },
129
+ void 0,
130
+ scope
131
+ );
132
+ const countries = Array.from(
133
+ new Set(
134
+ submissions.map((submission) => submission.originCountry?.trim().toUpperCase() ?? "").filter((country) => country.length > 0)
135
+ )
136
+ ).sort((left, right) => left.localeCompare(right));
137
+ const countryRisks = countries.map((country) => ({
138
+ country,
139
+ tier: getCountryRiskTier(country)
140
+ }));
141
+ return {
142
+ countryRisks,
143
+ overallTier: computeOverallTier(countryRisks),
144
+ isSimplified: countryRisks.length > 0 && countryRisks.every((risk) => risk.tier === "low")
145
+ };
146
+ }
147
+ async function assertCompletedMitigationIfRequired(em, assessmentId, scope, criteria, conclusion) {
148
+ if (conclusion !== "negligible" || !hasConcernAnswer(criteria)) return;
149
+ const completedCount = await em.count(EudrMitigationAction, {
150
+ riskAssessmentId: assessmentId,
151
+ tenantId: scope.tenantId,
152
+ organizationId: scope.organizationId,
153
+ status: "completed",
154
+ deletedAt: null
155
+ });
156
+ if (completedCount < 1) {
157
+ throw new CrudHttpError(400, { error: "eudr.errors.mitigationRequired" });
158
+ }
159
+ }
160
+ function riskAssessmentSeedFromSnapshot(snapshot) {
161
+ return {
162
+ id: snapshot.id,
163
+ organizationId: snapshot.organizationId,
164
+ tenantId: snapshot.tenantId,
165
+ statementId: snapshot.statementId,
166
+ countryRisks: cloneCountryRisks(snapshot.countryRisks),
167
+ overallTier: snapshot.overallTier,
168
+ criteria: cloneCriteria(snapshot.criteria),
169
+ conclusion: snapshot.conclusion,
170
+ isSimplified: snapshot.isSimplified,
171
+ assessedAt: new Date(snapshot.assessedAt),
172
+ assessedByName: snapshot.assessedByName,
173
+ reviewDueAt: toDate(snapshot.reviewDueAt),
174
+ notes: snapshot.notes,
175
+ createdAt: new Date(snapshot.createdAt),
176
+ updatedAt: new Date(snapshot.updatedAt),
177
+ deletedAt: toDate(snapshot.deletedAt)
178
+ };
179
+ }
180
+ async function findRiskAssessment(em, entityId, includeDeleted = true) {
181
+ return includeDeleted ? findOneWithDecryption(em, EudrRiskAssessment, { id: entityId }) : findOneWithDecryption(em, EudrRiskAssessment, { id: entityId, deletedAt: null });
182
+ }
183
+ async function loadRiskAssessmentSnapshot(em, entityId) {
184
+ const record = await findRiskAssessment(em, entityId);
185
+ if (!record) return null;
186
+ const custom = await loadCustomFieldSnapshot(em, {
187
+ entityId: RISK_ASSESSMENT_ENTITY_ID,
188
+ recordId: record.id,
189
+ tenantId: record.tenantId,
190
+ organizationId: record.organizationId
191
+ });
192
+ return {
193
+ id: record.id,
194
+ organizationId: record.organizationId,
195
+ tenantId: record.tenantId,
196
+ statementId: record.statementId,
197
+ countryRisks: cloneCountryRisks(record.countryRisks),
198
+ overallTier: record.overallTier,
199
+ criteria: cloneCriteria(record.criteria),
200
+ conclusion: record.conclusion,
201
+ isSimplified: record.isSimplified,
202
+ assessedAt: record.assessedAt.toISOString(),
203
+ assessedByName: record.assessedByName ?? null,
204
+ reviewDueAt: record.reviewDueAt ? record.reviewDueAt.toISOString() : null,
205
+ notes: record.notes ?? null,
206
+ createdAt: record.createdAt.toISOString(),
207
+ updatedAt: record.updatedAt.toISOString(),
208
+ deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,
209
+ custom: Object.keys(custom).length ? custom : null
210
+ };
211
+ }
212
+ function restoreRiskAssessment(record, snapshot) {
213
+ record.organizationId = snapshot.organizationId;
214
+ record.tenantId = snapshot.tenantId;
215
+ record.statementId = snapshot.statementId;
216
+ record.countryRisks = cloneCountryRisks(snapshot.countryRisks);
217
+ record.overallTier = snapshot.overallTier;
218
+ record.criteria = cloneCriteria(snapshot.criteria);
219
+ record.conclusion = snapshot.conclusion;
220
+ record.isSimplified = snapshot.isSimplified;
221
+ record.assessedAt = new Date(snapshot.assessedAt);
222
+ record.assessedByName = snapshot.assessedByName;
223
+ record.reviewDueAt = toDate(snapshot.reviewDueAt);
224
+ record.notes = snapshot.notes;
225
+ record.createdAt = new Date(snapshot.createdAt);
226
+ record.updatedAt = new Date(snapshot.updatedAt);
227
+ record.deletedAt = toDate(snapshot.deletedAt);
228
+ }
229
+ async function setRiskAssessmentCustomFields(dataEngine, entityId, organizationId, tenantId, values) {
230
+ await setCustomFieldsIfAny({
231
+ dataEngine,
232
+ entityId: RISK_ASSESSMENT_ENTITY_ID,
233
+ recordId: entityId,
234
+ organizationId,
235
+ tenantId,
236
+ values,
237
+ notify: false
238
+ });
239
+ }
240
+ const createRiskAssessmentCommand = {
241
+ id: "eudr.risk_assessments.create",
242
+ async execute(rawInput, ctx) {
243
+ const { parsed, custom } = parseWithCustomFields(riskAssessmentCreateSchema, rawInput);
244
+ const scope = parseScopedCommandInput(rawInput);
245
+ ensureTenantScope(ctx, scope.tenantId);
246
+ ensureOrganizationScope(ctx, scope.organizationId);
247
+ const entityManager = ctx.container.resolve("em").fork();
248
+ let record;
249
+ let statementTitle = "";
250
+ await runCrudCommandWrite({
251
+ ctx,
252
+ em: entityManager,
253
+ entityId: RISK_ASSESSMENT_ENTITY_ID,
254
+ action: "created",
255
+ scope,
256
+ customFields: custom,
257
+ events: riskAssessmentCrudEvents,
258
+ indexer: riskAssessmentCrudIndexer,
259
+ sideEffect: () => ({
260
+ entity: record,
261
+ identifiers: {
262
+ id: record.id,
263
+ organizationId: record.organizationId,
264
+ tenantId: record.tenantId
265
+ }
266
+ }),
267
+ phases: [
268
+ async () => {
269
+ const statement = await requireStatementInScope(entityManager, parsed.statementId, scope);
270
+ statementTitle = statement.title;
271
+ const summary = await computeRiskSummary(entityManager, parsed.statementId, scope);
272
+ const assessedAt = parsed.assessedAt ?? /* @__PURE__ */ new Date();
273
+ assertNotFuture(assessedAt, "eudr.errors.assessedAtInFuture");
274
+ if (parsed.conclusion === "negligible" && hasConcernAnswer(parsed.criteria)) {
275
+ throw new CrudHttpError(400, { error: "eudr.errors.mitigationRequired" });
276
+ }
277
+ record = entityManager.create(EudrRiskAssessment, {
278
+ id: randomUUID(),
279
+ organizationId: scope.organizationId,
280
+ tenantId: scope.tenantId,
281
+ statementId: parsed.statementId,
282
+ countryRisks: summary.countryRisks,
283
+ overallTier: summary.overallTier,
284
+ criteria: cloneCriteria(parsed.criteria),
285
+ conclusion: parsed.conclusion,
286
+ isSimplified: summary.isSimplified,
287
+ assessedAt,
288
+ assessedByName: resolveActorDisplayName(ctx),
289
+ reviewDueAt: parsed.reviewDueAt ?? defaultReviewDueAt(assessedAt),
290
+ notes: parsed.notes ?? null
291
+ });
292
+ entityManager.persist(record);
293
+ }
294
+ ]
295
+ });
296
+ await emitEudrLifecycleEvent(ctx.container, "eudr.risk_assessment.concluded", {
297
+ id: record.id,
298
+ tenantId: record.tenantId,
299
+ organizationId: record.organizationId,
300
+ statementId: record.statementId,
301
+ statementTitle,
302
+ conclusion: record.conclusion
303
+ });
304
+ return { entityId: record.id };
305
+ },
306
+ captureAfter: async (_rawInput, result, ctx) => {
307
+ const entityManager = ctx.container.resolve("em").fork();
308
+ return loadRiskAssessmentSnapshot(entityManager, result.entityId);
309
+ },
310
+ buildLog: async ({ snapshots }) => {
311
+ const after = snapshots.after;
312
+ if (!after) return null;
313
+ const { translate } = await resolveTranslations();
314
+ return {
315
+ actionLabel: translate("eudr.audit.risk_assessments.create", "Create EUDR risk assessment"),
316
+ resourceKind: "eudr.risk_assessment",
317
+ resourceId: after.id,
318
+ tenantId: after.tenantId,
319
+ organizationId: after.organizationId,
320
+ snapshotAfter: after,
321
+ payload: {
322
+ undo: { after }
323
+ }
324
+ };
325
+ },
326
+ undo: async ({ logEntry, ctx }) => {
327
+ const payload = extractUndoPayload(logEntry);
328
+ const after = payload?.after;
329
+ if (!after) return;
330
+ const entityManager = ctx.container.resolve("em").fork();
331
+ const record = await findRiskAssessment(entityManager, after.id);
332
+ if (!record) return;
333
+ ensureTenantScope(ctx, record.tenantId);
334
+ ensureOrganizationScope(ctx, record.organizationId);
335
+ record.deletedAt = /* @__PURE__ */ new Date();
336
+ await entityManager.flush();
337
+ const dataEngine = ctx.container.resolve("dataEngine");
338
+ const resetValues = buildCustomFieldResetMap(void 0, after.custom ?? void 0);
339
+ await setRiskAssessmentCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues);
340
+ await emitCrudUndoSideEffects({
341
+ dataEngine,
342
+ action: "deleted",
343
+ entity: record,
344
+ identifiers: {
345
+ id: record.id,
346
+ organizationId: record.organizationId,
347
+ tenantId: record.tenantId
348
+ },
349
+ indexer: riskAssessmentCrudIndexer,
350
+ events: riskAssessmentCrudEvents
351
+ });
352
+ },
353
+ redo: makeCreateRedo({
354
+ entityClass: EudrRiskAssessment,
355
+ seedFromSnapshot: riskAssessmentSeedFromSnapshot,
356
+ buildResult: (entity) => ({ entityId: entity.id }),
357
+ indexer: riskAssessmentCrudIndexer,
358
+ events: riskAssessmentCrudEvents,
359
+ findRow: ({ em, id }) => findRiskAssessment(em, id),
360
+ afterRestore: async ({ ctx, entity, snapshot }) => {
361
+ if (!snapshot.custom || !Object.keys(snapshot.custom).length) return;
362
+ await setRiskAssessmentCustomFields(
363
+ ctx.container.resolve("dataEngine"),
364
+ entity.id,
365
+ entity.organizationId,
366
+ entity.tenantId,
367
+ snapshot.custom
368
+ );
369
+ }
370
+ })
371
+ };
372
+ const updateRiskAssessmentCommand = {
373
+ id: "eudr.risk_assessments.update",
374
+ async prepare(rawInput, ctx) {
375
+ const { parsed } = parseWithCustomFields(riskAssessmentUpdateSchema, rawInput);
376
+ const entityManager = ctx.container.resolve("em").fork();
377
+ const snapshot = await loadRiskAssessmentSnapshot(entityManager, parsed.id);
378
+ if (snapshot) {
379
+ ensureTenantScope(ctx, snapshot.tenantId);
380
+ ensureOrganizationScope(ctx, snapshot.organizationId);
381
+ }
382
+ return snapshot ? { before: snapshot } : {};
383
+ },
384
+ async execute(rawInput, ctx) {
385
+ const { parsed, custom } = parseWithCustomFields(riskAssessmentUpdateSchema, rawInput);
386
+ const entityManager = ctx.container.resolve("em").fork();
387
+ const record = await findRiskAssessment(entityManager, parsed.id, false);
388
+ if (!record) throw new CrudHttpError(404, { error: "eudr.errors.riskAssessmentNotFound" });
389
+ ensureTenantScope(ctx, record.tenantId);
390
+ ensureOrganizationScope(ctx, record.organizationId);
391
+ const scope = { tenantId: record.tenantId, organizationId: record.organizationId };
392
+ const previousConclusion = record.conclusion;
393
+ let statementTitle = "";
394
+ await runCrudCommandWrite({
395
+ ctx,
396
+ em: entityManager,
397
+ entityId: RISK_ASSESSMENT_ENTITY_ID,
398
+ action: "updated",
399
+ scope,
400
+ customFields: custom,
401
+ events: riskAssessmentCrudEvents,
402
+ indexer: riskAssessmentCrudIndexer,
403
+ sideEffect: () => ({
404
+ entity: record,
405
+ identifiers: {
406
+ id: record.id,
407
+ organizationId: record.organizationId,
408
+ tenantId: record.tenantId
409
+ }
410
+ }),
411
+ phases: [
412
+ async () => {
413
+ const nextStatementId = parsed.statementId ?? record.statementId;
414
+ const statement = await requireStatementInScope(entityManager, nextStatementId, scope);
415
+ statementTitle = statement.title;
416
+ const summary = await computeRiskSummary(entityManager, nextStatementId, scope);
417
+ const nextCriteria = parsed.criteria ? cloneCriteria(parsed.criteria) : cloneCriteria(record.criteria);
418
+ const nextConclusion = parsed.conclusion ?? record.conclusion;
419
+ const nextAssessedAt = parsed.assessedAt ?? record.assessedAt;
420
+ assertNotFuture(nextAssessedAt, "eudr.errors.assessedAtInFuture");
421
+ await assertCompletedMitigationIfRequired(entityManager, record.id, scope, nextCriteria, nextConclusion);
422
+ record.statementId = nextStatementId;
423
+ record.countryRisks = summary.countryRisks;
424
+ record.overallTier = summary.overallTier;
425
+ record.criteria = nextCriteria;
426
+ record.conclusion = nextConclusion;
427
+ record.isSimplified = summary.isSimplified;
428
+ record.assessedAt = nextAssessedAt;
429
+ record.assessedByName = resolveActorDisplayName(ctx);
430
+ if (parsed.reviewDueAt !== void 0) {
431
+ record.reviewDueAt = parsed.reviewDueAt;
432
+ } else if (parsed.assessedAt !== void 0 || !record.reviewDueAt) {
433
+ record.reviewDueAt = defaultReviewDueAt(nextAssessedAt);
434
+ }
435
+ if (parsed.notes !== void 0) record.notes = parsed.notes ?? null;
436
+ }
437
+ ]
438
+ });
439
+ if (record.conclusion !== previousConclusion) {
440
+ await emitEudrLifecycleEvent(ctx.container, "eudr.risk_assessment.concluded", {
441
+ id: record.id,
442
+ tenantId: record.tenantId,
443
+ organizationId: record.organizationId,
444
+ statementId: record.statementId,
445
+ statementTitle,
446
+ conclusion: record.conclusion
447
+ });
448
+ }
449
+ return { entityId: record.id, updatedAt: record.updatedAt };
450
+ },
451
+ captureAfter: async (_rawInput, result, ctx) => {
452
+ const entityManager = ctx.container.resolve("em").fork();
453
+ return loadRiskAssessmentSnapshot(entityManager, result.entityId);
454
+ },
455
+ buildLog: async ({ snapshots }) => {
456
+ const before = snapshots.before;
457
+ const after = snapshots.after;
458
+ if (!before) return null;
459
+ if (after && snapshotsEqual(before, after)) return { skipLog: true };
460
+ const { translate } = await resolveTranslations();
461
+ return {
462
+ actionLabel: translate("eudr.audit.risk_assessments.update", "Update EUDR risk assessment"),
463
+ resourceKind: "eudr.risk_assessment",
464
+ resourceId: before.id,
465
+ tenantId: before.tenantId,
466
+ organizationId: before.organizationId,
467
+ snapshotBefore: before,
468
+ snapshotAfter: after ?? null,
469
+ payload: {
470
+ undo: { before, after: after ?? null }
471
+ }
472
+ };
473
+ },
474
+ undo: async ({ logEntry, ctx }) => {
475
+ const payload = extractUndoPayload(logEntry);
476
+ const before = payload?.before;
477
+ if (!before) return;
478
+ const entityManager = ctx.container.resolve("em").fork();
479
+ let record = await findRiskAssessment(entityManager, before.id);
480
+ if (!record) {
481
+ record = entityManager.create(EudrRiskAssessment, riskAssessmentSeedFromSnapshot(before));
482
+ entityManager.persist(record);
483
+ } else {
484
+ ensureTenantScope(ctx, before.tenantId);
485
+ ensureOrganizationScope(ctx, before.organizationId);
486
+ restoreRiskAssessment(record, before);
487
+ }
488
+ await entityManager.flush();
489
+ const dataEngine = ctx.container.resolve("dataEngine");
490
+ const resetValues = buildCustomFieldResetMap(before.custom ?? void 0, payload?.after?.custom ?? void 0);
491
+ await setRiskAssessmentCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues);
492
+ await emitCrudUndoSideEffects({
493
+ dataEngine,
494
+ action: "updated",
495
+ entity: record,
496
+ identifiers: {
497
+ id: record.id,
498
+ organizationId: record.organizationId,
499
+ tenantId: record.tenantId
500
+ },
501
+ indexer: riskAssessmentCrudIndexer,
502
+ events: riskAssessmentCrudEvents
503
+ });
504
+ }
505
+ };
506
+ const deleteRiskAssessmentCommand = {
507
+ id: "eudr.risk_assessments.delete",
508
+ async prepare(input, ctx) {
509
+ const entityId = requireId(input, "eudr.errors.riskAssessmentIdRequired");
510
+ const entityManager = ctx.container.resolve("em").fork();
511
+ const snapshot = await loadRiskAssessmentSnapshot(entityManager, entityId);
512
+ if (snapshot) {
513
+ ensureTenantScope(ctx, snapshot.tenantId);
514
+ ensureOrganizationScope(ctx, snapshot.organizationId);
515
+ }
516
+ return snapshot ? { before: snapshot } : {};
517
+ },
518
+ async execute(input, ctx) {
519
+ const entityId = requireId(input, "eudr.errors.riskAssessmentIdRequired");
520
+ const entityManager = ctx.container.resolve("em").fork();
521
+ const record = await findRiskAssessment(entityManager, entityId, false);
522
+ if (!record) throw new CrudHttpError(404, { error: "eudr.errors.riskAssessmentNotFound" });
523
+ ensureTenantScope(ctx, record.tenantId);
524
+ ensureOrganizationScope(ctx, record.organizationId);
525
+ const snapshot = await loadRiskAssessmentSnapshot(entityManager, entityId);
526
+ record.deletedAt = /* @__PURE__ */ new Date();
527
+ await entityManager.flush();
528
+ const dataEngine = ctx.container.resolve("dataEngine");
529
+ if (snapshot?.custom) {
530
+ const resetValues = buildCustomFieldResetMap(snapshot.custom, void 0);
531
+ await setRiskAssessmentCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues);
532
+ }
533
+ await emitCrudSideEffects({
534
+ dataEngine,
535
+ action: "deleted",
536
+ entity: record,
537
+ identifiers: {
538
+ id: record.id,
539
+ organizationId: record.organizationId,
540
+ tenantId: record.tenantId
541
+ },
542
+ indexer: riskAssessmentCrudIndexer,
543
+ events: riskAssessmentCrudEvents
544
+ });
545
+ return { entityId: record.id, updatedAt: record.updatedAt };
546
+ },
547
+ buildLog: async ({ snapshots }) => {
548
+ const before = snapshots.before;
549
+ if (!before) return null;
550
+ const { translate } = await resolveTranslations();
551
+ return {
552
+ actionLabel: translate("eudr.audit.risk_assessments.delete", "Delete EUDR risk assessment"),
553
+ resourceKind: "eudr.risk_assessment",
554
+ resourceId: before.id,
555
+ tenantId: before.tenantId,
556
+ organizationId: before.organizationId,
557
+ snapshotBefore: before,
558
+ payload: {
559
+ undo: { before }
560
+ }
561
+ };
562
+ },
563
+ undo: async ({ logEntry, ctx }) => {
564
+ const payload = extractUndoPayload(logEntry);
565
+ const before = payload?.before;
566
+ if (!before) return;
567
+ const entityManager = ctx.container.resolve("em").fork();
568
+ let record = await findRiskAssessment(entityManager, before.id);
569
+ if (!record) {
570
+ record = entityManager.create(EudrRiskAssessment, riskAssessmentSeedFromSnapshot(before));
571
+ entityManager.persist(record);
572
+ } else {
573
+ ensureTenantScope(ctx, before.tenantId);
574
+ ensureOrganizationScope(ctx, before.organizationId);
575
+ restoreRiskAssessment(record, before);
576
+ }
577
+ await entityManager.flush();
578
+ const dataEngine = ctx.container.resolve("dataEngine");
579
+ if (before.custom) {
580
+ await setRiskAssessmentCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom);
581
+ }
582
+ await emitCrudUndoSideEffects({
583
+ dataEngine,
584
+ action: "created",
585
+ entity: record,
586
+ identifiers: {
587
+ id: record.id,
588
+ organizationId: record.organizationId,
589
+ tenantId: record.tenantId
590
+ },
591
+ indexer: riskAssessmentCrudIndexer,
592
+ events: riskAssessmentCrudEvents
593
+ });
594
+ }
595
+ };
596
+ registerCommand(createRiskAssessmentCommand);
597
+ registerCommand(updateRiskAssessmentCommand);
598
+ registerCommand(deleteRiskAssessmentCommand);
599
+ //# sourceMappingURL=risk-assessments.js.map