@open-mercato/core 0.6.8-develop.6924.1.a8d208fcdc → 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 (453) 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/role/index.js +2 -0
  15. package/dist/generated/entities/role/index.js.map +2 -2
  16. package/dist/generated/entities.ids.generated.js +9 -0
  17. package/dist/generated/entities.ids.generated.js.map +2 -2
  18. package/dist/generated/entity-fields-registry.js +121 -0
  19. package/dist/generated/entity-fields-registry.js.map +2 -2
  20. package/dist/helpers/integration/api.js +4 -0
  21. package/dist/helpers/integration/api.js.map +2 -2
  22. package/dist/modules/attachments/fields/attachment.js +5 -1
  23. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  24. package/dist/modules/attachments/lib/crud.js +3 -1
  25. package/dist/modules/attachments/lib/crud.js.map +2 -2
  26. package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js +5 -0
  27. package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js.map +2 -2
  28. package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js +5 -0
  29. package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js.map +2 -2
  30. package/dist/modules/audit_logs/backend/audit-logs/page.js +4 -4
  31. package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
  32. package/dist/modules/audit_logs/components/AuditLogsActions.js +9 -2
  33. package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
  34. package/dist/modules/auth/api/login.js +5 -2
  35. package/dist/modules/auth/api/login.js.map +2 -2
  36. package/dist/modules/auth/api/users/route.js +8 -5
  37. package/dist/modules/auth/api/users/route.js.map +2 -2
  38. package/dist/modules/auth/backend/users/[id]/edit/page.js +15 -1
  39. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  40. package/dist/modules/auth/backend/users/page.js +7 -1
  41. package/dist/modules/auth/backend/users/page.js.map +2 -2
  42. package/dist/modules/auth/commands/users.js +175 -76
  43. package/dist/modules/auth/commands/users.js.map +2 -2
  44. package/dist/modules/auth/data/entities.js +4 -0
  45. package/dist/modules/auth/data/entities.js.map +2 -2
  46. package/dist/modules/auth/lib/sessionIntegrity.js +1 -1
  47. package/dist/modules/auth/lib/sessionIntegrity.js.map +2 -2
  48. package/dist/modules/auth/lib/setup-app.js +1 -1
  49. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  50. package/dist/modules/auth/migrations/Migration20260728134212_auth.js +14 -0
  51. package/dist/modules/auth/migrations/Migration20260728134212_auth.js.map +7 -0
  52. package/dist/modules/eudr/acl.js +43 -0
  53. package/dist/modules/eudr/acl.js.map +7 -0
  54. package/dist/modules/eudr/ai-agents.js +205 -0
  55. package/dist/modules/eudr/ai-agents.js.map +7 -0
  56. package/dist/modules/eudr/ai-tools/compliance-pack.js +495 -0
  57. package/dist/modules/eudr/ai-tools/compliance-pack.js.map +7 -0
  58. package/dist/modules/eudr/ai-tools/types.js +10 -0
  59. package/dist/modules/eudr/ai-tools/types.js.map +7 -0
  60. package/dist/modules/eudr/ai-tools.js +10 -0
  61. package/dist/modules/eudr/ai-tools.js.map +7 -0
  62. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +386 -0
  63. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +7 -0
  64. package/dist/modules/eudr/api/evidence-submissions/route.js +318 -0
  65. package/dist/modules/eudr/api/evidence-submissions/route.js.map +7 -0
  66. package/dist/modules/eudr/api/mitigation-actions/route.js +249 -0
  67. package/dist/modules/eudr/api/mitigation-actions/route.js.map +7 -0
  68. package/dist/modules/eudr/api/openapi.js +27 -0
  69. package/dist/modules/eudr/api/openapi.js.map +7 -0
  70. package/dist/modules/eudr/api/plots/import/route.js +294 -0
  71. package/dist/modules/eudr/api/plots/import/route.js.map +7 -0
  72. package/dist/modules/eudr/api/plots/route.js +279 -0
  73. package/dist/modules/eudr/api/plots/route.js.map +7 -0
  74. package/dist/modules/eudr/api/product-mappings/route.js +257 -0
  75. package/dist/modules/eudr/api/product-mappings/route.js.map +7 -0
  76. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +298 -0
  77. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +7 -0
  78. package/dist/modules/eudr/api/product-mappings/suggestions/route.js +132 -0
  79. package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +7 -0
  80. package/dist/modules/eudr/api/reports/annual/route.js +266 -0
  81. package/dist/modules/eudr/api/reports/annual/route.js.map +7 -0
  82. package/dist/modules/eudr/api/risk-assessments/route.js +300 -0
  83. package/dist/modules/eudr/api/risk-assessments/route.js.map +7 -0
  84. package/dist/modules/eudr/api/statements/[id]/export/route.js +631 -0
  85. package/dist/modules/eudr/api/statements/[id]/export/route.js.map +7 -0
  86. package/dist/modules/eudr/api/statements/[id]/readiness/route.js +111 -0
  87. package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +7 -0
  88. package/dist/modules/eudr/api/statements/route.js +314 -0
  89. package/dist/modules/eudr/api/statements/route.js.map +7 -0
  90. package/dist/modules/eudr/api/suppliers/compliance/route.js +173 -0
  91. package/dist/modules/eudr/api/suppliers/compliance/route.js.map +7 -0
  92. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +468 -0
  93. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +7 -0
  94. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +16 -0
  95. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +7 -0
  96. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +351 -0
  97. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +7 -0
  98. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +17 -0
  99. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +7 -0
  100. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +313 -0
  101. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +7 -0
  102. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +16 -0
  103. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +7 -0
  104. package/dist/modules/eudr/backend/eudr/page.js +360 -0
  105. package/dist/modules/eudr/backend/eudr/page.js.map +7 -0
  106. package/dist/modules/eudr/backend/eudr/page.meta.js +16 -0
  107. package/dist/modules/eudr/backend/eudr/page.meta.js.map +7 -0
  108. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +346 -0
  109. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +7 -0
  110. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +16 -0
  111. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +7 -0
  112. package/dist/modules/eudr/backend/eudr/plots/create/page.js +253 -0
  113. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +7 -0
  114. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +17 -0
  115. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +7 -0
  116. package/dist/modules/eudr/backend/eudr/plots/page.js +386 -0
  117. package/dist/modules/eudr/backend/eudr/plots/page.js.map +7 -0
  118. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +16 -0
  119. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +7 -0
  120. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +253 -0
  121. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +7 -0
  122. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +16 -0
  123. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +7 -0
  124. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +174 -0
  125. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +7 -0
  126. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +17 -0
  127. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +7 -0
  128. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +306 -0
  129. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +7 -0
  130. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +16 -0
  131. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +7 -0
  132. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +335 -0
  133. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +7 -0
  134. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +16 -0
  135. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +7 -0
  136. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +220 -0
  137. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +7 -0
  138. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +17 -0
  139. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +7 -0
  140. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +324 -0
  141. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +7 -0
  142. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +16 -0
  143. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +7 -0
  144. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +648 -0
  145. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +7 -0
  146. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +16 -0
  147. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +7 -0
  148. package/dist/modules/eudr/backend/eudr/statements/create/page.js +432 -0
  149. package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +7 -0
  150. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +17 -0
  151. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +7 -0
  152. package/dist/modules/eudr/backend/eudr/statements/page.js +309 -0
  153. package/dist/modules/eudr/backend/eudr/statements/page.js.map +7 -0
  154. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +16 -0
  155. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +7 -0
  156. package/dist/modules/eudr/ce.js +56 -0
  157. package/dist/modules/eudr/ce.js.map +7 -0
  158. package/dist/modules/eudr/commands/evidence-submissions.js +571 -0
  159. package/dist/modules/eudr/commands/evidence-submissions.js.map +7 -0
  160. package/dist/modules/eudr/commands/index.js +7 -0
  161. package/dist/modules/eudr/commands/index.js.map +7 -0
  162. package/dist/modules/eudr/commands/lifecycle-events.js +19 -0
  163. package/dist/modules/eudr/commands/lifecycle-events.js.map +7 -0
  164. package/dist/modules/eudr/commands/mitigation-actions.js +488 -0
  165. package/dist/modules/eudr/commands/mitigation-actions.js.map +7 -0
  166. package/dist/modules/eudr/commands/plots.js +517 -0
  167. package/dist/modules/eudr/commands/plots.js.map +7 -0
  168. package/dist/modules/eudr/commands/product-mappings.js +468 -0
  169. package/dist/modules/eudr/commands/product-mappings.js.map +7 -0
  170. package/dist/modules/eudr/commands/risk-assessments.js +599 -0
  171. package/dist/modules/eudr/commands/risk-assessments.js.map +7 -0
  172. package/dist/modules/eudr/commands/statements.js +747 -0
  173. package/dist/modules/eudr/commands/statements.js.map +7 -0
  174. package/dist/modules/eudr/components/CountrySelectField.js +64 -0
  175. package/dist/modules/eudr/components/CountrySelectField.js.map +7 -0
  176. package/dist/modules/eudr/components/GeometryInput.js +133 -0
  177. package/dist/modules/eudr/components/GeometryInput.js.map +7 -0
  178. package/dist/modules/eudr/components/MappingSuggestionsDialog.js +307 -0
  179. package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +7 -0
  180. package/dist/modules/eudr/components/MitigationActionsSection.js +345 -0
  181. package/dist/modules/eudr/components/MitigationActionsSection.js.map +7 -0
  182. package/dist/modules/eudr/components/OrderSelectField.js +88 -0
  183. package/dist/modules/eudr/components/OrderSelectField.js.map +7 -0
  184. package/dist/modules/eudr/components/PlotImportDialog.js +229 -0
  185. package/dist/modules/eudr/components/PlotImportDialog.js.map +7 -0
  186. package/dist/modules/eudr/components/PlotMapPreview.js +35 -0
  187. package/dist/modules/eudr/components/PlotMapPreview.js.map +7 -0
  188. package/dist/modules/eudr/components/PlotMapPreviewImpl.js +97 -0
  189. package/dist/modules/eudr/components/PlotMapPreviewImpl.js.map +7 -0
  190. package/dist/modules/eudr/components/PlotMultiSelectField.js +198 -0
  191. package/dist/modules/eudr/components/PlotMultiSelectField.js.map +7 -0
  192. package/dist/modules/eudr/components/RiskCriteriaField.js +128 -0
  193. package/dist/modules/eudr/components/RiskCriteriaField.js.map +7 -0
  194. package/dist/modules/eudr/components/StatementLifecycleBar.js +274 -0
  195. package/dist/modules/eudr/components/StatementLifecycleBar.js.map +7 -0
  196. package/dist/modules/eudr/components/StatementReadinessChecklist.js +56 -0
  197. package/dist/modules/eudr/components/StatementReadinessChecklist.js.map +7 -0
  198. package/dist/modules/eudr/components/StatementRiskSection.js +179 -0
  199. package/dist/modules/eudr/components/StatementRiskSection.js.map +7 -0
  200. package/dist/modules/eudr/components/crudErrorI18n.js +31 -0
  201. package/dist/modules/eudr/components/crudErrorI18n.js.map +7 -0
  202. package/dist/modules/eudr/components/formConfig.js +593 -0
  203. package/dist/modules/eudr/components/formConfig.js.map +7 -0
  204. package/dist/modules/eudr/components/plotForm.js +68 -0
  205. package/dist/modules/eudr/components/plotForm.js.map +7 -0
  206. package/dist/modules/eudr/data/enrichers.js +62 -0
  207. package/dist/modules/eudr/data/enrichers.js.map +7 -0
  208. package/dist/modules/eudr/data/entities.js +437 -0
  209. package/dist/modules/eudr/data/entities.js.map +7 -0
  210. package/dist/modules/eudr/data/validators.js +271 -0
  211. package/dist/modules/eudr/data/validators.js.map +7 -0
  212. package/dist/modules/eudr/encryption.js +33 -0
  213. package/dist/modules/eudr/encryption.js.map +7 -0
  214. package/dist/modules/eudr/events.js +38 -0
  215. package/dist/modules/eudr/events.js.map +7 -0
  216. package/dist/modules/eudr/index.js +15 -0
  217. package/dist/modules/eudr/index.js.map +7 -0
  218. package/dist/modules/eudr/lib/annual-report.js +104 -0
  219. package/dist/modules/eudr/lib/annual-report.js.map +7 -0
  220. package/dist/modules/eudr/lib/completeness.js +64 -0
  221. package/dist/modules/eudr/lib/completeness.js.map +7 -0
  222. package/dist/modules/eudr/lib/detail-read-scope.js +16 -0
  223. package/dist/modules/eudr/lib/detail-read-scope.js.map +7 -0
  224. package/dist/modules/eudr/lib/geometry.js +142 -0
  225. package/dist/modules/eudr/lib/geometry.js.map +7 -0
  226. package/dist/modules/eudr/lib/notifications.js +56 -0
  227. package/dist/modules/eudr/lib/notifications.js.map +7 -0
  228. package/dist/modules/eudr/lib/plural.js +26 -0
  229. package/dist/modules/eudr/lib/plural.js.map +7 -0
  230. package/dist/modules/eudr/lib/reference-data.js +240 -0
  231. package/dist/modules/eudr/lib/reference-data.js.map +7 -0
  232. package/dist/modules/eudr/lib/species.js +10 -0
  233. package/dist/modules/eudr/lib/species.js.map +7 -0
  234. package/dist/modules/eudr/lib/statement-lifecycle.js +84 -0
  235. package/dist/modules/eudr/lib/statement-lifecycle.js.map +7 -0
  236. package/dist/modules/eudr/lib/statement-seeding.js +49 -0
  237. package/dist/modules/eudr/lib/statement-seeding.js.map +7 -0
  238. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js +15 -0
  239. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js.map +7 -0
  240. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js +24 -0
  241. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js.map +7 -0
  242. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js +15 -0
  243. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js.map +7 -0
  244. package/dist/modules/eudr/notifications.js +58 -0
  245. package/dist/modules/eudr/notifications.js.map +7 -0
  246. package/dist/modules/eudr/search.js +186 -0
  247. package/dist/modules/eudr/search.js.map +7 -0
  248. package/dist/modules/eudr/setup.js +12 -0
  249. package/dist/modules/eudr/setup.js.map +7 -0
  250. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js +34 -0
  251. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js.map +7 -0
  252. package/dist/modules/eudr/subscribers/notify-risk-concluded.js +35 -0
  253. package/dist/modules/eudr/subscribers/notify-risk-concluded.js.map +7 -0
  254. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js +37 -0
  255. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js.map +7 -0
  256. package/dist/modules/eudr/subscribers/notify-statement-submitted.js +34 -0
  257. package/dist/modules/eudr/subscribers/notify-statement-submitted.js.map +7 -0
  258. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js +34 -0
  259. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js.map +7 -0
  260. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js +124 -0
  261. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js.map +7 -0
  262. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js +22 -0
  263. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js.map +7 -0
  264. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js +203 -0
  265. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js.map +7 -0
  266. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js +23 -0
  267. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js.map +7 -0
  268. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js +19 -0
  269. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js.map +7 -0
  270. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js +31 -0
  271. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js.map +7 -0
  272. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js +100 -0
  273. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js.map +7 -0
  274. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js +17 -0
  275. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js.map +7 -0
  276. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js +116 -0
  277. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js.map +7 -0
  278. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js +17 -0
  279. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js.map +7 -0
  280. package/dist/modules/eudr/widgets/injection-table.js +32 -0
  281. package/dist/modules/eudr/widgets/injection-table.js.map +7 -0
  282. package/dist/modules/notifications/lib/notificationService.js +67 -3
  283. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  284. package/dist/modules/query_index/lib/engine.js +121 -48
  285. package/dist/modules/query_index/lib/engine.js.map +2 -2
  286. package/dist/modules/sales/api/documents/factory.js +17 -0
  287. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  288. package/dist/modules/sales/commands/documents.js +32 -18
  289. package/dist/modules/sales/commands/documents.js.map +2 -2
  290. package/dist/modules/sales/data/entities.js +1 -0
  291. package/dist/modules/sales/data/entities.js.map +2 -2
  292. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js +17 -0
  293. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js.map +7 -0
  294. package/generated/entities/eudr_due_diligence_statement/index.ts +22 -0
  295. package/generated/entities/eudr_evidence_submission/index.ts +24 -0
  296. package/generated/entities/eudr_mitigation_action/index.ts +14 -0
  297. package/generated/entities/eudr_plot/index.ts +18 -0
  298. package/generated/entities/eudr_product_mapping/index.ts +14 -0
  299. package/generated/entities/eudr_risk_assessment/index.ts +16 -0
  300. package/generated/entities/role/index.ts +1 -0
  301. package/generated/entities.ids.generated.ts +9 -0
  302. package/generated/entity-fields-registry.ts +121 -0
  303. package/package.json +7 -7
  304. package/src/helpers/integration/api.ts +13 -0
  305. package/src/modules/attachments/fields/attachment.tsx +5 -0
  306. package/src/modules/attachments/lib/crud.ts +2 -0
  307. package/src/modules/audit_logs/api/audit-logs/actions/redo/route.ts +7 -0
  308. package/src/modules/audit_logs/api/audit-logs/actions/undo/route.ts +9 -0
  309. package/src/modules/audit_logs/backend/audit-logs/page.tsx +4 -4
  310. package/src/modules/audit_logs/components/AuditLogsActions.tsx +20 -4
  311. package/src/modules/auth/api/login.ts +9 -2
  312. package/src/modules/auth/api/users/route.ts +8 -4
  313. package/src/modules/auth/backend/users/[id]/edit/page.tsx +17 -1
  314. package/src/modules/auth/backend/users/page.tsx +11 -0
  315. package/src/modules/auth/commands/users.ts +251 -85
  316. package/src/modules/auth/data/entities.ts +3 -0
  317. package/src/modules/auth/i18n/de.json +6 -0
  318. package/src/modules/auth/i18n/en.json +6 -0
  319. package/src/modules/auth/i18n/es.json +6 -0
  320. package/src/modules/auth/i18n/ko.json +6 -0
  321. package/src/modules/auth/i18n/pl.json +6 -0
  322. package/src/modules/auth/lib/sessionIntegrity.ts +1 -1
  323. package/src/modules/auth/lib/setup-app.ts +1 -1
  324. package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
  325. package/src/modules/auth/migrations/Migration20260728134212_auth.ts +14 -0
  326. package/src/modules/eudr/acl.ts +39 -0
  327. package/src/modules/eudr/ai-agents.ts +258 -0
  328. package/src/modules/eudr/ai-tools/compliance-pack.ts +618 -0
  329. package/src/modules/eudr/ai-tools/types.ts +44 -0
  330. package/src/modules/eudr/ai-tools.ts +15 -0
  331. package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +481 -0
  332. package/src/modules/eudr/api/evidence-submissions/route.ts +335 -0
  333. package/src/modules/eudr/api/mitigation-actions/route.ts +263 -0
  334. package/src/modules/eudr/api/openapi.ts +28 -0
  335. package/src/modules/eudr/api/plots/import/route.ts +369 -0
  336. package/src/modules/eudr/api/plots/route.ts +296 -0
  337. package/src/modules/eudr/api/product-mappings/route.ts +269 -0
  338. package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +382 -0
  339. package/src/modules/eudr/api/product-mappings/suggestions/route.ts +169 -0
  340. package/src/modules/eudr/api/reports/annual/route.ts +457 -0
  341. package/src/modules/eudr/api/risk-assessments/route.ts +323 -0
  342. package/src/modules/eudr/api/statements/[id]/export/route.ts +713 -0
  343. package/src/modules/eudr/api/statements/[id]/readiness/route.ts +129 -0
  344. package/src/modules/eudr/api/statements/route.ts +329 -0
  345. package/src/modules/eudr/api/suppliers/compliance/route.ts +241 -0
  346. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +12 -0
  347. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +545 -0
  348. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +13 -0
  349. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +383 -0
  350. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +12 -0
  351. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +379 -0
  352. package/src/modules/eudr/backend/eudr/page.meta.ts +12 -0
  353. package/src/modules/eudr/backend/eudr/page.tsx +477 -0
  354. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +12 -0
  355. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +404 -0
  356. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +13 -0
  357. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +267 -0
  358. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +12 -0
  359. package/src/modules/eudr/backend/eudr/plots/page.tsx +442 -0
  360. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +12 -0
  361. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +311 -0
  362. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +13 -0
  363. package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +190 -0
  364. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +12 -0
  365. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +344 -0
  366. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +12 -0
  367. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +421 -0
  368. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +13 -0
  369. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +247 -0
  370. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +12 -0
  371. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +383 -0
  372. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +12 -0
  373. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +777 -0
  374. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +13 -0
  375. package/src/modules/eudr/backend/eudr/statements/create/page.tsx +511 -0
  376. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +12 -0
  377. package/src/modules/eudr/backend/eudr/statements/page.tsx +372 -0
  378. package/src/modules/eudr/ce.ts +52 -0
  379. package/src/modules/eudr/commands/evidence-submissions.ts +699 -0
  380. package/src/modules/eudr/commands/index.ts +6 -0
  381. package/src/modules/eudr/commands/lifecycle-events.ts +28 -0
  382. package/src/modules/eudr/commands/mitigation-actions.ts +574 -0
  383. package/src/modules/eudr/commands/plots.ts +627 -0
  384. package/src/modules/eudr/commands/product-mappings.ts +556 -0
  385. package/src/modules/eudr/commands/risk-assessments.ts +728 -0
  386. package/src/modules/eudr/commands/statements.ts +933 -0
  387. package/src/modules/eudr/components/CountrySelectField.tsx +77 -0
  388. package/src/modules/eudr/components/GeometryInput.tsx +170 -0
  389. package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +385 -0
  390. package/src/modules/eudr/components/MitigationActionsSection.tsx +417 -0
  391. package/src/modules/eudr/components/OrderSelectField.tsx +116 -0
  392. package/src/modules/eudr/components/PlotImportDialog.tsx +277 -0
  393. package/src/modules/eudr/components/PlotMapPreview.tsx +46 -0
  394. package/src/modules/eudr/components/PlotMapPreviewImpl.tsx +111 -0
  395. package/src/modules/eudr/components/PlotMultiSelectField.tsx +238 -0
  396. package/src/modules/eudr/components/RiskCriteriaField.tsx +173 -0
  397. package/src/modules/eudr/components/StatementLifecycleBar.tsx +363 -0
  398. package/src/modules/eudr/components/StatementReadinessChecklist.tsx +82 -0
  399. package/src/modules/eudr/components/StatementRiskSection.tsx +242 -0
  400. package/src/modules/eudr/components/crudErrorI18n.ts +36 -0
  401. package/src/modules/eudr/components/formConfig.tsx +717 -0
  402. package/src/modules/eudr/components/plotForm.ts +75 -0
  403. package/src/modules/eudr/data/enrichers.ts +82 -0
  404. package/src/modules/eudr/data/entities.ts +369 -0
  405. package/src/modules/eudr/data/validators.ts +357 -0
  406. package/src/modules/eudr/encryption.ts +31 -0
  407. package/src/modules/eudr/events.ts +38 -0
  408. package/src/modules/eudr/i18n/de.json +747 -0
  409. package/src/modules/eudr/i18n/en.json +747 -0
  410. package/src/modules/eudr/i18n/es.json +747 -0
  411. package/src/modules/eudr/i18n/ko.json +747 -0
  412. package/src/modules/eudr/i18n/pl.json +747 -0
  413. package/src/modules/eudr/index.ts +13 -0
  414. package/src/modules/eudr/lib/annual-report.ts +120 -0
  415. package/src/modules/eudr/lib/completeness.ts +90 -0
  416. package/src/modules/eudr/lib/detail-read-scope.ts +44 -0
  417. package/src/modules/eudr/lib/geometry.ts +191 -0
  418. package/src/modules/eudr/lib/notifications.ts +85 -0
  419. package/src/modules/eudr/lib/plural.ts +36 -0
  420. package/src/modules/eudr/lib/reference-data.ts +128 -0
  421. package/src/modules/eudr/lib/species.ts +12 -0
  422. package/src/modules/eudr/lib/statement-lifecycle.ts +109 -0
  423. package/src/modules/eudr/lib/statement-seeding.ts +86 -0
  424. package/src/modules/eudr/migrations/.snapshot-open-mercato.json +2046 -0
  425. package/src/modules/eudr/migrations/Migration20260706102002_eudr.ts +16 -0
  426. package/src/modules/eudr/migrations/Migration20260706152612_eudr.ts +30 -0
  427. package/src/modules/eudr/migrations/Migration20260722100000_eudr.ts +17 -0
  428. package/src/modules/eudr/notifications.ts +56 -0
  429. package/src/modules/eudr/search.ts +212 -0
  430. package/src/modules/eudr/setup.ts +10 -0
  431. package/src/modules/eudr/subscribers/notify-mitigation-completed.ts +56 -0
  432. package/src/modules/eudr/subscribers/notify-risk-concluded.ts +58 -0
  433. package/src/modules/eudr/subscribers/notify-statement-reference-issued.ts +59 -0
  434. package/src/modules/eudr/subscribers/notify-statement-submitted.ts +49 -0
  435. package/src/modules/eudr/subscribers/notify-statement-withdrawn.ts +49 -0
  436. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-created.ts +189 -0
  437. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.ts +31 -0
  438. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.client.tsx +271 -0
  439. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts +24 -0
  440. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx +37 -0
  441. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.ts +30 -0
  442. package/src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx +131 -0
  443. package/src/modules/eudr/widgets/injection/order-compliance/widget.ts +16 -0
  444. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx +168 -0
  445. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.ts +16 -0
  446. package/src/modules/eudr/widgets/injection-table.ts +31 -0
  447. package/src/modules/notifications/lib/notificationService.ts +83 -4
  448. package/src/modules/query_index/lib/engine.ts +139 -51
  449. package/src/modules/sales/api/documents/factory.ts +29 -0
  450. package/src/modules/sales/commands/documents.ts +65 -18
  451. package/src/modules/sales/data/entities.ts +1 -0
  452. package/src/modules/sales/migrations/.snapshot-open-mercato.json +10 -0
  453. package/src/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.ts +59 -0
@@ -0,0 +1,16 @@
1
+ import { Migration } from '@mikro-orm/migrations';
2
+
3
+ export class Migration20260706102002_eudr extends Migration {
4
+
5
+ override up(): void | Promise<void> {
6
+ this.addSql(`create table "eudr_due_diligence_statements" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "title" text not null, "commodity" text not null, "reference_number" text null, "verification_number" text null, "status" text not null default 'draft', "quantity_kg" numeric(14,3) null, "order_id" uuid null, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
7
+
8
+ this.addSql(`create table "eudr_evidence_submissions" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "supplier_entity_id" uuid not null, "supplier_snapshot" jsonb null, "commodity" text not null, "product_mapping_id" uuid null, "statement_id" uuid null, "origin_country" text null, "geolocation" jsonb null, "quantity_kg" numeric(14,3) null, "batch_number" text null, "harvest_from" timestamptz null, "harvest_to" timestamptz null, "producer_name" text null, "attachment_ids" jsonb not null default '[]', "status" text not null default 'draft', "completeness_score" int not null default 0, "missing_fields" jsonb not null default '[]', "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
9
+ this.addSql(`create index "idx_eudr_submissions_supplier" on "eudr_evidence_submissions" ("supplier_entity_id");`);
10
+ this.addSql(`create index "idx_eudr_submissions_statement" on "eudr_evidence_submissions" ("statement_id");`);
11
+
12
+ this.addSql(`create table "eudr_product_mappings" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "product_id" uuid not null, "product_snapshot" jsonb null, "commodity" text not null, "hs_code" text null, "is_in_scope" boolean not null default true, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
13
+ this.addSql(`create unique index "idx_eudr_mappings_org_product_commodity_unique" on "eudr_product_mappings" ("organization_id", "product_id", "commodity") where deleted_at is null;`);
14
+ }
15
+
16
+ }
@@ -0,0 +1,30 @@
1
+ import { Migration } from '@mikro-orm/migrations';
2
+
3
+ export class Migration20260706152612_eudr extends Migration {
4
+
5
+ override up(): void | Promise<void> {
6
+ this.addSql(`create table "eudr_mitigation_actions" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "risk_assessment_id" uuid not null, "action_type" text not null default 'other', "title" text not null, "description" text null, "status" text not null default 'planned', "due_date" timestamptz null, "completed_at" timestamptz null, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
7
+ this.addSql(`create index "idx_eudr_mitigation_actions_risk_assessment" on "eudr_mitigation_actions" ("risk_assessment_id");`);
8
+
9
+ this.addSql(`create table "eudr_plots" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "supplier_entity_id" uuid not null, "supplier_snapshot" jsonb null, "name" text not null, "external_id" text null, "description" text null, "origin_country" text not null, "plot_type" text not null default 'point', "geometry" jsonb not null, "area_ha" numeric(12,4) null, "validation_warnings" jsonb not null default '[]', "producer_name" text null, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
10
+ this.addSql(`create index "idx_eudr_plots_supplier" on "eudr_plots" ("supplier_entity_id");`);
11
+
12
+ this.addSql(`create table "eudr_risk_assessments" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "statement_id" uuid not null, "country_risks" jsonb not null default '[]', "overall_tier" text not null default 'unknown', "criteria" jsonb not null default '{}', "conclusion" text not null default 'non_negligible', "is_simplified" boolean not null default false, "assessed_at" timestamptz not null, "assessed_by_name" text null, "review_due_at" timestamptz null, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
13
+ this.addSql(`create index "idx_eudr_risk_assessments_statement" on "eudr_risk_assessments" ("statement_id");`);
14
+
15
+ this.addSql(`alter table "eudr_due_diligence_statements" add "activity_type" text null, add "actor_role" text null, add "referenced_statements" jsonb not null default '[]', add "supplementary_unit" text null, add "supplementary_quantity" numeric(14,3) null, add "submitted_at" timestamptz null, add "reference_issued_at" timestamptz null, add "order_snapshot" jsonb null;`);
16
+
17
+ this.addSql(`alter table "eudr_evidence_submissions" add "plot_ids" jsonb not null default '[]';`);
18
+ }
19
+
20
+ override down(): void | Promise<void> {
21
+ this.addSql(`alter table "eudr_due_diligence_statements" drop column "activity_type", drop column "actor_role", drop column "referenced_statements", drop column "supplementary_unit", drop column "supplementary_quantity", drop column "submitted_at", drop column "reference_issued_at", drop column "order_snapshot";`);
22
+
23
+ this.addSql(`alter table "eudr_evidence_submissions" drop column "plot_ids";`);
24
+
25
+ this.addSql(`drop table if exists "eudr_mitigation_actions" cascade;`);
26
+ this.addSql(`drop table if exists "eudr_risk_assessments" cascade;`);
27
+ this.addSql(`drop table if exists "eudr_plots" cascade;`);
28
+ }
29
+
30
+ }
@@ -0,0 +1,17 @@
1
+ import { Migration } from '@mikro-orm/migrations';
2
+
3
+ export class Migration20260722100000_eudr extends Migration {
4
+
5
+ override up(): void | Promise<void> {
6
+ this.addSql(`alter table "eudr_product_mappings" add column "species_scientific_name" text null, add column "species_common_name" text null;`);
7
+
8
+ this.addSql(`create index "eudr_dds_tenant_org_submitted_idx" on "eudr_due_diligence_statements" ("tenant_id", "organization_id", "submitted_at") where "deleted_at" is null;`);
9
+ }
10
+
11
+ override down(): void | Promise<void> {
12
+ this.addSql(`drop index "eudr_dds_tenant_org_submitted_idx";`);
13
+
14
+ this.addSql(`alter table "eudr_product_mappings" drop column "species_scientific_name", drop column "species_common_name";`);
15
+ }
16
+
17
+ }
@@ -0,0 +1,56 @@
1
+ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
2
+
3
+ export const notificationTypes: NotificationTypeDefinition[] = [
4
+ {
5
+ type: 'eudr.statement.submitted',
6
+ module: 'eudr',
7
+ titleKey: 'eudr.notifications.statement.submitted.title',
8
+ bodyKey: 'eudr.notifications.statement.submitted.body',
9
+ icon: 'file-check',
10
+ severity: 'info',
11
+ actions: [],
12
+ expiresAfterHours: 168,
13
+ },
14
+ {
15
+ type: 'eudr.statement.reference_issued',
16
+ module: 'eudr',
17
+ titleKey: 'eudr.notifications.statement.referenceIssued.title',
18
+ bodyKey: 'eudr.notifications.statement.referenceIssued.body',
19
+ icon: 'badge-check',
20
+ severity: 'success',
21
+ actions: [],
22
+ expiresAfterHours: 720,
23
+ },
24
+ {
25
+ type: 'eudr.statement.withdrawn',
26
+ module: 'eudr',
27
+ titleKey: 'eudr.notifications.statement.withdrawn.title',
28
+ bodyKey: 'eudr.notifications.statement.withdrawn.body',
29
+ icon: 'undo',
30
+ severity: 'warning',
31
+ actions: [],
32
+ expiresAfterHours: 168,
33
+ },
34
+ {
35
+ type: 'eudr.risk.non_negligible',
36
+ module: 'eudr',
37
+ titleKey: 'eudr.notifications.risk.nonNegligible.title',
38
+ bodyKey: 'eudr.notifications.risk.nonNegligible.body',
39
+ icon: 'alert-triangle',
40
+ severity: 'warning',
41
+ actions: [],
42
+ expiresAfterHours: 168,
43
+ },
44
+ {
45
+ type: 'eudr.mitigation.completed',
46
+ module: 'eudr',
47
+ titleKey: 'eudr.notifications.mitigation.completed.title',
48
+ bodyKey: 'eudr.notifications.mitigation.completed.body',
49
+ icon: 'check-circle',
50
+ severity: 'success',
51
+ actions: [],
52
+ expiresAfterHours: 168,
53
+ },
54
+ ]
55
+
56
+ export default notificationTypes
@@ -0,0 +1,212 @@
1
+ import type { SearchBuildContext, SearchIndexSource, SearchModuleConfig, SearchResultPresenter } from '@open-mercato/shared/modules/search'
2
+ import type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'
3
+ import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
4
+
5
+ const EUDR_STATEMENTS_URL = '/backend/eudr/statements'
6
+ const EUDR_PLOTS_URL = '/backend/eudr/plots'
7
+ const EUDR_EVIDENCE_SUBMISSIONS_URL = '/backend/eudr/evidence-submissions'
8
+
9
+ function assertTenantContext(ctx: SearchBuildContext): void {
10
+ if (typeof ctx.tenantId !== 'string' || ctx.tenantId.length === 0) {
11
+ throw new Error('[internal] [search.eudr] Missing tenantId in search build context')
12
+ }
13
+ }
14
+
15
+ function normalizeText(value: unknown): string | null {
16
+ if (value === null || value === undefined) return null
17
+ if (typeof value === 'string') {
18
+ const trimmed = value.trim()
19
+ return trimmed.length > 0 ? trimmed : null
20
+ }
21
+ if (value instanceof Date) return value.toISOString()
22
+ if (typeof value === 'number' || typeof value === 'boolean') return String(value)
23
+ return null
24
+ }
25
+
26
+ function readRecordText(record: Record<string, unknown>, ...keys: string[]): string | null {
27
+ for (const key of keys) {
28
+ const text = normalizeText(record[key])
29
+ if (text) return text
30
+ }
31
+ return null
32
+ }
33
+
34
+ function readObjectText(source: unknown, ...keys: string[]): string | null {
35
+ if (!source || typeof source !== 'object') return null
36
+ return readRecordText(source as Record<string, unknown>, ...keys)
37
+ }
38
+
39
+ function formatSubtitle(...parts: Array<unknown>): string | undefined {
40
+ const text = parts
41
+ .map((part) => normalizeText(part))
42
+ .filter((value): value is string => Boolean(value))
43
+ if (!text.length) return undefined
44
+ return text.join(' · ')
45
+ }
46
+
47
+ function appendLine(lines: string[], label: string, value: unknown) {
48
+ const text = normalizeText(value)
49
+ if (!text) return
50
+ lines.push(`${label}: ${text}`)
51
+ }
52
+
53
+ function friendlyLabel(input: string): string {
54
+ return input
55
+ .replace(/^cf:/, '')
56
+ .replace(/_/g, ' ')
57
+ .replace(/([a-z])([A-Z])/g, (_match, firstChar, secondChar) => `${firstChar} ${secondChar}`)
58
+ .replace(/\b\w/g, (character) => character.toUpperCase())
59
+ }
60
+
61
+ function appendCustomFieldLines(lines: string[], customFields: Record<string, unknown>) {
62
+ for (const [key, value] of Object.entries(customFields)) {
63
+ if (value === null || value === undefined) continue
64
+ appendLine(lines, friendlyLabel(key), value)
65
+ }
66
+ }
67
+
68
+ function buildIndexSource(
69
+ ctx: SearchBuildContext,
70
+ presenter: SearchResultPresenter,
71
+ lines: string[],
72
+ ): SearchIndexSource | null {
73
+ appendCustomFieldLines(lines, ctx.customFields)
74
+ if (!lines.length) return null
75
+ return {
76
+ text: lines,
77
+ presenter,
78
+ checksumSource: { record: ctx.record, customFields: ctx.customFields },
79
+ }
80
+ }
81
+
82
+ function buildRecordUrl(baseUrl: string, record: Record<string, unknown>): string | null {
83
+ const recordId = readRecordText(record, 'id')
84
+ return recordId ? `${baseUrl}/${encodeURIComponent(recordId)}` : null
85
+ }
86
+
87
+ function translateToken(translate: TranslateFn, prefix: string, value: string | null): string | null {
88
+ if (!value) return null
89
+ return translate(`${prefix}.${value}`, value)
90
+ }
91
+
92
+ function resolveSupplierName(record: Record<string, unknown>): string | null {
93
+ const snapshot = record.supplier_snapshot ?? record.supplierSnapshot
94
+ return readObjectText(snapshot, 'display_name', 'displayName', 'name')
95
+ }
96
+
97
+ function buildStatementPresenter(translate: TranslateFn, record: Record<string, unknown>): SearchResultPresenter {
98
+ const label = translate('eudr.search.badge.statement', 'DDS statement')
99
+ const title = readRecordText(record, 'title') ?? translate('eudr.common.recordUnavailable')
100
+ const subtitle = formatSubtitle(
101
+ readRecordText(record, 'reference_number', 'referenceNumber'),
102
+ translateToken(translate, 'eudr.commodity', readRecordText(record, 'commodity')),
103
+ )
104
+ return { title, subtitle, icon: 'file-check', badge: label }
105
+ }
106
+
107
+ function buildPlotPresenter(translate: TranslateFn, record: Record<string, unknown>): SearchResultPresenter {
108
+ const label = translate('eudr.search.badge.plot', 'Plot')
109
+ const title = readRecordText(record, 'name') ?? translate('eudr.common.recordUnavailable')
110
+ const subtitle = formatSubtitle(
111
+ readRecordText(record, 'origin_country', 'originCountry'),
112
+ translateToken(translate, 'eudr.plotType', readRecordText(record, 'plot_type', 'plotType')),
113
+ )
114
+ return { title, subtitle, icon: 'map-pin', badge: label }
115
+ }
116
+
117
+ function buildSubmissionPresenter(translate: TranslateFn, record: Record<string, unknown>): SearchResultPresenter {
118
+ const label = translate('eudr.search.badge.submission', 'Evidence submission')
119
+ const batchNumber = readRecordText(record, 'batch_number', 'batchNumber')
120
+ const supplierName = resolveSupplierName(record)
121
+ const title = batchNumber
122
+ ? `${label} ${batchNumber}`
123
+ : supplierName ?? translate('eudr.common.recordUnavailable')
124
+ const subtitle = formatSubtitle(
125
+ supplierName,
126
+ translateToken(translate, 'eudr.submissionStatus', readRecordText(record, 'status')),
127
+ )
128
+ return { title, subtitle, icon: 'package', badge: label }
129
+ }
130
+
131
+ export const searchConfig: SearchModuleConfig = {
132
+ entities: [
133
+ {
134
+ entityId: 'eudr:eudr_due_diligence_statement',
135
+ enabled: true,
136
+ priority: 8,
137
+ fieldPolicy: {
138
+ searchable: ['title', 'reference_number', 'commodity'],
139
+ excluded: ['notes'],
140
+ },
141
+ buildSource: async (ctx) => {
142
+ assertTenantContext(ctx)
143
+ const { t: translate } = await resolveTranslations()
144
+ const record = ctx.record
145
+ const lines: string[] = []
146
+ appendLine(lines, 'Title', record.title)
147
+ appendLine(lines, 'Reference number', record.reference_number ?? record.referenceNumber)
148
+ appendLine(lines, 'Commodity', record.commodity)
149
+ return buildIndexSource(ctx, buildStatementPresenter(translate, record), lines)
150
+ },
151
+ formatResult: async (ctx) => {
152
+ const { t: translate } = await resolveTranslations()
153
+ return buildStatementPresenter(translate, ctx.record)
154
+ },
155
+ resolveUrl: async (ctx) => buildRecordUrl(EUDR_STATEMENTS_URL, ctx.record),
156
+ aclFeatures: ['eudr.statements.view'],
157
+ },
158
+ {
159
+ entityId: 'eudr:eudr_plot',
160
+ enabled: true,
161
+ priority: 7,
162
+ fieldPolicy: {
163
+ searchable: ['name', 'external_id', 'origin_country'],
164
+ excluded: ['producer_name'],
165
+ },
166
+ buildSource: async (ctx) => {
167
+ assertTenantContext(ctx)
168
+ const { t: translate } = await resolveTranslations()
169
+ const record = ctx.record
170
+ const lines: string[] = []
171
+ appendLine(lines, 'Name', record.name)
172
+ appendLine(lines, 'External ID', record.external_id ?? record.externalId)
173
+ appendLine(lines, 'Origin country', record.origin_country ?? record.originCountry)
174
+ return buildIndexSource(ctx, buildPlotPresenter(translate, record), lines)
175
+ },
176
+ formatResult: async (ctx) => {
177
+ const { t: translate } = await resolveTranslations()
178
+ return buildPlotPresenter(translate, ctx.record)
179
+ },
180
+ resolveUrl: async (ctx) => buildRecordUrl(EUDR_PLOTS_URL, ctx.record),
181
+ aclFeatures: ['eudr.plots.view'],
182
+ },
183
+ {
184
+ entityId: 'eudr:eudr_evidence_submission',
185
+ enabled: true,
186
+ priority: 6,
187
+ fieldPolicy: {
188
+ searchable: ['batch_number', 'commodity'],
189
+ excluded: ['producer_name', 'notes'],
190
+ },
191
+ buildSource: async (ctx) => {
192
+ assertTenantContext(ctx)
193
+ const { t: translate } = await resolveTranslations()
194
+ const record = ctx.record
195
+ const lines: string[] = []
196
+ appendLine(lines, 'Batch number', record.batch_number ?? record.batchNumber)
197
+ appendLine(lines, 'Commodity', record.commodity)
198
+ appendLine(lines, 'Supplier', resolveSupplierName(record))
199
+ return buildIndexSource(ctx, buildSubmissionPresenter(translate, record), lines)
200
+ },
201
+ formatResult: async (ctx) => {
202
+ const { t: translate } = await resolveTranslations()
203
+ return buildSubmissionPresenter(translate, ctx.record)
204
+ },
205
+ resolveUrl: async (ctx) => buildRecordUrl(EUDR_EVIDENCE_SUBMISSIONS_URL, ctx.record),
206
+ aclFeatures: ['eudr.submissions.view'],
207
+ },
208
+ ],
209
+ }
210
+
211
+ export default searchConfig
212
+ export const config = searchConfig
@@ -0,0 +1,10 @@
1
+ import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'
2
+
3
+ export const setup: ModuleSetupConfig = {
4
+ defaultRoleFeatures: {
5
+ admin: ['eudr.*'],
6
+ employee: ['eudr.mappings.view', 'eudr.submissions.view', 'eudr.statements.view', 'eudr.plots.view', 'eudr.risk.view'],
7
+ },
8
+ }
9
+
10
+ export default setup
@@ -0,0 +1,56 @@
1
+ import { createLogger } from '@open-mercato/shared/lib/logger'
2
+ import {
3
+ deliverEudrNotification,
4
+ type EudrNotificationContainer,
5
+ } from '../lib/notifications'
6
+
7
+ const logger = createLogger('eudr').child({ component: 'notify-mitigation-completed' })
8
+
9
+ export const metadata = {
10
+ event: 'eudr.mitigation_action.completed',
11
+ persistent: true,
12
+ id: 'eudr:notify-mitigation-completed',
13
+ }
14
+
15
+ type MitigationCompletedPayload = {
16
+ id?: string
17
+ tenantId?: string | null
18
+ organizationId?: string | null
19
+ title?: string
20
+ riskAssessmentId?: string
21
+ occurredAt?: string
22
+ }
23
+
24
+ type SubscriberContext = EudrNotificationContainer & {
25
+ container?: EudrNotificationContainer
26
+ }
27
+
28
+ export default async function notifyMitigationCompleted(
29
+ payload: MitigationCompletedPayload,
30
+ ctx: SubscriberContext,
31
+ ): Promise<void> {
32
+ if (
33
+ !payload?.tenantId
34
+ || !payload.id
35
+ || !payload.riskAssessmentId
36
+ || !payload.occurredAt
37
+ || typeof payload.title !== 'string'
38
+ ) {
39
+ logger.debug('Skipping mitigation-completed notification because the event payload is incomplete')
40
+ return
41
+ }
42
+
43
+ await deliverEudrNotification({
44
+ container: ctx.container ?? ctx,
45
+ typeId: 'eudr.mitigation.completed',
46
+ payload: {
47
+ tenantId: payload.tenantId,
48
+ organizationId: payload.organizationId ?? null,
49
+ entityId: payload.id,
50
+ occurredAt: payload.occurredAt,
51
+ bodyVariables: { actionTitle: payload.title },
52
+ linkHref: `/backend/eudr/risk-assessments/${payload.riskAssessmentId}`,
53
+ sourceEntityType: 'eudr:eudr_mitigation_action',
54
+ },
55
+ })
56
+ }
@@ -0,0 +1,58 @@
1
+ import { createLogger } from '@open-mercato/shared/lib/logger'
2
+ import {
3
+ deliverEudrNotification,
4
+ type EudrNotificationContainer,
5
+ } from '../lib/notifications'
6
+
7
+ const logger = createLogger('eudr').child({ component: 'notify-risk-concluded' })
8
+
9
+ export const metadata = {
10
+ event: 'eudr.risk_assessment.concluded',
11
+ persistent: true,
12
+ id: 'eudr:notify-risk-concluded',
13
+ }
14
+
15
+ type RiskConcludedPayload = {
16
+ id?: string
17
+ tenantId?: string | null
18
+ organizationId?: string | null
19
+ statementId?: string
20
+ statementTitle?: string
21
+ conclusion?: string
22
+ occurredAt?: string
23
+ }
24
+
25
+ type SubscriberContext = EudrNotificationContainer & {
26
+ container?: EudrNotificationContainer
27
+ }
28
+
29
+ export default async function notifyRiskConcluded(
30
+ payload: RiskConcludedPayload,
31
+ ctx: SubscriberContext,
32
+ ): Promise<void> {
33
+ if (payload?.conclusion !== 'non_negligible') return
34
+ if (
35
+ !payload.tenantId
36
+ || !payload.id
37
+ || !payload.statementId
38
+ || !payload.occurredAt
39
+ || typeof payload.statementTitle !== 'string'
40
+ ) {
41
+ logger.debug('Skipping risk-concluded notification because the event payload is incomplete')
42
+ return
43
+ }
44
+
45
+ await deliverEudrNotification({
46
+ container: ctx.container ?? ctx,
47
+ typeId: 'eudr.risk.non_negligible',
48
+ payload: {
49
+ tenantId: payload.tenantId,
50
+ organizationId: payload.organizationId ?? null,
51
+ entityId: payload.id,
52
+ occurredAt: payload.occurredAt,
53
+ bodyVariables: { statementTitle: payload.statementTitle },
54
+ linkHref: `/backend/eudr/statements/${payload.statementId}`,
55
+ sourceEntityType: 'eudr:eudr_risk_assessment',
56
+ },
57
+ })
58
+ }
@@ -0,0 +1,59 @@
1
+ import { createLogger } from '@open-mercato/shared/lib/logger'
2
+ import {
3
+ deliverEudrNotification,
4
+ type EudrNotificationContainer,
5
+ } from '../lib/notifications'
6
+
7
+ const logger = createLogger('eudr').child({ component: 'notify-statement-reference-issued' })
8
+
9
+ export const metadata = {
10
+ event: 'eudr.due_diligence_statement.reference_issued',
11
+ persistent: true,
12
+ id: 'eudr:notify-statement-reference-issued',
13
+ }
14
+
15
+ type StatementReferenceIssuedPayload = {
16
+ id?: string
17
+ tenantId?: string | null
18
+ organizationId?: string | null
19
+ title?: string
20
+ referenceNumber?: string
21
+ occurredAt?: string
22
+ }
23
+
24
+ type SubscriberContext = EudrNotificationContainer & {
25
+ container?: EudrNotificationContainer
26
+ }
27
+
28
+ export default async function notifyStatementReferenceIssued(
29
+ payload: StatementReferenceIssuedPayload,
30
+ ctx: SubscriberContext,
31
+ ): Promise<void> {
32
+ if (
33
+ !payload?.tenantId
34
+ || !payload.id
35
+ || !payload.occurredAt
36
+ || typeof payload.title !== 'string'
37
+ || typeof payload.referenceNumber !== 'string'
38
+ ) {
39
+ logger.debug('Skipping reference-issued notification because the event payload is incomplete')
40
+ return
41
+ }
42
+
43
+ await deliverEudrNotification({
44
+ container: ctx.container ?? ctx,
45
+ typeId: 'eudr.statement.reference_issued',
46
+ payload: {
47
+ tenantId: payload.tenantId,
48
+ organizationId: payload.organizationId ?? null,
49
+ entityId: payload.id,
50
+ occurredAt: payload.occurredAt,
51
+ bodyVariables: {
52
+ statementTitle: payload.title,
53
+ referenceNumber: payload.referenceNumber,
54
+ },
55
+ linkHref: `/backend/eudr/statements/${payload.id}`,
56
+ sourceEntityType: 'eudr:eudr_due_diligence_statement',
57
+ },
58
+ })
59
+ }
@@ -0,0 +1,49 @@
1
+ import { createLogger } from '@open-mercato/shared/lib/logger'
2
+ import {
3
+ deliverEudrNotification,
4
+ type EudrNotificationContainer,
5
+ } from '../lib/notifications'
6
+
7
+ const logger = createLogger('eudr').child({ component: 'notify-statement-submitted' })
8
+
9
+ export const metadata = {
10
+ event: 'eudr.due_diligence_statement.submitted',
11
+ persistent: true,
12
+ id: 'eudr:notify-statement-submitted',
13
+ }
14
+
15
+ type StatementSubmittedPayload = {
16
+ id?: string
17
+ tenantId?: string | null
18
+ organizationId?: string | null
19
+ title?: string
20
+ occurredAt?: string
21
+ }
22
+
23
+ type SubscriberContext = EudrNotificationContainer & {
24
+ container?: EudrNotificationContainer
25
+ }
26
+
27
+ export default async function notifyStatementSubmitted(
28
+ payload: StatementSubmittedPayload,
29
+ ctx: SubscriberContext,
30
+ ): Promise<void> {
31
+ if (!payload?.tenantId || !payload.id || !payload.occurredAt || typeof payload.title !== 'string') {
32
+ logger.debug('Skipping statement-submitted notification because the event payload is incomplete')
33
+ return
34
+ }
35
+
36
+ await deliverEudrNotification({
37
+ container: ctx.container ?? ctx,
38
+ typeId: 'eudr.statement.submitted',
39
+ payload: {
40
+ tenantId: payload.tenantId,
41
+ organizationId: payload.organizationId ?? null,
42
+ entityId: payload.id,
43
+ occurredAt: payload.occurredAt,
44
+ bodyVariables: { statementTitle: payload.title },
45
+ linkHref: `/backend/eudr/statements/${payload.id}`,
46
+ sourceEntityType: 'eudr:eudr_due_diligence_statement',
47
+ },
48
+ })
49
+ }
@@ -0,0 +1,49 @@
1
+ import { createLogger } from '@open-mercato/shared/lib/logger'
2
+ import {
3
+ deliverEudrNotification,
4
+ type EudrNotificationContainer,
5
+ } from '../lib/notifications'
6
+
7
+ const logger = createLogger('eudr').child({ component: 'notify-statement-withdrawn' })
8
+
9
+ export const metadata = {
10
+ event: 'eudr.due_diligence_statement.withdrawn',
11
+ persistent: true,
12
+ id: 'eudr:notify-statement-withdrawn',
13
+ }
14
+
15
+ type StatementWithdrawnPayload = {
16
+ id?: string
17
+ tenantId?: string | null
18
+ organizationId?: string | null
19
+ title?: string
20
+ occurredAt?: string
21
+ }
22
+
23
+ type SubscriberContext = EudrNotificationContainer & {
24
+ container?: EudrNotificationContainer
25
+ }
26
+
27
+ export default async function notifyStatementWithdrawn(
28
+ payload: StatementWithdrawnPayload,
29
+ ctx: SubscriberContext,
30
+ ): Promise<void> {
31
+ if (!payload?.tenantId || !payload.id || !payload.occurredAt || typeof payload.title !== 'string') {
32
+ logger.debug('Skipping statement-withdrawn notification because the event payload is incomplete')
33
+ return
34
+ }
35
+
36
+ await deliverEudrNotification({
37
+ container: ctx.container ?? ctx,
38
+ typeId: 'eudr.statement.withdrawn',
39
+ payload: {
40
+ tenantId: payload.tenantId,
41
+ organizationId: payload.organizationId ?? null,
42
+ entityId: payload.id,
43
+ occurredAt: payload.occurredAt,
44
+ bodyVariables: { statementTitle: payload.title },
45
+ linkHref: `/backend/eudr/statements/${payload.id}`,
46
+ sourceEntityType: 'eudr:eudr_due_diligence_statement',
47
+ },
48
+ })
49
+ }