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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/eudr_due_diligence_statement/index.js +47 -0
  3. package/dist/generated/entities/eudr_due_diligence_statement/index.js.map +7 -0
  4. package/dist/generated/entities/eudr_evidence_submission/index.js +51 -0
  5. package/dist/generated/entities/eudr_evidence_submission/index.js.map +7 -0
  6. package/dist/generated/entities/eudr_mitigation_action/index.js +31 -0
  7. package/dist/generated/entities/eudr_mitigation_action/index.js.map +7 -0
  8. package/dist/generated/entities/eudr_plot/index.js +39 -0
  9. package/dist/generated/entities/eudr_plot/index.js.map +7 -0
  10. package/dist/generated/entities/eudr_product_mapping/index.js +31 -0
  11. package/dist/generated/entities/eudr_product_mapping/index.js.map +7 -0
  12. package/dist/generated/entities/eudr_risk_assessment/index.js +35 -0
  13. package/dist/generated/entities/eudr_risk_assessment/index.js.map +7 -0
  14. package/dist/generated/entities.ids.generated.js +9 -0
  15. package/dist/generated/entities.ids.generated.js.map +2 -2
  16. package/dist/generated/entity-fields-registry.js +120 -0
  17. package/dist/generated/entity-fields-registry.js.map +2 -2
  18. package/dist/helpers/integration/ui.js +3 -0
  19. package/dist/helpers/integration/ui.js.map +2 -2
  20. package/dist/modules/attachments/fields/attachment.js +5 -1
  21. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  22. package/dist/modules/attachments/lib/crud.js +3 -1
  23. package/dist/modules/attachments/lib/crud.js.map +2 -2
  24. package/dist/modules/eudr/acl.js +43 -0
  25. package/dist/modules/eudr/acl.js.map +7 -0
  26. package/dist/modules/eudr/ai-agents.js +205 -0
  27. package/dist/modules/eudr/ai-agents.js.map +7 -0
  28. package/dist/modules/eudr/ai-tools/compliance-pack.js +495 -0
  29. package/dist/modules/eudr/ai-tools/compliance-pack.js.map +7 -0
  30. package/dist/modules/eudr/ai-tools/types.js +10 -0
  31. package/dist/modules/eudr/ai-tools/types.js.map +7 -0
  32. package/dist/modules/eudr/ai-tools.js +10 -0
  33. package/dist/modules/eudr/ai-tools.js.map +7 -0
  34. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +386 -0
  35. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +7 -0
  36. package/dist/modules/eudr/api/evidence-submissions/route.js +318 -0
  37. package/dist/modules/eudr/api/evidence-submissions/route.js.map +7 -0
  38. package/dist/modules/eudr/api/mitigation-actions/route.js +249 -0
  39. package/dist/modules/eudr/api/mitigation-actions/route.js.map +7 -0
  40. package/dist/modules/eudr/api/openapi.js +27 -0
  41. package/dist/modules/eudr/api/openapi.js.map +7 -0
  42. package/dist/modules/eudr/api/plots/import/route.js +294 -0
  43. package/dist/modules/eudr/api/plots/import/route.js.map +7 -0
  44. package/dist/modules/eudr/api/plots/route.js +279 -0
  45. package/dist/modules/eudr/api/plots/route.js.map +7 -0
  46. package/dist/modules/eudr/api/product-mappings/route.js +257 -0
  47. package/dist/modules/eudr/api/product-mappings/route.js.map +7 -0
  48. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +298 -0
  49. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +7 -0
  50. package/dist/modules/eudr/api/product-mappings/suggestions/route.js +132 -0
  51. package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +7 -0
  52. package/dist/modules/eudr/api/reports/annual/route.js +266 -0
  53. package/dist/modules/eudr/api/reports/annual/route.js.map +7 -0
  54. package/dist/modules/eudr/api/risk-assessments/route.js +300 -0
  55. package/dist/modules/eudr/api/risk-assessments/route.js.map +7 -0
  56. package/dist/modules/eudr/api/statements/[id]/export/route.js +631 -0
  57. package/dist/modules/eudr/api/statements/[id]/export/route.js.map +7 -0
  58. package/dist/modules/eudr/api/statements/[id]/readiness/route.js +111 -0
  59. package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +7 -0
  60. package/dist/modules/eudr/api/statements/route.js +314 -0
  61. package/dist/modules/eudr/api/statements/route.js.map +7 -0
  62. package/dist/modules/eudr/api/suppliers/compliance/route.js +173 -0
  63. package/dist/modules/eudr/api/suppliers/compliance/route.js.map +7 -0
  64. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +468 -0
  65. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +7 -0
  66. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +16 -0
  67. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +7 -0
  68. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +351 -0
  69. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +7 -0
  70. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +17 -0
  71. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +7 -0
  72. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +313 -0
  73. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +7 -0
  74. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +16 -0
  75. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +7 -0
  76. package/dist/modules/eudr/backend/eudr/page.js +360 -0
  77. package/dist/modules/eudr/backend/eudr/page.js.map +7 -0
  78. package/dist/modules/eudr/backend/eudr/page.meta.js +16 -0
  79. package/dist/modules/eudr/backend/eudr/page.meta.js.map +7 -0
  80. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +346 -0
  81. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +7 -0
  82. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +16 -0
  83. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +7 -0
  84. package/dist/modules/eudr/backend/eudr/plots/create/page.js +253 -0
  85. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +7 -0
  86. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +17 -0
  87. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +7 -0
  88. package/dist/modules/eudr/backend/eudr/plots/page.js +386 -0
  89. package/dist/modules/eudr/backend/eudr/plots/page.js.map +7 -0
  90. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +16 -0
  91. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +7 -0
  92. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +253 -0
  93. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +7 -0
  94. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +16 -0
  95. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +7 -0
  96. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +174 -0
  97. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +7 -0
  98. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +17 -0
  99. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +7 -0
  100. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +306 -0
  101. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +7 -0
  102. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +16 -0
  103. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +7 -0
  104. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +335 -0
  105. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +7 -0
  106. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +16 -0
  107. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +7 -0
  108. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +220 -0
  109. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +7 -0
  110. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +17 -0
  111. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +7 -0
  112. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +324 -0
  113. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +7 -0
  114. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +16 -0
  115. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +7 -0
  116. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +648 -0
  117. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +7 -0
  118. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +16 -0
  119. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +7 -0
  120. package/dist/modules/eudr/backend/eudr/statements/create/page.js +432 -0
  121. package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +7 -0
  122. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +17 -0
  123. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +7 -0
  124. package/dist/modules/eudr/backend/eudr/statements/page.js +309 -0
  125. package/dist/modules/eudr/backend/eudr/statements/page.js.map +7 -0
  126. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +16 -0
  127. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +7 -0
  128. package/dist/modules/eudr/ce.js +56 -0
  129. package/dist/modules/eudr/ce.js.map +7 -0
  130. package/dist/modules/eudr/commands/evidence-submissions.js +571 -0
  131. package/dist/modules/eudr/commands/evidence-submissions.js.map +7 -0
  132. package/dist/modules/eudr/commands/index.js +7 -0
  133. package/dist/modules/eudr/commands/index.js.map +7 -0
  134. package/dist/modules/eudr/commands/lifecycle-events.js +19 -0
  135. package/dist/modules/eudr/commands/lifecycle-events.js.map +7 -0
  136. package/dist/modules/eudr/commands/mitigation-actions.js +488 -0
  137. package/dist/modules/eudr/commands/mitigation-actions.js.map +7 -0
  138. package/dist/modules/eudr/commands/plots.js +517 -0
  139. package/dist/modules/eudr/commands/plots.js.map +7 -0
  140. package/dist/modules/eudr/commands/product-mappings.js +468 -0
  141. package/dist/modules/eudr/commands/product-mappings.js.map +7 -0
  142. package/dist/modules/eudr/commands/risk-assessments.js +599 -0
  143. package/dist/modules/eudr/commands/risk-assessments.js.map +7 -0
  144. package/dist/modules/eudr/commands/statements.js +747 -0
  145. package/dist/modules/eudr/commands/statements.js.map +7 -0
  146. package/dist/modules/eudr/components/CountrySelectField.js +64 -0
  147. package/dist/modules/eudr/components/CountrySelectField.js.map +7 -0
  148. package/dist/modules/eudr/components/GeometryInput.js +133 -0
  149. package/dist/modules/eudr/components/GeometryInput.js.map +7 -0
  150. package/dist/modules/eudr/components/MappingSuggestionsDialog.js +307 -0
  151. package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +7 -0
  152. package/dist/modules/eudr/components/MitigationActionsSection.js +345 -0
  153. package/dist/modules/eudr/components/MitigationActionsSection.js.map +7 -0
  154. package/dist/modules/eudr/components/OrderSelectField.js +88 -0
  155. package/dist/modules/eudr/components/OrderSelectField.js.map +7 -0
  156. package/dist/modules/eudr/components/PlotImportDialog.js +229 -0
  157. package/dist/modules/eudr/components/PlotImportDialog.js.map +7 -0
  158. package/dist/modules/eudr/components/PlotMapPreview.js +35 -0
  159. package/dist/modules/eudr/components/PlotMapPreview.js.map +7 -0
  160. package/dist/modules/eudr/components/PlotMapPreviewImpl.js +97 -0
  161. package/dist/modules/eudr/components/PlotMapPreviewImpl.js.map +7 -0
  162. package/dist/modules/eudr/components/PlotMultiSelectField.js +198 -0
  163. package/dist/modules/eudr/components/PlotMultiSelectField.js.map +7 -0
  164. package/dist/modules/eudr/components/RiskCriteriaField.js +128 -0
  165. package/dist/modules/eudr/components/RiskCriteriaField.js.map +7 -0
  166. package/dist/modules/eudr/components/StatementLifecycleBar.js +274 -0
  167. package/dist/modules/eudr/components/StatementLifecycleBar.js.map +7 -0
  168. package/dist/modules/eudr/components/StatementReadinessChecklist.js +56 -0
  169. package/dist/modules/eudr/components/StatementReadinessChecklist.js.map +7 -0
  170. package/dist/modules/eudr/components/StatementRiskSection.js +179 -0
  171. package/dist/modules/eudr/components/StatementRiskSection.js.map +7 -0
  172. package/dist/modules/eudr/components/crudErrorI18n.js +31 -0
  173. package/dist/modules/eudr/components/crudErrorI18n.js.map +7 -0
  174. package/dist/modules/eudr/components/formConfig.js +593 -0
  175. package/dist/modules/eudr/components/formConfig.js.map +7 -0
  176. package/dist/modules/eudr/components/plotForm.js +68 -0
  177. package/dist/modules/eudr/components/plotForm.js.map +7 -0
  178. package/dist/modules/eudr/data/enrichers.js +62 -0
  179. package/dist/modules/eudr/data/enrichers.js.map +7 -0
  180. package/dist/modules/eudr/data/entities.js +437 -0
  181. package/dist/modules/eudr/data/entities.js.map +7 -0
  182. package/dist/modules/eudr/data/validators.js +271 -0
  183. package/dist/modules/eudr/data/validators.js.map +7 -0
  184. package/dist/modules/eudr/encryption.js +33 -0
  185. package/dist/modules/eudr/encryption.js.map +7 -0
  186. package/dist/modules/eudr/events.js +38 -0
  187. package/dist/modules/eudr/events.js.map +7 -0
  188. package/dist/modules/eudr/index.js +15 -0
  189. package/dist/modules/eudr/index.js.map +7 -0
  190. package/dist/modules/eudr/lib/annual-report.js +104 -0
  191. package/dist/modules/eudr/lib/annual-report.js.map +7 -0
  192. package/dist/modules/eudr/lib/completeness.js +64 -0
  193. package/dist/modules/eudr/lib/completeness.js.map +7 -0
  194. package/dist/modules/eudr/lib/detail-read-scope.js +16 -0
  195. package/dist/modules/eudr/lib/detail-read-scope.js.map +7 -0
  196. package/dist/modules/eudr/lib/geometry.js +142 -0
  197. package/dist/modules/eudr/lib/geometry.js.map +7 -0
  198. package/dist/modules/eudr/lib/notifications.js +56 -0
  199. package/dist/modules/eudr/lib/notifications.js.map +7 -0
  200. package/dist/modules/eudr/lib/plural.js +26 -0
  201. package/dist/modules/eudr/lib/plural.js.map +7 -0
  202. package/dist/modules/eudr/lib/reference-data.js +240 -0
  203. package/dist/modules/eudr/lib/reference-data.js.map +7 -0
  204. package/dist/modules/eudr/lib/species.js +10 -0
  205. package/dist/modules/eudr/lib/species.js.map +7 -0
  206. package/dist/modules/eudr/lib/statement-lifecycle.js +84 -0
  207. package/dist/modules/eudr/lib/statement-lifecycle.js.map +7 -0
  208. package/dist/modules/eudr/lib/statement-seeding.js +49 -0
  209. package/dist/modules/eudr/lib/statement-seeding.js.map +7 -0
  210. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js +15 -0
  211. package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js.map +7 -0
  212. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js +24 -0
  213. package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js.map +7 -0
  214. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js +15 -0
  215. package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js.map +7 -0
  216. package/dist/modules/eudr/notifications.js +58 -0
  217. package/dist/modules/eudr/notifications.js.map +7 -0
  218. package/dist/modules/eudr/search.js +186 -0
  219. package/dist/modules/eudr/search.js.map +7 -0
  220. package/dist/modules/eudr/setup.js +12 -0
  221. package/dist/modules/eudr/setup.js.map +7 -0
  222. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js +34 -0
  223. package/dist/modules/eudr/subscribers/notify-mitigation-completed.js.map +7 -0
  224. package/dist/modules/eudr/subscribers/notify-risk-concluded.js +35 -0
  225. package/dist/modules/eudr/subscribers/notify-risk-concluded.js.map +7 -0
  226. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js +37 -0
  227. package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js.map +7 -0
  228. package/dist/modules/eudr/subscribers/notify-statement-submitted.js +34 -0
  229. package/dist/modules/eudr/subscribers/notify-statement-submitted.js.map +7 -0
  230. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js +34 -0
  231. package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js.map +7 -0
  232. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js +124 -0
  233. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js.map +7 -0
  234. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js +22 -0
  235. package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js.map +7 -0
  236. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js +203 -0
  237. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js.map +7 -0
  238. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js +23 -0
  239. package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js.map +7 -0
  240. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js +19 -0
  241. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js.map +7 -0
  242. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js +31 -0
  243. package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js.map +7 -0
  244. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js +100 -0
  245. package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js.map +7 -0
  246. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js +17 -0
  247. package/dist/modules/eudr/widgets/injection/order-compliance/widget.js.map +7 -0
  248. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js +116 -0
  249. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js.map +7 -0
  250. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js +17 -0
  251. package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js.map +7 -0
  252. package/dist/modules/eudr/widgets/injection-table.js +32 -0
  253. package/dist/modules/eudr/widgets/injection-table.js.map +7 -0
  254. package/dist/modules/notifications/lib/notificationService.js +67 -3
  255. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  256. package/dist/modules/query_index/lib/engine.js +121 -48
  257. package/dist/modules/query_index/lib/engine.js.map +2 -2
  258. package/dist/modules/sales/api/documents/factory.js +17 -0
  259. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  260. package/dist/modules/sales/commands/documents.js +32 -18
  261. package/dist/modules/sales/commands/documents.js.map +2 -2
  262. package/dist/modules/sales/data/entities.js +1 -0
  263. package/dist/modules/sales/data/entities.js.map +2 -2
  264. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js +17 -0
  265. package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js.map +7 -0
  266. package/generated/entities/eudr_due_diligence_statement/index.ts +22 -0
  267. package/generated/entities/eudr_evidence_submission/index.ts +24 -0
  268. package/generated/entities/eudr_mitigation_action/index.ts +14 -0
  269. package/generated/entities/eudr_plot/index.ts +18 -0
  270. package/generated/entities/eudr_product_mapping/index.ts +14 -0
  271. package/generated/entities/eudr_risk_assessment/index.ts +16 -0
  272. package/generated/entities.ids.generated.ts +9 -0
  273. package/generated/entity-fields-registry.ts +120 -0
  274. package/package.json +7 -7
  275. package/src/helpers/integration/ui.ts +12 -0
  276. package/src/modules/attachments/fields/attachment.tsx +5 -0
  277. package/src/modules/attachments/lib/crud.ts +2 -0
  278. package/src/modules/eudr/acl.ts +39 -0
  279. package/src/modules/eudr/ai-agents.ts +258 -0
  280. package/src/modules/eudr/ai-tools/compliance-pack.ts +618 -0
  281. package/src/modules/eudr/ai-tools/types.ts +44 -0
  282. package/src/modules/eudr/ai-tools.ts +15 -0
  283. package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +481 -0
  284. package/src/modules/eudr/api/evidence-submissions/route.ts +335 -0
  285. package/src/modules/eudr/api/mitigation-actions/route.ts +263 -0
  286. package/src/modules/eudr/api/openapi.ts +28 -0
  287. package/src/modules/eudr/api/plots/import/route.ts +369 -0
  288. package/src/modules/eudr/api/plots/route.ts +296 -0
  289. package/src/modules/eudr/api/product-mappings/route.ts +269 -0
  290. package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +382 -0
  291. package/src/modules/eudr/api/product-mappings/suggestions/route.ts +169 -0
  292. package/src/modules/eudr/api/reports/annual/route.ts +457 -0
  293. package/src/modules/eudr/api/risk-assessments/route.ts +323 -0
  294. package/src/modules/eudr/api/statements/[id]/export/route.ts +713 -0
  295. package/src/modules/eudr/api/statements/[id]/readiness/route.ts +129 -0
  296. package/src/modules/eudr/api/statements/route.ts +329 -0
  297. package/src/modules/eudr/api/suppliers/compliance/route.ts +241 -0
  298. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +12 -0
  299. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +545 -0
  300. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +13 -0
  301. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +383 -0
  302. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +12 -0
  303. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +379 -0
  304. package/src/modules/eudr/backend/eudr/page.meta.ts +12 -0
  305. package/src/modules/eudr/backend/eudr/page.tsx +477 -0
  306. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +12 -0
  307. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +404 -0
  308. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +13 -0
  309. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +267 -0
  310. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +12 -0
  311. package/src/modules/eudr/backend/eudr/plots/page.tsx +442 -0
  312. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +12 -0
  313. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +311 -0
  314. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +13 -0
  315. package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +190 -0
  316. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +12 -0
  317. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +344 -0
  318. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +12 -0
  319. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +421 -0
  320. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +13 -0
  321. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +247 -0
  322. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +12 -0
  323. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +383 -0
  324. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +12 -0
  325. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +777 -0
  326. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +13 -0
  327. package/src/modules/eudr/backend/eudr/statements/create/page.tsx +511 -0
  328. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +12 -0
  329. package/src/modules/eudr/backend/eudr/statements/page.tsx +372 -0
  330. package/src/modules/eudr/ce.ts +52 -0
  331. package/src/modules/eudr/commands/evidence-submissions.ts +699 -0
  332. package/src/modules/eudr/commands/index.ts +6 -0
  333. package/src/modules/eudr/commands/lifecycle-events.ts +28 -0
  334. package/src/modules/eudr/commands/mitigation-actions.ts +574 -0
  335. package/src/modules/eudr/commands/plots.ts +627 -0
  336. package/src/modules/eudr/commands/product-mappings.ts +556 -0
  337. package/src/modules/eudr/commands/risk-assessments.ts +728 -0
  338. package/src/modules/eudr/commands/statements.ts +933 -0
  339. package/src/modules/eudr/components/CountrySelectField.tsx +77 -0
  340. package/src/modules/eudr/components/GeometryInput.tsx +170 -0
  341. package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +385 -0
  342. package/src/modules/eudr/components/MitigationActionsSection.tsx +417 -0
  343. package/src/modules/eudr/components/OrderSelectField.tsx +116 -0
  344. package/src/modules/eudr/components/PlotImportDialog.tsx +277 -0
  345. package/src/modules/eudr/components/PlotMapPreview.tsx +46 -0
  346. package/src/modules/eudr/components/PlotMapPreviewImpl.tsx +111 -0
  347. package/src/modules/eudr/components/PlotMultiSelectField.tsx +238 -0
  348. package/src/modules/eudr/components/RiskCriteriaField.tsx +173 -0
  349. package/src/modules/eudr/components/StatementLifecycleBar.tsx +363 -0
  350. package/src/modules/eudr/components/StatementReadinessChecklist.tsx +82 -0
  351. package/src/modules/eudr/components/StatementRiskSection.tsx +242 -0
  352. package/src/modules/eudr/components/crudErrorI18n.ts +36 -0
  353. package/src/modules/eudr/components/formConfig.tsx +717 -0
  354. package/src/modules/eudr/components/plotForm.ts +75 -0
  355. package/src/modules/eudr/data/enrichers.ts +82 -0
  356. package/src/modules/eudr/data/entities.ts +369 -0
  357. package/src/modules/eudr/data/validators.ts +357 -0
  358. package/src/modules/eudr/encryption.ts +31 -0
  359. package/src/modules/eudr/events.ts +38 -0
  360. package/src/modules/eudr/i18n/de.json +747 -0
  361. package/src/modules/eudr/i18n/en.json +747 -0
  362. package/src/modules/eudr/i18n/es.json +747 -0
  363. package/src/modules/eudr/i18n/ko.json +747 -0
  364. package/src/modules/eudr/i18n/pl.json +747 -0
  365. package/src/modules/eudr/index.ts +13 -0
  366. package/src/modules/eudr/lib/annual-report.ts +120 -0
  367. package/src/modules/eudr/lib/completeness.ts +90 -0
  368. package/src/modules/eudr/lib/detail-read-scope.ts +44 -0
  369. package/src/modules/eudr/lib/geometry.ts +191 -0
  370. package/src/modules/eudr/lib/notifications.ts +85 -0
  371. package/src/modules/eudr/lib/plural.ts +36 -0
  372. package/src/modules/eudr/lib/reference-data.ts +128 -0
  373. package/src/modules/eudr/lib/species.ts +12 -0
  374. package/src/modules/eudr/lib/statement-lifecycle.ts +109 -0
  375. package/src/modules/eudr/lib/statement-seeding.ts +86 -0
  376. package/src/modules/eudr/migrations/.snapshot-open-mercato.json +2046 -0
  377. package/src/modules/eudr/migrations/Migration20260706102002_eudr.ts +16 -0
  378. package/src/modules/eudr/migrations/Migration20260706152612_eudr.ts +30 -0
  379. package/src/modules/eudr/migrations/Migration20260722100000_eudr.ts +17 -0
  380. package/src/modules/eudr/notifications.ts +56 -0
  381. package/src/modules/eudr/search.ts +212 -0
  382. package/src/modules/eudr/setup.ts +10 -0
  383. package/src/modules/eudr/subscribers/notify-mitigation-completed.ts +56 -0
  384. package/src/modules/eudr/subscribers/notify-risk-concluded.ts +58 -0
  385. package/src/modules/eudr/subscribers/notify-statement-reference-issued.ts +59 -0
  386. package/src/modules/eudr/subscribers/notify-statement-submitted.ts +49 -0
  387. package/src/modules/eudr/subscribers/notify-statement-withdrawn.ts +49 -0
  388. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-created.ts +189 -0
  389. package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.ts +31 -0
  390. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.client.tsx +271 -0
  391. package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts +24 -0
  392. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx +37 -0
  393. package/src/modules/eudr/widgets/injection/eudr-product-column/widget.ts +30 -0
  394. package/src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx +131 -0
  395. package/src/modules/eudr/widgets/injection/order-compliance/widget.ts +16 -0
  396. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx +168 -0
  397. package/src/modules/eudr/widgets/injection/supplier-compliance/widget.ts +16 -0
  398. package/src/modules/eudr/widgets/injection-table.ts +31 -0
  399. package/src/modules/notifications/lib/notificationService.ts +83 -4
  400. package/src/modules/query_index/lib/engine.ts +139 -51
  401. package/src/modules/sales/api/documents/factory.ts +29 -0
  402. package/src/modules/sales/commands/documents.ts +65 -18
  403. package/src/modules/sales/data/entities.ts +1 -0
  404. package/src/modules/sales/migrations/.snapshot-open-mercato.json +10 -0
  405. package/src/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.ts +59 -0
@@ -0,0 +1,468 @@
1
+ import { registerCommand } from "@open-mercato/shared/lib/commands";
2
+ import {
3
+ parseWithCustomFields,
4
+ emitCrudSideEffects,
5
+ emitCrudUndoSideEffects,
6
+ requireId,
7
+ snapshotsEqual
8
+ } from "@open-mercato/shared/lib/commands/helpers";
9
+ import { extractUndoPayload } from "@open-mercato/shared/lib/commands/undo";
10
+ import { makeCreateRedo } from "@open-mercato/shared/lib/commands/redo";
11
+ import { runCrudCommandWrite } from "@open-mercato/shared/lib/commands/runCrudCommandWrite";
12
+ import { setCustomFieldsIfAny } from "@open-mercato/shared/lib/commands/helpers";
13
+ import { ensureOrganizationScope, ensureTenantScope } from "@open-mercato/shared/lib/commands/scope";
14
+ import {
15
+ loadCustomFieldSnapshot,
16
+ buildCustomFieldResetMap
17
+ } from "@open-mercato/shared/lib/commands/customFieldSnapshots";
18
+ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
19
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
20
+ import { E } from "../../../generated/entities.ids.generated.js";
21
+ import { z } from "zod";
22
+ import { EudrProductMapping } from "../data/entities.js";
23
+ import {
24
+ productMappingCreateSchema,
25
+ productMappingUpdateSchema
26
+ } from "../data/validators.js";
27
+ const PRODUCT_MAPPING_ENTITY_ID = "eudr:eudr_product_mapping";
28
+ const scopedCommandInputSchema = z.object({
29
+ tenantId: z.string().uuid(),
30
+ organizationId: z.string().uuid()
31
+ });
32
+ const productMappingCrudIndexer = {
33
+ entityType: E.eudr.eudr_product_mapping
34
+ };
35
+ const productMappingCrudEvents = {
36
+ module: "eudr",
37
+ entity: "product_mapping",
38
+ persistent: true,
39
+ buildPayload: (emitContext) => ({
40
+ id: emitContext.identifiers.id,
41
+ entityId: emitContext.entity?.id ?? emitContext.identifiers.id,
42
+ organizationId: emitContext.identifiers.organizationId,
43
+ tenantId: emitContext.identifiers.tenantId
44
+ })
45
+ };
46
+ function parseScopedCommandInput(input) {
47
+ return scopedCommandInputSchema.parse(input);
48
+ }
49
+ function toDate(value) {
50
+ return value ? new Date(value) : null;
51
+ }
52
+ function productMappingSeedFromSnapshot(snapshot) {
53
+ return {
54
+ id: snapshot.id,
55
+ organizationId: snapshot.organizationId,
56
+ tenantId: snapshot.tenantId,
57
+ productId: snapshot.productId,
58
+ productSnapshot: snapshot.productSnapshot,
59
+ commodity: snapshot.commodity,
60
+ hsCode: snapshot.hsCode,
61
+ isInScope: snapshot.isInScope,
62
+ notes: snapshot.notes,
63
+ speciesScientificName: snapshot.speciesScientificName,
64
+ speciesCommonName: snapshot.speciesCommonName,
65
+ createdAt: new Date(snapshot.createdAt),
66
+ updatedAt: new Date(snapshot.updatedAt),
67
+ deletedAt: toDate(snapshot.deletedAt)
68
+ };
69
+ }
70
+ async function loadProductMappingSnapshot(em, entityId) {
71
+ const record = await em.findOne(EudrProductMapping, { id: entityId });
72
+ if (!record) return null;
73
+ const custom = await loadCustomFieldSnapshot(em, {
74
+ entityId: PRODUCT_MAPPING_ENTITY_ID,
75
+ recordId: record.id,
76
+ tenantId: record.tenantId,
77
+ organizationId: record.organizationId
78
+ });
79
+ return {
80
+ id: record.id,
81
+ organizationId: record.organizationId,
82
+ tenantId: record.tenantId,
83
+ productId: record.productId,
84
+ productSnapshot: record.productSnapshot ?? null,
85
+ commodity: record.commodity,
86
+ hsCode: record.hsCode ?? null,
87
+ isInScope: record.isInScope,
88
+ notes: record.notes ?? null,
89
+ speciesScientificName: record.speciesScientificName ?? null,
90
+ speciesCommonName: record.speciesCommonName ?? null,
91
+ createdAt: record.createdAt.toISOString(),
92
+ updatedAt: record.updatedAt.toISOString(),
93
+ deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,
94
+ custom: Object.keys(custom).length ? custom : null
95
+ };
96
+ }
97
+ async function assertUniqueProductMapping(em, input) {
98
+ const existing = await em.findOne(EudrProductMapping, {
99
+ tenantId: input.tenantId,
100
+ organizationId: input.organizationId,
101
+ productId: input.productId,
102
+ commodity: input.commodity,
103
+ deletedAt: null,
104
+ ...input.excludeId ? { id: { $ne: input.excludeId } } : {}
105
+ });
106
+ if (existing) {
107
+ throw new CrudHttpError(400, { error: "eudr.errors.duplicateMapping" });
108
+ }
109
+ }
110
+ function restoreProductMapping(record, snapshot) {
111
+ record.organizationId = snapshot.organizationId;
112
+ record.tenantId = snapshot.tenantId;
113
+ record.productId = snapshot.productId;
114
+ record.productSnapshot = snapshot.productSnapshot;
115
+ record.commodity = snapshot.commodity;
116
+ record.hsCode = snapshot.hsCode;
117
+ record.isInScope = snapshot.isInScope;
118
+ record.notes = snapshot.notes;
119
+ record.speciesScientificName = snapshot.speciesScientificName;
120
+ record.speciesCommonName = snapshot.speciesCommonName;
121
+ record.createdAt = new Date(snapshot.createdAt);
122
+ record.updatedAt = new Date(snapshot.updatedAt);
123
+ record.deletedAt = toDate(snapshot.deletedAt);
124
+ }
125
+ async function setProductMappingCustomFields(dataEngine, entityId, organizationId, tenantId, values) {
126
+ await setCustomFieldsIfAny({
127
+ dataEngine,
128
+ entityId: PRODUCT_MAPPING_ENTITY_ID,
129
+ recordId: entityId,
130
+ organizationId,
131
+ tenantId,
132
+ values,
133
+ notify: false
134
+ });
135
+ }
136
+ const createProductMappingCommand = {
137
+ id: "eudr.product_mappings.create",
138
+ async execute(rawInput, ctx) {
139
+ const { parsed, custom } = parseWithCustomFields(productMappingCreateSchema, rawInput);
140
+ const scope = parseScopedCommandInput(rawInput);
141
+ ensureTenantScope(ctx, scope.tenantId);
142
+ ensureOrganizationScope(ctx, scope.organizationId);
143
+ const entityManager = ctx.container.resolve("em").fork();
144
+ let record;
145
+ await runCrudCommandWrite({
146
+ ctx,
147
+ em: entityManager,
148
+ entityId: PRODUCT_MAPPING_ENTITY_ID,
149
+ action: "created",
150
+ scope,
151
+ customFields: custom,
152
+ events: productMappingCrudEvents,
153
+ indexer: productMappingCrudIndexer,
154
+ sideEffect: () => ({
155
+ entity: record,
156
+ identifiers: {
157
+ id: record.id,
158
+ organizationId: record.organizationId,
159
+ tenantId: record.tenantId
160
+ }
161
+ }),
162
+ phases: [
163
+ () => assertUniqueProductMapping(entityManager, {
164
+ tenantId: scope.tenantId,
165
+ organizationId: scope.organizationId,
166
+ productId: parsed.productId,
167
+ commodity: parsed.commodity
168
+ }),
169
+ () => {
170
+ record = entityManager.create(EudrProductMapping, {
171
+ organizationId: scope.organizationId,
172
+ tenantId: scope.tenantId,
173
+ productId: parsed.productId,
174
+ productSnapshot: parsed.productSnapshot ?? null,
175
+ commodity: parsed.commodity,
176
+ hsCode: parsed.hsCode ?? null,
177
+ isInScope: parsed.isInScope ?? true,
178
+ notes: parsed.notes ?? null,
179
+ speciesScientificName: parsed.commodity === "wood" ? parsed.speciesScientificName ?? null : null,
180
+ speciesCommonName: parsed.commodity === "wood" ? parsed.speciesCommonName ?? null : null
181
+ });
182
+ entityManager.persist(record);
183
+ }
184
+ ]
185
+ });
186
+ return { entityId: record.id };
187
+ },
188
+ captureAfter: async (_rawInput, result, ctx) => {
189
+ const entityManager = ctx.container.resolve("em").fork();
190
+ return loadProductMappingSnapshot(entityManager, result.entityId);
191
+ },
192
+ buildLog: async ({ snapshots }) => {
193
+ const after = snapshots.after;
194
+ if (!after) return null;
195
+ const { translate } = await resolveTranslations();
196
+ return {
197
+ actionLabel: translate("eudr.audit.product_mappings.create", "Create EUDR product mapping"),
198
+ resourceKind: "eudr.product_mapping",
199
+ resourceId: after.id,
200
+ tenantId: after.tenantId,
201
+ organizationId: after.organizationId,
202
+ snapshotAfter: after,
203
+ payload: {
204
+ undo: { after }
205
+ }
206
+ };
207
+ },
208
+ undo: async ({ logEntry, ctx }) => {
209
+ const payload = extractUndoPayload(logEntry);
210
+ const after = payload?.after;
211
+ if (!after) return;
212
+ const entityManager = ctx.container.resolve("em").fork();
213
+ const record = await entityManager.findOne(EudrProductMapping, { id: after.id });
214
+ if (!record) return;
215
+ ensureTenantScope(ctx, record.tenantId);
216
+ ensureOrganizationScope(ctx, record.organizationId);
217
+ record.deletedAt = /* @__PURE__ */ new Date();
218
+ await entityManager.flush();
219
+ const dataEngine = ctx.container.resolve("dataEngine");
220
+ const resetValues = buildCustomFieldResetMap(void 0, after.custom ?? void 0);
221
+ await setProductMappingCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues);
222
+ await emitCrudUndoSideEffects({
223
+ dataEngine,
224
+ action: "deleted",
225
+ entity: record,
226
+ identifiers: {
227
+ id: record.id,
228
+ organizationId: record.organizationId,
229
+ tenantId: record.tenantId
230
+ },
231
+ indexer: productMappingCrudIndexer,
232
+ events: productMappingCrudEvents
233
+ });
234
+ },
235
+ redo: makeCreateRedo({
236
+ entityClass: EudrProductMapping,
237
+ seedFromSnapshot: productMappingSeedFromSnapshot,
238
+ buildResult: (entity) => ({ entityId: entity.id }),
239
+ indexer: productMappingCrudIndexer,
240
+ events: productMappingCrudEvents,
241
+ afterRestore: async ({ ctx, entity, snapshot }) => {
242
+ if (!snapshot.custom || !Object.keys(snapshot.custom).length) return;
243
+ await setProductMappingCustomFields(
244
+ ctx.container.resolve("dataEngine"),
245
+ entity.id,
246
+ entity.organizationId,
247
+ entity.tenantId,
248
+ snapshot.custom
249
+ );
250
+ }
251
+ })
252
+ };
253
+ const updateProductMappingCommand = {
254
+ id: "eudr.product_mappings.update",
255
+ async prepare(rawInput, ctx) {
256
+ const { parsed } = parseWithCustomFields(productMappingUpdateSchema, rawInput);
257
+ const entityManager = ctx.container.resolve("em").fork();
258
+ const snapshot = await loadProductMappingSnapshot(entityManager, parsed.id);
259
+ if (snapshot) {
260
+ ensureTenantScope(ctx, snapshot.tenantId);
261
+ ensureOrganizationScope(ctx, snapshot.organizationId);
262
+ }
263
+ return snapshot ? { before: snapshot } : {};
264
+ },
265
+ async execute(rawInput, ctx) {
266
+ const { parsed, custom } = parseWithCustomFields(productMappingUpdateSchema, rawInput);
267
+ const entityManager = ctx.container.resolve("em").fork();
268
+ const record = await entityManager.findOne(EudrProductMapping, { id: parsed.id, deletedAt: null });
269
+ if (!record) throw new CrudHttpError(404, { error: "EUDR product mapping not found" });
270
+ ensureTenantScope(ctx, record.tenantId);
271
+ ensureOrganizationScope(ctx, record.organizationId);
272
+ const nextProductId = parsed.productId ?? record.productId;
273
+ const nextCommodity = parsed.commodity ?? record.commodity;
274
+ await runCrudCommandWrite({
275
+ ctx,
276
+ em: entityManager,
277
+ entityId: PRODUCT_MAPPING_ENTITY_ID,
278
+ action: "updated",
279
+ scope: { tenantId: record.tenantId, organizationId: record.organizationId },
280
+ customFields: custom,
281
+ events: productMappingCrudEvents,
282
+ indexer: productMappingCrudIndexer,
283
+ sideEffect: () => ({
284
+ entity: record,
285
+ identifiers: {
286
+ id: record.id,
287
+ organizationId: record.organizationId,
288
+ tenantId: record.tenantId
289
+ }
290
+ }),
291
+ phases: [
292
+ async () => {
293
+ if (nextProductId === record.productId && nextCommodity === record.commodity) return;
294
+ await assertUniqueProductMapping(entityManager, {
295
+ tenantId: record.tenantId,
296
+ organizationId: record.organizationId,
297
+ productId: nextProductId,
298
+ commodity: nextCommodity,
299
+ excludeId: record.id
300
+ });
301
+ },
302
+ () => {
303
+ if (parsed.productId !== void 0) record.productId = parsed.productId;
304
+ if (parsed.productSnapshot !== void 0) record.productSnapshot = parsed.productSnapshot ?? null;
305
+ if (parsed.commodity !== void 0) record.commodity = parsed.commodity;
306
+ if (parsed.hsCode !== void 0) record.hsCode = parsed.hsCode ?? null;
307
+ if (parsed.isInScope !== void 0) record.isInScope = parsed.isInScope;
308
+ if (parsed.notes !== void 0) record.notes = parsed.notes ?? null;
309
+ if (parsed.speciesScientificName !== void 0) record.speciesScientificName = parsed.speciesScientificName ?? null;
310
+ if (parsed.speciesCommonName !== void 0) record.speciesCommonName = parsed.speciesCommonName ?? null;
311
+ if (nextCommodity !== "wood") {
312
+ record.speciesScientificName = null;
313
+ record.speciesCommonName = null;
314
+ }
315
+ }
316
+ ]
317
+ });
318
+ return { entityId: record.id, updatedAt: record.updatedAt };
319
+ },
320
+ captureAfter: async (_rawInput, result, ctx) => {
321
+ const entityManager = ctx.container.resolve("em").fork();
322
+ return loadProductMappingSnapshot(entityManager, result.entityId);
323
+ },
324
+ buildLog: async ({ snapshots }) => {
325
+ const before = snapshots.before;
326
+ const after = snapshots.after;
327
+ if (!before) return null;
328
+ if (after && snapshotsEqual(before, after)) return { skipLog: true };
329
+ const { translate } = await resolveTranslations();
330
+ return {
331
+ actionLabel: translate("eudr.audit.product_mappings.update", "Update EUDR product mapping"),
332
+ resourceKind: "eudr.product_mapping",
333
+ resourceId: before.id,
334
+ tenantId: before.tenantId,
335
+ organizationId: before.organizationId,
336
+ snapshotBefore: before,
337
+ snapshotAfter: after ?? null,
338
+ payload: {
339
+ undo: { before, after: after ?? null }
340
+ }
341
+ };
342
+ },
343
+ undo: async ({ logEntry, ctx }) => {
344
+ const payload = extractUndoPayload(logEntry);
345
+ const before = payload?.before;
346
+ if (!before) return;
347
+ const entityManager = ctx.container.resolve("em").fork();
348
+ let record = await entityManager.findOne(EudrProductMapping, { id: before.id });
349
+ if (!record) {
350
+ record = entityManager.create(EudrProductMapping, productMappingSeedFromSnapshot(before));
351
+ entityManager.persist(record);
352
+ } else {
353
+ ensureTenantScope(ctx, before.tenantId);
354
+ ensureOrganizationScope(ctx, before.organizationId);
355
+ restoreProductMapping(record, before);
356
+ }
357
+ await entityManager.flush();
358
+ const dataEngine = ctx.container.resolve("dataEngine");
359
+ const resetValues = buildCustomFieldResetMap(before.custom ?? void 0, payload?.after?.custom ?? void 0);
360
+ await setProductMappingCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues);
361
+ await emitCrudUndoSideEffects({
362
+ dataEngine,
363
+ action: "updated",
364
+ entity: record,
365
+ identifiers: {
366
+ id: record.id,
367
+ organizationId: record.organizationId,
368
+ tenantId: record.tenantId
369
+ },
370
+ indexer: productMappingCrudIndexer,
371
+ events: productMappingCrudEvents
372
+ });
373
+ }
374
+ };
375
+ const deleteProductMappingCommand = {
376
+ id: "eudr.product_mappings.delete",
377
+ async prepare(input, ctx) {
378
+ const entityId = requireId(input, "EUDR product mapping id required");
379
+ const entityManager = ctx.container.resolve("em").fork();
380
+ const snapshot = await loadProductMappingSnapshot(entityManager, entityId);
381
+ if (snapshot) {
382
+ ensureTenantScope(ctx, snapshot.tenantId);
383
+ ensureOrganizationScope(ctx, snapshot.organizationId);
384
+ }
385
+ return snapshot ? { before: snapshot } : {};
386
+ },
387
+ async execute(input, ctx) {
388
+ const entityId = requireId(input, "EUDR product mapping id required");
389
+ const entityManager = ctx.container.resolve("em").fork();
390
+ const record = await entityManager.findOne(EudrProductMapping, { id: entityId, deletedAt: null });
391
+ if (!record) throw new CrudHttpError(404, { error: "EUDR product mapping not found" });
392
+ ensureTenantScope(ctx, record.tenantId);
393
+ ensureOrganizationScope(ctx, record.organizationId);
394
+ const snapshot = await loadProductMappingSnapshot(entityManager, entityId);
395
+ record.deletedAt = /* @__PURE__ */ new Date();
396
+ await entityManager.flush();
397
+ const dataEngine = ctx.container.resolve("dataEngine");
398
+ if (snapshot?.custom) {
399
+ const resetValues = buildCustomFieldResetMap(snapshot.custom, void 0);
400
+ await setProductMappingCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues);
401
+ }
402
+ await emitCrudSideEffects({
403
+ dataEngine,
404
+ action: "deleted",
405
+ entity: record,
406
+ identifiers: {
407
+ id: record.id,
408
+ organizationId: record.organizationId,
409
+ tenantId: record.tenantId
410
+ },
411
+ indexer: productMappingCrudIndexer,
412
+ events: productMappingCrudEvents
413
+ });
414
+ return { entityId: record.id, updatedAt: record.updatedAt };
415
+ },
416
+ buildLog: async ({ snapshots }) => {
417
+ const before = snapshots.before;
418
+ if (!before) return null;
419
+ const { translate } = await resolveTranslations();
420
+ return {
421
+ actionLabel: translate("eudr.audit.product_mappings.delete", "Delete EUDR product mapping"),
422
+ resourceKind: "eudr.product_mapping",
423
+ resourceId: before.id,
424
+ tenantId: before.tenantId,
425
+ organizationId: before.organizationId,
426
+ snapshotBefore: before,
427
+ payload: {
428
+ undo: { before }
429
+ }
430
+ };
431
+ },
432
+ undo: async ({ logEntry, ctx }) => {
433
+ const payload = extractUndoPayload(logEntry);
434
+ const before = payload?.before;
435
+ if (!before) return;
436
+ const entityManager = ctx.container.resolve("em").fork();
437
+ let record = await entityManager.findOne(EudrProductMapping, { id: before.id });
438
+ if (!record) {
439
+ record = entityManager.create(EudrProductMapping, productMappingSeedFromSnapshot(before));
440
+ entityManager.persist(record);
441
+ } else {
442
+ ensureTenantScope(ctx, before.tenantId);
443
+ ensureOrganizationScope(ctx, before.organizationId);
444
+ restoreProductMapping(record, before);
445
+ }
446
+ await entityManager.flush();
447
+ const dataEngine = ctx.container.resolve("dataEngine");
448
+ if (before.custom) {
449
+ await setProductMappingCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom);
450
+ }
451
+ await emitCrudUndoSideEffects({
452
+ dataEngine,
453
+ action: "created",
454
+ entity: record,
455
+ identifiers: {
456
+ id: record.id,
457
+ organizationId: record.organizationId,
458
+ tenantId: record.tenantId
459
+ },
460
+ indexer: productMappingCrudIndexer,
461
+ events: productMappingCrudEvents
462
+ });
463
+ }
464
+ };
465
+ registerCommand(createProductMappingCommand);
466
+ registerCommand(updateProductMappingCommand);
467
+ registerCommand(deleteProductMappingCommand);
468
+ //# sourceMappingURL=product-mappings.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/eudr/commands/product-mappings.ts"],
4
+ "sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { RequiredEntityData } from '@mikro-orm/core'\nimport {\n parseWithCustomFields,\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n requireId,\n snapshotsEqual,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport { runCrudCommandWrite } from '@open-mercato/shared/lib/commands/runCrudCommandWrite'\nimport { setCustomFieldsIfAny } from '@open-mercato/shared/lib/commands/helpers'\nimport { ensureOrganizationScope, ensureTenantScope } from '@open-mercato/shared/lib/commands/scope'\nimport {\n loadCustomFieldSnapshot,\n buildCustomFieldResetMap,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport type { CrudEventsConfig, CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { E } from '#generated/entities.ids.generated'\nimport { z } from 'zod'\nimport { EudrProductMapping } from '../data/entities'\nimport {\n productMappingCreateSchema,\n productMappingUpdateSchema,\n type ProductMappingCreateInput,\n type ProductMappingUpdateInput,\n} from '../data/validators'\n\nconst PRODUCT_MAPPING_ENTITY_ID = 'eudr:eudr_product_mapping'\n\ntype ScopedCommandInput = {\n tenantId: string\n organizationId: string\n}\n\ntype ProductSnapshot = {\n name?: string | null\n sku?: string | null\n}\n\ntype ProductMappingSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n productId: string\n productSnapshot: ProductSnapshot | null\n commodity: string\n hsCode: string | null\n isInScope: boolean\n notes: string | null\n speciesScientificName: string | null\n speciesCommonName: string | null\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n custom?: Record<string, unknown> | null\n}\n\ntype ProductMappingUndoPayload = {\n before?: ProductMappingSnapshot | null\n after?: ProductMappingSnapshot | null\n}\n\ntype ScopedProductMappingCreateInput = ProductMappingCreateInput & ScopedCommandInput\ntype ScopedProductMappingUpdateInput = ProductMappingUpdateInput & Partial<ScopedCommandInput>\n\ntype ProductMappingCommandResult = {\n entityId: string\n updatedAt?: Date\n}\n\nconst scopedCommandInputSchema = z.object({\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n})\n\nconst productMappingCrudIndexer: CrudIndexerConfig<EudrProductMapping> = {\n entityType: E.eudr.eudr_product_mapping,\n}\n\nconst productMappingCrudEvents: CrudEventsConfig<EudrProductMapping> = {\n module: 'eudr',\n entity: 'product_mapping',\n persistent: true,\n buildPayload: (emitContext) => ({\n id: emitContext.identifiers.id,\n entityId: emitContext.entity?.id ?? emitContext.identifiers.id,\n organizationId: emitContext.identifiers.organizationId,\n tenantId: emitContext.identifiers.tenantId,\n }),\n}\n\nfunction parseScopedCommandInput(input: unknown): ScopedCommandInput {\n return scopedCommandInputSchema.parse(input)\n}\n\nfunction toDate(value: string | null): Date | null {\n return value ? new Date(value) : null\n}\n\nfunction productMappingSeedFromSnapshot(snapshot: ProductMappingSnapshot): RequiredEntityData<EudrProductMapping> {\n return {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n productId: snapshot.productId,\n productSnapshot: snapshot.productSnapshot,\n commodity: snapshot.commodity,\n hsCode: snapshot.hsCode,\n isInScope: snapshot.isInScope,\n notes: snapshot.notes,\n speciesScientificName: snapshot.speciesScientificName,\n speciesCommonName: snapshot.speciesCommonName,\n createdAt: new Date(snapshot.createdAt),\n updatedAt: new Date(snapshot.updatedAt),\n deletedAt: toDate(snapshot.deletedAt),\n }\n}\n\nasync function loadProductMappingSnapshot(em: EntityManager, entityId: string): Promise<ProductMappingSnapshot | null> {\n const record = await em.findOne(EudrProductMapping, { id: entityId })\n if (!record) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: PRODUCT_MAPPING_ENTITY_ID,\n recordId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n })\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n productId: record.productId,\n productSnapshot: record.productSnapshot ?? null,\n commodity: record.commodity,\n hsCode: record.hsCode ?? null,\n isInScope: record.isInScope,\n notes: record.notes ?? null,\n speciesScientificName: record.speciesScientificName ?? null,\n speciesCommonName: record.speciesCommonName ?? null,\n createdAt: record.createdAt.toISOString(),\n updatedAt: record.updatedAt.toISOString(),\n deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,\n custom: Object.keys(custom).length ? custom : null,\n }\n}\n\nasync function assertUniqueProductMapping(\n em: EntityManager,\n input: {\n tenantId: string\n organizationId: string\n productId: string\n commodity: string\n excludeId?: string\n },\n): Promise<void> {\n const existing = await em.findOne(EudrProductMapping, {\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n productId: input.productId,\n commodity: input.commodity,\n deletedAt: null,\n ...(input.excludeId ? { id: { $ne: input.excludeId } } : {}),\n })\n if (existing) {\n throw new CrudHttpError(400, { error: 'eudr.errors.duplicateMapping' })\n }\n}\n\nfunction restoreProductMapping(record: EudrProductMapping, snapshot: ProductMappingSnapshot): void {\n record.organizationId = snapshot.organizationId\n record.tenantId = snapshot.tenantId\n record.productId = snapshot.productId\n record.productSnapshot = snapshot.productSnapshot\n record.commodity = snapshot.commodity\n record.hsCode = snapshot.hsCode\n record.isInScope = snapshot.isInScope\n record.notes = snapshot.notes\n record.speciesScientificName = snapshot.speciesScientificName\n record.speciesCommonName = snapshot.speciesCommonName\n record.createdAt = new Date(snapshot.createdAt)\n record.updatedAt = new Date(snapshot.updatedAt)\n record.deletedAt = toDate(snapshot.deletedAt)\n}\n\nasync function setProductMappingCustomFields(\n dataEngine: DataEngine,\n entityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>,\n): Promise<void> {\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: PRODUCT_MAPPING_ENTITY_ID,\n recordId: entityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\nconst createProductMappingCommand: CommandHandler<ScopedProductMappingCreateInput, ProductMappingCommandResult> = {\n id: 'eudr.product_mappings.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(productMappingCreateSchema, rawInput)\n const scope = parseScopedCommandInput(rawInput)\n ensureTenantScope(ctx, scope.tenantId)\n ensureOrganizationScope(ctx, scope.organizationId)\n\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record!: EudrProductMapping\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: PRODUCT_MAPPING_ENTITY_ID,\n action: 'created',\n scope,\n customFields: custom,\n events: productMappingCrudEvents,\n indexer: productMappingCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n () => assertUniqueProductMapping(entityManager, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n productId: parsed.productId,\n commodity: parsed.commodity,\n }),\n () => {\n record = entityManager.create(EudrProductMapping, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n productId: parsed.productId,\n productSnapshot: parsed.productSnapshot ?? null,\n commodity: parsed.commodity,\n hsCode: parsed.hsCode ?? null,\n isInScope: parsed.isInScope ?? true,\n notes: parsed.notes ?? null,\n speciesScientificName: parsed.commodity === 'wood' ? (parsed.speciesScientificName ?? null) : null,\n speciesCommonName: parsed.commodity === 'wood' ? (parsed.speciesCommonName ?? null) : null,\n })\n entityManager.persist(record)\n },\n ],\n })\n\n return { entityId: record.id }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadProductMappingSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const after = snapshots.after as ProductMappingSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.product_mappings.create', 'Create EUDR product mapping'),\n resourceKind: 'eudr.product_mapping',\n resourceId: after.id,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: {\n undo: { after } satisfies ProductMappingUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ProductMappingUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrProductMapping, { id: after.id })\n if (!record) return\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(undefined, after.custom ?? undefined)\n await setProductMappingCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: productMappingCrudIndexer,\n events: productMappingCrudEvents,\n })\n },\n redo: makeCreateRedo<EudrProductMapping, ProductMappingSnapshot, ScopedProductMappingCreateInput, ProductMappingCommandResult>({\n entityClass: EudrProductMapping,\n seedFromSnapshot: productMappingSeedFromSnapshot,\n buildResult: (entity) => ({ entityId: entity.id }),\n indexer: productMappingCrudIndexer,\n events: productMappingCrudEvents,\n afterRestore: async ({ ctx, entity, snapshot }) => {\n if (!snapshot.custom || !Object.keys(snapshot.custom).length) return\n await setProductMappingCustomFields(\n ctx.container.resolve('dataEngine') as DataEngine,\n entity.id,\n entity.organizationId,\n entity.tenantId,\n snapshot.custom,\n )\n },\n }),\n}\n\nconst updateProductMappingCommand: CommandHandler<ScopedProductMappingUpdateInput, ProductMappingCommandResult> = {\n id: 'eudr.product_mappings.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(productMappingUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadProductMappingSnapshot(entityManager, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(productMappingUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrProductMapping, { id: parsed.id, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR product mapping not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n\n const nextProductId = parsed.productId ?? record.productId\n const nextCommodity = parsed.commodity ?? record.commodity\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: PRODUCT_MAPPING_ENTITY_ID,\n action: 'updated',\n scope: { tenantId: record.tenantId, organizationId: record.organizationId },\n customFields: custom,\n events: productMappingCrudEvents,\n indexer: productMappingCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n async () => {\n if (nextProductId === record.productId && nextCommodity === record.commodity) return\n await assertUniqueProductMapping(entityManager, {\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n productId: nextProductId,\n commodity: nextCommodity,\n excludeId: record.id,\n })\n },\n () => {\n if (parsed.productId !== undefined) record.productId = parsed.productId\n if (parsed.productSnapshot !== undefined) record.productSnapshot = parsed.productSnapshot ?? null\n if (parsed.commodity !== undefined) record.commodity = parsed.commodity\n if (parsed.hsCode !== undefined) record.hsCode = parsed.hsCode ?? null\n if (parsed.isInScope !== undefined) record.isInScope = parsed.isInScope\n if (parsed.notes !== undefined) record.notes = parsed.notes ?? null\n if (parsed.speciesScientificName !== undefined) record.speciesScientificName = parsed.speciesScientificName ?? null\n if (parsed.speciesCommonName !== undefined) record.speciesCommonName = parsed.speciesCommonName ?? null\n if (nextCommodity !== 'wood') {\n record.speciesScientificName = null\n record.speciesCommonName = null\n }\n },\n ],\n })\n\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadProductMappingSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as ProductMappingSnapshot | undefined\n const after = snapshots.after as ProductMappingSnapshot | undefined\n if (!before) return null\n if (after && snapshotsEqual(before, after)) return { skipLog: true }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.product_mappings.update', 'Update EUDR product mapping'),\n resourceKind: 'eudr.product_mapping',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: { before, after: after ?? null } satisfies ProductMappingUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ProductMappingUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrProductMapping, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrProductMapping, productMappingSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreProductMapping(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(before.custom ?? undefined, payload?.after?.custom ?? undefined)\n await setProductMappingCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'updated',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: productMappingCrudIndexer,\n events: productMappingCrudEvents,\n })\n },\n}\n\nconst deleteProductMappingCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, ProductMappingCommandResult> = {\n id: 'eudr.product_mappings.delete',\n async prepare(input, ctx) {\n const entityId = requireId(input, 'EUDR product mapping id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadProductMappingSnapshot(entityManager, entityId)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const entityId = requireId(input, 'EUDR product mapping id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrProductMapping, { id: entityId, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR product mapping not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n\n const snapshot = await loadProductMappingSnapshot(entityManager, entityId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (snapshot?.custom) {\n const resetValues = buildCustomFieldResetMap(snapshot.custom, undefined)\n await setProductMappingCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues)\n }\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: productMappingCrudIndexer,\n events: productMappingCrudEvents,\n })\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as ProductMappingSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.product_mappings.delete', 'Delete EUDR product mapping'),\n resourceKind: 'eudr.product_mapping',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: { before } satisfies ProductMappingUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ProductMappingUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrProductMapping, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrProductMapping, productMappingSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreProductMapping(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (before.custom) {\n await setProductMappingCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom)\n }\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'created',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: productMappingCrudIndexer,\n events: productMappingCrudEvents,\n })\n },\n}\n\nregisterCommand(createProductMappingCommand)\nregisterCommand(updateProductMappingCommand)\nregisterCommand(deleteProductMappingCommand)\n"],
5
+ "mappings": "AAAA,SAAS,uBAAuB;AAGhC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,4BAA4B;AACrC,SAAS,yBAAyB,yBAAyB;AAC3D;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAGP,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AAEpC,SAAS,SAAS;AAClB,SAAS,SAAS;AAClB,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAEP,MAAM,4BAA4B;AA2ClC,MAAM,2BAA2B,EAAE,OAAO;AAAA,EACxC,UAAU,EAAE,OAAO,EAAE,KAAK;AAAA,EAC1B,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAClC,CAAC;AAED,MAAM,4BAAmE;AAAA,EACvE,YAAY,EAAE,KAAK;AACrB;AAEA,MAAM,2BAAiE;AAAA,EACrE,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,cAAc,CAAC,iBAAiB;AAAA,IAC9B,IAAI,YAAY,YAAY;AAAA,IAC5B,UAAU,YAAY,QAAQ,MAAM,YAAY,YAAY;AAAA,IAC5D,gBAAgB,YAAY,YAAY;AAAA,IACxC,UAAU,YAAY,YAAY;AAAA,EACpC;AACF;AAEA,SAAS,wBAAwB,OAAoC;AACnE,SAAO,yBAAyB,MAAM,KAAK;AAC7C;AAEA,SAAS,OAAO,OAAmC;AACjD,SAAO,QAAQ,IAAI,KAAK,KAAK,IAAI;AACnC;AAEA,SAAS,+BAA+B,UAA0E;AAChH,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,gBAAgB,SAAS;AAAA,IACzB,UAAU,SAAS;AAAA,IACnB,WAAW,SAAS;AAAA,IACpB,iBAAiB,SAAS;AAAA,IAC1B,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,WAAW,SAAS;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,uBAAuB,SAAS;AAAA,IAChC,mBAAmB,SAAS;AAAA,IAC5B,WAAW,IAAI,KAAK,SAAS,SAAS;AAAA,IACtC,WAAW,IAAI,KAAK,SAAS,SAAS;AAAA,IACtC,WAAW,OAAO,SAAS,SAAS;AAAA,EACtC;AACF;AAEA,eAAe,2BAA2B,IAAmB,UAA0D;AACrH,QAAM,SAAS,MAAM,GAAG,QAAQ,oBAAoB,EAAE,IAAI,SAAS,CAAC;AACpE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,MAAM,wBAAwB,IAAI;AAAA,IAC/C,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AACD,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,gBAAgB,OAAO;AAAA,IACvB,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,iBAAiB,OAAO,mBAAmB;AAAA,IAC3C,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO,UAAU;AAAA,IACzB,WAAW,OAAO;AAAA,IAClB,OAAO,OAAO,SAAS;AAAA,IACvB,uBAAuB,OAAO,yBAAyB;AAAA,IACvD,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C,WAAW,OAAO,UAAU,YAAY;AAAA,IACxC,WAAW,OAAO,UAAU,YAAY;AAAA,IACxC,WAAW,OAAO,YAAY,OAAO,UAAU,YAAY,IAAI;AAAA,IAC/D,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,EAChD;AACF;AAEA,eAAe,2BACb,IACA,OAOe;AACf,QAAM,WAAW,MAAM,GAAG,QAAQ,oBAAoB;AAAA,IACpD,UAAU,MAAM;AAAA,IAChB,gBAAgB,MAAM;AAAA,IACtB,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,WAAW;AAAA,IACX,GAAI,MAAM,YAAY,EAAE,IAAI,EAAE,KAAK,MAAM,UAAU,EAAE,IAAI,CAAC;AAAA,EAC5D,CAAC;AACD,MAAI,UAAU;AACZ,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACxE;AACF;AAEA,SAAS,sBAAsB,QAA4B,UAAwC;AACjG,SAAO,iBAAiB,SAAS;AACjC,SAAO,WAAW,SAAS;AAC3B,SAAO,YAAY,SAAS;AAC5B,SAAO,kBAAkB,SAAS;AAClC,SAAO,YAAY,SAAS;AAC5B,SAAO,SAAS,SAAS;AACzB,SAAO,YAAY,SAAS;AAC5B,SAAO,QAAQ,SAAS;AACxB,SAAO,wBAAwB,SAAS;AACxC,SAAO,oBAAoB,SAAS;AACpC,SAAO,YAAY,IAAI,KAAK,SAAS,SAAS;AAC9C,SAAO,YAAY,IAAI,KAAK,SAAS,SAAS;AAC9C,SAAO,YAAY,OAAO,SAAS,SAAS;AAC9C;AAEA,eAAe,8BACb,YACA,UACA,gBACA,UACA,QACe;AACf,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,MAAM,8BAA4G;AAAA,EAChH,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,EAAE,QAAQ,OAAO,IAAI,sBAAsB,4BAA4B,QAAQ;AACrF,UAAM,QAAQ,wBAAwB,QAAQ;AAC9C,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AAEjD,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,QAAI;AAEJ,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR,aAAa;AAAA,UACX,IAAI,OAAO;AAAA,UACX,gBAAgB,OAAO;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,MAAM,2BAA2B,eAAe;AAAA,UAC9C,UAAU,MAAM;AAAA,UAChB,gBAAgB,MAAM;AAAA,UACtB,WAAW,OAAO;AAAA,UAClB,WAAW,OAAO;AAAA,QACpB,CAAC;AAAA,QACD,MAAM;AACJ,mBAAS,cAAc,OAAO,oBAAoB;AAAA,YAChD,gBAAgB,MAAM;AAAA,YACtB,UAAU,MAAM;AAAA,YAChB,WAAW,OAAO;AAAA,YAClB,iBAAiB,OAAO,mBAAmB;AAAA,YAC3C,WAAW,OAAO;AAAA,YAClB,QAAQ,OAAO,UAAU;AAAA,YACzB,WAAW,OAAO,aAAa;AAAA,YAC/B,OAAO,OAAO,SAAS;AAAA,YACvB,uBAAuB,OAAO,cAAc,SAAU,OAAO,yBAAyB,OAAQ;AAAA,YAC9F,mBAAmB,OAAO,cAAc,SAAU,OAAO,qBAAqB,OAAQ;AAAA,UACxF,CAAC;AACD,wBAAc,QAAQ,MAAM;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,UAAU,OAAO,GAAG;AAAA,EAC/B;AAAA,EACA,cAAc,OAAO,WAAW,QAAQ,QAAQ;AAC9C,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,WAAO,2BAA2B,eAAe,OAAO,QAAQ;AAAA,EAClE;AAAA,EACA,UAAU,OAAO,EAAE,UAAU,MAAM;AACjC,UAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,WAAO;AAAA,MACL,aAAa,UAAU,sCAAsC,6BAA6B;AAAA,MAC1F,cAAc;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,gBAAgB,MAAM;AAAA,MACtB,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM,EAAE,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAA8C,QAAQ;AACtE,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO;AACZ,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,SAAS,MAAM,cAAc,QAAQ,oBAAoB,EAAE,IAAI,MAAM,GAAG,CAAC;AAC/E,QAAI,CAAC,OAAQ;AACb,sBAAkB,KAAK,OAAO,QAAQ;AACtC,4BAAwB,KAAK,OAAO,cAAc;AAClD,WAAO,YAAY,oBAAI,KAAK;AAC5B,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,UAAM,cAAc,yBAAyB,QAAW,MAAM,UAAU,MAAS;AACjF,UAAM,8BAA8B,YAAY,MAAM,IAAI,MAAM,gBAAgB,MAAM,UAAU,WAAW;AAC3G,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EACA,MAAM,eAAyH;AAAA,IAC7H,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,aAAa,CAAC,YAAY,EAAE,UAAU,OAAO,GAAG;AAAA,IAChD,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc,OAAO,EAAE,KAAK,QAAQ,SAAS,MAAM;AACjD,UAAI,CAAC,SAAS,UAAU,CAAC,OAAO,KAAK,SAAS,MAAM,EAAE,OAAQ;AAC9D,YAAM;AAAA,QACJ,IAAI,UAAU,QAAQ,YAAY;AAAA,QAClC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,MAAM,8BAA4G;AAAA,EAChH,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,EAAE,OAAO,IAAI,sBAAsB,4BAA4B,QAAQ;AAC7E,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,WAAW,MAAM,2BAA2B,eAAe,OAAO,EAAE;AAC1E,QAAI,UAAU;AACZ,wBAAkB,KAAK,SAAS,QAAQ;AACxC,8BAAwB,KAAK,SAAS,cAAc;AAAA,IACtD;AACA,WAAO,WAAW,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,EAC5C;AAAA,EACA,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,EAAE,QAAQ,OAAO,IAAI,sBAAsB,4BAA4B,QAAQ;AACrF,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,SAAS,MAAM,cAAc,QAAQ,oBAAoB,EAAE,IAAI,OAAO,IAAI,WAAW,KAAK,CAAC;AACjG,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,iCAAiC,CAAC;AACrF,sBAAkB,KAAK,OAAO,QAAQ;AACtC,4BAAwB,KAAK,OAAO,cAAc;AAElD,UAAM,gBAAgB,OAAO,aAAa,OAAO;AACjD,UAAM,gBAAgB,OAAO,aAAa,OAAO;AAEjD,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO,EAAE,UAAU,OAAO,UAAU,gBAAgB,OAAO,eAAe;AAAA,MAC1E,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR,aAAa;AAAA,UACX,IAAI,OAAO;AAAA,UACX,gBAAgB,OAAO;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,YAAY;AACV,cAAI,kBAAkB,OAAO,aAAa,kBAAkB,OAAO,UAAW;AAC9E,gBAAM,2BAA2B,eAAe;AAAA,YAC9C,UAAU,OAAO;AAAA,YACjB,gBAAgB,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,WAAW;AAAA,YACX,WAAW,OAAO;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,QACA,MAAM;AACJ,cAAI,OAAO,cAAc,OAAW,QAAO,YAAY,OAAO;AAC9D,cAAI,OAAO,oBAAoB,OAAW,QAAO,kBAAkB,OAAO,mBAAmB;AAC7F,cAAI,OAAO,cAAc,OAAW,QAAO,YAAY,OAAO;AAC9D,cAAI,OAAO,WAAW,OAAW,QAAO,SAAS,OAAO,UAAU;AAClE,cAAI,OAAO,cAAc,OAAW,QAAO,YAAY,OAAO;AAC9D,cAAI,OAAO,UAAU,OAAW,QAAO,QAAQ,OAAO,SAAS;AAC/D,cAAI,OAAO,0BAA0B,OAAW,QAAO,wBAAwB,OAAO,yBAAyB;AAC/G,cAAI,OAAO,sBAAsB,OAAW,QAAO,oBAAoB,OAAO,qBAAqB;AACnG,cAAI,kBAAkB,QAAQ;AAC5B,mBAAO,wBAAwB;AAC/B,mBAAO,oBAAoB;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,UAAU,OAAO,IAAI,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA,EACA,cAAc,OAAO,WAAW,QAAQ,QAAQ;AAC9C,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,WAAO,2BAA2B,eAAe,OAAO,QAAQ;AAAA,EAClE;AAAA,EACA,UAAU,OAAO,EAAE,UAAU,MAAM;AACjC,UAAM,SAAS,UAAU;AACzB,UAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,SAAS,eAAe,QAAQ,KAAK,EAAG,QAAO,EAAE,SAAS,KAAK;AACnE,UAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,WAAO;AAAA,MACL,aAAa,UAAU,sCAAsC,6BAA6B;AAAA,MAC1F,cAAc;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,gBAAgB;AAAA,MAChB,eAAe,SAAS;AAAA,MACxB,SAAS;AAAA,QACP,MAAM,EAAE,QAAQ,OAAO,SAAS,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAA8C,QAAQ;AACtE,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,QAAI,SAAS,MAAM,cAAc,QAAQ,oBAAoB,EAAE,IAAI,OAAO,GAAG,CAAC;AAC9E,QAAI,CAAC,QAAQ;AACX,eAAS,cAAc,OAAO,oBAAoB,+BAA+B,MAAM,CAAC;AACxF,oBAAc,QAAQ,MAAM;AAAA,IAC9B,OAAO;AACL,wBAAkB,KAAK,OAAO,QAAQ;AACtC,8BAAwB,KAAK,OAAO,cAAc;AAClD,4BAAsB,QAAQ,MAAM;AAAA,IACtC;AACA,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,UAAM,cAAc,yBAAyB,OAAO,UAAU,QAAW,SAAS,OAAO,UAAU,MAAS;AAC5G,UAAM,8BAA8B,YAAY,OAAO,IAAI,OAAO,gBAAgB,OAAO,UAAU,WAAW;AAC9G,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,MAAM,8BAAgJ;AAAA,EACpJ,IAAI;AAAA,EACJ,MAAM,QAAQ,OAAO,KAAK;AACxB,UAAM,WAAW,UAAU,OAAO,kCAAkC;AACpE,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,WAAW,MAAM,2BAA2B,eAAe,QAAQ;AACzE,QAAI,UAAU;AACZ,wBAAkB,KAAK,SAAS,QAAQ;AACxC,8BAAwB,KAAK,SAAS,cAAc;AAAA,IACtD;AACA,WAAO,WAAW,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,EAC5C;AAAA,EACA,MAAM,QAAQ,OAAO,KAAK;AACxB,UAAM,WAAW,UAAU,OAAO,kCAAkC;AACpE,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,SAAS,MAAM,cAAc,QAAQ,oBAAoB,EAAE,IAAI,UAAU,WAAW,KAAK,CAAC;AAChG,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,iCAAiC,CAAC;AACrF,sBAAkB,KAAK,OAAO,QAAQ;AACtC,4BAAwB,KAAK,OAAO,cAAc;AAElD,UAAM,WAAW,MAAM,2BAA2B,eAAe,QAAQ;AACzE,WAAO,YAAY,oBAAI,KAAK;AAC5B,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,QAAI,UAAU,QAAQ;AACpB,YAAM,cAAc,yBAAyB,SAAS,QAAQ,MAAS;AACvE,YAAM,8BAA8B,YAAY,SAAS,IAAI,SAAS,gBAAgB,SAAS,UAAU,WAAW;AAAA,IACtH;AACA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,EAAE,UAAU,OAAO,IAAI,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA,EACA,UAAU,OAAO,EAAE,UAAU,MAAM;AACjC,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,WAAO;AAAA,MACL,aAAa,UAAU,sCAAsC,6BAA6B;AAAA,MAC1F,cAAc;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,gBAAgB;AAAA,MAChB,SAAS;AAAA,QACP,MAAM,EAAE,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAA8C,QAAQ;AACtE,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,QAAI,SAAS,MAAM,cAAc,QAAQ,oBAAoB,EAAE,IAAI,OAAO,GAAG,CAAC;AAC9E,QAAI,CAAC,QAAQ;AACX,eAAS,cAAc,OAAO,oBAAoB,+BAA+B,MAAM,CAAC;AACxF,oBAAc,QAAQ,MAAM;AAAA,IAC9B,OAAO;AACL,wBAAkB,KAAK,OAAO,QAAQ;AACtC,8BAAwB,KAAK,OAAO,cAAc;AAClD,4BAAsB,QAAQ,MAAM;AAAA,IACtC;AACA,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,QAAI,OAAO,QAAQ;AACjB,YAAM,8BAA8B,YAAY,OAAO,IAAI,OAAO,gBAAgB,OAAO,UAAU,OAAO,MAAM;AAAA,IAClH;AACA,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,gBAAgB,2BAA2B;AAC3C,gBAAgB,2BAA2B;AAC3C,gBAAgB,2BAA2B;",
6
+ "names": []
7
+ }