@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/commands/statements.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 setCustomFieldsIfAny,\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 { 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 { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { emitEudrLifecycleEvent } from './lifecycle-events'\nimport { E } from '#generated/entities.ids.generated'\nimport { sql } from 'kysely'\nimport { z } from 'zod'\nimport {\n EudrDueDiligenceStatement,\n EudrEvidenceSubmission,\n EudrMitigationAction,\n EudrRiskAssessment,\n} from '../data/entities'\nimport {\n EUDR_STATEMENT_STATUSES,\n statementCreateSchema,\n statementUpdateSchema,\n type EudrStatementStatus,\n type StatementCreateInput,\n type StatementUpdateInput,\n} from '../data/validators'\nimport {\n EUDR_AMEND_GUARDED_FIELDS,\n canTransition,\n evaluateSubmissionGate,\n isAmendWindowOpen,\n type GateAssessmentView,\n type GateSubmissionView,\n} from '../lib/statement-lifecycle'\n\nconst STATEMENT_ENTITY_ID = 'eudr:eudr_due_diligence_statement'\n\ntype ScopedCommandInput = {\n tenantId: string\n organizationId: string\n}\n\ntype StatementSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n title: string\n commodity: string\n referenceNumber: string | null\n verificationNumber: string | null\n status: string\n activityType: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n quantityKg: string | null\n supplementaryUnit: string | null\n supplementaryQuantity: string | null\n orderId: string | null\n submittedAt: string | null\n referenceIssuedAt: string | null\n orderSnapshot: { orderNumber?: string | null } | null\n notes: string | null\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n custom?: Record<string, unknown> | null\n}\n\ntype StatementUndoPayload = {\n before?: StatementSnapshot | null\n after?: StatementSnapshot | null\n}\n\ntype ScopedStatementCreateInput = StatementCreateInput & ScopedCommandInput\ntype ScopedStatementUpdateInput = StatementUpdateInput & Partial<ScopedCommandInput>\n\ntype StatementCommandResult = {\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 statementCrudIndexer: CrudIndexerConfig<EudrDueDiligenceStatement> = {\n entityType: E.eudr.eudr_due_diligence_statement,\n}\n\nconst statementCrudEvents: CrudEventsConfig<EudrDueDiligenceStatement> = {\n module: 'eudr',\n entity: 'due_diligence_statement',\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 toNumericString(value: number | null | undefined): string | null {\n return value == null ? null : String(value)\n}\n\nfunction toDate(value: string | null): Date | null {\n return value ? new Date(value) : null\n}\n\nfunction statementSeedFromSnapshot(snapshot: StatementSnapshot): RequiredEntityData<EudrDueDiligenceStatement> {\n return {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n title: snapshot.title,\n commodity: snapshot.commodity,\n referenceNumber: snapshot.referenceNumber,\n verificationNumber: snapshot.verificationNumber,\n status: snapshot.status,\n activityType: snapshot.activityType,\n actorRole: snapshot.actorRole,\n referencedStatements: snapshot.referencedStatements.map((entry) => ({ ...entry })),\n quantityKg: snapshot.quantityKg,\n supplementaryUnit: snapshot.supplementaryUnit,\n supplementaryQuantity: snapshot.supplementaryQuantity,\n orderId: snapshot.orderId,\n submittedAt: toDate(snapshot.submittedAt),\n referenceIssuedAt: toDate(snapshot.referenceIssuedAt),\n orderSnapshot: snapshot.orderSnapshot,\n notes: snapshot.notes,\n createdAt: new Date(snapshot.createdAt),\n updatedAt: new Date(snapshot.updatedAt),\n deletedAt: toDate(snapshot.deletedAt),\n }\n}\n\nasync function loadStatementSnapshot(em: EntityManager, entityId: string): Promise<StatementSnapshot | null> {\n const record = await em.findOne(EudrDueDiligenceStatement, { id: entityId })\n if (!record) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: STATEMENT_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 title: record.title,\n commodity: record.commodity,\n referenceNumber: record.referenceNumber ?? null,\n verificationNumber: record.verificationNumber ?? null,\n status: record.status,\n activityType: record.activityType ?? null,\n actorRole: record.actorRole ?? null,\n referencedStatements: Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n quantityKg: record.quantityKg ?? null,\n supplementaryUnit: record.supplementaryUnit ?? null,\n supplementaryQuantity: record.supplementaryQuantity ?? null,\n orderId: record.orderId ?? null,\n submittedAt: record.submittedAt ? record.submittedAt.toISOString() : null,\n referenceIssuedAt: record.referenceIssuedAt ? record.referenceIssuedAt.toISOString() : null,\n orderSnapshot: record.orderSnapshot ?? null,\n notes: record.notes ?? 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\nfunction applyStatementUpdate(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): void {\n if (parsed.title !== undefined) record.title = parsed.title\n if (parsed.commodity !== undefined) record.commodity = parsed.commodity\n if (parsed.referenceNumber !== undefined) record.referenceNumber = parsed.referenceNumber ?? null\n if (parsed.verificationNumber !== undefined) record.verificationNumber = parsed.verificationNumber ?? null\n if (parsed.status !== undefined) record.status = parsed.status\n if (parsed.activityType !== undefined) record.activityType = parsed.activityType ?? null\n if (parsed.actorRole !== undefined) record.actorRole = parsed.actorRole ?? null\n if (parsed.referencedStatements !== undefined) {\n record.referencedStatements = parsed.referencedStatements.map((entry) => ({ ...entry }))\n }\n if (parsed.quantityKg !== undefined) record.quantityKg = toNumericString(parsed.quantityKg)\n if (parsed.supplementaryUnit !== undefined) record.supplementaryUnit = parsed.supplementaryUnit ?? null\n if (parsed.supplementaryQuantity !== undefined) record.supplementaryQuantity = toNumericString(parsed.supplementaryQuantity)\n if (parsed.orderId !== undefined) record.orderId = parsed.orderId ?? null\n if (parsed.referenceIssuedAt !== undefined) record.referenceIssuedAt = parsed.referenceIssuedAt\n if (parsed.orderSnapshot !== undefined) record.orderSnapshot = parsed.orderSnapshot ?? null\n if (parsed.notes !== undefined) record.notes = parsed.notes ?? null\n}\n\nfunction restoreStatement(record: EudrDueDiligenceStatement, snapshot: StatementSnapshot): void {\n record.organizationId = snapshot.organizationId\n record.tenantId = snapshot.tenantId\n record.title = snapshot.title\n record.commodity = snapshot.commodity\n record.referenceNumber = snapshot.referenceNumber\n record.verificationNumber = snapshot.verificationNumber\n record.status = snapshot.status\n record.activityType = snapshot.activityType\n record.actorRole = snapshot.actorRole\n record.referencedStatements = snapshot.referencedStatements.map((entry) => ({ ...entry }))\n record.quantityKg = snapshot.quantityKg\n record.supplementaryUnit = snapshot.supplementaryUnit\n record.supplementaryQuantity = snapshot.supplementaryQuantity\n record.orderId = snapshot.orderId\n record.submittedAt = toDate(snapshot.submittedAt)\n record.referenceIssuedAt = toDate(snapshot.referenceIssuedAt)\n record.orderSnapshot = snapshot.orderSnapshot\n record.notes = snapshot.notes\n record.createdAt = new Date(snapshot.createdAt)\n record.updatedAt = new Date(snapshot.updatedAt)\n record.deletedAt = toDate(snapshot.deletedAt)\n}\n\nasync function setStatementCustomFields(\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: STATEMENT_ENTITY_ID,\n recordId: entityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\ntype PatchedStatementView = {\n referenceNumber: string | null\n verificationNumber: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n}\n\ntype StatementServerFields = {\n submittedAt?: Date\n referenceIssuedAt?: Date | null\n}\n\nconst STATEMENT_STATUS_SET = new Set<string>(EUDR_STATEMENT_STATUSES)\n\nconst STATEMENT_UPDATE_FIELDS = [\n 'title',\n 'commodity',\n 'referenceNumber',\n 'verificationNumber',\n 'status',\n 'activityType',\n 'actorRole',\n 'referencedStatements',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'orderId',\n 'referenceIssuedAt',\n 'orderSnapshot',\n 'notes',\n] as const\n\ntype StatementUpdateField = (typeof STATEMENT_UPDATE_FIELDS)[number]\n\nfunction isStatementStatus(value: string): value is EudrStatementStatus {\n return STATEMENT_STATUS_SET.has(value)\n}\n\nfunction isNonEmpty(value: string | null | undefined): boolean {\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction dateValuesEqual(left: Date | null | undefined, right: Date | null | undefined): boolean {\n const leftTime = left ? left.getTime() : null\n const rightTime = right ? right.getTime() : null\n return leftTime === rightTime\n}\n\nfunction jsonValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left ?? null) === JSON.stringify(right ?? null)\n}\n\n// PG numeric columns read back scale-padded ('100.000'); compare numerically so\n// an unchanged echo from a whole-document save is not treated as an amendment.\nfunction numericValuesEqual(left: string | null | undefined, right: string | null | undefined): boolean {\n const leftNumber = left === null || left === undefined || left === '' ? null : Number(left)\n const rightNumber = right === null || right === undefined || right === '' ? null : Number(right)\n if (leftNumber === null || rightNumber === null) return leftNumber === rightNumber\n return Number.isFinite(leftNumber) && Number.isFinite(rightNumber) && leftNumber === rightNumber\n}\n\nfunction referencedStatementsEqual(\n left: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n right: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n): boolean {\n return JSON.stringify(left ?? []) === JSON.stringify(right ?? [])\n}\n\nfunction statementFieldChanged(\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n field: StatementUpdateField,\n): boolean {\n switch (field) {\n case 'title':\n return parsed.title !== undefined && parsed.title !== record.title\n case 'commodity':\n return parsed.commodity !== undefined && parsed.commodity !== record.commodity\n case 'referenceNumber':\n return parsed.referenceNumber !== undefined && (parsed.referenceNumber ?? null) !== (record.referenceNumber ?? null)\n case 'verificationNumber':\n return parsed.verificationNumber !== undefined && (parsed.verificationNumber ?? null) !== (record.verificationNumber ?? null)\n case 'status':\n return parsed.status !== undefined && parsed.status !== record.status\n case 'activityType':\n return parsed.activityType !== undefined && (parsed.activityType ?? null) !== (record.activityType ?? null)\n case 'actorRole':\n return parsed.actorRole !== undefined && (parsed.actorRole ?? null) !== (record.actorRole ?? null)\n case 'referencedStatements':\n return parsed.referencedStatements !== undefined && !referencedStatementsEqual(parsed.referencedStatements, record.referencedStatements)\n case 'quantityKg':\n return parsed.quantityKg !== undefined && !numericValuesEqual(toNumericString(parsed.quantityKg), record.quantityKg ?? null)\n case 'supplementaryUnit':\n return parsed.supplementaryUnit !== undefined && (parsed.supplementaryUnit ?? null) !== (record.supplementaryUnit ?? null)\n case 'supplementaryQuantity':\n return parsed.supplementaryQuantity !== undefined && !numericValuesEqual(toNumericString(parsed.supplementaryQuantity), record.supplementaryQuantity ?? null)\n case 'orderId':\n return parsed.orderId !== undefined && (parsed.orderId ?? null) !== (record.orderId ?? null)\n case 'referenceIssuedAt':\n return parsed.referenceIssuedAt !== undefined && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n case 'orderSnapshot':\n return parsed.orderSnapshot !== undefined && !jsonValuesEqual(parsed.orderSnapshot ?? null, record.orderSnapshot ?? null)\n case 'notes':\n return parsed.notes !== undefined && (parsed.notes ?? null) !== (record.notes ?? null)\n }\n}\n\nfunction hasStatementFieldChanges(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return STATEMENT_UPDATE_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction buildPatchedStatementView(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): PatchedStatementView {\n return {\n referenceNumber: parsed.referenceNumber !== undefined ? parsed.referenceNumber ?? null : record.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber !== undefined ? parsed.verificationNumber ?? null : record.verificationNumber ?? null,\n actorRole: parsed.actorRole !== undefined ? parsed.actorRole ?? null : record.actorRole ?? null,\n referencedStatements: parsed.referencedStatements !== undefined\n ? parsed.referencedStatements.map((entry) => ({ ...entry }))\n : Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n }\n}\n\nfunction hasChangedAmendGuardedField(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return EUDR_AMEND_GUARDED_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction hasConcernAnswers(criteria: Record<string, { answer: string; note?: string | null }>): boolean {\n return Object.values(criteria).some((entry) => entry.answer === 'concern')\n}\n\nexport async function loadStatementSubmissionsForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateSubmissionView[]> {\n const submissions = await findWithDecryption(\n em,\n EudrEvidenceSubmission,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n return submissions.map((submission) => ({\n status: submission.status,\n completenessScore: submission.completenessScore,\n originCountry: submission.originCountry ?? null,\n }))\n}\n\nexport async function loadLatestAssessmentForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateAssessmentView> {\n const assessments = await findWithDecryption(\n em,\n EudrRiskAssessment,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n {\n orderBy: { assessedAt: 'desc', createdAt: 'desc' },\n limit: 1,\n },\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n const assessment = assessments[0]\n if (!assessment) return null\n const completedMitigationCount = await em.count(EudrMitigationAction, {\n riskAssessmentId: assessment.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n status: 'completed',\n deletedAt: null,\n })\n return {\n conclusion: assessment.conclusion,\n countryRisks: assessment.countryRisks.map((risk) => ({ country: risk.country, tier: risk.tier })),\n reviewDueAt: assessment.reviewDueAt ?? null,\n hasConcernAnswers: hasConcernAnswers(assessment.criteria),\n hasCompletedMitigation: completedMitigationCount > 0,\n }\n}\n\nasync function assertNoDownstreamReferences(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<void> {\n const referenceNumber = record.referenceNumber?.trim().toUpperCase() ?? ''\n if (!referenceNumber) return\n const db = em.getKysely<{\n eudr_due_diligence_statements: {\n id: string\n tenant_id: string\n organization_id: string\n deleted_at: Date | null\n referenced_statements: unknown\n }\n }>()\n const containment = JSON.stringify([{ referenceNumber }])\n const downstreamRow = await db\n .selectFrom('eudr_due_diligence_statements')\n .select(sql<number>`count(*)`.as('total'))\n .where('tenant_id', '=', record.tenantId)\n .where('organization_id', '=', record.organizationId)\n .where('deleted_at', 'is', null)\n .where('id', '!=', record.id)\n .where(sql<boolean>`referenced_statements @> ${containment}::jsonb`)\n .executeTakeFirst()\n if (Number(downstreamRow?.total ?? 0) > 0) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referencedDownstream' })\n }\n}\n\nasync function validateStatementUpdate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n custom: Record<string, unknown>,\n): Promise<StatementServerFields> {\n if (!isStatementStatus(record.status)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const requestedStatus = parsed.status\n const statusChanged = requestedStatus !== undefined && requestedStatus !== record.status\n if (statusChanged && (!isStatementStatus(requestedStatus) || !canTransition(record.status, requestedStatus))) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const hasBaseChanges = hasStatementFieldChanges(record, parsed)\n if (record.status === 'archived' && (hasBaseChanges || Object.keys(custom).length > 0)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n\n const patched = buildPatchedStatementView(record, parsed)\n const serverFields: StatementServerFields = {}\n const isSubmittedToAvailable = record.status === 'submitted' && requestedStatus === 'available'\n\n if (statusChanged) {\n if (record.status === 'draft' && requestedStatus === 'submitted') {\n const submissions = await loadStatementSubmissionsForGate(em, record)\n const latestAssessment = await loadLatestAssessmentForGate(em, record)\n const gate = evaluateSubmissionGate({\n actorRole: patched.actorRole,\n referencedStatementsCount: patched.referencedStatements.length,\n submissions,\n latestAssessment,\n })\n if (!gate.allowed) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.gateFailed',\n details: {\n reasons: gate.reasons.map((reason) => `eudr.gate.${reason}`),\n },\n })\n }\n serverFields.submittedAt = new Date()\n }\n\n if (isSubmittedToAvailable) {\n if (!isNonEmpty(patched.referenceNumber) || !isNonEmpty(patched.verificationNumber)) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.referenceNumbersRequired',\n details: {\n reasons: ['eudr.gate.referenceNumbersRequired'],\n },\n })\n }\n const issuedAt = parsed.referenceIssuedAt ?? new Date()\n if (issuedAt.getTime() > Date.now()) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtInvalid' })\n }\n serverFields.referenceIssuedAt = issuedAt\n }\n\n if (record.status === 'available' && requestedStatus === 'withdrawn') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(em, record)\n }\n }\n\n if (\n parsed.referenceIssuedAt !== undefined\n && !isSubmittedToAvailable\n && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtImmutable' })\n }\n\n // Guarded fields freeze once the amend window elapses, regardless of any\n // status transition requested in the same call (available\u2192archived must not\n // smuggle in a quantity/commodity change).\n if (\n record.status === 'available'\n && !isAmendWindowOpen(record.referenceIssuedAt ?? null)\n && hasChangedAmendGuardedField(record, parsed)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n\n return serverFields\n}\n\nconst createStatementCommand: CommandHandler<ScopedStatementCreateInput, StatementCommandResult> = {\n id: 'eudr.statements.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(statementCreateSchema, rawInput)\n const scope = parseScopedCommandInput(rawInput)\n ensureTenantScope(ctx, scope.tenantId)\n ensureOrganizationScope(ctx, scope.organizationId)\n if (parsed.status !== undefined && parsed.status !== 'draft') {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n if (parsed.referenceIssuedAt !== undefined) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtImmutable' })\n }\n\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record!: EudrDueDiligenceStatement\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'created',\n scope,\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n () => {\n record = entityManager.create(EudrDueDiligenceStatement, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n title: parsed.title,\n commodity: parsed.commodity,\n referenceNumber: parsed.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber ?? null,\n status: parsed.status ?? 'draft',\n activityType: parsed.activityType ?? null,\n actorRole: parsed.actorRole ?? null,\n referencedStatements: parsed.referencedStatements ? parsed.referencedStatements.map((entry) => ({ ...entry })) : [],\n quantityKg: toNumericString(parsed.quantityKg),\n supplementaryUnit: parsed.supplementaryUnit ?? null,\n supplementaryQuantity: toNumericString(parsed.supplementaryQuantity),\n orderId: parsed.orderId ?? null,\n referenceIssuedAt: null,\n orderSnapshot: parsed.orderSnapshot ?? null,\n notes: parsed.notes ?? 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 loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const after = snapshots.after as StatementSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.create', 'Create EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: after.id,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: {\n undo: { after } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(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(EudrDueDiligenceStatement, { 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 setStatementCustomFields(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: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n redo: makeCreateRedo<EudrDueDiligenceStatement, StatementSnapshot, ScopedStatementCreateInput, StatementCommandResult>({\n entityClass: EudrDueDiligenceStatement,\n seedFromSnapshot: statementSeedFromSnapshot,\n buildResult: (entity) => ({ entityId: entity.id }),\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n afterRestore: async ({ ctx, entity, snapshot }) => {\n if (!snapshot.custom || !Object.keys(snapshot.custom).length) return\n await setStatementCustomFields(\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 updateStatementCommand: CommandHandler<ScopedStatementUpdateInput, StatementCommandResult> = {\n id: 'eudr.statements.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(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(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: parsed.id, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n const previousStatus = record.status\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'updated',\n scope: { tenantId: record.tenantId, organizationId: record.organizationId },\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\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 const serverFields = await validateStatementUpdate(entityManager, record, parsed, custom)\n applyStatementUpdate(record, parsed)\n if (serverFields.submittedAt !== undefined) record.submittedAt = serverFields.submittedAt\n if (serverFields.referenceIssuedAt !== undefined) record.referenceIssuedAt = serverFields.referenceIssuedAt\n },\n ],\n })\n\n const lifecycleEventId = record.status === previousStatus\n ? null\n : previousStatus === 'draft' && record.status === 'submitted'\n ? 'eudr.due_diligence_statement.submitted'\n : previousStatus === 'submitted' && record.status === 'available'\n ? 'eudr.due_diligence_statement.reference_issued'\n : previousStatus === 'available' && record.status === 'withdrawn'\n ? 'eudr.due_diligence_statement.withdrawn'\n : null\n if (lifecycleEventId) {\n await emitEudrLifecycleEvent(ctx.container, lifecycleEventId, {\n id: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n title: record.title,\n referenceNumber: record.referenceNumber ?? null,\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 loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n const after = snapshots.after as StatementSnapshot | 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.statements.update', 'Update EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\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 StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(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(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(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 setStatementCustomFields(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: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nconst deleteStatementCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, StatementCommandResult> = {\n id: 'eudr.statements.delete',\n async prepare(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(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 due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: entityId, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n if (record.status === 'archived') {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n if (record.status === 'available') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(entityManager, record)\n }\n\n const snapshot = await loadStatementSnapshot(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 setStatementCustomFields(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: statementCrudIndexer,\n events: statementCrudEvents,\n })\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.delete', 'Delete EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: { before } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(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(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (before.custom) {\n await setStatementCustomFields(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: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nregisterCommand(createStatementCommand)\nregisterCommand(updateStatementCommand)\nregisterCommand(deleteStatementCommand)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useLocale } from "@open-mercato/shared/lib/i18n/context";
|
|
5
|
+
import {
|
|
6
|
+
ISO_COUNTRIES,
|
|
7
|
+
buildCountryOptions,
|
|
8
|
+
resolveCountryName
|
|
9
|
+
} from "@open-mercato/shared/lib/location/countries";
|
|
10
|
+
import { ComboboxInput } from "@open-mercato/ui/backend/inputs/ComboboxInput";
|
|
11
|
+
function formatCountryLabel(code, name) {
|
|
12
|
+
return `${name} (${code})`;
|
|
13
|
+
}
|
|
14
|
+
function normalizeCountryCode(value) {
|
|
15
|
+
return value.trim().toUpperCase();
|
|
16
|
+
}
|
|
17
|
+
function CountrySelectField({
|
|
18
|
+
id,
|
|
19
|
+
value,
|
|
20
|
+
onChange,
|
|
21
|
+
disabled,
|
|
22
|
+
placeholder
|
|
23
|
+
}) {
|
|
24
|
+
const locale = useLocale();
|
|
25
|
+
const options = React.useMemo(() => {
|
|
26
|
+
return buildCountryOptions({
|
|
27
|
+
locale,
|
|
28
|
+
transformLabel: formatCountryLabel
|
|
29
|
+
}).map((option) => ({
|
|
30
|
+
value: option.code,
|
|
31
|
+
label: option.label
|
|
32
|
+
}));
|
|
33
|
+
}, [locale]);
|
|
34
|
+
const knownCodes = React.useMemo(() => new Set(ISO_COUNTRIES.map((country) => country.code)), []);
|
|
35
|
+
const selectedValue = typeof value === "string" ? normalizeCountryCode(value) : "";
|
|
36
|
+
const resolveLabel = React.useCallback((code) => {
|
|
37
|
+
const normalized = normalizeCountryCode(code);
|
|
38
|
+
const localizedName = knownCodes.has(normalized) ? resolveCountryName(normalized, { locale }) : normalized;
|
|
39
|
+
return formatCountryLabel(normalized, localizedName);
|
|
40
|
+
}, [knownCodes, locale]);
|
|
41
|
+
return /* @__PURE__ */ jsx("div", { id, children: /* @__PURE__ */ jsx(
|
|
42
|
+
ComboboxInput,
|
|
43
|
+
{
|
|
44
|
+
value: selectedValue,
|
|
45
|
+
onChange: (nextValue) => {
|
|
46
|
+
const normalized = normalizeCountryCode(nextValue);
|
|
47
|
+
onChange(normalized.length > 0 ? normalized : null);
|
|
48
|
+
},
|
|
49
|
+
suggestions: options,
|
|
50
|
+
seedOptions: selectedValue ? [{ value: selectedValue, label: resolveLabel(selectedValue) }] : void 0,
|
|
51
|
+
resolveLabel,
|
|
52
|
+
placeholder,
|
|
53
|
+
disabled,
|
|
54
|
+
allowCustomValues: false,
|
|
55
|
+
clearable: true
|
|
56
|
+
}
|
|
57
|
+
) });
|
|
58
|
+
}
|
|
59
|
+
var CountrySelectField_default = CountrySelectField;
|
|
60
|
+
export {
|
|
61
|
+
CountrySelectField,
|
|
62
|
+
CountrySelectField_default as default
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=CountrySelectField.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/components/CountrySelectField.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useLocale } from '@open-mercato/shared/lib/i18n/context'\nimport {\n ISO_COUNTRIES,\n buildCountryOptions,\n resolveCountryName,\n} from '@open-mercato/shared/lib/location/countries'\nimport { ComboboxInput, type ComboboxOption } from '@open-mercato/ui/backend/inputs/ComboboxInput'\n\nexport type CountrySelectFieldProps = {\n id: string\n value: string | null\n onChange: (value: string | null) => void\n disabled?: boolean\n placeholder?: string\n}\n\nfunction formatCountryLabel(code: string, name: string): string {\n return `${name} (${code})`\n}\n\nfunction normalizeCountryCode(value: string): string {\n return value.trim().toUpperCase()\n}\n\nexport function CountrySelectField({\n id,\n value,\n onChange,\n disabled,\n placeholder,\n}: CountrySelectFieldProps) {\n const locale = useLocale()\n const options = React.useMemo<ComboboxOption[]>(() => {\n return buildCountryOptions({\n locale,\n transformLabel: formatCountryLabel,\n }).map((option) => ({\n value: option.code,\n label: option.label,\n }))\n }, [locale])\n\n const knownCodes = React.useMemo(() => new Set(ISO_COUNTRIES.map((country) => country.code)), [])\n const selectedValue = typeof value === 'string' ? normalizeCountryCode(value) : ''\n\n const resolveLabel = React.useCallback((code: string) => {\n const normalized = normalizeCountryCode(code)\n const localizedName = knownCodes.has(normalized)\n ? resolveCountryName(normalized, { locale })\n : normalized\n return formatCountryLabel(normalized, localizedName)\n }, [knownCodes, locale])\n\n return (\n <div id={id}>\n <ComboboxInput\n value={selectedValue}\n onChange={(nextValue) => {\n const normalized = normalizeCountryCode(nextValue)\n onChange(normalized.length > 0 ? normalized : null)\n }}\n suggestions={options}\n seedOptions={selectedValue ? [{ value: selectedValue, label: resolveLabel(selectedValue) }] : undefined}\n resolveLabel={resolveLabel}\n placeholder={placeholder}\n disabled={disabled}\n allowCustomValues={false}\n clearable\n />\n </div>\n )\n}\n\nexport default CountrySelectField\n"],
|
|
5
|
+
"mappings": ";AA0DI;AAxDJ,YAAY,WAAW;AACvB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAA0C;AAUnD,SAAS,mBAAmB,MAAc,MAAsB;AAC9D,SAAO,GAAG,IAAI,KAAK,IAAI;AACzB;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,KAAK,EAAE,YAAY;AAClC;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,SAAS,UAAU;AACzB,QAAM,UAAU,MAAM,QAA0B,MAAM;AACpD,WAAO,oBAAoB;AAAA,MACzB;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC,EAAE,IAAI,CAAC,YAAY;AAAA,MAClB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IAChB,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAa,MAAM,QAAQ,MAAM,IAAI,IAAI,cAAc,IAAI,CAAC,YAAY,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC;AAChG,QAAM,gBAAgB,OAAO,UAAU,WAAW,qBAAqB,KAAK,IAAI;AAEhF,QAAM,eAAe,MAAM,YAAY,CAAC,SAAiB;AACvD,UAAM,aAAa,qBAAqB,IAAI;AAC5C,UAAM,gBAAgB,WAAW,IAAI,UAAU,IAC3C,mBAAmB,YAAY,EAAE,OAAO,CAAC,IACzC;AACJ,WAAO,mBAAmB,YAAY,aAAa;AAAA,EACrD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,SACE,oBAAC,SAAI,IACL;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,cAAc;AACvB,cAAM,aAAa,qBAAqB,SAAS;AACjD,iBAAS,WAAW,SAAS,IAAI,aAAa,IAAI;AAAA,MACpD;AAAA,MACA,aAAa;AAAA,MACb,aAAa,gBAAgB,CAAC,EAAE,OAAO,eAAe,OAAO,aAAa,aAAa,EAAE,CAAC,IAAI;AAAA,MAC9F;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,MACnB,WAAS;AAAA;AAAA,EACX,GACA;AAEJ;AAEA,IAAO,6BAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { FileJson, Upload } from "lucide-react";
|
|
5
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
6
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
7
|
+
import { Textarea } from "@open-mercato/ui/primitives/textarea";
|
|
8
|
+
import { validatePlotGeometry } from "../lib/geometry.js";
|
|
9
|
+
import { pointAreaExceedsLimit } from "./plotForm.js";
|
|
10
|
+
import { PlotMapPreview } from "./PlotMapPreview.js";
|
|
11
|
+
async function readJsonFileText(file) {
|
|
12
|
+
return file.text();
|
|
13
|
+
}
|
|
14
|
+
function parseGeometryText(raw) {
|
|
15
|
+
const trimmed = raw.trim();
|
|
16
|
+
if (!trimmed) return null;
|
|
17
|
+
return JSON.parse(trimmed);
|
|
18
|
+
}
|
|
19
|
+
function validateGeometryText(raw) {
|
|
20
|
+
const trimmed = raw.trim();
|
|
21
|
+
if (!trimmed) return { state: "empty" };
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(trimmed);
|
|
25
|
+
} catch {
|
|
26
|
+
return { state: "invalid", errorKey: "geometryInvalid" };
|
|
27
|
+
}
|
|
28
|
+
const result = validatePlotGeometry(parsed);
|
|
29
|
+
if (!result.ok) return { state: "invalid", errorKey: result.errorKey };
|
|
30
|
+
return { state: "valid", result };
|
|
31
|
+
}
|
|
32
|
+
function formatArea(value) {
|
|
33
|
+
if (value === null) return "";
|
|
34
|
+
return new Intl.NumberFormat(void 0, { maximumFractionDigits: 4 }).format(value);
|
|
35
|
+
}
|
|
36
|
+
function GeometryInput({
|
|
37
|
+
id,
|
|
38
|
+
value,
|
|
39
|
+
onChange,
|
|
40
|
+
disabled,
|
|
41
|
+
areaHa
|
|
42
|
+
}) {
|
|
43
|
+
const translate = useT();
|
|
44
|
+
const fileInputRef = React.useRef(null);
|
|
45
|
+
const [showTextarea, setShowTextarea] = React.useState(() => value.trim().length > 0);
|
|
46
|
+
const validation = React.useMemo(() => validateGeometryText(value), [value]);
|
|
47
|
+
const pointAreaTooLarge = validation.state === "valid" && pointAreaExceedsLimit(validation.result.plotType, areaHa);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
if (value.trim().length > 0) setShowTextarea(true);
|
|
50
|
+
}, [value]);
|
|
51
|
+
const handleFile = React.useCallback(async (files) => {
|
|
52
|
+
const file = files?.[0];
|
|
53
|
+
if (!file) return;
|
|
54
|
+
const text = await readJsonFileText(file);
|
|
55
|
+
onChange(text);
|
|
56
|
+
}, [onChange]);
|
|
57
|
+
return /* @__PURE__ */ jsxs("div", { id, className: "space-y-3", children: [
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
59
|
+
/* @__PURE__ */ jsxs(
|
|
60
|
+
Button,
|
|
61
|
+
{
|
|
62
|
+
type: "button",
|
|
63
|
+
variant: "outline",
|
|
64
|
+
onClick: () => fileInputRef.current?.click(),
|
|
65
|
+
disabled,
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ jsx(Upload, { className: "size-4", "aria-hidden": "true" }),
|
|
68
|
+
translate("eudr.plots.geometry.upload")
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
/* @__PURE__ */ jsxs(
|
|
73
|
+
Button,
|
|
74
|
+
{
|
|
75
|
+
type: "button",
|
|
76
|
+
variant: "outline",
|
|
77
|
+
onClick: () => setShowTextarea((current) => !current),
|
|
78
|
+
disabled,
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsx(FileJson, { className: "size-4", "aria-hidden": "true" }),
|
|
81
|
+
translate("eudr.plots.geometry.togglePaste")
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
/* @__PURE__ */ jsx(
|
|
86
|
+
"input",
|
|
87
|
+
{
|
|
88
|
+
ref: fileInputRef,
|
|
89
|
+
type: "file",
|
|
90
|
+
className: "hidden",
|
|
91
|
+
accept: ".json,.geojson,application/json,application/geo+json",
|
|
92
|
+
disabled,
|
|
93
|
+
onChange: (event) => {
|
|
94
|
+
void handleFile(event.target.files);
|
|
95
|
+
event.target.value = "";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
] }),
|
|
100
|
+
showTextarea ? /* @__PURE__ */ jsx(
|
|
101
|
+
Textarea,
|
|
102
|
+
{
|
|
103
|
+
value,
|
|
104
|
+
disabled,
|
|
105
|
+
rows: 10,
|
|
106
|
+
placeholder: translate("eudr.plots.geometry.placeholder"),
|
|
107
|
+
onChange: (event) => onChange(event.target.value)
|
|
108
|
+
}
|
|
109
|
+
) : null,
|
|
110
|
+
validation.state === "empty" ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-dashed border-border/70 bg-muted/30 px-3 py-2 text-sm text-muted-foreground", children: translate("eudr.plots.geometry.empty") }) : null,
|
|
111
|
+
validation.state === "invalid" ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-status-error-border bg-status-error-bg px-3 py-2 text-sm text-status-error-text", children: translate(`eudr.errors.${validation.errorKey}`) }) : null,
|
|
112
|
+
validation.state === "valid" ? /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
113
|
+
pointAreaTooLarge ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-status-error-border bg-status-error-bg px-3 py-2 text-sm text-status-error-text", children: translate("eudr.errors.polygonRequired") }) : /* @__PURE__ */ jsxs("div", { className: "rounded-md border border-status-success-border bg-status-success-bg px-3 py-2 text-sm text-status-success-text", children: [
|
|
114
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium", children: translate("eudr.plots.geometry.valid", {
|
|
115
|
+
type: translate(`eudr.plotType.${validation.result.plotType}`)
|
|
116
|
+
}) }),
|
|
117
|
+
validation.result.computedAreaHa !== null ? /* @__PURE__ */ jsx("div", { children: translate("eudr.plots.geometry.computedArea", {
|
|
118
|
+
area: formatArea(validation.result.computedAreaHa)
|
|
119
|
+
}) }) : null,
|
|
120
|
+
validation.result.warnings.includes("low_precision") ? /* @__PURE__ */ jsx("div", { className: "mt-1 text-status-warning-text", children: translate("eudr.errors.low_precision") }) : null
|
|
121
|
+
] }),
|
|
122
|
+
/* @__PURE__ */ jsx(PlotMapPreview, { features: [validation.result.feature] })
|
|
123
|
+
] }) : null
|
|
124
|
+
] });
|
|
125
|
+
}
|
|
126
|
+
var GeometryInput_default = GeometryInput;
|
|
127
|
+
export {
|
|
128
|
+
GeometryInput,
|
|
129
|
+
GeometryInput_default as default,
|
|
130
|
+
parseGeometryText,
|
|
131
|
+
readJsonFileText
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=GeometryInput.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/eudr/components/GeometryInput.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { FileJson, Upload } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { validatePlotGeometry, type GeometryValidationResult } from '../lib/geometry'\nimport { pointAreaExceedsLimit } from './plotForm'\nimport { PlotMapPreview } from './PlotMapPreview'\n\nexport type GeometryInputProps = {\n id: string\n value: string\n onChange: (value: string) => void\n disabled?: boolean\n areaHa?: string\n}\n\ntype ParsedGeometryState =\n | { state: 'empty' }\n | { state: 'invalid'; errorKey: string }\n | { state: 'valid'; result: Extract<GeometryValidationResult, { ok: true }> }\n\nexport async function readJsonFileText(file: File): Promise<string> {\n return file.text()\n}\n\nexport function parseGeometryText(raw: string): unknown | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n return JSON.parse(trimmed)\n}\n\nfunction validateGeometryText(raw: string): ParsedGeometryState {\n const trimmed = raw.trim()\n if (!trimmed) return { state: 'empty' }\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n return { state: 'invalid', errorKey: 'geometryInvalid' }\n }\n const result = validatePlotGeometry(parsed)\n if (!result.ok) return { state: 'invalid', errorKey: result.errorKey }\n return { state: 'valid', result }\n}\n\nfunction formatArea(value: number | null): string {\n if (value === null) return ''\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 4 }).format(value)\n}\n\nexport function GeometryInput({\n id,\n value,\n onChange,\n disabled,\n areaHa,\n}: GeometryInputProps) {\n const translate = useT()\n const fileInputRef = React.useRef<HTMLInputElement | null>(null)\n const [showTextarea, setShowTextarea] = React.useState(() => value.trim().length > 0)\n const validation = React.useMemo(() => validateGeometryText(value), [value])\n const pointAreaTooLarge =\n validation.state === 'valid' &&\n pointAreaExceedsLimit(validation.result.plotType, areaHa)\n\n React.useEffect(() => {\n if (value.trim().length > 0) setShowTextarea(true)\n }, [value])\n\n const handleFile = React.useCallback(async (files: FileList | null) => {\n const file = files?.[0]\n if (!file) return\n const text = await readJsonFileText(file)\n onChange(text)\n }, [onChange])\n\n return (\n <div id={id} className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled}\n >\n <Upload className=\"size-4\" aria-hidden=\"true\" />\n {translate('eudr.plots.geometry.upload')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowTextarea((current) => !current)}\n disabled={disabled}\n >\n <FileJson className=\"size-4\" aria-hidden=\"true\" />\n {translate('eudr.plots.geometry.togglePaste')}\n </Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n accept=\".json,.geojson,application/json,application/geo+json\"\n disabled={disabled}\n onChange={(event) => {\n void handleFile(event.target.files)\n event.target.value = ''\n }}\n />\n </div>\n\n {showTextarea ? (\n <Textarea\n value={value}\n disabled={disabled}\n rows={10}\n placeholder={translate('eudr.plots.geometry.placeholder')}\n onChange={(event) => onChange(event.target.value)}\n />\n ) : null}\n\n {validation.state === 'empty' ? (\n <div className=\"rounded-md border border-dashed border-border/70 bg-muted/30 px-3 py-2 text-sm text-muted-foreground\">\n {translate('eudr.plots.geometry.empty')}\n </div>\n ) : null}\n\n {validation.state === 'invalid' ? (\n <div className=\"rounded-md border border-status-error-border bg-status-error-bg px-3 py-2 text-sm text-status-error-text\">\n {translate(`eudr.errors.${validation.errorKey}`)}\n </div>\n ) : null}\n\n {validation.state === 'valid' ? (\n <div className=\"space-y-3\">\n {pointAreaTooLarge ? (\n <div className=\"rounded-md border border-status-error-border bg-status-error-bg px-3 py-2 text-sm text-status-error-text\">\n {translate('eudr.errors.polygonRequired')}\n </div>\n ) : (\n <div className=\"rounded-md border border-status-success-border bg-status-success-bg px-3 py-2 text-sm text-status-success-text\">\n <div className=\"font-medium\">\n {translate('eudr.plots.geometry.valid', {\n type: translate(`eudr.plotType.${validation.result.plotType}`),\n })}\n </div>\n {validation.result.computedAreaHa !== null ? (\n <div>\n {translate('eudr.plots.geometry.computedArea', {\n area: formatArea(validation.result.computedAreaHa),\n })}\n </div>\n ) : null}\n {validation.result.warnings.includes('low_precision') ? (\n <div className=\"mt-1 text-status-warning-text\">\n {translate('eudr.errors.low_precision')}\n </div>\n ) : null}\n </div>\n )}\n <PlotMapPreview features={[validation.result.feature]} />\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default GeometryInput\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|