@open-mercato/core 0.6.8-develop.6925.1.cefa200fa4 → 0.6.8-develop.6931.1.4a1e1c786b

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 (405) 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/helpers/integration/ui.js +3 -0
  19. package/dist/helpers/integration/ui.js.map +2 -2
  20. package/dist/modules/attachments/fields/attachment.js +5 -1
  21. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  22. package/dist/modules/attachments/lib/crud.js +3 -1
  23. package/dist/modules/attachments/lib/crud.js.map +2 -2
  24. package/dist/modules/eudr/acl.js +43 -0
  25. package/dist/modules/eudr/acl.js.map +7 -0
  26. package/dist/modules/eudr/ai-agents.js +205 -0
  27. package/dist/modules/eudr/ai-agents.js.map +7 -0
  28. package/dist/modules/eudr/ai-tools/compliance-pack.js +495 -0
  29. package/dist/modules/eudr/ai-tools/compliance-pack.js.map +7 -0
  30. package/dist/modules/eudr/ai-tools/types.js +10 -0
  31. package/dist/modules/eudr/ai-tools/types.js.map +7 -0
  32. package/dist/modules/eudr/ai-tools.js +10 -0
  33. package/dist/modules/eudr/ai-tools.js.map +7 -0
  34. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +386 -0
  35. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +7 -0
  36. package/dist/modules/eudr/api/evidence-submissions/route.js +318 -0
  37. package/dist/modules/eudr/api/evidence-submissions/route.js.map +7 -0
  38. package/dist/modules/eudr/api/mitigation-actions/route.js +249 -0
  39. package/dist/modules/eudr/api/mitigation-actions/route.js.map +7 -0
  40. package/dist/modules/eudr/api/openapi.js +27 -0
  41. package/dist/modules/eudr/api/openapi.js.map +7 -0
  42. package/dist/modules/eudr/api/plots/import/route.js +294 -0
  43. package/dist/modules/eudr/api/plots/import/route.js.map +7 -0
  44. package/dist/modules/eudr/api/plots/route.js +279 -0
  45. package/dist/modules/eudr/api/plots/route.js.map +7 -0
  46. package/dist/modules/eudr/api/product-mappings/route.js +257 -0
  47. package/dist/modules/eudr/api/product-mappings/route.js.map +7 -0
  48. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +298 -0
  49. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +7 -0
  50. package/dist/modules/eudr/api/product-mappings/suggestions/route.js +132 -0
  51. package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +7 -0
  52. package/dist/modules/eudr/api/reports/annual/route.js +266 -0
  53. package/dist/modules/eudr/api/reports/annual/route.js.map +7 -0
  54. package/dist/modules/eudr/api/risk-assessments/route.js +300 -0
  55. package/dist/modules/eudr/api/risk-assessments/route.js.map +7 -0
  56. package/dist/modules/eudr/api/statements/[id]/export/route.js +631 -0
  57. package/dist/modules/eudr/api/statements/[id]/export/route.js.map +7 -0
  58. package/dist/modules/eudr/api/statements/[id]/readiness/route.js +111 -0
  59. package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +7 -0
  60. package/dist/modules/eudr/api/statements/route.js +314 -0
  61. package/dist/modules/eudr/api/statements/route.js.map +7 -0
  62. package/dist/modules/eudr/api/suppliers/compliance/route.js +173 -0
  63. package/dist/modules/eudr/api/suppliers/compliance/route.js.map +7 -0
  64. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +468 -0
  65. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +7 -0
  66. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +16 -0
  67. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +7 -0
  68. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +351 -0
  69. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +7 -0
  70. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +17 -0
  71. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +7 -0
  72. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +313 -0
  73. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +7 -0
  74. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +16 -0
  75. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +7 -0
  76. package/dist/modules/eudr/backend/eudr/page.js +360 -0
  77. package/dist/modules/eudr/backend/eudr/page.js.map +7 -0
  78. package/dist/modules/eudr/backend/eudr/page.meta.js +16 -0
  79. package/dist/modules/eudr/backend/eudr/page.meta.js.map +7 -0
  80. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +346 -0
  81. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +7 -0
  82. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +16 -0
  83. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +7 -0
  84. package/dist/modules/eudr/backend/eudr/plots/create/page.js +253 -0
  85. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +7 -0
  86. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +17 -0
  87. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +7 -0
  88. package/dist/modules/eudr/backend/eudr/plots/page.js +386 -0
  89. package/dist/modules/eudr/backend/eudr/plots/page.js.map +7 -0
  90. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +16 -0
  91. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +7 -0
  92. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +253 -0
  93. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +7 -0
  94. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +16 -0
  95. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +7 -0
  96. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +174 -0
  97. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +7 -0
  98. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +17 -0
  99. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +7 -0
  100. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +306 -0
  101. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +7 -0
  102. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +16 -0
  103. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +7 -0
  104. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +335 -0
  105. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +7 -0
  106. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +16 -0
  107. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +7 -0
  108. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +220 -0
  109. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +7 -0
  110. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +17 -0
  111. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +7 -0
  112. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +324 -0
  113. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +7 -0
  114. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +16 -0
  115. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +7 -0
  116. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +648 -0
  117. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +7 -0
  118. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +16 -0
  119. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +7 -0
  120. package/dist/modules/eudr/backend/eudr/statements/create/page.js +432 -0
  121. package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +7 -0
  122. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +17 -0
  123. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +7 -0
  124. package/dist/modules/eudr/backend/eudr/statements/page.js +309 -0
  125. package/dist/modules/eudr/backend/eudr/statements/page.js.map +7 -0
  126. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +16 -0
  127. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +7 -0
  128. package/dist/modules/eudr/ce.js +56 -0
  129. package/dist/modules/eudr/ce.js.map +7 -0
  130. package/dist/modules/eudr/commands/evidence-submissions.js +571 -0
  131. package/dist/modules/eudr/commands/evidence-submissions.js.map +7 -0
  132. package/dist/modules/eudr/commands/index.js +7 -0
  133. package/dist/modules/eudr/commands/index.js.map +7 -0
  134. package/dist/modules/eudr/commands/lifecycle-events.js +19 -0
  135. package/dist/modules/eudr/commands/lifecycle-events.js.map +7 -0
  136. package/dist/modules/eudr/commands/mitigation-actions.js +488 -0
  137. package/dist/modules/eudr/commands/mitigation-actions.js.map +7 -0
  138. package/dist/modules/eudr/commands/plots.js +517 -0
  139. package/dist/modules/eudr/commands/plots.js.map +7 -0
  140. package/dist/modules/eudr/commands/product-mappings.js +468 -0
  141. package/dist/modules/eudr/commands/product-mappings.js.map +7 -0
  142. package/dist/modules/eudr/commands/risk-assessments.js +599 -0
  143. package/dist/modules/eudr/commands/risk-assessments.js.map +7 -0
  144. package/dist/modules/eudr/commands/statements.js +747 -0
  145. package/dist/modules/eudr/commands/statements.js.map +7 -0
  146. package/dist/modules/eudr/components/CountrySelectField.js +64 -0
  147. package/dist/modules/eudr/components/CountrySelectField.js.map +7 -0
  148. package/dist/modules/eudr/components/GeometryInput.js +133 -0
  149. package/dist/modules/eudr/components/GeometryInput.js.map +7 -0
  150. package/dist/modules/eudr/components/MappingSuggestionsDialog.js +307 -0
  151. package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +7 -0
  152. package/dist/modules/eudr/components/MitigationActionsSection.js +345 -0
  153. package/dist/modules/eudr/components/MitigationActionsSection.js.map +7 -0
  154. package/dist/modules/eudr/components/OrderSelectField.js +88 -0
  155. package/dist/modules/eudr/components/OrderSelectField.js.map +7 -0
  156. package/dist/modules/eudr/components/PlotImportDialog.js +229 -0
  157. package/dist/modules/eudr/components/PlotImportDialog.js.map +7 -0
  158. package/dist/modules/eudr/components/PlotMapPreview.js +35 -0
  159. package/dist/modules/eudr/components/PlotMapPreview.js.map +7 -0
  160. package/dist/modules/eudr/components/PlotMapPreviewImpl.js +97 -0
  161. package/dist/modules/eudr/components/PlotMapPreviewImpl.js.map +7 -0
  162. package/dist/modules/eudr/components/PlotMultiSelectField.js +198 -0
  163. package/dist/modules/eudr/components/PlotMultiSelectField.js.map +7 -0
  164. package/dist/modules/eudr/components/RiskCriteriaField.js +128 -0
  165. package/dist/modules/eudr/components/RiskCriteriaField.js.map +7 -0
  166. package/dist/modules/eudr/components/StatementLifecycleBar.js +274 -0
  167. package/dist/modules/eudr/components/StatementLifecycleBar.js.map +7 -0
  168. package/dist/modules/eudr/components/StatementReadinessChecklist.js +56 -0
  169. package/dist/modules/eudr/components/StatementReadinessChecklist.js.map +7 -0
  170. package/dist/modules/eudr/components/StatementRiskSection.js +179 -0
  171. package/dist/modules/eudr/components/StatementRiskSection.js.map +7 -0
  172. package/dist/modules/eudr/components/crudErrorI18n.js +31 -0
  173. package/dist/modules/eudr/components/crudErrorI18n.js.map +7 -0
  174. package/dist/modules/eudr/components/formConfig.js +593 -0
  175. package/dist/modules/eudr/components/formConfig.js.map +7 -0
  176. package/dist/modules/eudr/components/plotForm.js +68 -0
  177. package/dist/modules/eudr/components/plotForm.js.map +7 -0
  178. package/dist/modules/eudr/data/enrichers.js +62 -0
  179. package/dist/modules/eudr/data/enrichers.js.map +7 -0
  180. package/dist/modules/eudr/data/entities.js +437 -0
  181. package/dist/modules/eudr/data/entities.js.map +7 -0
  182. package/dist/modules/eudr/data/validators.js +271 -0
  183. package/dist/modules/eudr/data/validators.js.map +7 -0
  184. package/dist/modules/eudr/encryption.js +33 -0
  185. package/dist/modules/eudr/encryption.js.map +7 -0
  186. package/dist/modules/eudr/events.js +38 -0
  187. package/dist/modules/eudr/events.js.map +7 -0
  188. package/dist/modules/eudr/index.js +15 -0
  189. package/dist/modules/eudr/index.js.map +7 -0
  190. package/dist/modules/eudr/lib/annual-report.js +104 -0
  191. package/dist/modules/eudr/lib/annual-report.js.map +7 -0
  192. package/dist/modules/eudr/lib/completeness.js +64 -0
  193. package/dist/modules/eudr/lib/completeness.js.map +7 -0
  194. package/dist/modules/eudr/lib/detail-read-scope.js +16 -0
  195. package/dist/modules/eudr/lib/detail-read-scope.js.map +7 -0
  196. package/dist/modules/eudr/lib/geometry.js +142 -0
  197. package/dist/modules/eudr/lib/geometry.js.map +7 -0
  198. package/dist/modules/eudr/lib/notifications.js +56 -0
  199. package/dist/modules/eudr/lib/notifications.js.map +7 -0
  200. package/dist/modules/eudr/lib/plural.js +26 -0
  201. package/dist/modules/eudr/lib/plural.js.map +7 -0
  202. package/dist/modules/eudr/lib/reference-data.js +240 -0
  203. package/dist/modules/eudr/lib/reference-data.js.map +7 -0
  204. package/dist/modules/eudr/lib/species.js +10 -0
  205. package/dist/modules/eudr/lib/species.js.map +7 -0
  206. package/dist/modules/eudr/lib/statement-lifecycle.js +84 -0
  207. package/dist/modules/eudr/lib/statement-lifecycle.js.map +7 -0
  208. package/dist/modules/eudr/lib/statement-seeding.js +49 -0
  209. package/dist/modules/eudr/lib/statement-seeding.js.map +7 -0
  210. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js +15 -0
  211. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js.map +7 -0
  212. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js +24 -0
  213. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js.map +7 -0
  214. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js +15 -0
  215. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js.map +7 -0
  216. package/dist/modules/eudr/notifications.js +58 -0
  217. package/dist/modules/eudr/notifications.js.map +7 -0
  218. package/dist/modules/eudr/search.js +186 -0
  219. package/dist/modules/eudr/search.js.map +7 -0
  220. package/dist/modules/eudr/setup.js +12 -0
  221. package/dist/modules/eudr/setup.js.map +7 -0
  222. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js +34 -0
  223. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js.map +7 -0
  224. package/dist/modules/eudr/subscribers/notify-risk-concluded.js +35 -0
  225. package/dist/modules/eudr/subscribers/notify-risk-concluded.js.map +7 -0
  226. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js +37 -0
  227. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js.map +7 -0
  228. package/dist/modules/eudr/subscribers/notify-statement-submitted.js +34 -0
  229. package/dist/modules/eudr/subscribers/notify-statement-submitted.js.map +7 -0
  230. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js +34 -0
  231. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js.map +7 -0
  232. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js +124 -0
  233. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js.map +7 -0
  234. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js +22 -0
  235. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js.map +7 -0
  236. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js +203 -0
  237. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js.map +7 -0
  238. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js +23 -0
  239. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js.map +7 -0
  240. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js +19 -0
  241. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js.map +7 -0
  242. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js +31 -0
  243. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js.map +7 -0
  244. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js +100 -0
  245. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js.map +7 -0
  246. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js +17 -0
  247. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js.map +7 -0
  248. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js +116 -0
  249. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js.map +7 -0
  250. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js +17 -0
  251. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js.map +7 -0
  252. package/dist/modules/eudr/widgets/injection-table.js +32 -0
  253. package/dist/modules/eudr/widgets/injection-table.js.map +7 -0
  254. package/dist/modules/notifications/lib/notificationService.js +67 -3
  255. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  256. package/dist/modules/query_index/lib/engine.js +121 -48
  257. package/dist/modules/query_index/lib/engine.js.map +2 -2
  258. package/dist/modules/sales/api/documents/factory.js +17 -0
  259. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  260. package/dist/modules/sales/commands/documents.js +32 -18
  261. package/dist/modules/sales/commands/documents.js.map +2 -2
  262. package/dist/modules/sales/data/entities.js +1 -0
  263. package/dist/modules/sales/data/entities.js.map +2 -2
  264. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js +17 -0
  265. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js.map +7 -0
  266. package/generated/entities/eudr_due_diligence_statement/index.ts +22 -0
  267. package/generated/entities/eudr_evidence_submission/index.ts +24 -0
  268. package/generated/entities/eudr_mitigation_action/index.ts +14 -0
  269. package/generated/entities/eudr_plot/index.ts +18 -0
  270. package/generated/entities/eudr_product_mapping/index.ts +14 -0
  271. package/generated/entities/eudr_risk_assessment/index.ts +16 -0
  272. package/generated/entities.ids.generated.ts +9 -0
  273. package/generated/entity-fields-registry.ts +120 -0
  274. package/package.json +7 -7
  275. package/src/helpers/integration/ui.ts +12 -0
  276. package/src/modules/attachments/fields/attachment.tsx +5 -0
  277. package/src/modules/attachments/lib/crud.ts +2 -0
  278. package/src/modules/eudr/acl.ts +39 -0
  279. package/src/modules/eudr/ai-agents.ts +258 -0
  280. package/src/modules/eudr/ai-tools/compliance-pack.ts +618 -0
  281. package/src/modules/eudr/ai-tools/types.ts +44 -0
  282. package/src/modules/eudr/ai-tools.ts +15 -0
  283. package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +481 -0
  284. package/src/modules/eudr/api/evidence-submissions/route.ts +335 -0
  285. package/src/modules/eudr/api/mitigation-actions/route.ts +263 -0
  286. package/src/modules/eudr/api/openapi.ts +28 -0
  287. package/src/modules/eudr/api/plots/import/route.ts +369 -0
  288. package/src/modules/eudr/api/plots/route.ts +296 -0
  289. package/src/modules/eudr/api/product-mappings/route.ts +269 -0
  290. package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +382 -0
  291. package/src/modules/eudr/api/product-mappings/suggestions/route.ts +169 -0
  292. package/src/modules/eudr/api/reports/annual/route.ts +457 -0
  293. package/src/modules/eudr/api/risk-assessments/route.ts +323 -0
  294. package/src/modules/eudr/api/statements/[id]/export/route.ts +713 -0
  295. package/src/modules/eudr/api/statements/[id]/readiness/route.ts +129 -0
  296. package/src/modules/eudr/api/statements/route.ts +329 -0
  297. package/src/modules/eudr/api/suppliers/compliance/route.ts +241 -0
  298. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +12 -0
  299. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +545 -0
  300. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +13 -0
  301. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +383 -0
  302. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +12 -0
  303. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +379 -0
  304. package/src/modules/eudr/backend/eudr/page.meta.ts +12 -0
  305. package/src/modules/eudr/backend/eudr/page.tsx +477 -0
  306. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +12 -0
  307. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +404 -0
  308. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +13 -0
  309. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +267 -0
  310. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +12 -0
  311. package/src/modules/eudr/backend/eudr/plots/page.tsx +442 -0
  312. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +12 -0
  313. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +311 -0
  314. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +13 -0
  315. package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +190 -0
  316. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +12 -0
  317. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +344 -0
  318. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +12 -0
  319. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +421 -0
  320. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +13 -0
  321. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +247 -0
  322. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +12 -0
  323. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +383 -0
  324. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +12 -0
  325. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +777 -0
  326. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +13 -0
  327. package/src/modules/eudr/backend/eudr/statements/create/page.tsx +511 -0
  328. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +12 -0
  329. package/src/modules/eudr/backend/eudr/statements/page.tsx +372 -0
  330. package/src/modules/eudr/ce.ts +52 -0
  331. package/src/modules/eudr/commands/evidence-submissions.ts +699 -0
  332. package/src/modules/eudr/commands/index.ts +6 -0
  333. package/src/modules/eudr/commands/lifecycle-events.ts +28 -0
  334. package/src/modules/eudr/commands/mitigation-actions.ts +574 -0
  335. package/src/modules/eudr/commands/plots.ts +627 -0
  336. package/src/modules/eudr/commands/product-mappings.ts +556 -0
  337. package/src/modules/eudr/commands/risk-assessments.ts +728 -0
  338. package/src/modules/eudr/commands/statements.ts +933 -0
  339. package/src/modules/eudr/components/CountrySelectField.tsx +77 -0
  340. package/src/modules/eudr/components/GeometryInput.tsx +170 -0
  341. package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +385 -0
  342. package/src/modules/eudr/components/MitigationActionsSection.tsx +417 -0
  343. package/src/modules/eudr/components/OrderSelectField.tsx +116 -0
  344. package/src/modules/eudr/components/PlotImportDialog.tsx +277 -0
  345. package/src/modules/eudr/components/PlotMapPreview.tsx +46 -0
  346. package/src/modules/eudr/components/PlotMapPreviewImpl.tsx +111 -0
  347. package/src/modules/eudr/components/PlotMultiSelectField.tsx +238 -0
  348. package/src/modules/eudr/components/RiskCriteriaField.tsx +173 -0
  349. package/src/modules/eudr/components/StatementLifecycleBar.tsx +363 -0
  350. package/src/modules/eudr/components/StatementReadinessChecklist.tsx +82 -0
  351. package/src/modules/eudr/components/StatementRiskSection.tsx +242 -0
  352. package/src/modules/eudr/components/crudErrorI18n.ts +36 -0
  353. package/src/modules/eudr/components/formConfig.tsx +717 -0
  354. package/src/modules/eudr/components/plotForm.ts +75 -0
  355. package/src/modules/eudr/data/enrichers.ts +82 -0
  356. package/src/modules/eudr/data/entities.ts +369 -0
  357. package/src/modules/eudr/data/validators.ts +357 -0
  358. package/src/modules/eudr/encryption.ts +31 -0
  359. package/src/modules/eudr/events.ts +38 -0
  360. package/src/modules/eudr/i18n/de.json +747 -0
  361. package/src/modules/eudr/i18n/en.json +747 -0
  362. package/src/modules/eudr/i18n/es.json +747 -0
  363. package/src/modules/eudr/i18n/ko.json +747 -0
  364. package/src/modules/eudr/i18n/pl.json +747 -0
  365. package/src/modules/eudr/index.ts +13 -0
  366. package/src/modules/eudr/lib/annual-report.ts +120 -0
  367. package/src/modules/eudr/lib/completeness.ts +90 -0
  368. package/src/modules/eudr/lib/detail-read-scope.ts +44 -0
  369. package/src/modules/eudr/lib/geometry.ts +191 -0
  370. package/src/modules/eudr/lib/notifications.ts +85 -0
  371. package/src/modules/eudr/lib/plural.ts +36 -0
  372. package/src/modules/eudr/lib/reference-data.ts +128 -0
  373. package/src/modules/eudr/lib/species.ts +12 -0
  374. package/src/modules/eudr/lib/statement-lifecycle.ts +109 -0
  375. package/src/modules/eudr/lib/statement-seeding.ts +86 -0
  376. package/src/modules/eudr/migrations/.snapshot-open-mercato.json +2046 -0
  377. package/src/modules/eudr/migrations/Migration20260706102002_eudr.ts +16 -0
  378. package/src/modules/eudr/migrations/Migration20260706152612_eudr.ts +30 -0
  379. package/src/modules/eudr/migrations/Migration20260722100000_eudr.ts +17 -0
  380. package/src/modules/eudr/notifications.ts +56 -0
  381. package/src/modules/eudr/search.ts +212 -0
  382. package/src/modules/eudr/setup.ts +10 -0
  383. package/src/modules/eudr/subscribers/notify-mitigation-completed.ts +56 -0
  384. package/src/modules/eudr/subscribers/notify-risk-concluded.ts +58 -0
  385. package/src/modules/eudr/subscribers/notify-statement-reference-issued.ts +59 -0
  386. package/src/modules/eudr/subscribers/notify-statement-submitted.ts +49 -0
  387. package/src/modules/eudr/subscribers/notify-statement-withdrawn.ts +49 -0
  388. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-created.ts +189 -0
  389. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.ts +31 -0
  390. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.client.tsx +271 -0
  391. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts +24 -0
  392. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx +37 -0
  393. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.ts +30 -0
  394. package/src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx +131 -0
  395. package/src/modules/eudr/widgets/injection/order-compliance/widget.ts +16 -0
  396. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx +168 -0
  397. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.ts +16 -0
  398. package/src/modules/eudr/widgets/injection-table.ts +31 -0
  399. package/src/modules/notifications/lib/notificationService.ts +83 -4
  400. package/src/modules/query_index/lib/engine.ts +139 -51
  401. package/src/modules/sales/api/documents/factory.ts +29 -0
  402. package/src/modules/sales/commands/documents.ts +65 -18
  403. package/src/modules/sales/data/entities.ts +1 -0
  404. package/src/modules/sales/migrations/.snapshot-open-mercato.json +10 -0
  405. package/src/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.ts +59 -0
@@ -0,0 +1,747 @@
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 {
15
+ loadCustomFieldSnapshot,
16
+ buildCustomFieldResetMap
17
+ } from "@open-mercato/shared/lib/commands/customFieldSnapshots";
18
+ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
19
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
20
+ import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
21
+ import { emitEudrLifecycleEvent } from "./lifecycle-events.js";
22
+ import { E } from "../../../generated/entities.ids.generated.js";
23
+ import { sql } from "kysely";
24
+ import { z } from "zod";
25
+ import {
26
+ EudrDueDiligenceStatement,
27
+ EudrEvidenceSubmission,
28
+ EudrMitigationAction,
29
+ EudrRiskAssessment
30
+ } from "../data/entities.js";
31
+ import {
32
+ EUDR_STATEMENT_STATUSES,
33
+ statementCreateSchema,
34
+ statementUpdateSchema
35
+ } from "../data/validators.js";
36
+ import {
37
+ EUDR_AMEND_GUARDED_FIELDS,
38
+ canTransition,
39
+ evaluateSubmissionGate,
40
+ isAmendWindowOpen
41
+ } from "../lib/statement-lifecycle.js";
42
+ const STATEMENT_ENTITY_ID = "eudr:eudr_due_diligence_statement";
43
+ const scopedCommandInputSchema = z.object({
44
+ tenantId: z.string().uuid(),
45
+ organizationId: z.string().uuid()
46
+ });
47
+ const statementCrudIndexer = {
48
+ entityType: E.eudr.eudr_due_diligence_statement
49
+ };
50
+ const statementCrudEvents = {
51
+ module: "eudr",
52
+ entity: "due_diligence_statement",
53
+ persistent: true,
54
+ buildPayload: (emitContext) => ({
55
+ id: emitContext.identifiers.id,
56
+ entityId: emitContext.entity?.id ?? emitContext.identifiers.id,
57
+ organizationId: emitContext.identifiers.organizationId,
58
+ tenantId: emitContext.identifiers.tenantId
59
+ })
60
+ };
61
+ function parseScopedCommandInput(input) {
62
+ return scopedCommandInputSchema.parse(input);
63
+ }
64
+ function toNumericString(value) {
65
+ return value == null ? null : String(value);
66
+ }
67
+ function toDate(value) {
68
+ return value ? new Date(value) : null;
69
+ }
70
+ function statementSeedFromSnapshot(snapshot) {
71
+ return {
72
+ id: snapshot.id,
73
+ organizationId: snapshot.organizationId,
74
+ tenantId: snapshot.tenantId,
75
+ title: snapshot.title,
76
+ commodity: snapshot.commodity,
77
+ referenceNumber: snapshot.referenceNumber,
78
+ verificationNumber: snapshot.verificationNumber,
79
+ status: snapshot.status,
80
+ activityType: snapshot.activityType,
81
+ actorRole: snapshot.actorRole,
82
+ referencedStatements: snapshot.referencedStatements.map((entry) => ({ ...entry })),
83
+ quantityKg: snapshot.quantityKg,
84
+ supplementaryUnit: snapshot.supplementaryUnit,
85
+ supplementaryQuantity: snapshot.supplementaryQuantity,
86
+ orderId: snapshot.orderId,
87
+ submittedAt: toDate(snapshot.submittedAt),
88
+ referenceIssuedAt: toDate(snapshot.referenceIssuedAt),
89
+ orderSnapshot: snapshot.orderSnapshot,
90
+ notes: snapshot.notes,
91
+ createdAt: new Date(snapshot.createdAt),
92
+ updatedAt: new Date(snapshot.updatedAt),
93
+ deletedAt: toDate(snapshot.deletedAt)
94
+ };
95
+ }
96
+ async function loadStatementSnapshot(em, entityId) {
97
+ const record = await em.findOne(EudrDueDiligenceStatement, { id: entityId });
98
+ if (!record) return null;
99
+ const custom = await loadCustomFieldSnapshot(em, {
100
+ entityId: STATEMENT_ENTITY_ID,
101
+ recordId: record.id,
102
+ tenantId: record.tenantId,
103
+ organizationId: record.organizationId
104
+ });
105
+ return {
106
+ id: record.id,
107
+ organizationId: record.organizationId,
108
+ tenantId: record.tenantId,
109
+ title: record.title,
110
+ commodity: record.commodity,
111
+ referenceNumber: record.referenceNumber ?? null,
112
+ verificationNumber: record.verificationNumber ?? null,
113
+ status: record.status,
114
+ activityType: record.activityType ?? null,
115
+ actorRole: record.actorRole ?? null,
116
+ referencedStatements: Array.isArray(record.referencedStatements) ? record.referencedStatements.map((entry) => ({ ...entry })) : [],
117
+ quantityKg: record.quantityKg ?? null,
118
+ supplementaryUnit: record.supplementaryUnit ?? null,
119
+ supplementaryQuantity: record.supplementaryQuantity ?? null,
120
+ orderId: record.orderId ?? null,
121
+ submittedAt: record.submittedAt ? record.submittedAt.toISOString() : null,
122
+ referenceIssuedAt: record.referenceIssuedAt ? record.referenceIssuedAt.toISOString() : null,
123
+ orderSnapshot: record.orderSnapshot ?? null,
124
+ notes: record.notes ?? null,
125
+ createdAt: record.createdAt.toISOString(),
126
+ updatedAt: record.updatedAt.toISOString(),
127
+ deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,
128
+ custom: Object.keys(custom).length ? custom : null
129
+ };
130
+ }
131
+ function applyStatementUpdate(record, parsed) {
132
+ if (parsed.title !== void 0) record.title = parsed.title;
133
+ if (parsed.commodity !== void 0) record.commodity = parsed.commodity;
134
+ if (parsed.referenceNumber !== void 0) record.referenceNumber = parsed.referenceNumber ?? null;
135
+ if (parsed.verificationNumber !== void 0) record.verificationNumber = parsed.verificationNumber ?? null;
136
+ if (parsed.status !== void 0) record.status = parsed.status;
137
+ if (parsed.activityType !== void 0) record.activityType = parsed.activityType ?? null;
138
+ if (parsed.actorRole !== void 0) record.actorRole = parsed.actorRole ?? null;
139
+ if (parsed.referencedStatements !== void 0) {
140
+ record.referencedStatements = parsed.referencedStatements.map((entry) => ({ ...entry }));
141
+ }
142
+ if (parsed.quantityKg !== void 0) record.quantityKg = toNumericString(parsed.quantityKg);
143
+ if (parsed.supplementaryUnit !== void 0) record.supplementaryUnit = parsed.supplementaryUnit ?? null;
144
+ if (parsed.supplementaryQuantity !== void 0) record.supplementaryQuantity = toNumericString(parsed.supplementaryQuantity);
145
+ if (parsed.orderId !== void 0) record.orderId = parsed.orderId ?? null;
146
+ if (parsed.referenceIssuedAt !== void 0) record.referenceIssuedAt = parsed.referenceIssuedAt;
147
+ if (parsed.orderSnapshot !== void 0) record.orderSnapshot = parsed.orderSnapshot ?? null;
148
+ if (parsed.notes !== void 0) record.notes = parsed.notes ?? null;
149
+ }
150
+ function restoreStatement(record, snapshot) {
151
+ record.organizationId = snapshot.organizationId;
152
+ record.tenantId = snapshot.tenantId;
153
+ record.title = snapshot.title;
154
+ record.commodity = snapshot.commodity;
155
+ record.referenceNumber = snapshot.referenceNumber;
156
+ record.verificationNumber = snapshot.verificationNumber;
157
+ record.status = snapshot.status;
158
+ record.activityType = snapshot.activityType;
159
+ record.actorRole = snapshot.actorRole;
160
+ record.referencedStatements = snapshot.referencedStatements.map((entry) => ({ ...entry }));
161
+ record.quantityKg = snapshot.quantityKg;
162
+ record.supplementaryUnit = snapshot.supplementaryUnit;
163
+ record.supplementaryQuantity = snapshot.supplementaryQuantity;
164
+ record.orderId = snapshot.orderId;
165
+ record.submittedAt = toDate(snapshot.submittedAt);
166
+ record.referenceIssuedAt = toDate(snapshot.referenceIssuedAt);
167
+ record.orderSnapshot = snapshot.orderSnapshot;
168
+ record.notes = snapshot.notes;
169
+ record.createdAt = new Date(snapshot.createdAt);
170
+ record.updatedAt = new Date(snapshot.updatedAt);
171
+ record.deletedAt = toDate(snapshot.deletedAt);
172
+ }
173
+ async function setStatementCustomFields(dataEngine, entityId, organizationId, tenantId, values) {
174
+ await setCustomFieldsIfAny({
175
+ dataEngine,
176
+ entityId: STATEMENT_ENTITY_ID,
177
+ recordId: entityId,
178
+ organizationId,
179
+ tenantId,
180
+ values,
181
+ notify: false
182
+ });
183
+ }
184
+ const STATEMENT_STATUS_SET = new Set(EUDR_STATEMENT_STATUSES);
185
+ const STATEMENT_UPDATE_FIELDS = [
186
+ "title",
187
+ "commodity",
188
+ "referenceNumber",
189
+ "verificationNumber",
190
+ "status",
191
+ "activityType",
192
+ "actorRole",
193
+ "referencedStatements",
194
+ "quantityKg",
195
+ "supplementaryUnit",
196
+ "supplementaryQuantity",
197
+ "orderId",
198
+ "referenceIssuedAt",
199
+ "orderSnapshot",
200
+ "notes"
201
+ ];
202
+ function isStatementStatus(value) {
203
+ return STATEMENT_STATUS_SET.has(value);
204
+ }
205
+ function isNonEmpty(value) {
206
+ return typeof value === "string" && value.trim().length > 0;
207
+ }
208
+ function dateValuesEqual(left, right) {
209
+ const leftTime = left ? left.getTime() : null;
210
+ const rightTime = right ? right.getTime() : null;
211
+ return leftTime === rightTime;
212
+ }
213
+ function jsonValuesEqual(left, right) {
214
+ return JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
215
+ }
216
+ function numericValuesEqual(left, right) {
217
+ const leftNumber = left === null || left === void 0 || left === "" ? null : Number(left);
218
+ const rightNumber = right === null || right === void 0 || right === "" ? null : Number(right);
219
+ if (leftNumber === null || rightNumber === null) return leftNumber === rightNumber;
220
+ return Number.isFinite(leftNumber) && Number.isFinite(rightNumber) && leftNumber === rightNumber;
221
+ }
222
+ function referencedStatementsEqual(left, right) {
223
+ return JSON.stringify(left ?? []) === JSON.stringify(right ?? []);
224
+ }
225
+ function statementFieldChanged(record, parsed, field) {
226
+ switch (field) {
227
+ case "title":
228
+ return parsed.title !== void 0 && parsed.title !== record.title;
229
+ case "commodity":
230
+ return parsed.commodity !== void 0 && parsed.commodity !== record.commodity;
231
+ case "referenceNumber":
232
+ return parsed.referenceNumber !== void 0 && (parsed.referenceNumber ?? null) !== (record.referenceNumber ?? null);
233
+ case "verificationNumber":
234
+ return parsed.verificationNumber !== void 0 && (parsed.verificationNumber ?? null) !== (record.verificationNumber ?? null);
235
+ case "status":
236
+ return parsed.status !== void 0 && parsed.status !== record.status;
237
+ case "activityType":
238
+ return parsed.activityType !== void 0 && (parsed.activityType ?? null) !== (record.activityType ?? null);
239
+ case "actorRole":
240
+ return parsed.actorRole !== void 0 && (parsed.actorRole ?? null) !== (record.actorRole ?? null);
241
+ case "referencedStatements":
242
+ return parsed.referencedStatements !== void 0 && !referencedStatementsEqual(parsed.referencedStatements, record.referencedStatements);
243
+ case "quantityKg":
244
+ return parsed.quantityKg !== void 0 && !numericValuesEqual(toNumericString(parsed.quantityKg), record.quantityKg ?? null);
245
+ case "supplementaryUnit":
246
+ return parsed.supplementaryUnit !== void 0 && (parsed.supplementaryUnit ?? null) !== (record.supplementaryUnit ?? null);
247
+ case "supplementaryQuantity":
248
+ return parsed.supplementaryQuantity !== void 0 && !numericValuesEqual(toNumericString(parsed.supplementaryQuantity), record.supplementaryQuantity ?? null);
249
+ case "orderId":
250
+ return parsed.orderId !== void 0 && (parsed.orderId ?? null) !== (record.orderId ?? null);
251
+ case "referenceIssuedAt":
252
+ return parsed.referenceIssuedAt !== void 0 && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null);
253
+ case "orderSnapshot":
254
+ return parsed.orderSnapshot !== void 0 && !jsonValuesEqual(parsed.orderSnapshot ?? null, record.orderSnapshot ?? null);
255
+ case "notes":
256
+ return parsed.notes !== void 0 && (parsed.notes ?? null) !== (record.notes ?? null);
257
+ }
258
+ }
259
+ function hasStatementFieldChanges(record, parsed) {
260
+ return STATEMENT_UPDATE_FIELDS.some((field) => statementFieldChanged(record, parsed, field));
261
+ }
262
+ function buildPatchedStatementView(record, parsed) {
263
+ return {
264
+ referenceNumber: parsed.referenceNumber !== void 0 ? parsed.referenceNumber ?? null : record.referenceNumber ?? null,
265
+ verificationNumber: parsed.verificationNumber !== void 0 ? parsed.verificationNumber ?? null : record.verificationNumber ?? null,
266
+ actorRole: parsed.actorRole !== void 0 ? parsed.actorRole ?? null : record.actorRole ?? null,
267
+ referencedStatements: parsed.referencedStatements !== void 0 ? parsed.referencedStatements.map((entry) => ({ ...entry })) : Array.isArray(record.referencedStatements) ? record.referencedStatements.map((entry) => ({ ...entry })) : []
268
+ };
269
+ }
270
+ function hasChangedAmendGuardedField(record, parsed) {
271
+ return EUDR_AMEND_GUARDED_FIELDS.some((field) => statementFieldChanged(record, parsed, field));
272
+ }
273
+ function hasConcernAnswers(criteria) {
274
+ return Object.values(criteria).some((entry) => entry.answer === "concern");
275
+ }
276
+ async function loadStatementSubmissionsForGate(em, record) {
277
+ const submissions = await findWithDecryption(
278
+ em,
279
+ EudrEvidenceSubmission,
280
+ {
281
+ statementId: record.id,
282
+ tenantId: record.tenantId,
283
+ organizationId: record.organizationId,
284
+ deletedAt: null
285
+ },
286
+ void 0,
287
+ { tenantId: record.tenantId, organizationId: record.organizationId }
288
+ );
289
+ return submissions.map((submission) => ({
290
+ status: submission.status,
291
+ completenessScore: submission.completenessScore,
292
+ originCountry: submission.originCountry ?? null
293
+ }));
294
+ }
295
+ async function loadLatestAssessmentForGate(em, record) {
296
+ const assessments = await findWithDecryption(
297
+ em,
298
+ EudrRiskAssessment,
299
+ {
300
+ statementId: record.id,
301
+ tenantId: record.tenantId,
302
+ organizationId: record.organizationId,
303
+ deletedAt: null
304
+ },
305
+ {
306
+ orderBy: { assessedAt: "desc", createdAt: "desc" },
307
+ limit: 1
308
+ },
309
+ { tenantId: record.tenantId, organizationId: record.organizationId }
310
+ );
311
+ const assessment = assessments[0];
312
+ if (!assessment) return null;
313
+ const completedMitigationCount = await em.count(EudrMitigationAction, {
314
+ riskAssessmentId: assessment.id,
315
+ tenantId: record.tenantId,
316
+ organizationId: record.organizationId,
317
+ status: "completed",
318
+ deletedAt: null
319
+ });
320
+ return {
321
+ conclusion: assessment.conclusion,
322
+ countryRisks: assessment.countryRisks.map((risk) => ({ country: risk.country, tier: risk.tier })),
323
+ reviewDueAt: assessment.reviewDueAt ?? null,
324
+ hasConcernAnswers: hasConcernAnswers(assessment.criteria),
325
+ hasCompletedMitigation: completedMitigationCount > 0
326
+ };
327
+ }
328
+ async function assertNoDownstreamReferences(em, record) {
329
+ const referenceNumber = record.referenceNumber?.trim().toUpperCase() ?? "";
330
+ if (!referenceNumber) return;
331
+ const db = em.getKysely();
332
+ const containment = JSON.stringify([{ referenceNumber }]);
333
+ const downstreamRow = await db.selectFrom("eudr_due_diligence_statements").select(sql`count(*)`.as("total")).where("tenant_id", "=", record.tenantId).where("organization_id", "=", record.organizationId).where("deleted_at", "is", null).where("id", "!=", record.id).where(sql`referenced_statements @> ${containment}::jsonb`).executeTakeFirst();
334
+ if (Number(downstreamRow?.total ?? 0) > 0) {
335
+ throw new CrudHttpError(400, { error: "eudr.errors.referencedDownstream" });
336
+ }
337
+ }
338
+ async function validateStatementUpdate(em, record, parsed, custom) {
339
+ if (!isStatementStatus(record.status)) {
340
+ throw new CrudHttpError(400, { error: "eudr.errors.invalidTransition" });
341
+ }
342
+ const requestedStatus = parsed.status;
343
+ const statusChanged = requestedStatus !== void 0 && requestedStatus !== record.status;
344
+ if (statusChanged && (!isStatementStatus(requestedStatus) || !canTransition(record.status, requestedStatus))) {
345
+ throw new CrudHttpError(400, { error: "eudr.errors.invalidTransition" });
346
+ }
347
+ const hasBaseChanges = hasStatementFieldChanges(record, parsed);
348
+ if (record.status === "archived" && (hasBaseChanges || Object.keys(custom).length > 0)) {
349
+ throw new CrudHttpError(400, { error: "eudr.errors.archivedReadOnly" });
350
+ }
351
+ const patched = buildPatchedStatementView(record, parsed);
352
+ const serverFields = {};
353
+ const isSubmittedToAvailable = record.status === "submitted" && requestedStatus === "available";
354
+ if (statusChanged) {
355
+ if (record.status === "draft" && requestedStatus === "submitted") {
356
+ const submissions = await loadStatementSubmissionsForGate(em, record);
357
+ const latestAssessment = await loadLatestAssessmentForGate(em, record);
358
+ const gate = evaluateSubmissionGate({
359
+ actorRole: patched.actorRole,
360
+ referencedStatementsCount: patched.referencedStatements.length,
361
+ submissions,
362
+ latestAssessment
363
+ });
364
+ if (!gate.allowed) {
365
+ throw new CrudHttpError(400, {
366
+ error: "eudr.errors.gateFailed",
367
+ details: {
368
+ reasons: gate.reasons.map((reason) => `eudr.gate.${reason}`)
369
+ }
370
+ });
371
+ }
372
+ serverFields.submittedAt = /* @__PURE__ */ new Date();
373
+ }
374
+ if (isSubmittedToAvailable) {
375
+ if (!isNonEmpty(patched.referenceNumber) || !isNonEmpty(patched.verificationNumber)) {
376
+ throw new CrudHttpError(400, {
377
+ error: "eudr.errors.referenceNumbersRequired",
378
+ details: {
379
+ reasons: ["eudr.gate.referenceNumbersRequired"]
380
+ }
381
+ });
382
+ }
383
+ const issuedAt = parsed.referenceIssuedAt ?? /* @__PURE__ */ new Date();
384
+ if (issuedAt.getTime() > Date.now()) {
385
+ throw new CrudHttpError(400, { error: "eudr.errors.referenceIssuedAtInvalid" });
386
+ }
387
+ serverFields.referenceIssuedAt = issuedAt;
388
+ }
389
+ if (record.status === "available" && requestedStatus === "withdrawn") {
390
+ if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {
391
+ throw new CrudHttpError(400, { error: "eudr.errors.amendWindowElapsed" });
392
+ }
393
+ await assertNoDownstreamReferences(em, record);
394
+ }
395
+ }
396
+ if (parsed.referenceIssuedAt !== void 0 && !isSubmittedToAvailable && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)) {
397
+ throw new CrudHttpError(400, { error: "eudr.errors.referenceIssuedAtImmutable" });
398
+ }
399
+ if (record.status === "available" && !isAmendWindowOpen(record.referenceIssuedAt ?? null) && hasChangedAmendGuardedField(record, parsed)) {
400
+ throw new CrudHttpError(400, { error: "eudr.errors.amendWindowElapsed" });
401
+ }
402
+ return serverFields;
403
+ }
404
+ const createStatementCommand = {
405
+ id: "eudr.statements.create",
406
+ async execute(rawInput, ctx) {
407
+ const { parsed, custom } = parseWithCustomFields(statementCreateSchema, rawInput);
408
+ const scope = parseScopedCommandInput(rawInput);
409
+ ensureTenantScope(ctx, scope.tenantId);
410
+ ensureOrganizationScope(ctx, scope.organizationId);
411
+ if (parsed.status !== void 0 && parsed.status !== "draft") {
412
+ throw new CrudHttpError(400, { error: "eudr.errors.invalidTransition" });
413
+ }
414
+ if (parsed.referenceIssuedAt !== void 0) {
415
+ throw new CrudHttpError(400, { error: "eudr.errors.referenceIssuedAtImmutable" });
416
+ }
417
+ const entityManager = ctx.container.resolve("em").fork();
418
+ let record;
419
+ await runCrudCommandWrite({
420
+ ctx,
421
+ em: entityManager,
422
+ entityId: STATEMENT_ENTITY_ID,
423
+ action: "created",
424
+ scope,
425
+ customFields: custom,
426
+ events: statementCrudEvents,
427
+ indexer: statementCrudIndexer,
428
+ sideEffect: () => ({
429
+ entity: record,
430
+ identifiers: {
431
+ id: record.id,
432
+ organizationId: record.organizationId,
433
+ tenantId: record.tenantId
434
+ }
435
+ }),
436
+ phases: [
437
+ () => {
438
+ record = entityManager.create(EudrDueDiligenceStatement, {
439
+ organizationId: scope.organizationId,
440
+ tenantId: scope.tenantId,
441
+ title: parsed.title,
442
+ commodity: parsed.commodity,
443
+ referenceNumber: parsed.referenceNumber ?? null,
444
+ verificationNumber: parsed.verificationNumber ?? null,
445
+ status: parsed.status ?? "draft",
446
+ activityType: parsed.activityType ?? null,
447
+ actorRole: parsed.actorRole ?? null,
448
+ referencedStatements: parsed.referencedStatements ? parsed.referencedStatements.map((entry) => ({ ...entry })) : [],
449
+ quantityKg: toNumericString(parsed.quantityKg),
450
+ supplementaryUnit: parsed.supplementaryUnit ?? null,
451
+ supplementaryQuantity: toNumericString(parsed.supplementaryQuantity),
452
+ orderId: parsed.orderId ?? null,
453
+ referenceIssuedAt: null,
454
+ orderSnapshot: parsed.orderSnapshot ?? null,
455
+ notes: parsed.notes ?? null
456
+ });
457
+ entityManager.persist(record);
458
+ }
459
+ ]
460
+ });
461
+ return { entityId: record.id };
462
+ },
463
+ captureAfter: async (_rawInput, result, ctx) => {
464
+ const entityManager = ctx.container.resolve("em").fork();
465
+ return loadStatementSnapshot(entityManager, result.entityId);
466
+ },
467
+ buildLog: async ({ snapshots }) => {
468
+ const after = snapshots.after;
469
+ if (!after) return null;
470
+ const { translate } = await resolveTranslations();
471
+ return {
472
+ actionLabel: translate("eudr.audit.statements.create", "Create EUDR due diligence statement"),
473
+ resourceKind: "eudr.due_diligence_statement",
474
+ resourceId: after.id,
475
+ tenantId: after.tenantId,
476
+ organizationId: after.organizationId,
477
+ snapshotAfter: after,
478
+ payload: {
479
+ undo: { after }
480
+ }
481
+ };
482
+ },
483
+ undo: async ({ logEntry, ctx }) => {
484
+ const payload = extractUndoPayload(logEntry);
485
+ const after = payload?.after;
486
+ if (!after) return;
487
+ const entityManager = ctx.container.resolve("em").fork();
488
+ const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: after.id });
489
+ if (!record) return;
490
+ ensureTenantScope(ctx, record.tenantId);
491
+ ensureOrganizationScope(ctx, record.organizationId);
492
+ record.deletedAt = /* @__PURE__ */ new Date();
493
+ await entityManager.flush();
494
+ const dataEngine = ctx.container.resolve("dataEngine");
495
+ const resetValues = buildCustomFieldResetMap(void 0, after.custom ?? void 0);
496
+ await setStatementCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues);
497
+ await emitCrudUndoSideEffects({
498
+ dataEngine,
499
+ action: "deleted",
500
+ entity: record,
501
+ identifiers: {
502
+ id: record.id,
503
+ organizationId: record.organizationId,
504
+ tenantId: record.tenantId
505
+ },
506
+ indexer: statementCrudIndexer,
507
+ events: statementCrudEvents
508
+ });
509
+ },
510
+ redo: makeCreateRedo({
511
+ entityClass: EudrDueDiligenceStatement,
512
+ seedFromSnapshot: statementSeedFromSnapshot,
513
+ buildResult: (entity) => ({ entityId: entity.id }),
514
+ indexer: statementCrudIndexer,
515
+ events: statementCrudEvents,
516
+ afterRestore: async ({ ctx, entity, snapshot }) => {
517
+ if (!snapshot.custom || !Object.keys(snapshot.custom).length) return;
518
+ await setStatementCustomFields(
519
+ ctx.container.resolve("dataEngine"),
520
+ entity.id,
521
+ entity.organizationId,
522
+ entity.tenantId,
523
+ snapshot.custom
524
+ );
525
+ }
526
+ })
527
+ };
528
+ const updateStatementCommand = {
529
+ id: "eudr.statements.update",
530
+ async prepare(rawInput, ctx) {
531
+ const { parsed } = parseWithCustomFields(statementUpdateSchema, rawInput);
532
+ const entityManager = ctx.container.resolve("em").fork();
533
+ const snapshot = await loadStatementSnapshot(entityManager, parsed.id);
534
+ if (snapshot) {
535
+ ensureTenantScope(ctx, snapshot.tenantId);
536
+ ensureOrganizationScope(ctx, snapshot.organizationId);
537
+ }
538
+ return snapshot ? { before: snapshot } : {};
539
+ },
540
+ async execute(rawInput, ctx) {
541
+ const { parsed, custom } = parseWithCustomFields(statementUpdateSchema, rawInput);
542
+ const entityManager = ctx.container.resolve("em").fork();
543
+ const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: parsed.id, deletedAt: null });
544
+ if (!record) throw new CrudHttpError(404, { error: "EUDR due diligence statement not found" });
545
+ ensureTenantScope(ctx, record.tenantId);
546
+ ensureOrganizationScope(ctx, record.organizationId);
547
+ const previousStatus = record.status;
548
+ await runCrudCommandWrite({
549
+ ctx,
550
+ em: entityManager,
551
+ entityId: STATEMENT_ENTITY_ID,
552
+ action: "updated",
553
+ scope: { tenantId: record.tenantId, organizationId: record.organizationId },
554
+ customFields: custom,
555
+ events: statementCrudEvents,
556
+ indexer: statementCrudIndexer,
557
+ sideEffect: () => ({
558
+ entity: record,
559
+ identifiers: {
560
+ id: record.id,
561
+ organizationId: record.organizationId,
562
+ tenantId: record.tenantId
563
+ }
564
+ }),
565
+ phases: [
566
+ async () => {
567
+ const serverFields = await validateStatementUpdate(entityManager, record, parsed, custom);
568
+ applyStatementUpdate(record, parsed);
569
+ if (serverFields.submittedAt !== void 0) record.submittedAt = serverFields.submittedAt;
570
+ if (serverFields.referenceIssuedAt !== void 0) record.referenceIssuedAt = serverFields.referenceIssuedAt;
571
+ }
572
+ ]
573
+ });
574
+ const lifecycleEventId = record.status === previousStatus ? null : previousStatus === "draft" && record.status === "submitted" ? "eudr.due_diligence_statement.submitted" : previousStatus === "submitted" && record.status === "available" ? "eudr.due_diligence_statement.reference_issued" : previousStatus === "available" && record.status === "withdrawn" ? "eudr.due_diligence_statement.withdrawn" : null;
575
+ if (lifecycleEventId) {
576
+ await emitEudrLifecycleEvent(ctx.container, lifecycleEventId, {
577
+ id: record.id,
578
+ tenantId: record.tenantId,
579
+ organizationId: record.organizationId,
580
+ title: record.title,
581
+ referenceNumber: record.referenceNumber ?? null
582
+ });
583
+ }
584
+ return { entityId: record.id, updatedAt: record.updatedAt };
585
+ },
586
+ captureAfter: async (_rawInput, result, ctx) => {
587
+ const entityManager = ctx.container.resolve("em").fork();
588
+ return loadStatementSnapshot(entityManager, result.entityId);
589
+ },
590
+ buildLog: async ({ snapshots }) => {
591
+ const before = snapshots.before;
592
+ const after = snapshots.after;
593
+ if (!before) return null;
594
+ if (after && snapshotsEqual(before, after)) return { skipLog: true };
595
+ const { translate } = await resolveTranslations();
596
+ return {
597
+ actionLabel: translate("eudr.audit.statements.update", "Update EUDR due diligence statement"),
598
+ resourceKind: "eudr.due_diligence_statement",
599
+ resourceId: before.id,
600
+ tenantId: before.tenantId,
601
+ organizationId: before.organizationId,
602
+ snapshotBefore: before,
603
+ snapshotAfter: after ?? null,
604
+ payload: {
605
+ undo: { before, after: after ?? null }
606
+ }
607
+ };
608
+ },
609
+ undo: async ({ logEntry, ctx }) => {
610
+ const payload = extractUndoPayload(logEntry);
611
+ const before = payload?.before;
612
+ if (!before) return;
613
+ const entityManager = ctx.container.resolve("em").fork();
614
+ let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id });
615
+ if (!record) {
616
+ record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before));
617
+ entityManager.persist(record);
618
+ } else {
619
+ ensureTenantScope(ctx, before.tenantId);
620
+ ensureOrganizationScope(ctx, before.organizationId);
621
+ restoreStatement(record, before);
622
+ }
623
+ await entityManager.flush();
624
+ const dataEngine = ctx.container.resolve("dataEngine");
625
+ const resetValues = buildCustomFieldResetMap(before.custom ?? void 0, payload?.after?.custom ?? void 0);
626
+ await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues);
627
+ await emitCrudUndoSideEffects({
628
+ dataEngine,
629
+ action: "updated",
630
+ entity: record,
631
+ identifiers: {
632
+ id: record.id,
633
+ organizationId: record.organizationId,
634
+ tenantId: record.tenantId
635
+ },
636
+ indexer: statementCrudIndexer,
637
+ events: statementCrudEvents
638
+ });
639
+ }
640
+ };
641
+ const deleteStatementCommand = {
642
+ id: "eudr.statements.delete",
643
+ async prepare(input, ctx) {
644
+ const entityId = requireId(input, "EUDR due diligence statement id required");
645
+ const entityManager = ctx.container.resolve("em").fork();
646
+ const snapshot = await loadStatementSnapshot(entityManager, entityId);
647
+ if (snapshot) {
648
+ ensureTenantScope(ctx, snapshot.tenantId);
649
+ ensureOrganizationScope(ctx, snapshot.organizationId);
650
+ }
651
+ return snapshot ? { before: snapshot } : {};
652
+ },
653
+ async execute(input, ctx) {
654
+ const entityId = requireId(input, "EUDR due diligence statement id required");
655
+ const entityManager = ctx.container.resolve("em").fork();
656
+ const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: entityId, deletedAt: null });
657
+ if (!record) throw new CrudHttpError(404, { error: "EUDR due diligence statement not found" });
658
+ ensureTenantScope(ctx, record.tenantId);
659
+ ensureOrganizationScope(ctx, record.organizationId);
660
+ if (record.status === "archived") {
661
+ throw new CrudHttpError(400, { error: "eudr.errors.archivedReadOnly" });
662
+ }
663
+ if (record.status === "available") {
664
+ if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {
665
+ throw new CrudHttpError(400, { error: "eudr.errors.amendWindowElapsed" });
666
+ }
667
+ await assertNoDownstreamReferences(entityManager, record);
668
+ }
669
+ const snapshot = await loadStatementSnapshot(entityManager, entityId);
670
+ record.deletedAt = /* @__PURE__ */ new Date();
671
+ await entityManager.flush();
672
+ const dataEngine = ctx.container.resolve("dataEngine");
673
+ if (snapshot?.custom) {
674
+ const resetValues = buildCustomFieldResetMap(snapshot.custom, void 0);
675
+ await setStatementCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues);
676
+ }
677
+ await emitCrudSideEffects({
678
+ dataEngine,
679
+ action: "deleted",
680
+ entity: record,
681
+ identifiers: {
682
+ id: record.id,
683
+ organizationId: record.organizationId,
684
+ tenantId: record.tenantId
685
+ },
686
+ indexer: statementCrudIndexer,
687
+ events: statementCrudEvents
688
+ });
689
+ return { entityId: record.id, updatedAt: record.updatedAt };
690
+ },
691
+ buildLog: async ({ snapshots }) => {
692
+ const before = snapshots.before;
693
+ if (!before) return null;
694
+ const { translate } = await resolveTranslations();
695
+ return {
696
+ actionLabel: translate("eudr.audit.statements.delete", "Delete EUDR due diligence statement"),
697
+ resourceKind: "eudr.due_diligence_statement",
698
+ resourceId: before.id,
699
+ tenantId: before.tenantId,
700
+ organizationId: before.organizationId,
701
+ snapshotBefore: before,
702
+ payload: {
703
+ undo: { before }
704
+ }
705
+ };
706
+ },
707
+ undo: async ({ logEntry, ctx }) => {
708
+ const payload = extractUndoPayload(logEntry);
709
+ const before = payload?.before;
710
+ if (!before) return;
711
+ const entityManager = ctx.container.resolve("em").fork();
712
+ let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id });
713
+ if (!record) {
714
+ record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before));
715
+ entityManager.persist(record);
716
+ } else {
717
+ ensureTenantScope(ctx, before.tenantId);
718
+ ensureOrganizationScope(ctx, before.organizationId);
719
+ restoreStatement(record, before);
720
+ }
721
+ await entityManager.flush();
722
+ const dataEngine = ctx.container.resolve("dataEngine");
723
+ if (before.custom) {
724
+ await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom);
725
+ }
726
+ await emitCrudUndoSideEffects({
727
+ dataEngine,
728
+ action: "created",
729
+ entity: record,
730
+ identifiers: {
731
+ id: record.id,
732
+ organizationId: record.organizationId,
733
+ tenantId: record.tenantId
734
+ },
735
+ indexer: statementCrudIndexer,
736
+ events: statementCrudEvents
737
+ });
738
+ }
739
+ };
740
+ registerCommand(createStatementCommand);
741
+ registerCommand(updateStatementCommand);
742
+ registerCommand(deleteStatementCommand);
743
+ export {
744
+ loadLatestAssessmentForGate,
745
+ loadStatementSubmissionsForGate
746
+ };
747
+ //# sourceMappingURL=statements.js.map