@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.
- package/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/eudr_due_diligence_statement/index.js +47 -0
- package/dist/generated/entities/eudr_due_diligence_statement/index.js.map +7 -0
- package/dist/generated/entities/eudr_evidence_submission/index.js +51 -0
- package/dist/generated/entities/eudr_evidence_submission/index.js.map +7 -0
- package/dist/generated/entities/eudr_mitigation_action/index.js +31 -0
- package/dist/generated/entities/eudr_mitigation_action/index.js.map +7 -0
- package/dist/generated/entities/eudr_plot/index.js +39 -0
- package/dist/generated/entities/eudr_plot/index.js.map +7 -0
- package/dist/generated/entities/eudr_product_mapping/index.js +31 -0
- package/dist/generated/entities/eudr_product_mapping/index.js.map +7 -0
- package/dist/generated/entities/eudr_risk_assessment/index.js +35 -0
- package/dist/generated/entities/eudr_risk_assessment/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +9 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +120 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/ui.js +3 -0
- package/dist/helpers/integration/ui.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +5 -1
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/attachments/lib/crud.js +3 -1
- package/dist/modules/attachments/lib/crud.js.map +2 -2
- package/dist/modules/eudr/acl.js +43 -0
- package/dist/modules/eudr/acl.js.map +7 -0
- package/dist/modules/eudr/ai-agents.js +205 -0
- package/dist/modules/eudr/ai-agents.js.map +7 -0
- package/dist/modules/eudr/ai-tools/compliance-pack.js +495 -0
- package/dist/modules/eudr/ai-tools/compliance-pack.js.map +7 -0
- package/dist/modules/eudr/ai-tools/types.js +10 -0
- package/dist/modules/eudr/ai-tools/types.js.map +7 -0
- package/dist/modules/eudr/ai-tools.js +10 -0
- package/dist/modules/eudr/ai-tools.js.map +7 -0
- package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +386 -0
- package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +7 -0
- package/dist/modules/eudr/api/evidence-submissions/route.js +318 -0
- package/dist/modules/eudr/api/evidence-submissions/route.js.map +7 -0
- package/dist/modules/eudr/api/mitigation-actions/route.js +249 -0
- package/dist/modules/eudr/api/mitigation-actions/route.js.map +7 -0
- package/dist/modules/eudr/api/openapi.js +27 -0
- package/dist/modules/eudr/api/openapi.js.map +7 -0
- package/dist/modules/eudr/api/plots/import/route.js +294 -0
- package/dist/modules/eudr/api/plots/import/route.js.map +7 -0
- package/dist/modules/eudr/api/plots/route.js +279 -0
- package/dist/modules/eudr/api/plots/route.js.map +7 -0
- package/dist/modules/eudr/api/product-mappings/route.js +257 -0
- package/dist/modules/eudr/api/product-mappings/route.js.map +7 -0
- package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +298 -0
- package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +7 -0
- package/dist/modules/eudr/api/product-mappings/suggestions/route.js +132 -0
- package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +7 -0
- package/dist/modules/eudr/api/reports/annual/route.js +266 -0
- package/dist/modules/eudr/api/reports/annual/route.js.map +7 -0
- package/dist/modules/eudr/api/risk-assessments/route.js +300 -0
- package/dist/modules/eudr/api/risk-assessments/route.js.map +7 -0
- package/dist/modules/eudr/api/statements/[id]/export/route.js +631 -0
- package/dist/modules/eudr/api/statements/[id]/export/route.js.map +7 -0
- package/dist/modules/eudr/api/statements/[id]/readiness/route.js +111 -0
- package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +7 -0
- package/dist/modules/eudr/api/statements/route.js +314 -0
- package/dist/modules/eudr/api/statements/route.js.map +7 -0
- package/dist/modules/eudr/api/suppliers/compliance/route.js +173 -0
- package/dist/modules/eudr/api/suppliers/compliance/route.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +468 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +351 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +17 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +313 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/page.js +360 -0
- package/dist/modules/eudr/backend/eudr/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +346 -0
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +253 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +17 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js +386 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +253 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +174 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +17 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +306 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +335 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +220 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +17 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +324 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +648 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.js +432 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +17 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js +309 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +7 -0
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js +16 -0
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +7 -0
- package/dist/modules/eudr/ce.js +56 -0
- package/dist/modules/eudr/ce.js.map +7 -0
- package/dist/modules/eudr/commands/evidence-submissions.js +571 -0
- package/dist/modules/eudr/commands/evidence-submissions.js.map +7 -0
- package/dist/modules/eudr/commands/index.js +7 -0
- package/dist/modules/eudr/commands/index.js.map +7 -0
- package/dist/modules/eudr/commands/lifecycle-events.js +19 -0
- package/dist/modules/eudr/commands/lifecycle-events.js.map +7 -0
- package/dist/modules/eudr/commands/mitigation-actions.js +488 -0
- package/dist/modules/eudr/commands/mitigation-actions.js.map +7 -0
- package/dist/modules/eudr/commands/plots.js +517 -0
- package/dist/modules/eudr/commands/plots.js.map +7 -0
- package/dist/modules/eudr/commands/product-mappings.js +468 -0
- package/dist/modules/eudr/commands/product-mappings.js.map +7 -0
- package/dist/modules/eudr/commands/risk-assessments.js +599 -0
- package/dist/modules/eudr/commands/risk-assessments.js.map +7 -0
- package/dist/modules/eudr/commands/statements.js +747 -0
- package/dist/modules/eudr/commands/statements.js.map +7 -0
- package/dist/modules/eudr/components/CountrySelectField.js +64 -0
- package/dist/modules/eudr/components/CountrySelectField.js.map +7 -0
- package/dist/modules/eudr/components/GeometryInput.js +133 -0
- package/dist/modules/eudr/components/GeometryInput.js.map +7 -0
- package/dist/modules/eudr/components/MappingSuggestionsDialog.js +307 -0
- package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +7 -0
- package/dist/modules/eudr/components/MitigationActionsSection.js +345 -0
- package/dist/modules/eudr/components/MitigationActionsSection.js.map +7 -0
- package/dist/modules/eudr/components/OrderSelectField.js +88 -0
- package/dist/modules/eudr/components/OrderSelectField.js.map +7 -0
- package/dist/modules/eudr/components/PlotImportDialog.js +229 -0
- package/dist/modules/eudr/components/PlotImportDialog.js.map +7 -0
- package/dist/modules/eudr/components/PlotMapPreview.js +35 -0
- package/dist/modules/eudr/components/PlotMapPreview.js.map +7 -0
- package/dist/modules/eudr/components/PlotMapPreviewImpl.js +97 -0
- package/dist/modules/eudr/components/PlotMapPreviewImpl.js.map +7 -0
- package/dist/modules/eudr/components/PlotMultiSelectField.js +198 -0
- package/dist/modules/eudr/components/PlotMultiSelectField.js.map +7 -0
- package/dist/modules/eudr/components/RiskCriteriaField.js +128 -0
- package/dist/modules/eudr/components/RiskCriteriaField.js.map +7 -0
- package/dist/modules/eudr/components/StatementLifecycleBar.js +274 -0
- package/dist/modules/eudr/components/StatementLifecycleBar.js.map +7 -0
- package/dist/modules/eudr/components/StatementReadinessChecklist.js +56 -0
- package/dist/modules/eudr/components/StatementReadinessChecklist.js.map +7 -0
- package/dist/modules/eudr/components/StatementRiskSection.js +179 -0
- package/dist/modules/eudr/components/StatementRiskSection.js.map +7 -0
- package/dist/modules/eudr/components/crudErrorI18n.js +31 -0
- package/dist/modules/eudr/components/crudErrorI18n.js.map +7 -0
- package/dist/modules/eudr/components/formConfig.js +593 -0
- package/dist/modules/eudr/components/formConfig.js.map +7 -0
- package/dist/modules/eudr/components/plotForm.js +68 -0
- package/dist/modules/eudr/components/plotForm.js.map +7 -0
- package/dist/modules/eudr/data/enrichers.js +62 -0
- package/dist/modules/eudr/data/enrichers.js.map +7 -0
- package/dist/modules/eudr/data/entities.js +437 -0
- package/dist/modules/eudr/data/entities.js.map +7 -0
- package/dist/modules/eudr/data/validators.js +271 -0
- package/dist/modules/eudr/data/validators.js.map +7 -0
- package/dist/modules/eudr/encryption.js +33 -0
- package/dist/modules/eudr/encryption.js.map +7 -0
- package/dist/modules/eudr/events.js +38 -0
- package/dist/modules/eudr/events.js.map +7 -0
- package/dist/modules/eudr/index.js +15 -0
- package/dist/modules/eudr/index.js.map +7 -0
- package/dist/modules/eudr/lib/annual-report.js +104 -0
- package/dist/modules/eudr/lib/annual-report.js.map +7 -0
- package/dist/modules/eudr/lib/completeness.js +64 -0
- package/dist/modules/eudr/lib/completeness.js.map +7 -0
- package/dist/modules/eudr/lib/detail-read-scope.js +16 -0
- package/dist/modules/eudr/lib/detail-read-scope.js.map +7 -0
- package/dist/modules/eudr/lib/geometry.js +142 -0
- package/dist/modules/eudr/lib/geometry.js.map +7 -0
- package/dist/modules/eudr/lib/notifications.js +56 -0
- package/dist/modules/eudr/lib/notifications.js.map +7 -0
- package/dist/modules/eudr/lib/plural.js +26 -0
- package/dist/modules/eudr/lib/plural.js.map +7 -0
- package/dist/modules/eudr/lib/reference-data.js +240 -0
- package/dist/modules/eudr/lib/reference-data.js.map +7 -0
- package/dist/modules/eudr/lib/species.js +10 -0
- package/dist/modules/eudr/lib/species.js.map +7 -0
- package/dist/modules/eudr/lib/statement-lifecycle.js +84 -0
- package/dist/modules/eudr/lib/statement-lifecycle.js.map +7 -0
- package/dist/modules/eudr/lib/statement-seeding.js +49 -0
- package/dist/modules/eudr/lib/statement-seeding.js.map +7 -0
- package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js +15 -0
- package/dist/modules/eudr/migrations/Migration20260706102002_eudr.js.map +7 -0
- package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js +24 -0
- package/dist/modules/eudr/migrations/Migration20260706152612_eudr.js.map +7 -0
- package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js +15 -0
- package/dist/modules/eudr/migrations/Migration20260722100000_eudr.js.map +7 -0
- package/dist/modules/eudr/notifications.js +58 -0
- package/dist/modules/eudr/notifications.js.map +7 -0
- package/dist/modules/eudr/search.js +186 -0
- package/dist/modules/eudr/search.js.map +7 -0
- package/dist/modules/eudr/setup.js +12 -0
- package/dist/modules/eudr/setup.js.map +7 -0
- package/dist/modules/eudr/subscribers/notify-mitigation-completed.js +34 -0
- package/dist/modules/eudr/subscribers/notify-mitigation-completed.js.map +7 -0
- package/dist/modules/eudr/subscribers/notify-risk-concluded.js +35 -0
- package/dist/modules/eudr/subscribers/notify-risk-concluded.js.map +7 -0
- package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js +37 -0
- package/dist/modules/eudr/subscribers/notify-statement-reference-issued.js.map +7 -0
- package/dist/modules/eudr/subscribers/notify-statement-submitted.js +34 -0
- package/dist/modules/eudr/subscribers/notify-statement-submitted.js.map +7 -0
- package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js +34 -0
- package/dist/modules/eudr/subscribers/notify-statement-withdrawn.js.map +7 -0
- package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js +124 -0
- package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-created.js.map +7 -0
- package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js +22 -0
- package/dist/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.js.map +7 -0
- package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js +203 -0
- package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.client.js.map +7 -0
- package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js +23 -0
- package/dist/modules/eudr/widgets/dashboard/compliance-overview/widget.js.map +7 -0
- package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js +19 -0
- package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.client.js.map +7 -0
- package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js +31 -0
- package/dist/modules/eudr/widgets/injection/eudr-product-column/widget.js.map +7 -0
- package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js +100 -0
- package/dist/modules/eudr/widgets/injection/order-compliance/widget.client.js.map +7 -0
- package/dist/modules/eudr/widgets/injection/order-compliance/widget.js +17 -0
- package/dist/modules/eudr/widgets/injection/order-compliance/widget.js.map +7 -0
- package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js +116 -0
- package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.client.js.map +7 -0
- package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js +17 -0
- package/dist/modules/eudr/widgets/injection/supplier-compliance/widget.js.map +7 -0
- package/dist/modules/eudr/widgets/injection-table.js +32 -0
- package/dist/modules/eudr/widgets/injection-table.js.map +7 -0
- package/dist/modules/notifications/lib/notificationService.js +67 -3
- package/dist/modules/notifications/lib/notificationService.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +121 -48
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/sales/api/documents/factory.js +17 -0
- package/dist/modules/sales/api/documents/factory.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +32 -18
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/data/entities.js +1 -0
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js +17 -0
- package/dist/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.js.map +7 -0
- package/generated/entities/eudr_due_diligence_statement/index.ts +22 -0
- package/generated/entities/eudr_evidence_submission/index.ts +24 -0
- package/generated/entities/eudr_mitigation_action/index.ts +14 -0
- package/generated/entities/eudr_plot/index.ts +18 -0
- package/generated/entities/eudr_product_mapping/index.ts +14 -0
- package/generated/entities/eudr_risk_assessment/index.ts +16 -0
- package/generated/entities.ids.generated.ts +9 -0
- package/generated/entity-fields-registry.ts +120 -0
- package/package.json +7 -7
- package/src/helpers/integration/ui.ts +12 -0
- package/src/modules/attachments/fields/attachment.tsx +5 -0
- package/src/modules/attachments/lib/crud.ts +2 -0
- package/src/modules/eudr/acl.ts +39 -0
- package/src/modules/eudr/ai-agents.ts +258 -0
- package/src/modules/eudr/ai-tools/compliance-pack.ts +618 -0
- package/src/modules/eudr/ai-tools/types.ts +44 -0
- package/src/modules/eudr/ai-tools.ts +15 -0
- package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +481 -0
- package/src/modules/eudr/api/evidence-submissions/route.ts +335 -0
- package/src/modules/eudr/api/mitigation-actions/route.ts +263 -0
- package/src/modules/eudr/api/openapi.ts +28 -0
- package/src/modules/eudr/api/plots/import/route.ts +369 -0
- package/src/modules/eudr/api/plots/route.ts +296 -0
- package/src/modules/eudr/api/product-mappings/route.ts +269 -0
- package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +382 -0
- package/src/modules/eudr/api/product-mappings/suggestions/route.ts +169 -0
- package/src/modules/eudr/api/reports/annual/route.ts +457 -0
- package/src/modules/eudr/api/risk-assessments/route.ts +323 -0
- package/src/modules/eudr/api/statements/[id]/export/route.ts +713 -0
- package/src/modules/eudr/api/statements/[id]/readiness/route.ts +129 -0
- package/src/modules/eudr/api/statements/route.ts +329 -0
- package/src/modules/eudr/api/suppliers/compliance/route.ts +241 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +545 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +13 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +383 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +379 -0
- package/src/modules/eudr/backend/eudr/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/page.tsx +477 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +404 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +13 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +267 -0
- package/src/modules/eudr/backend/eudr/plots/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +442 -0
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +311 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +13 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +190 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +344 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +421 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +13 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +247 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +383 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +777 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +13 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.tsx +511 -0
- package/src/modules/eudr/backend/eudr/statements/page.meta.ts +12 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +372 -0
- package/src/modules/eudr/ce.ts +52 -0
- package/src/modules/eudr/commands/evidence-submissions.ts +699 -0
- package/src/modules/eudr/commands/index.ts +6 -0
- package/src/modules/eudr/commands/lifecycle-events.ts +28 -0
- package/src/modules/eudr/commands/mitigation-actions.ts +574 -0
- package/src/modules/eudr/commands/plots.ts +627 -0
- package/src/modules/eudr/commands/product-mappings.ts +556 -0
- package/src/modules/eudr/commands/risk-assessments.ts +728 -0
- package/src/modules/eudr/commands/statements.ts +933 -0
- package/src/modules/eudr/components/CountrySelectField.tsx +77 -0
- package/src/modules/eudr/components/GeometryInput.tsx +170 -0
- package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +385 -0
- package/src/modules/eudr/components/MitigationActionsSection.tsx +417 -0
- package/src/modules/eudr/components/OrderSelectField.tsx +116 -0
- package/src/modules/eudr/components/PlotImportDialog.tsx +277 -0
- package/src/modules/eudr/components/PlotMapPreview.tsx +46 -0
- package/src/modules/eudr/components/PlotMapPreviewImpl.tsx +111 -0
- package/src/modules/eudr/components/PlotMultiSelectField.tsx +238 -0
- package/src/modules/eudr/components/RiskCriteriaField.tsx +173 -0
- package/src/modules/eudr/components/StatementLifecycleBar.tsx +363 -0
- package/src/modules/eudr/components/StatementReadinessChecklist.tsx +82 -0
- package/src/modules/eudr/components/StatementRiskSection.tsx +242 -0
- package/src/modules/eudr/components/crudErrorI18n.ts +36 -0
- package/src/modules/eudr/components/formConfig.tsx +717 -0
- package/src/modules/eudr/components/plotForm.ts +75 -0
- package/src/modules/eudr/data/enrichers.ts +82 -0
- package/src/modules/eudr/data/entities.ts +369 -0
- package/src/modules/eudr/data/validators.ts +357 -0
- package/src/modules/eudr/encryption.ts +31 -0
- package/src/modules/eudr/events.ts +38 -0
- package/src/modules/eudr/i18n/de.json +747 -0
- package/src/modules/eudr/i18n/en.json +747 -0
- package/src/modules/eudr/i18n/es.json +747 -0
- package/src/modules/eudr/i18n/ko.json +747 -0
- package/src/modules/eudr/i18n/pl.json +747 -0
- package/src/modules/eudr/index.ts +13 -0
- package/src/modules/eudr/lib/annual-report.ts +120 -0
- package/src/modules/eudr/lib/completeness.ts +90 -0
- package/src/modules/eudr/lib/detail-read-scope.ts +44 -0
- package/src/modules/eudr/lib/geometry.ts +191 -0
- package/src/modules/eudr/lib/notifications.ts +85 -0
- package/src/modules/eudr/lib/plural.ts +36 -0
- package/src/modules/eudr/lib/reference-data.ts +128 -0
- package/src/modules/eudr/lib/species.ts +12 -0
- package/src/modules/eudr/lib/statement-lifecycle.ts +109 -0
- package/src/modules/eudr/lib/statement-seeding.ts +86 -0
- package/src/modules/eudr/migrations/.snapshot-open-mercato.json +2046 -0
- package/src/modules/eudr/migrations/Migration20260706102002_eudr.ts +16 -0
- package/src/modules/eudr/migrations/Migration20260706152612_eudr.ts +30 -0
- package/src/modules/eudr/migrations/Migration20260722100000_eudr.ts +17 -0
- package/src/modules/eudr/notifications.ts +56 -0
- package/src/modules/eudr/search.ts +212 -0
- package/src/modules/eudr/setup.ts +10 -0
- package/src/modules/eudr/subscribers/notify-mitigation-completed.ts +56 -0
- package/src/modules/eudr/subscribers/notify-risk-concluded.ts +58 -0
- package/src/modules/eudr/subscribers/notify-statement-reference-issued.ts +59 -0
- package/src/modules/eudr/subscribers/notify-statement-submitted.ts +49 -0
- package/src/modules/eudr/subscribers/notify-statement-withdrawn.ts +49 -0
- package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-created.ts +189 -0
- package/src/modules/eudr/subscribers/recompute-completeness-on-attachment-deleted.ts +31 -0
- package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.client.tsx +271 -0
- package/src/modules/eudr/widgets/dashboard/compliance-overview/widget.ts +24 -0
- package/src/modules/eudr/widgets/injection/eudr-product-column/widget.client.tsx +37 -0
- package/src/modules/eudr/widgets/injection/eudr-product-column/widget.ts +30 -0
- package/src/modules/eudr/widgets/injection/order-compliance/widget.client.tsx +131 -0
- package/src/modules/eudr/widgets/injection/order-compliance/widget.ts +16 -0
- package/src/modules/eudr/widgets/injection/supplier-compliance/widget.client.tsx +168 -0
- package/src/modules/eudr/widgets/injection/supplier-compliance/widget.ts +16 -0
- package/src/modules/eudr/widgets/injection-table.ts +31 -0
- package/src/modules/notifications/lib/notificationService.ts +83 -4
- package/src/modules/query_index/lib/engine.ts +139 -51
- package/src/modules/sales/api/documents/factory.ts +29 -0
- package/src/modules/sales/commands/documents.ts +65 -18
- package/src/modules/sales/data/entities.ts +1 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +10 -0
- package/src/modules/sales/migrations/Migration20260806120000_sales_tag_assignment_document_idx.ts +59 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { getCountryRiskTier } from "./reference-data.js";
|
|
2
|
+
const EUDR_STATEMENT_TRANSITIONS = {
|
|
3
|
+
draft: ["submitted", "archived"],
|
|
4
|
+
submitted: ["draft", "available", "archived"],
|
|
5
|
+
available: ["withdrawn", "archived"],
|
|
6
|
+
withdrawn: ["archived"],
|
|
7
|
+
archived: []
|
|
8
|
+
};
|
|
9
|
+
function canTransition(from, to) {
|
|
10
|
+
return EUDR_STATEMENT_TRANSITIONS[from].includes(to);
|
|
11
|
+
}
|
|
12
|
+
const EUDR_AMEND_GUARDED_FIELDS = [
|
|
13
|
+
"commodity",
|
|
14
|
+
"quantityKg",
|
|
15
|
+
"supplementaryUnit",
|
|
16
|
+
"supplementaryQuantity",
|
|
17
|
+
"referencedStatements",
|
|
18
|
+
"orderId"
|
|
19
|
+
];
|
|
20
|
+
const EUDR_AMEND_WINDOW_MS = 72 * 60 * 60 * 1e3;
|
|
21
|
+
function isAmendWindowOpen(referenceIssuedAt, now = /* @__PURE__ */ new Date()) {
|
|
22
|
+
if (referenceIssuedAt == null) return false;
|
|
23
|
+
const issuedAtMs = referenceIssuedAt.getTime();
|
|
24
|
+
if (Number.isNaN(issuedAtMs)) return false;
|
|
25
|
+
const elapsedMs = now.getTime() - issuedAtMs;
|
|
26
|
+
return elapsedMs >= 0 && elapsedMs <= EUDR_AMEND_WINDOW_MS;
|
|
27
|
+
}
|
|
28
|
+
function normalizeCountry(value) {
|
|
29
|
+
const normalized = value?.trim().toUpperCase() ?? "";
|
|
30
|
+
return normalized.length > 0 ? normalized : null;
|
|
31
|
+
}
|
|
32
|
+
function parseDate(value) {
|
|
33
|
+
if (value == null) return null;
|
|
34
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
35
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
36
|
+
}
|
|
37
|
+
function hasSameCountries(left, right) {
|
|
38
|
+
if (left.size !== right.size) return false;
|
|
39
|
+
for (const country of left) {
|
|
40
|
+
if (!right.has(country)) return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
function evaluateSubmissionGate(input) {
|
|
45
|
+
const reasons = [];
|
|
46
|
+
if (input.actorRole === "sme_trader") {
|
|
47
|
+
if (input.referencedStatementsCount < 1) reasons.push("referencedStatementsRequired");
|
|
48
|
+
return { allowed: reasons.length === 0, reasons };
|
|
49
|
+
}
|
|
50
|
+
if (input.submissions.length === 0) reasons.push("noSubmissions");
|
|
51
|
+
if (input.submissions.some((submission) => submission.status !== "verified" || submission.completenessScore !== 100)) {
|
|
52
|
+
reasons.push("submissionsNotReady");
|
|
53
|
+
}
|
|
54
|
+
if (input.submissions.some((submission) => normalizeCountry(submission.originCountry) === null)) {
|
|
55
|
+
reasons.push("originCountryMissing");
|
|
56
|
+
}
|
|
57
|
+
const currentCountries = new Set(
|
|
58
|
+
input.submissions.map((submission) => normalizeCountry(submission.originCountry)).filter((country) => country !== null)
|
|
59
|
+
);
|
|
60
|
+
const allCountriesPresent = input.submissions.length > 0 && input.submissions.every((submission) => normalizeCountry(submission.originCountry) !== null);
|
|
61
|
+
const tiers = [...currentCountries].map((country) => getCountryRiskTier(country));
|
|
62
|
+
const simplifiedDueDiligenceSatisfied = allCountriesPresent && tiers.length > 0 && tiers.every((tier) => tier === "low");
|
|
63
|
+
if (!simplifiedDueDiligenceSatisfied) {
|
|
64
|
+
const assessment = input.latestAssessment;
|
|
65
|
+
if (assessment == null || assessment.conclusion !== "negligible") reasons.push("riskConclusionMissing");
|
|
66
|
+
if (assessment != null) {
|
|
67
|
+
const assessedCountries = new Set(assessment.countryRisks.map((risk) => risk.country.trim().toUpperCase()).filter((country) => country.length > 0));
|
|
68
|
+
if (!hasSameCountries(currentCountries, assessedCountries)) reasons.push("riskAssessmentStale");
|
|
69
|
+
const reviewDueAt = parseDate(assessment.reviewDueAt);
|
|
70
|
+
if (reviewDueAt !== null && reviewDueAt.getTime() < (input.now ?? /* @__PURE__ */ new Date()).getTime()) reasons.push("riskReviewOverdue");
|
|
71
|
+
if (assessment.hasConcernAnswers && !assessment.hasCompletedMitigation) reasons.push("mitigationIncomplete");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { allowed: reasons.length === 0, reasons };
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
EUDR_AMEND_GUARDED_FIELDS,
|
|
78
|
+
EUDR_AMEND_WINDOW_MS,
|
|
79
|
+
EUDR_STATEMENT_TRANSITIONS,
|
|
80
|
+
canTransition,
|
|
81
|
+
evaluateSubmissionGate,
|
|
82
|
+
isAmendWindowOpen
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=statement-lifecycle.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/lib/statement-lifecycle.ts"],
|
|
4
|
+
"sourcesContent": ["import type { EudrStatementStatus } from '../data/validators'\nimport { getCountryRiskTier } from './reference-data'\n\nexport const EUDR_STATEMENT_TRANSITIONS: Record<EudrStatementStatus, readonly EudrStatementStatus[]> = {\n draft: ['submitted', 'archived'],\n submitted: ['draft', 'available', 'archived'],\n available: ['withdrawn', 'archived'],\n withdrawn: ['archived'],\n archived: [],\n}\n\nexport function canTransition(from: EudrStatementStatus, to: EudrStatementStatus): boolean {\n return EUDR_STATEMENT_TRANSITIONS[from].includes(to)\n}\n\nexport const EUDR_AMEND_GUARDED_FIELDS = [\n 'commodity',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'referencedStatements',\n 'orderId',\n] as const\n\nexport const EUDR_AMEND_WINDOW_MS = 72 * 60 * 60 * 1000\n\nexport function isAmendWindowOpen(referenceIssuedAt: Date | null | undefined, now: Date = new Date()): boolean {\n if (referenceIssuedAt == null) return false\n const issuedAtMs = referenceIssuedAt.getTime()\n if (Number.isNaN(issuedAtMs)) return false\n const elapsedMs = now.getTime() - issuedAtMs\n return elapsedMs >= 0 && elapsedMs <= EUDR_AMEND_WINDOW_MS\n}\n\nexport type GateSubmissionView = { status: string; completenessScore: number; originCountry: string | null }\nexport type GateAssessmentView = {\n conclusion: string\n countryRisks: Array<{ country: string; tier: string }>\n reviewDueAt: Date | string | null\n hasConcernAnswers: boolean\n hasCompletedMitigation: boolean\n} | null\nexport type GateResult = { allowed: boolean; reasons: string[] }\n\nfunction normalizeCountry(value: string | null): string | null {\n const normalized = value?.trim().toUpperCase() ?? ''\n return normalized.length > 0 ? normalized : null\n}\n\nfunction parseDate(value: Date | string | null): Date | null {\n if (value == null) return null\n const date = value instanceof Date ? value : new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n}\n\nfunction hasSameCountries(left: Set<string>, right: Set<string>): boolean {\n if (left.size !== right.size) return false\n for (const country of left) {\n if (!right.has(country)) return false\n }\n return true\n}\n\nexport function evaluateSubmissionGate(input: {\n actorRole: string | null\n referencedStatementsCount: number\n submissions: GateSubmissionView[]\n latestAssessment: GateAssessmentView\n now?: Date\n}): GateResult {\n const reasons: string[] = []\n\n if (input.actorRole === 'sme_trader') {\n if (input.referencedStatementsCount < 1) reasons.push('referencedStatementsRequired')\n return { allowed: reasons.length === 0, reasons }\n }\n\n if (input.submissions.length === 0) reasons.push('noSubmissions')\n if (input.submissions.some((submission) => submission.status !== 'verified' || submission.completenessScore !== 100)) {\n reasons.push('submissionsNotReady')\n }\n if (input.submissions.some((submission) => normalizeCountry(submission.originCountry) === null)) {\n reasons.push('originCountryMissing')\n }\n\n const currentCountries = new Set(\n input.submissions\n .map((submission) => normalizeCountry(submission.originCountry))\n .filter((country): country is string => country !== null),\n )\n const allCountriesPresent = input.submissions.length > 0 && input.submissions.every((submission) => normalizeCountry(submission.originCountry) !== null)\n const tiers = [...currentCountries].map((country) => getCountryRiskTier(country))\n const simplifiedDueDiligenceSatisfied = allCountriesPresent && tiers.length > 0 && tiers.every((tier) => tier === 'low')\n\n if (!simplifiedDueDiligenceSatisfied) {\n const assessment = input.latestAssessment\n if (assessment == null || assessment.conclusion !== 'negligible') reasons.push('riskConclusionMissing')\n if (assessment != null) {\n const assessedCountries = new Set(assessment.countryRisks.map((risk) => risk.country.trim().toUpperCase()).filter((country) => country.length > 0))\n if (!hasSameCountries(currentCountries, assessedCountries)) reasons.push('riskAssessmentStale')\n\n const reviewDueAt = parseDate(assessment.reviewDueAt)\n if (reviewDueAt !== null && reviewDueAt.getTime() < (input.now ?? new Date()).getTime()) reasons.push('riskReviewOverdue')\n if (assessment.hasConcernAnswers && !assessment.hasCompletedMitigation) reasons.push('mitigationIncomplete')\n }\n }\n\n return { allowed: reasons.length === 0, reasons }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
2
|
+
function validUuid(value) {
|
|
3
|
+
if (!value) return null;
|
|
4
|
+
const trimmed = value.trim();
|
|
5
|
+
return UUID_PATTERN.test(trimmed) ? trimmed : null;
|
|
6
|
+
}
|
|
7
|
+
function textValue(value) {
|
|
8
|
+
return typeof value === "string" ? value : "";
|
|
9
|
+
}
|
|
10
|
+
function numberTextValue(value) {
|
|
11
|
+
return typeof value === "number" || typeof value === "string" ? String(value) : "";
|
|
12
|
+
}
|
|
13
|
+
function resolveSeedingParams(searchParams) {
|
|
14
|
+
const duplicateId = validUuid(searchParams.get("duplicateFrom"));
|
|
15
|
+
const orderId = validUuid(searchParams.get("orderId"));
|
|
16
|
+
if (duplicateId) {
|
|
17
|
+
return orderId ? { mode: "duplicate", id: duplicateId, ignoredOrder: true } : { mode: "duplicate", id: duplicateId };
|
|
18
|
+
}
|
|
19
|
+
if (orderId) return { mode: "order", id: orderId };
|
|
20
|
+
return { mode: "none" };
|
|
21
|
+
}
|
|
22
|
+
function buildDuplicateSeed(source) {
|
|
23
|
+
return {
|
|
24
|
+
title: textValue(source.title),
|
|
25
|
+
commodity: textValue(source.commodity),
|
|
26
|
+
activityType: textValue(source.activityType),
|
|
27
|
+
actorRole: textValue(source.actorRole),
|
|
28
|
+
orderId: textValue(source.orderId),
|
|
29
|
+
quantityKg: numberTextValue(source.quantityKg),
|
|
30
|
+
supplementaryUnit: textValue(source.supplementaryUnit),
|
|
31
|
+
supplementaryQuantity: numberTextValue(source.supplementaryQuantity),
|
|
32
|
+
notes: textValue(source.notes)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function pickUnambiguousCommodity(mappings) {
|
|
36
|
+
const commodities = /* @__PURE__ */ new Set();
|
|
37
|
+
for (const mapping of mappings) {
|
|
38
|
+
if (!mapping.isInScope) continue;
|
|
39
|
+
const commodity = mapping.commodity.trim();
|
|
40
|
+
if (commodity) commodities.add(commodity);
|
|
41
|
+
}
|
|
42
|
+
return commodities.size === 1 ? Array.from(commodities)[0] : null;
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
buildDuplicateSeed,
|
|
46
|
+
pickUnambiguousCommodity,
|
|
47
|
+
resolveSeedingParams
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=statement-seeding.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/lib/statement-seeding.ts"],
|
|
4
|
+
"sourcesContent": ["const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport type StatementSeedingParams =\n | { mode: 'duplicate'; id: string; ignoredOrder?: boolean }\n | { mode: 'order'; id: string }\n | { mode: 'none'; ignoredOrder?: boolean }\n\nexport type StatementSeedSource = {\n id?: string | null\n title?: string | null\n commodity?: string | null\n activityType?: string | null\n actorRole?: string | null\n orderId?: string | null\n quantityKg?: number | string | null\n supplementaryUnit?: string | null\n supplementaryQuantity?: number | string | null\n notes?: string | null\n}\n\nexport type StatementSeedValues = {\n title: string\n commodity: string\n activityType: string\n actorRole: string\n orderId: string\n quantityKg: string\n supplementaryUnit: string\n supplementaryQuantity: string\n notes: string\n}\n\nfunction validUuid(value: string | null): string | null {\n if (!value) return null\n const trimmed = value.trim()\n return UUID_PATTERN.test(trimmed) ? trimmed : null\n}\n\nfunction textValue(value: string | null | undefined): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction numberTextValue(value: number | string | null | undefined): string {\n return typeof value === 'number' || typeof value === 'string' ? String(value) : ''\n}\n\nexport function resolveSeedingParams(\n searchParams: { get(name: string): string | null },\n): StatementSeedingParams {\n const duplicateId = validUuid(searchParams.get('duplicateFrom'))\n const orderId = validUuid(searchParams.get('orderId'))\n\n if (duplicateId) {\n return orderId\n ? { mode: 'duplicate', id: duplicateId, ignoredOrder: true }\n : { mode: 'duplicate', id: duplicateId }\n }\n if (orderId) return { mode: 'order', id: orderId }\n return { mode: 'none' }\n}\n\nexport function buildDuplicateSeed(source: StatementSeedSource): Partial<StatementSeedValues> {\n return {\n title: textValue(source.title),\n commodity: textValue(source.commodity),\n activityType: textValue(source.activityType),\n actorRole: textValue(source.actorRole),\n orderId: textValue(source.orderId),\n quantityKg: numberTextValue(source.quantityKg),\n supplementaryUnit: textValue(source.supplementaryUnit),\n supplementaryQuantity: numberTextValue(source.supplementaryQuantity),\n notes: textValue(source.notes),\n }\n}\n\nexport function pickUnambiguousCommodity(\n mappings: Array<{ commodity: string; isInScope: boolean }>,\n): string | null {\n const commodities = new Set<string>()\n for (const mapping of mappings) {\n if (!mapping.isInScope) continue\n const commodity = mapping.commodity.trim()\n if (commodity) commodities.add(commodity)\n }\n return commodities.size === 1 ? Array.from(commodities)[0] : null\n}\n"],
|
|
5
|
+
"mappings": "AAAA,MAAM,eAAe;AAgCrB,SAAS,UAAU,OAAqC;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,aAAa,KAAK,OAAO,IAAI,UAAU;AAChD;AAEA,SAAS,UAAU,OAA0C;AAC3D,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,gBAAgB,OAAmD;AAC1E,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAClF;AAEO,SAAS,qBACd,cACwB;AACxB,QAAM,cAAc,UAAU,aAAa,IAAI,eAAe,CAAC;AAC/D,QAAM,UAAU,UAAU,aAAa,IAAI,SAAS,CAAC;AAErD,MAAI,aAAa;AACf,WAAO,UACH,EAAE,MAAM,aAAa,IAAI,aAAa,cAAc,KAAK,IACzD,EAAE,MAAM,aAAa,IAAI,YAAY;AAAA,EAC3C;AACA,MAAI,QAAS,QAAO,EAAE,MAAM,SAAS,IAAI,QAAQ;AACjD,SAAO,EAAE,MAAM,OAAO;AACxB;AAEO,SAAS,mBAAmB,QAA2D;AAC5F,SAAO;AAAA,IACL,OAAO,UAAU,OAAO,KAAK;AAAA,IAC7B,WAAW,UAAU,OAAO,SAAS;AAAA,IACrC,cAAc,UAAU,OAAO,YAAY;AAAA,IAC3C,WAAW,UAAU,OAAO,SAAS;AAAA,IACrC,SAAS,UAAU,OAAO,OAAO;AAAA,IACjC,YAAY,gBAAgB,OAAO,UAAU;AAAA,IAC7C,mBAAmB,UAAU,OAAO,iBAAiB;AAAA,IACrD,uBAAuB,gBAAgB,OAAO,qBAAqB;AAAA,IACnE,OAAO,UAAU,OAAO,KAAK;AAAA,EAC/B;AACF;AAEO,SAAS,yBACd,UACe;AACf,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,QAAQ,UAAW;AACxB,UAAM,YAAY,QAAQ,UAAU,KAAK;AACzC,QAAI,UAAW,aAAY,IAAI,SAAS;AAAA,EAC1C;AACA,SAAO,YAAY,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC,IAAI;AAC/D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Migration } from "@mikro-orm/migrations";
|
|
2
|
+
class Migration20260706102002_eudr extends Migration {
|
|
3
|
+
up() {
|
|
4
|
+
this.addSql(`create table "eudr_due_diligence_statements" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "title" text not null, "commodity" text not null, "reference_number" text null, "verification_number" text null, "status" text not null default 'draft', "quantity_kg" numeric(14,3) null, "order_id" uuid null, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
|
|
5
|
+
this.addSql(`create table "eudr_evidence_submissions" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "supplier_entity_id" uuid not null, "supplier_snapshot" jsonb null, "commodity" text not null, "product_mapping_id" uuid null, "statement_id" uuid null, "origin_country" text null, "geolocation" jsonb null, "quantity_kg" numeric(14,3) null, "batch_number" text null, "harvest_from" timestamptz null, "harvest_to" timestamptz null, "producer_name" text null, "attachment_ids" jsonb not null default '[]', "status" text not null default 'draft', "completeness_score" int not null default 0, "missing_fields" jsonb not null default '[]', "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
|
|
6
|
+
this.addSql(`create index "idx_eudr_submissions_supplier" on "eudr_evidence_submissions" ("supplier_entity_id");`);
|
|
7
|
+
this.addSql(`create index "idx_eudr_submissions_statement" on "eudr_evidence_submissions" ("statement_id");`);
|
|
8
|
+
this.addSql(`create table "eudr_product_mappings" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "product_id" uuid not null, "product_snapshot" jsonb null, "commodity" text not null, "hs_code" text null, "is_in_scope" boolean not null default true, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
|
|
9
|
+
this.addSql(`create unique index "idx_eudr_mappings_org_product_commodity_unique" on "eudr_product_mappings" ("organization_id", "product_id", "commodity") where deleted_at is null;`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
Migration20260706102002_eudr
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=Migration20260706102002_eudr.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/migrations/Migration20260706102002_eudr.ts"],
|
|
4
|
+
"sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260706102002_eudr extends Migration {\n\n override up(): void | Promise<void> {\n this.addSql(`create table \"eudr_due_diligence_statements\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"title\" text not null, \"commodity\" text not null, \"reference_number\" text null, \"verification_number\" text null, \"status\" text not null default 'draft', \"quantity_kg\" numeric(14,3) null, \"order_id\" uuid null, \"notes\" text null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, primary key (\"id\"));`);\n\n this.addSql(`create table \"eudr_evidence_submissions\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"supplier_entity_id\" uuid not null, \"supplier_snapshot\" jsonb null, \"commodity\" text not null, \"product_mapping_id\" uuid null, \"statement_id\" uuid null, \"origin_country\" text null, \"geolocation\" jsonb null, \"quantity_kg\" numeric(14,3) null, \"batch_number\" text null, \"harvest_from\" timestamptz null, \"harvest_to\" timestamptz null, \"producer_name\" text null, \"attachment_ids\" jsonb not null default '[]', \"status\" text not null default 'draft', \"completeness_score\" int not null default 0, \"missing_fields\" jsonb not null default '[]', \"notes\" text null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, primary key (\"id\"));`);\n this.addSql(`create index \"idx_eudr_submissions_supplier\" on \"eudr_evidence_submissions\" (\"supplier_entity_id\");`);\n this.addSql(`create index \"idx_eudr_submissions_statement\" on \"eudr_evidence_submissions\" (\"statement_id\");`);\n\n this.addSql(`create table \"eudr_product_mappings\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"product_id\" uuid not null, \"product_snapshot\" jsonb null, \"commodity\" text not null, \"hs_code\" text null, \"is_in_scope\" boolean not null default true, \"notes\" text null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, primary key (\"id\"));`);\n this.addSql(`create unique index \"idx_eudr_mappings_org_product_commodity_unique\" on \"eudr_product_mappings\" (\"organization_id\", \"product_id\", \"commodity\") where deleted_at is null;`);\n }\n\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,qCAAqC,UAAU;AAAA,EAEjD,KAA2B;AAClC,SAAK,OAAO,ufAAuf;AAEngB,SAAK,OAAO,yzBAAyzB;AACr0B,SAAK,OAAO,qGAAqG;AACjH,SAAK,OAAO,gGAAgG;AAE5G,SAAK,OAAO,sbAAsb;AAClc,SAAK,OAAO,0KAA0K;AAAA,EACxL;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Migration } from "@mikro-orm/migrations";
|
|
2
|
+
class Migration20260706152612_eudr extends Migration {
|
|
3
|
+
up() {
|
|
4
|
+
this.addSql(`create table "eudr_mitigation_actions" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "risk_assessment_id" uuid not null, "action_type" text not null default 'other', "title" text not null, "description" text null, "status" text not null default 'planned', "due_date" timestamptz null, "completed_at" timestamptz null, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
|
|
5
|
+
this.addSql(`create index "idx_eudr_mitigation_actions_risk_assessment" on "eudr_mitigation_actions" ("risk_assessment_id");`);
|
|
6
|
+
this.addSql(`create table "eudr_plots" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "supplier_entity_id" uuid not null, "supplier_snapshot" jsonb null, "name" text not null, "external_id" text null, "description" text null, "origin_country" text not null, "plot_type" text not null default 'point', "geometry" jsonb not null, "area_ha" numeric(12,4) null, "validation_warnings" jsonb not null default '[]', "producer_name" text null, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
|
|
7
|
+
this.addSql(`create index "idx_eudr_plots_supplier" on "eudr_plots" ("supplier_entity_id");`);
|
|
8
|
+
this.addSql(`create table "eudr_risk_assessments" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "statement_id" uuid not null, "country_risks" jsonb not null default '[]', "overall_tier" text not null default 'unknown', "criteria" jsonb not null default '{}', "conclusion" text not null default 'non_negligible', "is_simplified" boolean not null default false, "assessed_at" timestamptz not null, "assessed_by_name" text null, "review_due_at" timestamptz null, "notes" text null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, primary key ("id"));`);
|
|
9
|
+
this.addSql(`create index "idx_eudr_risk_assessments_statement" on "eudr_risk_assessments" ("statement_id");`);
|
|
10
|
+
this.addSql(`alter table "eudr_due_diligence_statements" add "activity_type" text null, add "actor_role" text null, add "referenced_statements" jsonb not null default '[]', add "supplementary_unit" text null, add "supplementary_quantity" numeric(14,3) null, add "submitted_at" timestamptz null, add "reference_issued_at" timestamptz null, add "order_snapshot" jsonb null;`);
|
|
11
|
+
this.addSql(`alter table "eudr_evidence_submissions" add "plot_ids" jsonb not null default '[]';`);
|
|
12
|
+
}
|
|
13
|
+
down() {
|
|
14
|
+
this.addSql(`alter table "eudr_due_diligence_statements" drop column "activity_type", drop column "actor_role", drop column "referenced_statements", drop column "supplementary_unit", drop column "supplementary_quantity", drop column "submitted_at", drop column "reference_issued_at", drop column "order_snapshot";`);
|
|
15
|
+
this.addSql(`alter table "eudr_evidence_submissions" drop column "plot_ids";`);
|
|
16
|
+
this.addSql(`drop table if exists "eudr_mitigation_actions" cascade;`);
|
|
17
|
+
this.addSql(`drop table if exists "eudr_risk_assessments" cascade;`);
|
|
18
|
+
this.addSql(`drop table if exists "eudr_plots" cascade;`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
Migration20260706152612_eudr
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=Migration20260706152612_eudr.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/migrations/Migration20260706152612_eudr.ts"],
|
|
4
|
+
"sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260706152612_eudr extends Migration {\n\n override up(): void | Promise<void> {\n this.addSql(`create table \"eudr_mitigation_actions\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"risk_assessment_id\" uuid not null, \"action_type\" text not null default 'other', \"title\" text not null, \"description\" text null, \"status\" text not null default 'planned', \"due_date\" timestamptz null, \"completed_at\" timestamptz null, \"notes\" text null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, primary key (\"id\"));`);\n this.addSql(`create index \"idx_eudr_mitigation_actions_risk_assessment\" on \"eudr_mitigation_actions\" (\"risk_assessment_id\");`);\n\n this.addSql(`create table \"eudr_plots\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"supplier_entity_id\" uuid not null, \"supplier_snapshot\" jsonb null, \"name\" text not null, \"external_id\" text null, \"description\" text null, \"origin_country\" text not null, \"plot_type\" text not null default 'point', \"geometry\" jsonb not null, \"area_ha\" numeric(12,4) null, \"validation_warnings\" jsonb not null default '[]', \"producer_name\" text null, \"is_active\" boolean not null default true, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, primary key (\"id\"));`);\n this.addSql(`create index \"idx_eudr_plots_supplier\" on \"eudr_plots\" (\"supplier_entity_id\");`);\n\n this.addSql(`create table \"eudr_risk_assessments\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"statement_id\" uuid not null, \"country_risks\" jsonb not null default '[]', \"overall_tier\" text not null default 'unknown', \"criteria\" jsonb not null default '{}', \"conclusion\" text not null default 'non_negligible', \"is_simplified\" boolean not null default false, \"assessed_at\" timestamptz not null, \"assessed_by_name\" text null, \"review_due_at\" timestamptz null, \"notes\" text null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, primary key (\"id\"));`);\n this.addSql(`create index \"idx_eudr_risk_assessments_statement\" on \"eudr_risk_assessments\" (\"statement_id\");`);\n\n this.addSql(`alter table \"eudr_due_diligence_statements\" add \"activity_type\" text null, add \"actor_role\" text null, add \"referenced_statements\" jsonb not null default '[]', add \"supplementary_unit\" text null, add \"supplementary_quantity\" numeric(14,3) null, add \"submitted_at\" timestamptz null, add \"reference_issued_at\" timestamptz null, add \"order_snapshot\" jsonb null;`);\n\n this.addSql(`alter table \"eudr_evidence_submissions\" add \"plot_ids\" jsonb not null default '[]';`);\n }\n\n override down(): void | Promise<void> {\n this.addSql(`alter table \"eudr_due_diligence_statements\" drop column \"activity_type\", drop column \"actor_role\", drop column \"referenced_statements\", drop column \"supplementary_unit\", drop column \"supplementary_quantity\", drop column \"submitted_at\", drop column \"reference_issued_at\", drop column \"order_snapshot\";`);\n\n this.addSql(`alter table \"eudr_evidence_submissions\" drop column \"plot_ids\";`);\n\n this.addSql(`drop table if exists \"eudr_mitigation_actions\" cascade;`);\n this.addSql(`drop table if exists \"eudr_risk_assessments\" cascade;`);\n this.addSql(`drop table if exists \"eudr_plots\" cascade;`);\n }\n\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,qCAAqC,UAAU;AAAA,EAEjD,KAA2B;AAClC,SAAK,OAAO,ygBAAygB;AACrhB,SAAK,OAAO,iHAAiH;AAE7H,SAAK,OAAO,yoBAAyoB;AACrpB,SAAK,OAAO,gFAAgF;AAE5F,SAAK,OAAO,0oBAA0oB;AACtpB,SAAK,OAAO,iGAAiG;AAE7G,SAAK,OAAO,wWAAwW;AAEpX,SAAK,OAAO,qFAAqF;AAAA,EACnG;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,8SAA8S;AAE1T,SAAK,OAAO,iEAAiE;AAE7E,SAAK,OAAO,yDAAyD;AACrE,SAAK,OAAO,uDAAuD;AACnE,SAAK,OAAO,4CAA4C;AAAA,EAC1D;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Migration } from "@mikro-orm/migrations";
|
|
2
|
+
class Migration20260722100000_eudr extends Migration {
|
|
3
|
+
up() {
|
|
4
|
+
this.addSql(`alter table "eudr_product_mappings" add column "species_scientific_name" text null, add column "species_common_name" text null;`);
|
|
5
|
+
this.addSql(`create index "eudr_dds_tenant_org_submitted_idx" on "eudr_due_diligence_statements" ("tenant_id", "organization_id", "submitted_at") where "deleted_at" is null;`);
|
|
6
|
+
}
|
|
7
|
+
down() {
|
|
8
|
+
this.addSql(`drop index "eudr_dds_tenant_org_submitted_idx";`);
|
|
9
|
+
this.addSql(`alter table "eudr_product_mappings" drop column "species_scientific_name", drop column "species_common_name";`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
Migration20260722100000_eudr
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=Migration20260722100000_eudr.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/migrations/Migration20260722100000_eudr.ts"],
|
|
4
|
+
"sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260722100000_eudr extends Migration {\n\n override up(): void | Promise<void> {\n this.addSql(`alter table \"eudr_product_mappings\" add column \"species_scientific_name\" text null, add column \"species_common_name\" text null;`);\n\n this.addSql(`create index \"eudr_dds_tenant_org_submitted_idx\" on \"eudr_due_diligence_statements\" (\"tenant_id\", \"organization_id\", \"submitted_at\") where \"deleted_at\" is null;`);\n }\n\n override down(): void | Promise<void> {\n this.addSql(`drop index \"eudr_dds_tenant_org_submitted_idx\";`);\n\n this.addSql(`alter table \"eudr_product_mappings\" drop column \"species_scientific_name\", drop column \"species_common_name\";`);\n }\n\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,qCAAqC,UAAU;AAAA,EAEjD,KAA2B;AAClC,SAAK,OAAO,iIAAiI;AAE7I,SAAK,OAAO,kKAAkK;AAAA,EAChL;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,iDAAiD;AAE7D,SAAK,OAAO,+GAA+G;AAAA,EAC7H;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const notificationTypes = [
|
|
2
|
+
{
|
|
3
|
+
type: "eudr.statement.submitted",
|
|
4
|
+
module: "eudr",
|
|
5
|
+
titleKey: "eudr.notifications.statement.submitted.title",
|
|
6
|
+
bodyKey: "eudr.notifications.statement.submitted.body",
|
|
7
|
+
icon: "file-check",
|
|
8
|
+
severity: "info",
|
|
9
|
+
actions: [],
|
|
10
|
+
expiresAfterHours: 168
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
type: "eudr.statement.reference_issued",
|
|
14
|
+
module: "eudr",
|
|
15
|
+
titleKey: "eudr.notifications.statement.referenceIssued.title",
|
|
16
|
+
bodyKey: "eudr.notifications.statement.referenceIssued.body",
|
|
17
|
+
icon: "badge-check",
|
|
18
|
+
severity: "success",
|
|
19
|
+
actions: [],
|
|
20
|
+
expiresAfterHours: 720
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
type: "eudr.statement.withdrawn",
|
|
24
|
+
module: "eudr",
|
|
25
|
+
titleKey: "eudr.notifications.statement.withdrawn.title",
|
|
26
|
+
bodyKey: "eudr.notifications.statement.withdrawn.body",
|
|
27
|
+
icon: "undo",
|
|
28
|
+
severity: "warning",
|
|
29
|
+
actions: [],
|
|
30
|
+
expiresAfterHours: 168
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
type: "eudr.risk.non_negligible",
|
|
34
|
+
module: "eudr",
|
|
35
|
+
titleKey: "eudr.notifications.risk.nonNegligible.title",
|
|
36
|
+
bodyKey: "eudr.notifications.risk.nonNegligible.body",
|
|
37
|
+
icon: "alert-triangle",
|
|
38
|
+
severity: "warning",
|
|
39
|
+
actions: [],
|
|
40
|
+
expiresAfterHours: 168
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: "eudr.mitigation.completed",
|
|
44
|
+
module: "eudr",
|
|
45
|
+
titleKey: "eudr.notifications.mitigation.completed.title",
|
|
46
|
+
bodyKey: "eudr.notifications.mitigation.completed.body",
|
|
47
|
+
icon: "check-circle",
|
|
48
|
+
severity: "success",
|
|
49
|
+
actions: [],
|
|
50
|
+
expiresAfterHours: 168
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
var notifications_default = notificationTypes;
|
|
54
|
+
export {
|
|
55
|
+
notifications_default as default,
|
|
56
|
+
notificationTypes
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/modules/eudr/notifications.ts"],
|
|
4
|
+
"sourcesContent": ["import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'\n\nexport const notificationTypes: NotificationTypeDefinition[] = [\n {\n type: 'eudr.statement.submitted',\n module: 'eudr',\n titleKey: 'eudr.notifications.statement.submitted.title',\n bodyKey: 'eudr.notifications.statement.submitted.body',\n icon: 'file-check',\n severity: 'info',\n actions: [],\n expiresAfterHours: 168,\n },\n {\n type: 'eudr.statement.reference_issued',\n module: 'eudr',\n titleKey: 'eudr.notifications.statement.referenceIssued.title',\n bodyKey: 'eudr.notifications.statement.referenceIssued.body',\n icon: 'badge-check',\n severity: 'success',\n actions: [],\n expiresAfterHours: 720,\n },\n {\n type: 'eudr.statement.withdrawn',\n module: 'eudr',\n titleKey: 'eudr.notifications.statement.withdrawn.title',\n bodyKey: 'eudr.notifications.statement.withdrawn.body',\n icon: 'undo',\n severity: 'warning',\n actions: [],\n expiresAfterHours: 168,\n },\n {\n type: 'eudr.risk.non_negligible',\n module: 'eudr',\n titleKey: 'eudr.notifications.risk.nonNegligible.title',\n bodyKey: 'eudr.notifications.risk.nonNegligible.body',\n icon: 'alert-triangle',\n severity: 'warning',\n actions: [],\n expiresAfterHours: 168,\n },\n {\n type: 'eudr.mitigation.completed',\n module: 'eudr',\n titleKey: 'eudr.notifications.mitigation.completed.title',\n bodyKey: 'eudr.notifications.mitigation.completed.body',\n icon: 'check-circle',\n severity: 'success',\n actions: [],\n expiresAfterHours: 168,\n },\n]\n\nexport default notificationTypes\n"],
|
|
5
|
+
"mappings": "AAEO,MAAM,oBAAkD;AAAA,EAC7D;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,mBAAmB;AAAA,EACrB;AACF;AAEA,IAAO,wBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
2
|
+
const EUDR_STATEMENTS_URL = "/backend/eudr/statements";
|
|
3
|
+
const EUDR_PLOTS_URL = "/backend/eudr/plots";
|
|
4
|
+
const EUDR_EVIDENCE_SUBMISSIONS_URL = "/backend/eudr/evidence-submissions";
|
|
5
|
+
function assertTenantContext(ctx) {
|
|
6
|
+
if (typeof ctx.tenantId !== "string" || ctx.tenantId.length === 0) {
|
|
7
|
+
throw new Error("[internal] [search.eudr] Missing tenantId in search build context");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function normalizeText(value) {
|
|
11
|
+
if (value === null || value === void 0) return null;
|
|
12
|
+
if (typeof value === "string") {
|
|
13
|
+
const trimmed = value.trim();
|
|
14
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
15
|
+
}
|
|
16
|
+
if (value instanceof Date) return value.toISOString();
|
|
17
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
function readRecordText(record, ...keys) {
|
|
21
|
+
for (const key of keys) {
|
|
22
|
+
const text = normalizeText(record[key]);
|
|
23
|
+
if (text) return text;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
function readObjectText(source, ...keys) {
|
|
28
|
+
if (!source || typeof source !== "object") return null;
|
|
29
|
+
return readRecordText(source, ...keys);
|
|
30
|
+
}
|
|
31
|
+
function formatSubtitle(...parts) {
|
|
32
|
+
const text = parts.map((part) => normalizeText(part)).filter((value) => Boolean(value));
|
|
33
|
+
if (!text.length) return void 0;
|
|
34
|
+
return text.join(" \xB7 ");
|
|
35
|
+
}
|
|
36
|
+
function appendLine(lines, label, value) {
|
|
37
|
+
const text = normalizeText(value);
|
|
38
|
+
if (!text) return;
|
|
39
|
+
lines.push(`${label}: ${text}`);
|
|
40
|
+
}
|
|
41
|
+
function friendlyLabel(input) {
|
|
42
|
+
return input.replace(/^cf:/, "").replace(/_/g, " ").replace(/([a-z])([A-Z])/g, (_match, firstChar, secondChar) => `${firstChar} ${secondChar}`).replace(/\b\w/g, (character) => character.toUpperCase());
|
|
43
|
+
}
|
|
44
|
+
function appendCustomFieldLines(lines, customFields) {
|
|
45
|
+
for (const [key, value] of Object.entries(customFields)) {
|
|
46
|
+
if (value === null || value === void 0) continue;
|
|
47
|
+
appendLine(lines, friendlyLabel(key), value);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function buildIndexSource(ctx, presenter, lines) {
|
|
51
|
+
appendCustomFieldLines(lines, ctx.customFields);
|
|
52
|
+
if (!lines.length) return null;
|
|
53
|
+
return {
|
|
54
|
+
text: lines,
|
|
55
|
+
presenter,
|
|
56
|
+
checksumSource: { record: ctx.record, customFields: ctx.customFields }
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function buildRecordUrl(baseUrl, record) {
|
|
60
|
+
const recordId = readRecordText(record, "id");
|
|
61
|
+
return recordId ? `${baseUrl}/${encodeURIComponent(recordId)}` : null;
|
|
62
|
+
}
|
|
63
|
+
function translateToken(translate, prefix, value) {
|
|
64
|
+
if (!value) return null;
|
|
65
|
+
return translate(`${prefix}.${value}`, value);
|
|
66
|
+
}
|
|
67
|
+
function resolveSupplierName(record) {
|
|
68
|
+
const snapshot = record.supplier_snapshot ?? record.supplierSnapshot;
|
|
69
|
+
return readObjectText(snapshot, "display_name", "displayName", "name");
|
|
70
|
+
}
|
|
71
|
+
function buildStatementPresenter(translate, record) {
|
|
72
|
+
const label = translate("eudr.search.badge.statement", "DDS statement");
|
|
73
|
+
const title = readRecordText(record, "title") ?? translate("eudr.common.recordUnavailable");
|
|
74
|
+
const subtitle = formatSubtitle(
|
|
75
|
+
readRecordText(record, "reference_number", "referenceNumber"),
|
|
76
|
+
translateToken(translate, "eudr.commodity", readRecordText(record, "commodity"))
|
|
77
|
+
);
|
|
78
|
+
return { title, subtitle, icon: "file-check", badge: label };
|
|
79
|
+
}
|
|
80
|
+
function buildPlotPresenter(translate, record) {
|
|
81
|
+
const label = translate("eudr.search.badge.plot", "Plot");
|
|
82
|
+
const title = readRecordText(record, "name") ?? translate("eudr.common.recordUnavailable");
|
|
83
|
+
const subtitle = formatSubtitle(
|
|
84
|
+
readRecordText(record, "origin_country", "originCountry"),
|
|
85
|
+
translateToken(translate, "eudr.plotType", readRecordText(record, "plot_type", "plotType"))
|
|
86
|
+
);
|
|
87
|
+
return { title, subtitle, icon: "map-pin", badge: label };
|
|
88
|
+
}
|
|
89
|
+
function buildSubmissionPresenter(translate, record) {
|
|
90
|
+
const label = translate("eudr.search.badge.submission", "Evidence submission");
|
|
91
|
+
const batchNumber = readRecordText(record, "batch_number", "batchNumber");
|
|
92
|
+
const supplierName = resolveSupplierName(record);
|
|
93
|
+
const title = batchNumber ? `${label} ${batchNumber}` : supplierName ?? translate("eudr.common.recordUnavailable");
|
|
94
|
+
const subtitle = formatSubtitle(
|
|
95
|
+
supplierName,
|
|
96
|
+
translateToken(translate, "eudr.submissionStatus", readRecordText(record, "status"))
|
|
97
|
+
);
|
|
98
|
+
return { title, subtitle, icon: "package", badge: label };
|
|
99
|
+
}
|
|
100
|
+
const searchConfig = {
|
|
101
|
+
entities: [
|
|
102
|
+
{
|
|
103
|
+
entityId: "eudr:eudr_due_diligence_statement",
|
|
104
|
+
enabled: true,
|
|
105
|
+
priority: 8,
|
|
106
|
+
fieldPolicy: {
|
|
107
|
+
searchable: ["title", "reference_number", "commodity"],
|
|
108
|
+
excluded: ["notes"]
|
|
109
|
+
},
|
|
110
|
+
buildSource: async (ctx) => {
|
|
111
|
+
assertTenantContext(ctx);
|
|
112
|
+
const { t: translate } = await resolveTranslations();
|
|
113
|
+
const record = ctx.record;
|
|
114
|
+
const lines = [];
|
|
115
|
+
appendLine(lines, "Title", record.title);
|
|
116
|
+
appendLine(lines, "Reference number", record.reference_number ?? record.referenceNumber);
|
|
117
|
+
appendLine(lines, "Commodity", record.commodity);
|
|
118
|
+
return buildIndexSource(ctx, buildStatementPresenter(translate, record), lines);
|
|
119
|
+
},
|
|
120
|
+
formatResult: async (ctx) => {
|
|
121
|
+
const { t: translate } = await resolveTranslations();
|
|
122
|
+
return buildStatementPresenter(translate, ctx.record);
|
|
123
|
+
},
|
|
124
|
+
resolveUrl: async (ctx) => buildRecordUrl(EUDR_STATEMENTS_URL, ctx.record),
|
|
125
|
+
aclFeatures: ["eudr.statements.view"]
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
entityId: "eudr:eudr_plot",
|
|
129
|
+
enabled: true,
|
|
130
|
+
priority: 7,
|
|
131
|
+
fieldPolicy: {
|
|
132
|
+
searchable: ["name", "external_id", "origin_country"],
|
|
133
|
+
excluded: ["producer_name"]
|
|
134
|
+
},
|
|
135
|
+
buildSource: async (ctx) => {
|
|
136
|
+
assertTenantContext(ctx);
|
|
137
|
+
const { t: translate } = await resolveTranslations();
|
|
138
|
+
const record = ctx.record;
|
|
139
|
+
const lines = [];
|
|
140
|
+
appendLine(lines, "Name", record.name);
|
|
141
|
+
appendLine(lines, "External ID", record.external_id ?? record.externalId);
|
|
142
|
+
appendLine(lines, "Origin country", record.origin_country ?? record.originCountry);
|
|
143
|
+
return buildIndexSource(ctx, buildPlotPresenter(translate, record), lines);
|
|
144
|
+
},
|
|
145
|
+
formatResult: async (ctx) => {
|
|
146
|
+
const { t: translate } = await resolveTranslations();
|
|
147
|
+
return buildPlotPresenter(translate, ctx.record);
|
|
148
|
+
},
|
|
149
|
+
resolveUrl: async (ctx) => buildRecordUrl(EUDR_PLOTS_URL, ctx.record),
|
|
150
|
+
aclFeatures: ["eudr.plots.view"]
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
entityId: "eudr:eudr_evidence_submission",
|
|
154
|
+
enabled: true,
|
|
155
|
+
priority: 6,
|
|
156
|
+
fieldPolicy: {
|
|
157
|
+
searchable: ["batch_number", "commodity"],
|
|
158
|
+
excluded: ["producer_name", "notes"]
|
|
159
|
+
},
|
|
160
|
+
buildSource: async (ctx) => {
|
|
161
|
+
assertTenantContext(ctx);
|
|
162
|
+
const { t: translate } = await resolveTranslations();
|
|
163
|
+
const record = ctx.record;
|
|
164
|
+
const lines = [];
|
|
165
|
+
appendLine(lines, "Batch number", record.batch_number ?? record.batchNumber);
|
|
166
|
+
appendLine(lines, "Commodity", record.commodity);
|
|
167
|
+
appendLine(lines, "Supplier", resolveSupplierName(record));
|
|
168
|
+
return buildIndexSource(ctx, buildSubmissionPresenter(translate, record), lines);
|
|
169
|
+
},
|
|
170
|
+
formatResult: async (ctx) => {
|
|
171
|
+
const { t: translate } = await resolveTranslations();
|
|
172
|
+
return buildSubmissionPresenter(translate, ctx.record);
|
|
173
|
+
},
|
|
174
|
+
resolveUrl: async (ctx) => buildRecordUrl(EUDR_EVIDENCE_SUBMISSIONS_URL, ctx.record),
|
|
175
|
+
aclFeatures: ["eudr.submissions.view"]
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
};
|
|
179
|
+
var search_default = searchConfig;
|
|
180
|
+
const config = searchConfig;
|
|
181
|
+
export {
|
|
182
|
+
config,
|
|
183
|
+
search_default as default,
|
|
184
|
+
searchConfig
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/modules/eudr/search.ts"],
|
|
4
|
+
"sourcesContent": ["import type { SearchBuildContext, SearchIndexSource, SearchModuleConfig, SearchResultPresenter } from '@open-mercato/shared/modules/search'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\n\nconst EUDR_STATEMENTS_URL = '/backend/eudr/statements'\nconst EUDR_PLOTS_URL = '/backend/eudr/plots'\nconst EUDR_EVIDENCE_SUBMISSIONS_URL = '/backend/eudr/evidence-submissions'\n\nfunction assertTenantContext(ctx: SearchBuildContext): void {\n if (typeof ctx.tenantId !== 'string' || ctx.tenantId.length === 0) {\n throw new Error('[internal] [search.eudr] Missing tenantId in search build context')\n }\n}\n\nfunction normalizeText(value: unknown): string | null {\n if (value === null || value === undefined) return null\n if (typeof value === 'string') {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n if (value instanceof Date) return value.toISOString()\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n return null\n}\n\nfunction readRecordText(record: Record<string, unknown>, ...keys: string[]): string | null {\n for (const key of keys) {\n const text = normalizeText(record[key])\n if (text) return text\n }\n return null\n}\n\nfunction readObjectText(source: unknown, ...keys: string[]): string | null {\n if (!source || typeof source !== 'object') return null\n return readRecordText(source as Record<string, unknown>, ...keys)\n}\n\nfunction formatSubtitle(...parts: Array<unknown>): string | undefined {\n const text = parts\n .map((part) => normalizeText(part))\n .filter((value): value is string => Boolean(value))\n if (!text.length) return undefined\n return text.join(' \u00B7 ')\n}\n\nfunction appendLine(lines: string[], label: string, value: unknown) {\n const text = normalizeText(value)\n if (!text) return\n lines.push(`${label}: ${text}`)\n}\n\nfunction friendlyLabel(input: string): string {\n return input\n .replace(/^cf:/, '')\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, (_match, firstChar, secondChar) => `${firstChar} ${secondChar}`)\n .replace(/\\b\\w/g, (character) => character.toUpperCase())\n}\n\nfunction appendCustomFieldLines(lines: string[], customFields: Record<string, unknown>) {\n for (const [key, value] of Object.entries(customFields)) {\n if (value === null || value === undefined) continue\n appendLine(lines, friendlyLabel(key), value)\n }\n}\n\nfunction buildIndexSource(\n ctx: SearchBuildContext,\n presenter: SearchResultPresenter,\n lines: string[],\n): SearchIndexSource | null {\n appendCustomFieldLines(lines, ctx.customFields)\n if (!lines.length) return null\n return {\n text: lines,\n presenter,\n checksumSource: { record: ctx.record, customFields: ctx.customFields },\n }\n}\n\nfunction buildRecordUrl(baseUrl: string, record: Record<string, unknown>): string | null {\n const recordId = readRecordText(record, 'id')\n return recordId ? `${baseUrl}/${encodeURIComponent(recordId)}` : null\n}\n\nfunction translateToken(translate: TranslateFn, prefix: string, value: string | null): string | null {\n if (!value) return null\n return translate(`${prefix}.${value}`, value)\n}\n\nfunction resolveSupplierName(record: Record<string, unknown>): string | null {\n const snapshot = record.supplier_snapshot ?? record.supplierSnapshot\n return readObjectText(snapshot, 'display_name', 'displayName', 'name')\n}\n\nfunction buildStatementPresenter(translate: TranslateFn, record: Record<string, unknown>): SearchResultPresenter {\n const label = translate('eudr.search.badge.statement', 'DDS statement')\n const title = readRecordText(record, 'title') ?? translate('eudr.common.recordUnavailable')\n const subtitle = formatSubtitle(\n readRecordText(record, 'reference_number', 'referenceNumber'),\n translateToken(translate, 'eudr.commodity', readRecordText(record, 'commodity')),\n )\n return { title, subtitle, icon: 'file-check', badge: label }\n}\n\nfunction buildPlotPresenter(translate: TranslateFn, record: Record<string, unknown>): SearchResultPresenter {\n const label = translate('eudr.search.badge.plot', 'Plot')\n const title = readRecordText(record, 'name') ?? translate('eudr.common.recordUnavailable')\n const subtitle = formatSubtitle(\n readRecordText(record, 'origin_country', 'originCountry'),\n translateToken(translate, 'eudr.plotType', readRecordText(record, 'plot_type', 'plotType')),\n )\n return { title, subtitle, icon: 'map-pin', badge: label }\n}\n\nfunction buildSubmissionPresenter(translate: TranslateFn, record: Record<string, unknown>): SearchResultPresenter {\n const label = translate('eudr.search.badge.submission', 'Evidence submission')\n const batchNumber = readRecordText(record, 'batch_number', 'batchNumber')\n const supplierName = resolveSupplierName(record)\n const title = batchNumber\n ? `${label} ${batchNumber}`\n : supplierName ?? translate('eudr.common.recordUnavailable')\n const subtitle = formatSubtitle(\n supplierName,\n translateToken(translate, 'eudr.submissionStatus', readRecordText(record, 'status')),\n )\n return { title, subtitle, icon: 'package', badge: label }\n}\n\nexport const searchConfig: SearchModuleConfig = {\n entities: [\n {\n entityId: 'eudr:eudr_due_diligence_statement',\n enabled: true,\n priority: 8,\n fieldPolicy: {\n searchable: ['title', 'reference_number', 'commodity'],\n excluded: ['notes'],\n },\n buildSource: async (ctx) => {\n assertTenantContext(ctx)\n const { t: translate } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Title', record.title)\n appendLine(lines, 'Reference number', record.reference_number ?? record.referenceNumber)\n appendLine(lines, 'Commodity', record.commodity)\n return buildIndexSource(ctx, buildStatementPresenter(translate, record), lines)\n },\n formatResult: async (ctx) => {\n const { t: translate } = await resolveTranslations()\n return buildStatementPresenter(translate, ctx.record)\n },\n resolveUrl: async (ctx) => buildRecordUrl(EUDR_STATEMENTS_URL, ctx.record),\n aclFeatures: ['eudr.statements.view'],\n },\n {\n entityId: 'eudr:eudr_plot',\n enabled: true,\n priority: 7,\n fieldPolicy: {\n searchable: ['name', 'external_id', 'origin_country'],\n excluded: ['producer_name'],\n },\n buildSource: async (ctx) => {\n assertTenantContext(ctx)\n const { t: translate } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Name', record.name)\n appendLine(lines, 'External ID', record.external_id ?? record.externalId)\n appendLine(lines, 'Origin country', record.origin_country ?? record.originCountry)\n return buildIndexSource(ctx, buildPlotPresenter(translate, record), lines)\n },\n formatResult: async (ctx) => {\n const { t: translate } = await resolveTranslations()\n return buildPlotPresenter(translate, ctx.record)\n },\n resolveUrl: async (ctx) => buildRecordUrl(EUDR_PLOTS_URL, ctx.record),\n aclFeatures: ['eudr.plots.view'],\n },\n {\n entityId: 'eudr:eudr_evidence_submission',\n enabled: true,\n priority: 6,\n fieldPolicy: {\n searchable: ['batch_number', 'commodity'],\n excluded: ['producer_name', 'notes'],\n },\n buildSource: async (ctx) => {\n assertTenantContext(ctx)\n const { t: translate } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Batch number', record.batch_number ?? record.batchNumber)\n appendLine(lines, 'Commodity', record.commodity)\n appendLine(lines, 'Supplier', resolveSupplierName(record))\n return buildIndexSource(ctx, buildSubmissionPresenter(translate, record), lines)\n },\n formatResult: async (ctx) => {\n const { t: translate } = await resolveTranslations()\n return buildSubmissionPresenter(translate, ctx.record)\n },\n resolveUrl: async (ctx) => buildRecordUrl(EUDR_EVIDENCE_SUBMISSIONS_URL, ctx.record),\n aclFeatures: ['eudr.submissions.view'],\n },\n ],\n}\n\nexport default searchConfig\nexport const config = searchConfig\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const setup = {
|
|
2
|
+
defaultRoleFeatures: {
|
|
3
|
+
admin: ["eudr.*"],
|
|
4
|
+
employee: ["eudr.mappings.view", "eudr.submissions.view", "eudr.statements.view", "eudr.plots.view", "eudr.risk.view"]
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
var setup_default = setup;
|
|
8
|
+
export {
|
|
9
|
+
setup_default as default,
|
|
10
|
+
setup
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/modules/eudr/setup.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'\n\nexport const setup: ModuleSetupConfig = {\n defaultRoleFeatures: {\n admin: ['eudr.*'],\n employee: ['eudr.mappings.view', 'eudr.submissions.view', 'eudr.statements.view', 'eudr.plots.view', 'eudr.risk.view'],\n },\n}\n\nexport default setup\n"],
|
|
5
|
+
"mappings": "AAEO,MAAM,QAA2B;AAAA,EACtC,qBAAqB;AAAA,IACnB,OAAO,CAAC,QAAQ;AAAA,IAChB,UAAU,CAAC,sBAAsB,yBAAyB,wBAAwB,mBAAmB,gBAAgB;AAAA,EACvH;AACF;AAEA,IAAO,gBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
2
|
+
import {
|
|
3
|
+
deliverEudrNotification
|
|
4
|
+
} from "../lib/notifications.js";
|
|
5
|
+
const logger = createLogger("eudr").child({ component: "notify-mitigation-completed" });
|
|
6
|
+
const metadata = {
|
|
7
|
+
event: "eudr.mitigation_action.completed",
|
|
8
|
+
persistent: true,
|
|
9
|
+
id: "eudr:notify-mitigation-completed"
|
|
10
|
+
};
|
|
11
|
+
async function notifyMitigationCompleted(payload, ctx) {
|
|
12
|
+
if (!payload?.tenantId || !payload.id || !payload.riskAssessmentId || !payload.occurredAt || typeof payload.title !== "string") {
|
|
13
|
+
logger.debug("Skipping mitigation-completed notification because the event payload is incomplete");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await deliverEudrNotification({
|
|
17
|
+
container: ctx.container ?? ctx,
|
|
18
|
+
typeId: "eudr.mitigation.completed",
|
|
19
|
+
payload: {
|
|
20
|
+
tenantId: payload.tenantId,
|
|
21
|
+
organizationId: payload.organizationId ?? null,
|
|
22
|
+
entityId: payload.id,
|
|
23
|
+
occurredAt: payload.occurredAt,
|
|
24
|
+
bodyVariables: { actionTitle: payload.title },
|
|
25
|
+
linkHref: `/backend/eudr/risk-assessments/${payload.riskAssessmentId}`,
|
|
26
|
+
sourceEntityType: "eudr:eudr_mitigation_action"
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
notifyMitigationCompleted as default,
|
|
32
|
+
metadata
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=notify-mitigation-completed.js.map
|