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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/eudr_due_diligence_statement/index.js +47 -0
  3. package/dist/generated/entities/eudr_due_diligence_statement/index.js.map +7 -0
  4. package/dist/generated/entities/eudr_evidence_submission/index.js +51 -0
  5. package/dist/generated/entities/eudr_evidence_submission/index.js.map +7 -0
  6. package/dist/generated/entities/eudr_mitigation_action/index.js +31 -0
  7. package/dist/generated/entities/eudr_mitigation_action/index.js.map +7 -0
  8. package/dist/generated/entities/eudr_plot/index.js +39 -0
  9. package/dist/generated/entities/eudr_plot/index.js.map +7 -0
  10. package/dist/generated/entities/eudr_product_mapping/index.js +31 -0
  11. package/dist/generated/entities/eudr_product_mapping/index.js.map +7 -0
  12. package/dist/generated/entities/eudr_risk_assessment/index.js +35 -0
  13. package/dist/generated/entities/eudr_risk_assessment/index.js.map +7 -0
  14. package/dist/generated/entities.ids.generated.js +9 -0
  15. package/dist/generated/entities.ids.generated.js.map +2 -2
  16. package/dist/generated/entity-fields-registry.js +120 -0
  17. package/dist/generated/entity-fields-registry.js.map +2 -2
  18. package/dist/modules/attachments/fields/attachment.js +5 -1
  19. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  20. package/dist/modules/attachments/lib/crud.js +3 -1
  21. package/dist/modules/attachments/lib/crud.js.map +2 -2
  22. package/dist/modules/eudr/acl.js +43 -0
  23. package/dist/modules/eudr/acl.js.map +7 -0
  24. package/dist/modules/eudr/ai-agents.js +205 -0
  25. package/dist/modules/eudr/ai-agents.js.map +7 -0
  26. package/dist/modules/eudr/ai-tools/compliance-pack.js +495 -0
  27. package/dist/modules/eudr/ai-tools/compliance-pack.js.map +7 -0
  28. package/dist/modules/eudr/ai-tools/types.js +10 -0
  29. package/dist/modules/eudr/ai-tools/types.js.map +7 -0
  30. package/dist/modules/eudr/ai-tools.js +10 -0
  31. package/dist/modules/eudr/ai-tools.js.map +7 -0
  32. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +386 -0
  33. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +7 -0
  34. package/dist/modules/eudr/api/evidence-submissions/route.js +318 -0
  35. package/dist/modules/eudr/api/evidence-submissions/route.js.map +7 -0
  36. package/dist/modules/eudr/api/mitigation-actions/route.js +249 -0
  37. package/dist/modules/eudr/api/mitigation-actions/route.js.map +7 -0
  38. package/dist/modules/eudr/api/openapi.js +27 -0
  39. package/dist/modules/eudr/api/openapi.js.map +7 -0
  40. package/dist/modules/eudr/api/plots/import/route.js +294 -0
  41. package/dist/modules/eudr/api/plots/import/route.js.map +7 -0
  42. package/dist/modules/eudr/api/plots/route.js +279 -0
  43. package/dist/modules/eudr/api/plots/route.js.map +7 -0
  44. package/dist/modules/eudr/api/product-mappings/route.js +257 -0
  45. package/dist/modules/eudr/api/product-mappings/route.js.map +7 -0
  46. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +298 -0
  47. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +7 -0
  48. package/dist/modules/eudr/api/product-mappings/suggestions/route.js +132 -0
  49. package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +7 -0
  50. package/dist/modules/eudr/api/reports/annual/route.js +266 -0
  51. package/dist/modules/eudr/api/reports/annual/route.js.map +7 -0
  52. package/dist/modules/eudr/api/risk-assessments/route.js +300 -0
  53. package/dist/modules/eudr/api/risk-assessments/route.js.map +7 -0
  54. package/dist/modules/eudr/api/statements/[id]/export/route.js +631 -0
  55. package/dist/modules/eudr/api/statements/[id]/export/route.js.map +7 -0
  56. package/dist/modules/eudr/api/statements/[id]/readiness/route.js +111 -0
  57. package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +7 -0
  58. package/dist/modules/eudr/api/statements/route.js +314 -0
  59. package/dist/modules/eudr/api/statements/route.js.map +7 -0
  60. package/dist/modules/eudr/api/suppliers/compliance/route.js +173 -0
  61. package/dist/modules/eudr/api/suppliers/compliance/route.js.map +7 -0
  62. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +468 -0
  63. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +7 -0
  64. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +16 -0
  65. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +7 -0
  66. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +351 -0
  67. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +7 -0
  68. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +17 -0
  69. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +7 -0
  70. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +313 -0
  71. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +7 -0
  72. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +16 -0
  73. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +7 -0
  74. package/dist/modules/eudr/backend/eudr/page.js +360 -0
  75. package/dist/modules/eudr/backend/eudr/page.js.map +7 -0
  76. package/dist/modules/eudr/backend/eudr/page.meta.js +16 -0
  77. package/dist/modules/eudr/backend/eudr/page.meta.js.map +7 -0
  78. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +346 -0
  79. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +7 -0
  80. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +16 -0
  81. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +7 -0
  82. package/dist/modules/eudr/backend/eudr/plots/create/page.js +253 -0
  83. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +7 -0
  84. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +17 -0
  85. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +7 -0
  86. package/dist/modules/eudr/backend/eudr/plots/page.js +386 -0
  87. package/dist/modules/eudr/backend/eudr/plots/page.js.map +7 -0
  88. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +16 -0
  89. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +7 -0
  90. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +253 -0
  91. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +7 -0
  92. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +16 -0
  93. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +7 -0
  94. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +174 -0
  95. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +7 -0
  96. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +17 -0
  97. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +7 -0
  98. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +306 -0
  99. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +7 -0
  100. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +16 -0
  101. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +7 -0
  102. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +335 -0
  103. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +7 -0
  104. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +16 -0
  105. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +7 -0
  106. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +220 -0
  107. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +7 -0
  108. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +17 -0
  109. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +7 -0
  110. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +324 -0
  111. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +7 -0
  112. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +16 -0
  113. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +7 -0
  114. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +648 -0
  115. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +7 -0
  116. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +16 -0
  117. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +7 -0
  118. package/dist/modules/eudr/backend/eudr/statements/create/page.js +432 -0
  119. package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +7 -0
  120. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +17 -0
  121. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +7 -0
  122. package/dist/modules/eudr/backend/eudr/statements/page.js +309 -0
  123. package/dist/modules/eudr/backend/eudr/statements/page.js.map +7 -0
  124. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +16 -0
  125. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +7 -0
  126. package/dist/modules/eudr/ce.js +56 -0
  127. package/dist/modules/eudr/ce.js.map +7 -0
  128. package/dist/modules/eudr/commands/evidence-submissions.js +571 -0
  129. package/dist/modules/eudr/commands/evidence-submissions.js.map +7 -0
  130. package/dist/modules/eudr/commands/index.js +7 -0
  131. package/dist/modules/eudr/commands/index.js.map +7 -0
  132. package/dist/modules/eudr/commands/lifecycle-events.js +19 -0
  133. package/dist/modules/eudr/commands/lifecycle-events.js.map +7 -0
  134. package/dist/modules/eudr/commands/mitigation-actions.js +488 -0
  135. package/dist/modules/eudr/commands/mitigation-actions.js.map +7 -0
  136. package/dist/modules/eudr/commands/plots.js +517 -0
  137. package/dist/modules/eudr/commands/plots.js.map +7 -0
  138. package/dist/modules/eudr/commands/product-mappings.js +468 -0
  139. package/dist/modules/eudr/commands/product-mappings.js.map +7 -0
  140. package/dist/modules/eudr/commands/risk-assessments.js +599 -0
  141. package/dist/modules/eudr/commands/risk-assessments.js.map +7 -0
  142. package/dist/modules/eudr/commands/statements.js +747 -0
  143. package/dist/modules/eudr/commands/statements.js.map +7 -0
  144. package/dist/modules/eudr/components/CountrySelectField.js +64 -0
  145. package/dist/modules/eudr/components/CountrySelectField.js.map +7 -0
  146. package/dist/modules/eudr/components/GeometryInput.js +133 -0
  147. package/dist/modules/eudr/components/GeometryInput.js.map +7 -0
  148. package/dist/modules/eudr/components/MappingSuggestionsDialog.js +307 -0
  149. package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +7 -0
  150. package/dist/modules/eudr/components/MitigationActionsSection.js +345 -0
  151. package/dist/modules/eudr/components/MitigationActionsSection.js.map +7 -0
  152. package/dist/modules/eudr/components/OrderSelectField.js +88 -0
  153. package/dist/modules/eudr/components/OrderSelectField.js.map +7 -0
  154. package/dist/modules/eudr/components/PlotImportDialog.js +229 -0
  155. package/dist/modules/eudr/components/PlotImportDialog.js.map +7 -0
  156. package/dist/modules/eudr/components/PlotMapPreview.js +35 -0
  157. package/dist/modules/eudr/components/PlotMapPreview.js.map +7 -0
  158. package/dist/modules/eudr/components/PlotMapPreviewImpl.js +97 -0
  159. package/dist/modules/eudr/components/PlotMapPreviewImpl.js.map +7 -0
  160. package/dist/modules/eudr/components/PlotMultiSelectField.js +198 -0
  161. package/dist/modules/eudr/components/PlotMultiSelectField.js.map +7 -0
  162. package/dist/modules/eudr/components/RiskCriteriaField.js +128 -0
  163. package/dist/modules/eudr/components/RiskCriteriaField.js.map +7 -0
  164. package/dist/modules/eudr/components/StatementLifecycleBar.js +274 -0
  165. package/dist/modules/eudr/components/StatementLifecycleBar.js.map +7 -0
  166. package/dist/modules/eudr/components/StatementReadinessChecklist.js +56 -0
  167. package/dist/modules/eudr/components/StatementReadinessChecklist.js.map +7 -0
  168. package/dist/modules/eudr/components/StatementRiskSection.js +179 -0
  169. package/dist/modules/eudr/components/StatementRiskSection.js.map +7 -0
  170. package/dist/modules/eudr/components/crudErrorI18n.js +31 -0
  171. package/dist/modules/eudr/components/crudErrorI18n.js.map +7 -0
  172. package/dist/modules/eudr/components/formConfig.js +593 -0
  173. package/dist/modules/eudr/components/formConfig.js.map +7 -0
  174. package/dist/modules/eudr/components/plotForm.js +68 -0
  175. package/dist/modules/eudr/components/plotForm.js.map +7 -0
  176. package/dist/modules/eudr/data/enrichers.js +62 -0
  177. package/dist/modules/eudr/data/enrichers.js.map +7 -0
  178. package/dist/modules/eudr/data/entities.js +437 -0
  179. package/dist/modules/eudr/data/entities.js.map +7 -0
  180. package/dist/modules/eudr/data/validators.js +271 -0
  181. package/dist/modules/eudr/data/validators.js.map +7 -0
  182. package/dist/modules/eudr/encryption.js +33 -0
  183. package/dist/modules/eudr/encryption.js.map +7 -0
  184. package/dist/modules/eudr/events.js +38 -0
  185. package/dist/modules/eudr/events.js.map +7 -0
  186. package/dist/modules/eudr/index.js +15 -0
  187. package/dist/modules/eudr/index.js.map +7 -0
  188. package/dist/modules/eudr/lib/annual-report.js +104 -0
  189. package/dist/modules/eudr/lib/annual-report.js.map +7 -0
  190. package/dist/modules/eudr/lib/completeness.js +64 -0
  191. package/dist/modules/eudr/lib/completeness.js.map +7 -0
  192. package/dist/modules/eudr/lib/detail-read-scope.js +16 -0
  193. package/dist/modules/eudr/lib/detail-read-scope.js.map +7 -0
  194. package/dist/modules/eudr/lib/geometry.js +142 -0
  195. package/dist/modules/eudr/lib/geometry.js.map +7 -0
  196. package/dist/modules/eudr/lib/notifications.js +56 -0
  197. package/dist/modules/eudr/lib/notifications.js.map +7 -0
  198. package/dist/modules/eudr/lib/plural.js +26 -0
  199. package/dist/modules/eudr/lib/plural.js.map +7 -0
  200. package/dist/modules/eudr/lib/reference-data.js +240 -0
  201. package/dist/modules/eudr/lib/reference-data.js.map +7 -0
  202. package/dist/modules/eudr/lib/species.js +10 -0
  203. package/dist/modules/eudr/lib/species.js.map +7 -0
  204. package/dist/modules/eudr/lib/statement-lifecycle.js +84 -0
  205. package/dist/modules/eudr/lib/statement-lifecycle.js.map +7 -0
  206. package/dist/modules/eudr/lib/statement-seeding.js +49 -0
  207. package/dist/modules/eudr/lib/statement-seeding.js.map +7 -0
  208. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js +15 -0
  209. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js.map +7 -0
  210. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js +24 -0
  211. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js.map +7 -0
  212. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js +15 -0
  213. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js.map +7 -0
  214. package/dist/modules/eudr/notifications.js +58 -0
  215. package/dist/modules/eudr/notifications.js.map +7 -0
  216. package/dist/modules/eudr/search.js +186 -0
  217. package/dist/modules/eudr/search.js.map +7 -0
  218. package/dist/modules/eudr/setup.js +12 -0
  219. package/dist/modules/eudr/setup.js.map +7 -0
  220. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js +34 -0
  221. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js.map +7 -0
  222. package/dist/modules/eudr/subscribers/notify-risk-concluded.js +35 -0
  223. package/dist/modules/eudr/subscribers/notify-risk-concluded.js.map +7 -0
  224. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js +37 -0
  225. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js.map +7 -0
  226. package/dist/modules/eudr/subscribers/notify-statement-submitted.js +34 -0
  227. package/dist/modules/eudr/subscribers/notify-statement-submitted.js.map +7 -0
  228. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js +34 -0
  229. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js.map +7 -0
  230. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js +124 -0
  231. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js.map +7 -0
  232. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js +22 -0
  233. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js.map +7 -0
  234. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js +203 -0
  235. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js.map +7 -0
  236. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js +23 -0
  237. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js.map +7 -0
  238. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js +19 -0
  239. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js.map +7 -0
  240. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js +31 -0
  241. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js.map +7 -0
  242. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js +100 -0
  243. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js.map +7 -0
  244. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js +17 -0
  245. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js.map +7 -0
  246. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js +116 -0
  247. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js.map +7 -0
  248. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js +17 -0
  249. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js.map +7 -0
  250. package/dist/modules/eudr/widgets/injection-table.js +32 -0
  251. package/dist/modules/eudr/widgets/injection-table.js.map +7 -0
  252. package/dist/modules/notifications/lib/notificationService.js +67 -3
  253. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  254. package/dist/modules/query_index/lib/engine.js +121 -48
  255. package/dist/modules/query_index/lib/engine.js.map +2 -2
  256. package/dist/modules/sales/api/documents/factory.js +17 -0
  257. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  258. package/dist/modules/sales/commands/documents.js +32 -18
  259. package/dist/modules/sales/commands/documents.js.map +2 -2
  260. package/dist/modules/sales/data/entities.js +1 -0
  261. package/dist/modules/sales/data/entities.js.map +2 -2
  262. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js +17 -0
  263. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js.map +7 -0
  264. package/generated/entities/eudr_due_diligence_statement/index.ts +22 -0
  265. package/generated/entities/eudr_evidence_submission/index.ts +24 -0
  266. package/generated/entities/eudr_mitigation_action/index.ts +14 -0
  267. package/generated/entities/eudr_plot/index.ts +18 -0
  268. package/generated/entities/eudr_product_mapping/index.ts +14 -0
  269. package/generated/entities/eudr_risk_assessment/index.ts +16 -0
  270. package/generated/entities.ids.generated.ts +9 -0
  271. package/generated/entity-fields-registry.ts +120 -0
  272. package/package.json +7 -7
  273. package/src/modules/attachments/fields/attachment.tsx +5 -0
  274. package/src/modules/attachments/lib/crud.ts +2 -0
  275. package/src/modules/eudr/acl.ts +39 -0
  276. package/src/modules/eudr/ai-agents.ts +258 -0
  277. package/src/modules/eudr/ai-tools/compliance-pack.ts +618 -0
  278. package/src/modules/eudr/ai-tools/types.ts +44 -0
  279. package/src/modules/eudr/ai-tools.ts +15 -0
  280. package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +481 -0
  281. package/src/modules/eudr/api/evidence-submissions/route.ts +335 -0
  282. package/src/modules/eudr/api/mitigation-actions/route.ts +263 -0
  283. package/src/modules/eudr/api/openapi.ts +28 -0
  284. package/src/modules/eudr/api/plots/import/route.ts +369 -0
  285. package/src/modules/eudr/api/plots/route.ts +296 -0
  286. package/src/modules/eudr/api/product-mappings/route.ts +269 -0
  287. package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +382 -0
  288. package/src/modules/eudr/api/product-mappings/suggestions/route.ts +169 -0
  289. package/src/modules/eudr/api/reports/annual/route.ts +457 -0
  290. package/src/modules/eudr/api/risk-assessments/route.ts +323 -0
  291. package/src/modules/eudr/api/statements/[id]/export/route.ts +713 -0
  292. package/src/modules/eudr/api/statements/[id]/readiness/route.ts +129 -0
  293. package/src/modules/eudr/api/statements/route.ts +329 -0
  294. package/src/modules/eudr/api/suppliers/compliance/route.ts +241 -0
  295. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +12 -0
  296. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +545 -0
  297. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +13 -0
  298. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +383 -0
  299. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +12 -0
  300. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +379 -0
  301. package/src/modules/eudr/backend/eudr/page.meta.ts +12 -0
  302. package/src/modules/eudr/backend/eudr/page.tsx +477 -0
  303. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +12 -0
  304. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +404 -0
  305. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +13 -0
  306. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +267 -0
  307. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +12 -0
  308. package/src/modules/eudr/backend/eudr/plots/page.tsx +442 -0
  309. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +12 -0
  310. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +311 -0
  311. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +13 -0
  312. package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +190 -0
  313. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +12 -0
  314. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +344 -0
  315. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +12 -0
  316. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +421 -0
  317. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +13 -0
  318. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +247 -0
  319. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +12 -0
  320. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +383 -0
  321. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +12 -0
  322. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +777 -0
  323. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +13 -0
  324. package/src/modules/eudr/backend/eudr/statements/create/page.tsx +511 -0
  325. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +12 -0
  326. package/src/modules/eudr/backend/eudr/statements/page.tsx +372 -0
  327. package/src/modules/eudr/ce.ts +52 -0
  328. package/src/modules/eudr/commands/evidence-submissions.ts +699 -0
  329. package/src/modules/eudr/commands/index.ts +6 -0
  330. package/src/modules/eudr/commands/lifecycle-events.ts +28 -0
  331. package/src/modules/eudr/commands/mitigation-actions.ts +574 -0
  332. package/src/modules/eudr/commands/plots.ts +627 -0
  333. package/src/modules/eudr/commands/product-mappings.ts +556 -0
  334. package/src/modules/eudr/commands/risk-assessments.ts +728 -0
  335. package/src/modules/eudr/commands/statements.ts +933 -0
  336. package/src/modules/eudr/components/CountrySelectField.tsx +77 -0
  337. package/src/modules/eudr/components/GeometryInput.tsx +170 -0
  338. package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +385 -0
  339. package/src/modules/eudr/components/MitigationActionsSection.tsx +417 -0
  340. package/src/modules/eudr/components/OrderSelectField.tsx +116 -0
  341. package/src/modules/eudr/components/PlotImportDialog.tsx +277 -0
  342. package/src/modules/eudr/components/PlotMapPreview.tsx +46 -0
  343. package/src/modules/eudr/components/PlotMapPreviewImpl.tsx +111 -0
  344. package/src/modules/eudr/components/PlotMultiSelectField.tsx +238 -0
  345. package/src/modules/eudr/components/RiskCriteriaField.tsx +173 -0
  346. package/src/modules/eudr/components/StatementLifecycleBar.tsx +363 -0
  347. package/src/modules/eudr/components/StatementReadinessChecklist.tsx +82 -0
  348. package/src/modules/eudr/components/StatementRiskSection.tsx +242 -0
  349. package/src/modules/eudr/components/crudErrorI18n.ts +36 -0
  350. package/src/modules/eudr/components/formConfig.tsx +717 -0
  351. package/src/modules/eudr/components/plotForm.ts +75 -0
  352. package/src/modules/eudr/data/enrichers.ts +82 -0
  353. package/src/modules/eudr/data/entities.ts +369 -0
  354. package/src/modules/eudr/data/validators.ts +357 -0
  355. package/src/modules/eudr/encryption.ts +31 -0
  356. package/src/modules/eudr/events.ts +38 -0
  357. package/src/modules/eudr/i18n/de.json +747 -0
  358. package/src/modules/eudr/i18n/en.json +747 -0
  359. package/src/modules/eudr/i18n/es.json +747 -0
  360. package/src/modules/eudr/i18n/ko.json +747 -0
  361. package/src/modules/eudr/i18n/pl.json +747 -0
  362. package/src/modules/eudr/index.ts +13 -0
  363. package/src/modules/eudr/lib/annual-report.ts +120 -0
  364. package/src/modules/eudr/lib/completeness.ts +90 -0
  365. package/src/modules/eudr/lib/detail-read-scope.ts +44 -0
  366. package/src/modules/eudr/lib/geometry.ts +191 -0
  367. package/src/modules/eudr/lib/notifications.ts +85 -0
  368. package/src/modules/eudr/lib/plural.ts +36 -0
  369. package/src/modules/eudr/lib/reference-data.ts +128 -0
  370. package/src/modules/eudr/lib/species.ts +12 -0
  371. package/src/modules/eudr/lib/statement-lifecycle.ts +109 -0
  372. package/src/modules/eudr/lib/statement-seeding.ts +86 -0
  373. package/src/modules/eudr/migrations/.snapshot-open-mercato.json +2046 -0
  374. package/src/modules/eudr/migrations/Migration20260706102002_eudr.ts +16 -0
  375. package/src/modules/eudr/migrations/Migration20260706152612_eudr.ts +30 -0
  376. package/src/modules/eudr/migrations/Migration20260722100000_eudr.ts +17 -0
  377. package/src/modules/eudr/notifications.ts +56 -0
  378. package/src/modules/eudr/search.ts +212 -0
  379. package/src/modules/eudr/setup.ts +10 -0
  380. package/src/modules/eudr/subscribers/notify-mitigation-completed.ts +56 -0
  381. package/src/modules/eudr/subscribers/notify-risk-concluded.ts +58 -0
  382. package/src/modules/eudr/subscribers/notify-statement-reference-issued.ts +59 -0
  383. package/src/modules/eudr/subscribers/notify-statement-submitted.ts +49 -0
  384. package/src/modules/eudr/subscribers/notify-statement-withdrawn.ts +49 -0
  385. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-created.ts +189 -0
  386. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.ts +31 -0
  387. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.client.tsx +271 -0
  388. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts +24 -0
  389. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx +37 -0
  390. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.ts +30 -0
  391. package/src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx +131 -0
  392. package/src/modules/eudr/widgets/injection/order-compliance/widget.ts +16 -0
  393. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx +168 -0
  394. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.ts +16 -0
  395. package/src/modules/eudr/widgets/injection-table.ts +31 -0
  396. package/src/modules/notifications/lib/notificationService.ts +83 -4
  397. package/src/modules/query_index/lib/engine.ts +139 -51
  398. package/src/modules/sales/api/documents/factory.ts +29 -0
  399. package/src/modules/sales/commands/documents.ts +65 -18
  400. package/src/modules/sales/data/entities.ts +1 -0
  401. package/src/modules/sales/migrations/.snapshot-open-mercato.json +10 -0
  402. package/src/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.ts +59 -0
@@ -0,0 +1,23 @@
1
+ import { lazyDashboardWidget } from "@open-mercato/shared/modules/dashboard/widgets";
2
+ const EudrComplianceOverviewWidget = lazyDashboardWidget(() => import("./widget.client.js"));
3
+ const widget = {
4
+ metadata: {
5
+ id: "eudr.dashboard.complianceOverview",
6
+ title: "EUDR compliance",
7
+ description: "Track due diligence readiness, evidence completeness, and upcoming EUDR review work.",
8
+ features: ["dashboards.view", "eudr.statements.view"],
9
+ defaultSize: "md",
10
+ defaultEnabled: false,
11
+ defaultSettings: {},
12
+ tags: ["eudr", "compliance"],
13
+ category: "compliance",
14
+ icon: "leaf",
15
+ supportsRefresh: true
16
+ },
17
+ Widget: EudrComplianceOverviewWidget
18
+ };
19
+ var widget_default = widget;
20
+ export {
21
+ widget_default as default
22
+ };
23
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts"],
4
+ "sourcesContent": ["import { lazyDashboardWidget, type DashboardWidgetModule } from '@open-mercato/shared/modules/dashboard/widgets'\n\nexport type EudrComplianceOverviewSettings = Record<string, never>\n\nconst EudrComplianceOverviewWidget = lazyDashboardWidget<EudrComplianceOverviewSettings>(() => import('./widget.client'))\n\nconst widget: DashboardWidgetModule<EudrComplianceOverviewSettings> = {\n metadata: {\n id: 'eudr.dashboard.complianceOverview',\n title: 'EUDR compliance',\n description: 'Track due diligence readiness, evidence completeness, and upcoming EUDR review work.',\n features: ['dashboards.view', 'eudr.statements.view'],\n defaultSize: 'md',\n defaultEnabled: false,\n defaultSettings: {},\n tags: ['eudr', 'compliance'],\n category: 'compliance',\n icon: 'leaf',\n supportsRefresh: true,\n },\n Widget: EudrComplianceOverviewWidget,\n}\n\nexport default widget\n"],
5
+ "mappings": "AAAA,SAAS,2BAAuD;AAIhE,MAAM,+BAA+B,oBAAoD,MAAM,OAAO,iBAAiB,CAAC;AAExH,MAAM,SAAgE;AAAA,EACpE,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU,CAAC,mBAAmB,sBAAsB;AAAA,IACpD,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,iBAAiB,CAAC;AAAA,IAClB,MAAM,CAAC,QAAQ,YAAY;AAAA,IAC3B,UAAU;AAAA,IACV,MAAM;AAAA,IACN,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AACV;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
4
+ import { Tag } from "@open-mercato/ui/primitives/tag";
5
+ function EudrProductColumnWidget({ value }) {
6
+ const t = useT();
7
+ if (!value || typeof value.commodity !== "string" || value.commodity.length === 0) {
8
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", "aria-label": t("eudr.productColumn.noMapping"), children: t("eudr.common.empty") });
9
+ }
10
+ const inScope = value.isInScope !== false;
11
+ return /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-wrap items-center gap-1.5", children: [
12
+ /* @__PURE__ */ jsx(Tag, { variant: inScope ? "success" : "neutral", children: t(`eudr.commodity.${value.commodity}`) }),
13
+ !inScope ? /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: t("eudr.productColumn.outOfScope") }) : null
14
+ ] });
15
+ }
16
+ export {
17
+ EudrProductColumnWidget as default
18
+ };
19
+ //# sourceMappingURL=widget.client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Tag } from '@open-mercato/ui/primitives/tag'\n\nexport type EudrProductColumnValue = {\n commodity?: string | null\n isInScope?: boolean | null\n} | null | undefined\n\nexport default function EudrProductColumnWidget({ value }: { value: EudrProductColumnValue }) {\n const t = useT()\n\n if (!value || typeof value.commodity !== 'string' || value.commodity.length === 0) {\n return (\n <span className=\"text-muted-foreground\" aria-label={t('eudr.productColumn.noMapping')}>\n {t('eudr.common.empty')}\n </span>\n )\n }\n\n const inScope = value.isInScope !== false\n\n return (\n <span className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <Tag variant={inScope ? 'success' : 'neutral'}>\n {t(`eudr.commodity.${value.commodity}`)}\n </Tag>\n {!inScope ? (\n <span className=\"text-xs text-muted-foreground\">\n {t('eudr.productColumn.outOfScope')}\n </span>\n ) : null}\n </span>\n )\n}\n"],
5
+ "mappings": ";AAgBM,cASF,YATE;AAbN,SAAS,YAAY;AACrB,SAAS,WAAW;AAOL,SAAR,wBAAyC,EAAE,MAAM,GAAsC;AAC5F,QAAM,IAAI,KAAK;AAEf,MAAI,CAAC,SAAS,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,WAAW,GAAG;AACjF,WACE,oBAAC,UAAK,WAAU,yBAAwB,cAAY,EAAE,8BAA8B,GACjF,YAAE,mBAAmB,GACxB;AAAA,EAEJ;AAEA,QAAM,UAAU,MAAM,cAAc;AAEpC,SACE,qBAAC,UAAK,WAAU,+CACd;AAAA,wBAAC,OAAI,SAAS,UAAU,YAAY,WACjC,YAAE,kBAAkB,MAAM,SAAS,EAAE,GACxC;AAAA,IACC,CAAC,UACA,oBAAC,UAAK,WAAU,iCACb,YAAE,+BAA+B,GACpC,IACE;AAAA,KACN;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,31 @@
1
+ import * as React from "react";
2
+ import EudrProductColumnWidget from "./widget.client.js";
3
+ const widget = {
4
+ metadata: {
5
+ id: "eudr.injection.product-column",
6
+ title: "EUDR product column",
7
+ description: "Renders EUDR commodity and scope information on catalog product lists.",
8
+ features: ["eudr.mappings.view"],
9
+ priority: 50,
10
+ enabled: true
11
+ },
12
+ columns: [
13
+ {
14
+ id: "eudr.product-column",
15
+ header: "eudr.productColumn.header",
16
+ accessorKey: "_eudr",
17
+ size: 180,
18
+ sortable: false,
19
+ cell: ({ getValue }) => {
20
+ return React.createElement(EudrProductColumnWidget, {
21
+ value: getValue()
22
+ });
23
+ }
24
+ }
25
+ ]
26
+ };
27
+ var widget_default = widget;
28
+ export {
29
+ widget_default as default
30
+ };
31
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/injection/eudr-product-column/widget.ts"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport type { InjectionColumnWidget } from '@open-mercato/shared/modules/widgets/injection'\nimport EudrProductColumnWidget, { type EudrProductColumnValue } from './widget.client'\n\nconst widget: InjectionColumnWidget = {\n metadata: {\n id: 'eudr.injection.product-column',\n title: 'EUDR product column',\n description: 'Renders EUDR commodity and scope information on catalog product lists.',\n features: ['eudr.mappings.view'],\n priority: 50,\n enabled: true,\n },\n columns: [\n {\n id: 'eudr.product-column',\n header: 'eudr.productColumn.header',\n accessorKey: '_eudr',\n size: 180,\n sortable: false,\n cell: ({ getValue }) => {\n return React.createElement(EudrProductColumnWidget, {\n value: getValue() as EudrProductColumnValue,\n })\n },\n },\n ],\n}\n\nexport default widget\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;AAEvB,OAAO,6BAA8D;AAErE,MAAM,SAAgC;AAAA,EACpC,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU,CAAC,oBAAoB;AAAA,IAC/B,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM,CAAC,EAAE,SAAS,MAAM;AACtB,eAAO,MAAM,cAAc,yBAAyB;AAAA,UAClD,OAAO,SAAS;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,100 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import Link from "next/link";
5
+ import { Check, Copy } from "lucide-react";
6
+ import { useQuery } from "@tanstack/react-query";
7
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
8
+ import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
9
+ import { ErrorMessage, LoadingMessage } from "@open-mercato/ui/backend/detail";
10
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
11
+ import { StatusBadge } from "@open-mercato/ui/primitives/status-badge";
12
+ import { statusBadgeVariant } from "../../../components/formConfig.js";
13
+ function CopyNumberButton({ value, label }) {
14
+ const [copied, setCopied] = React.useState(false);
15
+ const handleCopy = React.useCallback(async () => {
16
+ if (typeof navigator === "undefined" || !navigator.clipboard) return;
17
+ await navigator.clipboard.writeText(value);
18
+ setCopied(true);
19
+ window.setTimeout(() => setCopied(false), 1500);
20
+ }, [value]);
21
+ return /* @__PURE__ */ jsx(IconButton, { type: "button", variant: "ghost", size: "xs", onClick: handleCopy, "aria-label": label, children: copied ? /* @__PURE__ */ jsx(Check, { "aria-hidden": true }) : /* @__PURE__ */ jsx(Copy, { "aria-hidden": true }) });
22
+ }
23
+ function OrderComplianceWidget({ data }) {
24
+ const t = useT();
25
+ const orderId = data?.id;
26
+ const { data: statementsData, isLoading, isError } = useQuery({
27
+ queryKey: ["eudr-order-statements", orderId],
28
+ queryFn: async () => {
29
+ if (!orderId) return null;
30
+ const result = await apiCall(
31
+ `/api/eudr/statements?orderId=${encodeURIComponent(orderId)}&pageSize=20`
32
+ );
33
+ if (!result.ok) throw new Error("[internal] eudr order compliance statements load failed");
34
+ return result.result;
35
+ },
36
+ enabled: Boolean(orderId),
37
+ staleTime: 5e3
38
+ });
39
+ if (!orderId) return null;
40
+ const statements = statementsData?.items ?? [];
41
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3 rounded-lg border bg-card p-4 shadow-sm", children: [
42
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-foreground", children: t("eudr.orderPanel.groupLabel", "EUDR compliance") }),
43
+ isLoading ? /* @__PURE__ */ jsx(LoadingMessage, { label: t("eudr.orderPanel.loading", "Loading due diligence statements...") }) : isError ? /* @__PURE__ */ jsx(ErrorMessage, { label: t("eudr.orderPanel.error", "Failed to load due diligence statements.") }) : statements.length === 0 ? /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
44
+ t("eudr.orderPanel.empty", "No due diligence statements are linked to this order."),
45
+ " ",
46
+ /* @__PURE__ */ jsx(
47
+ Link,
48
+ {
49
+ href: `/backend/eudr/statements/create?orderId=${encodeURIComponent(orderId)}`,
50
+ className: "text-primary hover:underline",
51
+ children: t("eudr.orderPanel.createStatement", "Create statement")
52
+ }
53
+ )
54
+ ] }) : /* @__PURE__ */ jsx("ul", { className: "space-y-2", children: statements.map((statement) => /* @__PURE__ */ jsxs("li", { className: "space-y-1.5 rounded-md border p-2.5", children: [
55
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
56
+ /* @__PURE__ */ jsx(
57
+ Link,
58
+ {
59
+ href: `/backend/eudr/statements/${encodeURIComponent(statement.id)}`,
60
+ className: "min-w-0 truncate text-sm font-medium hover:underline",
61
+ children: statement.title || t("eudr.orderPanel.untitled", "Untitled statement")
62
+ }
63
+ ),
64
+ statement.status ? /* @__PURE__ */ jsx(StatusBadge, { variant: statusBadgeVariant(statement.status), dot: true, children: t(`eudr.statementStatus.${statement.status}`) }) : null
65
+ ] }),
66
+ statement.referenceNumber ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
67
+ /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
68
+ t("eudr.orderPanel.referenceLabel", "Reference"),
69
+ ": ",
70
+ statement.referenceNumber
71
+ ] }),
72
+ /* @__PURE__ */ jsx(
73
+ CopyNumberButton,
74
+ {
75
+ value: statement.referenceNumber,
76
+ label: t("eudr.orderPanel.copyReference", "Copy reference number")
77
+ }
78
+ )
79
+ ] }) : null,
80
+ statement.verificationNumber ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
81
+ /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
82
+ t("eudr.orderPanel.verificationLabel", "Verification"),
83
+ ": ",
84
+ statement.verificationNumber
85
+ ] }),
86
+ /* @__PURE__ */ jsx(
87
+ CopyNumberButton,
88
+ {
89
+ value: statement.verificationNumber,
90
+ label: t("eudr.orderPanel.copyVerification", "Copy verification number")
91
+ }
92
+ )
93
+ ] }) : null
94
+ ] }, statement.id)) })
95
+ ] });
96
+ }
97
+ export {
98
+ OrderComplianceWidget as default
99
+ };
100
+ //# sourceMappingURL=widget.client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Check, Copy } from 'lucide-react'\nimport { useQuery } from '@tanstack/react-query'\nimport type { InjectionWidgetComponentProps } from '@open-mercato/shared/modules/widgets/injection'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { ErrorMessage, LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { statusBadgeVariant } from '../../../components/formConfig'\n\nexport type OrderRecord = {\n id: string\n}\n\ntype StatementListItem = {\n id: string\n title: string | null\n status: string | null\n referenceNumber: string | null\n verificationNumber: string | null\n}\n\nfunction CopyNumberButton({ value, label }: { value: string; label: string }) {\n const [copied, setCopied] = React.useState(false)\n\n const handleCopy = React.useCallback(async () => {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return\n await navigator.clipboard.writeText(value)\n setCopied(true)\n window.setTimeout(() => setCopied(false), 1500)\n }, [value])\n\n return (\n <IconButton type=\"button\" variant=\"ghost\" size=\"xs\" onClick={handleCopy} aria-label={label}>\n {copied ? <Check aria-hidden /> : <Copy aria-hidden />}\n </IconButton>\n )\n}\n\nexport default function OrderComplianceWidget({ data }: InjectionWidgetComponentProps<unknown, OrderRecord>) {\n const t = useT()\n const orderId = data?.id\n\n const { data: statementsData, isLoading, isError } = useQuery({\n queryKey: ['eudr-order-statements', orderId],\n queryFn: async () => {\n if (!orderId) return null\n const result = await apiCall<{ items: StatementListItem[] }>(\n `/api/eudr/statements?orderId=${encodeURIComponent(orderId)}&pageSize=20`\n )\n if (!result.ok) throw new Error('[internal] eudr order compliance statements load failed')\n return result.result\n },\n enabled: Boolean(orderId),\n staleTime: 5_000,\n })\n\n if (!orderId) return null\n\n const statements = statementsData?.items ?? []\n\n return (\n <div className=\"space-y-3 rounded-lg border bg-card p-4 shadow-sm\">\n <div className=\"text-sm font-semibold text-foreground\">\n {t('eudr.orderPanel.groupLabel', 'EUDR compliance')}\n </div>\n\n {isLoading ? (\n <LoadingMessage label={t('eudr.orderPanel.loading', 'Loading due diligence statements...')} />\n ) : isError ? (\n <ErrorMessage label={t('eudr.orderPanel.error', 'Failed to load due diligence statements.')} />\n ) : statements.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {t('eudr.orderPanel.empty', 'No due diligence statements are linked to this order.')}{' '}\n <Link\n href={`/backend/eudr/statements/create?orderId=${encodeURIComponent(orderId)}`}\n className=\"text-primary hover:underline\"\n >\n {t('eudr.orderPanel.createStatement', 'Create statement')}\n </Link>\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {statements.map((statement) => (\n <li key={statement.id} className=\"space-y-1.5 rounded-md border p-2.5\">\n <div className=\"flex items-center justify-between gap-2\">\n <Link\n href={`/backend/eudr/statements/${encodeURIComponent(statement.id)}`}\n className=\"min-w-0 truncate text-sm font-medium hover:underline\"\n >\n {statement.title || t('eudr.orderPanel.untitled', 'Untitled statement')}\n </Link>\n {statement.status ? (\n <StatusBadge variant={statusBadgeVariant(statement.status)} dot>\n {t(`eudr.statementStatus.${statement.status}`)}\n </StatusBadge>\n ) : null}\n </div>\n {statement.referenceNumber ? (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <span className=\"truncate\">\n {t('eudr.orderPanel.referenceLabel', 'Reference')}: {statement.referenceNumber}\n </span>\n <CopyNumberButton\n value={statement.referenceNumber}\n label={t('eudr.orderPanel.copyReference', 'Copy reference number')}\n />\n </div>\n ) : null}\n {statement.verificationNumber ? (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <span className=\"truncate\">\n {t('eudr.orderPanel.verificationLabel', 'Verification')}: {statement.verificationNumber}\n </span>\n <CopyNumberButton\n value={statement.verificationNumber}\n label={t('eudr.orderPanel.copyVerification', 'Copy verification number')}\n />\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import OrderComplianceWidget from "./widget.client.js";
2
+ const widget = {
3
+ metadata: {
4
+ id: "eudr.injection.order-compliance",
5
+ title: "EUDR compliance",
6
+ description: "Due diligence statements linked to the sales order",
7
+ features: ["eudr.statements.view"],
8
+ priority: 210,
9
+ enabled: true
10
+ },
11
+ Widget: OrderComplianceWidget
12
+ };
13
+ var widget_default = widget;
14
+ export {
15
+ widget_default as default
16
+ };
17
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/injection/order-compliance/widget.ts"],
4
+ "sourcesContent": ["import type { InjectionWidgetModule } from '@open-mercato/shared/modules/widgets/injection'\nimport OrderComplianceWidget, { type OrderRecord } from './widget.client'\n\nconst widget: InjectionWidgetModule<unknown, OrderRecord> = {\n metadata: {\n id: 'eudr.injection.order-compliance',\n title: 'EUDR compliance',\n description: 'Due diligence statements linked to the sales order',\n features: ['eudr.statements.view'],\n priority: 210,\n enabled: true,\n },\n Widget: OrderComplianceWidget,\n}\n\nexport default widget\n"],
5
+ "mappings": "AACA,OAAO,2BAAiD;AAExD,MAAM,SAAsD;AAAA,EAC1D,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU,CAAC,sBAAsB;AAAA,IACjC,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AACV;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,116 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import { useQuery } from "@tanstack/react-query";
5
+ import { useLocale, useT } from "@open-mercato/shared/lib/i18n/context";
6
+ import { createLogger } from "@open-mercato/shared/lib/logger";
7
+ import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
8
+ import { Badge } from "@open-mercato/ui/primitives/badge";
9
+ import { StatusBadge } from "@open-mercato/ui/primitives/status-badge";
10
+ import { statusBadgeVariant } from "../../../components/formConfig.js";
11
+ import { EUDR_SUBMISSION_STATUSES } from "../../../data/validators.js";
12
+ const logger = createLogger("eudr");
13
+ function isRecord(value) {
14
+ return value !== null && typeof value === "object" && !Array.isArray(value);
15
+ }
16
+ function readId(value) {
17
+ if (typeof value !== "string") return null;
18
+ const trimmed = value.trim();
19
+ return trimmed.length > 0 ? trimmed : null;
20
+ }
21
+ function readNestedCompanyId(value) {
22
+ if (!isRecord(value) || !isRecord(value.company)) return null;
23
+ return readId(value.company.id);
24
+ }
25
+ function resolveCompanyId(context, data) {
26
+ if (!isRecord(context)) return readNestedCompanyId(data);
27
+ return readId(context.companyId) ?? readId(context.resourceId) ?? readId(context.entityId) ?? readId(context.recordId) ?? readNestedCompanyId(context.data) ?? readNestedCompanyId(data);
28
+ }
29
+ function formatDate(value, emptyLabel, locale) {
30
+ if (!value) return emptyLabel;
31
+ const date = new Date(value);
32
+ return Number.isNaN(date.getTime()) ? emptyLabel : date.toLocaleDateString(locale || void 0);
33
+ }
34
+ async function loadSupplierCompliance(supplierEntityId) {
35
+ try {
36
+ const call = await apiCall(
37
+ `/api/eudr/suppliers/compliance?supplierEntityId=${encodeURIComponent(supplierEntityId)}`,
38
+ {
39
+ headers: {
40
+ "x-om-forbidden-redirect": "0",
41
+ "x-om-unauthorized-redirect": "0"
42
+ }
43
+ }
44
+ );
45
+ if (!call.ok || !call.result) {
46
+ throw new Error(`[internal] EUDR supplier compliance request failed with status ${call.status}`);
47
+ }
48
+ return call.result;
49
+ } catch (err) {
50
+ logger.debug("Supplier compliance widget data unavailable", {
51
+ component: "supplier-compliance",
52
+ err
53
+ });
54
+ return null;
55
+ }
56
+ }
57
+ function SupplierComplianceWidget({
58
+ context,
59
+ data
60
+ }) {
61
+ const t = useT();
62
+ const locale = useLocale();
63
+ const companyId = resolveCompanyId(context, data);
64
+ const { data: compliance } = useQuery({
65
+ queryKey: ["eudr-supplier-compliance", companyId],
66
+ queryFn: () => companyId ? loadSupplierCompliance(companyId) : Promise.resolve(null),
67
+ enabled: Boolean(companyId),
68
+ staleTime: 5e3
69
+ });
70
+ if (!companyId || !compliance) return null;
71
+ if (compliance.submissions.total === 0 && (!compliance.plots || compliance.plots.total === 0)) return null;
72
+ const emptyLabel = t("eudr.common.empty");
73
+ const statusCounts = EUDR_SUBMISSION_STATUSES.flatMap((status) => {
74
+ const count = compliance.submissions.byStatus[status] ?? 0;
75
+ return count > 0 ? [{ status, count }] : [];
76
+ });
77
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3 rounded-lg border border-border bg-card p-4 shadow-sm", children: [
78
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-foreground", children: t("eudr.supplierPanel.title") }),
79
+ /* @__PURE__ */ jsxs("dl", { className: "grid gap-3 sm:grid-cols-3", children: [
80
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
81
+ /* @__PURE__ */ jsx("dt", { className: "text-xs text-muted-foreground", children: t("eudr.supplierPanel.submissions") }),
82
+ /* @__PURE__ */ jsx("dd", { className: "text-lg font-semibold text-foreground", children: compliance.submissions.total })
83
+ ] }),
84
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
85
+ /* @__PURE__ */ jsx("dt", { className: "text-xs text-muted-foreground", children: t("eudr.supplierPanel.avgCompleteness") }),
86
+ /* @__PURE__ */ jsx("dd", { className: "text-lg font-semibold text-foreground", children: compliance.submissions.avgCompleteness === null ? emptyLabel : `${Math.round(compliance.submissions.avgCompleteness)}%` })
87
+ ] }),
88
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
89
+ /* @__PURE__ */ jsx("dt", { className: "text-xs text-muted-foreground", children: t("eudr.supplierPanel.lastSubmission") }),
90
+ /* @__PURE__ */ jsx("dd", { className: "text-sm font-medium text-foreground", children: formatDate(compliance.lastSubmissionAt, emptyLabel, locale) })
91
+ ] })
92
+ ] }),
93
+ statusCounts.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: statusCounts.map(({ status, count }) => /* @__PURE__ */ jsxs(StatusBadge, { variant: statusBadgeVariant(status), dot: true, children: [
94
+ t(`eudr.submissionStatus.${status}`),
95
+ ": ",
96
+ count
97
+ ] }, status)) }) : null,
98
+ compliance.plots ? /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 text-sm", children: [
99
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("eudr.supplierPanel.plots") }),
100
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-foreground", children: compliance.plots.total }),
101
+ compliance.plots.withWarnings > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "warning", children: [
102
+ t("eudr.supplierPanel.warnings"),
103
+ ": ",
104
+ compliance.plots.withWarnings
105
+ ] }) : null
106
+ ] }) : null,
107
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-3 text-sm", children: [
108
+ /* @__PURE__ */ jsx(Link, { href: "/backend/eudr/evidence-submissions", className: "text-primary hover:underline", children: t("eudr.supplierPanel.viewSubmissions") }),
109
+ compliance.plots ? /* @__PURE__ */ jsx(Link, { href: "/backend/eudr/plots", className: "text-primary hover:underline", children: t("eudr.supplierPanel.viewPlots") }) : null
110
+ ] })
111
+ ] });
112
+ }
113
+ export {
114
+ SupplierComplianceWidget as default
115
+ };
116
+ //# sourceMappingURL=widget.client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport Link from 'next/link'\nimport { useQuery } from '@tanstack/react-query'\nimport type { InjectionWidgetComponentProps } from '@open-mercato/shared/modules/widgets/injection'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { statusBadgeVariant } from '../../../components/formConfig'\nimport { EUDR_SUBMISSION_STATUSES } from '../../../data/validators'\n\nconst logger = createLogger('eudr')\n\ntype SupplierCompliance = {\n submissions: {\n total: number\n byStatus: Record<string, number>\n avgCompleteness: number | null\n }\n lastSubmissionAt: string | null\n plots?: {\n total: number\n withWarnings: number\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readId(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction readNestedCompanyId(value: unknown): string | null {\n if (!isRecord(value) || !isRecord(value.company)) return null\n return readId(value.company.id)\n}\n\nfunction resolveCompanyId(context: unknown, data: unknown): string | null {\n if (!isRecord(context)) return readNestedCompanyId(data)\n return readId(context.companyId)\n ?? readId(context.resourceId)\n ?? readId(context.entityId)\n ?? readId(context.recordId)\n ?? readNestedCompanyId(context.data)\n ?? readNestedCompanyId(data)\n}\n\nfunction formatDate(value: string | null, emptyLabel: string, locale: string): string {\n if (!value) return emptyLabel\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? emptyLabel : date.toLocaleDateString(locale || undefined)\n}\n\nasync function loadSupplierCompliance(supplierEntityId: string): Promise<SupplierCompliance | null> {\n try {\n const call = await apiCall<SupplierCompliance>(\n `/api/eudr/suppliers/compliance?supplierEntityId=${encodeURIComponent(supplierEntityId)}`,\n {\n headers: {\n 'x-om-forbidden-redirect': '0',\n 'x-om-unauthorized-redirect': '0',\n },\n },\n )\n if (!call.ok || !call.result) {\n throw new Error(`[internal] EUDR supplier compliance request failed with status ${call.status}`)\n }\n return call.result\n } catch (err) {\n logger.debug('Supplier compliance widget data unavailable', {\n component: 'supplier-compliance',\n err,\n })\n return null\n }\n}\n\nexport default function SupplierComplianceWidget({\n context,\n data,\n}: InjectionWidgetComponentProps<unknown, unknown>) {\n const t = useT()\n const locale = useLocale()\n const companyId = resolveCompanyId(context, data)\n const { data: compliance } = useQuery({\n queryKey: ['eudr-supplier-compliance', companyId],\n queryFn: () => companyId ? loadSupplierCompliance(companyId) : Promise.resolve(null),\n enabled: Boolean(companyId),\n staleTime: 5_000,\n })\n\n if (!companyId || !compliance) return null\n if (compliance.submissions.total === 0 && (!compliance.plots || compliance.plots.total === 0)) return null\n\n const emptyLabel = t('eudr.common.empty')\n const statusCounts = EUDR_SUBMISSION_STATUSES.flatMap((status) => {\n const count = compliance.submissions.byStatus[status] ?? 0\n return count > 0 ? [{ status, count }] : []\n })\n\n return (\n <div className=\"space-y-3 rounded-lg border border-border bg-card p-4 shadow-sm\">\n <div className=\"text-sm font-semibold text-foreground\">\n {t('eudr.supplierPanel.title')}\n </div>\n\n <dl className=\"grid gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1\">\n <dt className=\"text-xs text-muted-foreground\">{t('eudr.supplierPanel.submissions')}</dt>\n <dd className=\"text-lg font-semibold text-foreground\">{compliance.submissions.total}</dd>\n </div>\n <div className=\"space-y-1\">\n <dt className=\"text-xs text-muted-foreground\">{t('eudr.supplierPanel.avgCompleteness')}</dt>\n <dd className=\"text-lg font-semibold text-foreground\">\n {compliance.submissions.avgCompleteness === null\n ? emptyLabel\n : `${Math.round(compliance.submissions.avgCompleteness)}%`}\n </dd>\n </div>\n <div className=\"space-y-1\">\n <dt className=\"text-xs text-muted-foreground\">{t('eudr.supplierPanel.lastSubmission')}</dt>\n <dd className=\"text-sm font-medium text-foreground\">\n {formatDate(compliance.lastSubmissionAt, emptyLabel, locale)}\n </dd>\n </div>\n </dl>\n\n {statusCounts.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {statusCounts.map(({ status, count }) => (\n <StatusBadge key={status} variant={statusBadgeVariant(status)} dot>\n {t(`eudr.submissionStatus.${status}`)}: {count}\n </StatusBadge>\n ))}\n </div>\n ) : null}\n\n {compliance.plots ? (\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <span className=\"text-muted-foreground\">{t('eudr.supplierPanel.plots')}</span>\n <span className=\"font-semibold text-foreground\">{compliance.plots.total}</span>\n {compliance.plots.withWarnings > 0 ? (\n <Badge variant=\"warning\">\n {t('eudr.supplierPanel.warnings')}: {compliance.plots.withWarnings}\n </Badge>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"flex flex-wrap gap-3 text-sm\">\n <Link href=\"/backend/eudr/evidence-submissions\" className=\"text-primary hover:underline\">\n {t('eudr.supplierPanel.viewSubmissions')}\n </Link>\n {compliance.plots ? (\n <Link href=\"/backend/eudr/plots\" className=\"text-primary hover:underline\">\n {t('eudr.supplierPanel.viewPlots')}\n </Link>\n ) : null}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": ";AA4GM,cAKE,YALF;AA1GN,OAAO,UAAU;AACjB,SAAS,gBAAgB;AAEzB,SAAS,WAAW,YAAY;AAChC,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AACnC,SAAS,gCAAgC;AAEzC,MAAM,SAAS,aAAa,MAAM;AAelC,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,OAAO,OAA+B;AAC7C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,oBAAoB,OAA+B;AAC1D,MAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,OAAO,EAAG,QAAO;AACzD,SAAO,OAAO,MAAM,QAAQ,EAAE;AAChC;AAEA,SAAS,iBAAiB,SAAkB,MAA8B;AACxE,MAAI,CAAC,SAAS,OAAO,EAAG,QAAO,oBAAoB,IAAI;AACvD,SAAO,OAAO,QAAQ,SAAS,KAC1B,OAAO,QAAQ,UAAU,KACzB,OAAO,QAAQ,QAAQ,KACvB,OAAO,QAAQ,QAAQ,KACvB,oBAAoB,QAAQ,IAAI,KAChC,oBAAoB,IAAI;AAC/B;AAEA,SAAS,WAAW,OAAsB,YAAoB,QAAwB;AACpF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,aAAa,KAAK,mBAAmB,UAAU,MAAS;AAChG;AAEA,eAAe,uBAAuB,kBAA8D;AAClG,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,mDAAmD,mBAAmB,gBAAgB,CAAC;AAAA,MACvF;AAAA,QACE,SAAS;AAAA,UACP,2BAA2B;AAAA,UAC3B,8BAA8B;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAK,MAAM,CAAC,KAAK,QAAQ;AAC5B,YAAM,IAAI,MAAM,kEAAkE,KAAK,MAAM,EAAE;AAAA,IACjG;AACA,WAAO,KAAK;AAAA,EACd,SAAS,KAAK;AACZ,WAAO,MAAM,+CAA+C;AAAA,MAC1D,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEe,SAAR,yBAA0C;AAAA,EAC/C;AAAA,EACA;AACF,GAAoD;AAClD,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,YAAY,iBAAiB,SAAS,IAAI;AAChD,QAAM,EAAE,MAAM,WAAW,IAAI,SAAS;AAAA,IACpC,UAAU,CAAC,4BAA4B,SAAS;AAAA,IAChD,SAAS,MAAM,YAAY,uBAAuB,SAAS,IAAI,QAAQ,QAAQ,IAAI;AAAA,IACnF,SAAS,QAAQ,SAAS;AAAA,IAC1B,WAAW;AAAA,EACb,CAAC;AAED,MAAI,CAAC,aAAa,CAAC,WAAY,QAAO;AACtC,MAAI,WAAW,YAAY,UAAU,MAAM,CAAC,WAAW,SAAS,WAAW,MAAM,UAAU,GAAI,QAAO;AAEtG,QAAM,aAAa,EAAE,mBAAmB;AACxC,QAAM,eAAe,yBAAyB,QAAQ,CAAC,WAAW;AAChE,UAAM,QAAQ,WAAW,YAAY,SAAS,MAAM,KAAK;AACzD,WAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,MAAM,CAAC,IAAI,CAAC;AAAA,EAC5C,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,mEACb;AAAA,wBAAC,SAAI,WAAU,yCACZ,YAAE,0BAA0B,GAC/B;AAAA,IAEA,qBAAC,QAAG,WAAU,6BACZ;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,4BAAC,QAAG,WAAU,iCAAiC,YAAE,gCAAgC,GAAE;AAAA,QACnF,oBAAC,QAAG,WAAU,yCAAyC,qBAAW,YAAY,OAAM;AAAA,SACtF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,QAAG,WAAU,iCAAiC,YAAE,oCAAoC,GAAE;AAAA,QACvF,oBAAC,QAAG,WAAU,yCACX,qBAAW,YAAY,oBAAoB,OACxC,aACA,GAAG,KAAK,MAAM,WAAW,YAAY,eAAe,CAAC,KAC3D;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,QAAG,WAAU,iCAAiC,YAAE,mCAAmC,GAAE;AAAA,QACtF,oBAAC,QAAG,WAAU,uCACX,qBAAW,WAAW,kBAAkB,YAAY,MAAM,GAC7D;AAAA,SACF;AAAA,OACF;AAAA,IAEC,aAAa,SAAS,IACrB,oBAAC,SAAI,WAAU,wBACZ,uBAAa,IAAI,CAAC,EAAE,QAAQ,MAAM,MACjC,qBAAC,eAAyB,SAAS,mBAAmB,MAAM,GAAG,KAAG,MAC/D;AAAA,QAAE,yBAAyB,MAAM,EAAE;AAAA,MAAE;AAAA,MAAG;AAAA,SADzB,MAElB,CACD,GACH,IACE;AAAA,IAEH,WAAW,QACV,qBAAC,SAAI,WAAU,6CACb;AAAA,0BAAC,UAAK,WAAU,yBAAyB,YAAE,0BAA0B,GAAE;AAAA,MACvE,oBAAC,UAAK,WAAU,iCAAiC,qBAAW,MAAM,OAAM;AAAA,MACvE,WAAW,MAAM,eAAe,IAC/B,qBAAC,SAAM,SAAQ,WACZ;AAAA,UAAE,6BAA6B;AAAA,QAAE;AAAA,QAAG,WAAW,MAAM;AAAA,SACxD,IACE;AAAA,OACN,IACE;AAAA,IAEJ,qBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,QAAK,MAAK,sCAAqC,WAAU,gCACvD,YAAE,oCAAoC,GACzC;AAAA,MACC,WAAW,QACV,oBAAC,QAAK,MAAK,uBAAsB,WAAU,gCACxC,YAAE,8BAA8B,GACnC,IACE;AAAA,OACN;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import SupplierComplianceWidget from "./widget.client.js";
2
+ const widget = {
3
+ metadata: {
4
+ id: "eudr.injection.supplier-compliance",
5
+ title: "eudr.supplierPanel.title",
6
+ description: "EUDR submissions and plot readiness for a supplier company",
7
+ features: ["eudr.submissions.view"],
8
+ priority: 220,
9
+ enabled: true
10
+ },
11
+ Widget: SupplierComplianceWidget
12
+ };
13
+ var widget_default = widget;
14
+ export {
15
+ widget_default as default
16
+ };
17
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/eudr/widgets/injection/supplier-compliance/widget.ts"],
4
+ "sourcesContent": ["import type { InjectionWidgetModule } from '@open-mercato/shared/modules/widgets/injection'\nimport SupplierComplianceWidget from './widget.client'\n\nconst widget: InjectionWidgetModule<unknown, unknown> = {\n metadata: {\n id: 'eudr.injection.supplier-compliance',\n title: 'eudr.supplierPanel.title',\n description: 'EUDR submissions and plot readiness for a supplier company',\n features: ['eudr.submissions.view'],\n priority: 220,\n enabled: true,\n },\n Widget: SupplierComplianceWidget,\n}\n\nexport default widget\n"],
5
+ "mappings": "AACA,OAAO,8BAA8B;AAErC,MAAM,SAAkD;AAAA,EACtD,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU,CAAC,uBAAuB;AAAA,IAClC,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AACV;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,32 @@
1
+ const supplierComplianceWidget = {
2
+ widgetId: "eudr.injection.supplier-compliance",
3
+ kind: "group",
4
+ column: 2,
5
+ groupLabel: "eudr.supplierPanel.title",
6
+ priority: 220
7
+ };
8
+ const injectionTable = {
9
+ "data-table:catalog.products.list:columns": [
10
+ {
11
+ widgetId: "eudr.injection.product-column",
12
+ priority: 50
13
+ }
14
+ ],
15
+ "sales.document.detail.order:details": [
16
+ {
17
+ widgetId: "eudr.injection.order-compliance",
18
+ kind: "group",
19
+ column: 2,
20
+ groupLabel: "eudr.orderPanel.groupLabel",
21
+ priority: 210
22
+ }
23
+ ],
24
+ "detail:customers.company:footer": [supplierComplianceWidget],
25
+ "customers.company.detail:details": [supplierComplianceWidget]
26
+ };
27
+ var injection_table_default = injectionTable;
28
+ export {
29
+ injection_table_default as default,
30
+ injectionTable
31
+ };
32
+ //# sourceMappingURL=injection-table.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/eudr/widgets/injection-table.ts"],
4
+ "sourcesContent": ["import type { ModuleInjectionTable } from '@open-mercato/shared/modules/widgets/injection'\n\nconst supplierComplianceWidget = {\n widgetId: 'eudr.injection.supplier-compliance',\n kind: 'group',\n column: 2,\n groupLabel: 'eudr.supplierPanel.title',\n priority: 220,\n} as const\n\nexport const injectionTable: ModuleInjectionTable = {\n 'data-table:catalog.products.list:columns': [\n {\n widgetId: 'eudr.injection.product-column',\n priority: 50,\n },\n ],\n 'sales.document.detail.order:details': [\n {\n widgetId: 'eudr.injection.order-compliance',\n kind: 'group',\n column: 2,\n groupLabel: 'eudr.orderPanel.groupLabel',\n priority: 210,\n },\n ],\n 'detail:customers.company:footer': [supplierComplianceWidget],\n 'customers.company.detail:details': [supplierComplianceWidget],\n}\n\nexport default injectionTable\n"],
5
+ "mappings": "AAEA,MAAM,2BAA2B;AAAA,EAC/B,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AACZ;AAEO,MAAM,iBAAuC;AAAA,EAClD,4CAA4C;AAAA,IAC1C;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,uCAAuC;AAAA,IACrC;AAAA,MACE,UAAU;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,mCAAmC,CAAC,wBAAwB;AAAA,EAC5D,oCAAoC,CAAC,wBAAwB;AAC/D;AAEA,IAAO,0BAAQ;",
6
+ "names": []
7
+ }
@@ -221,10 +221,74 @@ function createNotificationService(deps) {
221
221
  debug("No users found with feature:", input.requiredFeature, "in tenant:", ctx.tenantId);
222
222
  return [];
223
223
  }
224
- debug("Creating notifications for", recipientUserIds.length, "user(s) with feature:", input.requiredFeature);
225
- const { requiredFeature: _requiredFeature, ...content } = input;
224
+ let authorizedRecipientUserIds = recipientUserIds;
225
+ if (input.restrictRecipientsToOrganization) {
226
+ const uniqueCandidateUserIds = Array.from(new Set(recipientUserIds));
227
+ if (!ctx.organizationId) {
228
+ logger.warn("Organization-restricted feature fan-out skipped because organization scope is missing", {
229
+ tenantId: ctx.tenantId,
230
+ requiredFeature: input.requiredFeature
231
+ });
232
+ return [];
233
+ }
234
+ if (uniqueCandidateUserIds.length > 200) {
235
+ logger.warn("Organization-restricted feature fan-out skipped because the candidate cap was exceeded", {
236
+ tenantId: ctx.tenantId,
237
+ organizationId: ctx.organizationId,
238
+ requiredFeature: input.requiredFeature,
239
+ candidateCount: uniqueCandidateUserIds.length,
240
+ candidateCap: 200
241
+ });
242
+ return [];
243
+ }
244
+ if (!container) {
245
+ logger.warn("Organization-restricted feature fan-out skipped because the DI container is unavailable", {
246
+ tenantId: ctx.tenantId,
247
+ organizationId: ctx.organizationId,
248
+ requiredFeature: input.requiredFeature
249
+ });
250
+ return [];
251
+ }
252
+ try {
253
+ const rbacService = container.resolve("rbacService");
254
+ const allowedRecipientUserIds = [];
255
+ for (let offset = 0; offset < uniqueCandidateUserIds.length; offset += 10) {
256
+ const candidates = uniqueCandidateUserIds.slice(offset, offset + 10);
257
+ const results = await Promise.all(candidates.map(async (recipientUserId) => ({
258
+ recipientUserId,
259
+ allowed: await rbacService.userHasAllFeatures(
260
+ recipientUserId,
261
+ [input.requiredFeature],
262
+ { tenantId: ctx.tenantId, organizationId: ctx.organizationId ?? null }
263
+ )
264
+ })));
265
+ for (const result of results) {
266
+ if (result.allowed) allowedRecipientUserIds.push(result.recipientUserId);
267
+ }
268
+ }
269
+ authorizedRecipientUserIds = allowedRecipientUserIds;
270
+ } catch (err) {
271
+ logger.warn("Organization-restricted feature fan-out skipped because RBAC filtering failed", {
272
+ tenantId: ctx.tenantId,
273
+ organizationId: ctx.organizationId,
274
+ requiredFeature: input.requiredFeature,
275
+ err
276
+ });
277
+ return [];
278
+ }
279
+ if (authorizedRecipientUserIds.length === 0) {
280
+ debug("No users found with feature in organization:", input.requiredFeature, ctx.organizationId);
281
+ return [];
282
+ }
283
+ }
284
+ debug("Creating notifications for", authorizedRecipientUserIds.length, "user(s) with feature:", input.requiredFeature);
285
+ const {
286
+ requiredFeature: _requiredFeature,
287
+ restrictRecipientsToOrganization: _restrictRecipientsToOrganization,
288
+ ...content
289
+ } = input;
226
290
  const notifications = [];
227
- const uniqueRecipientUserIds = Array.from(new Set(recipientUserIds));
291
+ const uniqueRecipientUserIds = Array.from(new Set(authorizedRecipientUserIds));
228
292
  const writeEm = rootEm.fork();
229
293
  await writeEm.transactional(async (tx) => {
230
294
  for (const recipientUserId of uniqueRecipientUserIds) {