@open-mercato/core 0.7.0 → 0.7.1-develop.7103.1.41ff100d93
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 +1 -1
- package/dist/helpers/integration/api.js +13 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/di.js +9 -0
- package/dist/modules/api_keys/di.js.map +7 -0
- package/dist/modules/api_keys/services/principalService.js +31 -0
- package/dist/modules/api_keys/services/principalService.js.map +7 -0
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +11 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/attachment-service.js +313 -0
- package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +6 -2
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +57 -12
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +8 -2
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +4 -1
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/validate.js +55 -0
- package/dist/modules/auth/api/reset/validate.js.map +7 -0
- package/dist/modules/auth/api/roles/acl/route.js +28 -33
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/session/refresh.js +25 -1
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +96 -51
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +13 -5
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/commands/acl.js +254 -0
- package/dist/modules/auth/commands/acl.js.map +7 -0
- package/dist/modules/auth/components/AclEditor.js +39 -30
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +5 -1
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +35 -9
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/userIdFilter.js +16 -0
- package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
- package/dist/modules/auth/services/authService.js +16 -2
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/principalService.js +200 -0
- package/dist/modules/auth/services/principalService.js.map +7 -0
- package/dist/modules/auth/services/rbacService.js +67 -24
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
- package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
- package/dist/modules/business_rules/backend/logs/page.js +3 -1
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +3 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -1
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +7 -1
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +41 -2
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +9 -0
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/services/rateFetchingService.js +6 -1
- package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +4 -1
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +48 -6
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +17 -94
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +8 -25
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +14 -9
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +5 -5
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +38 -1
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +3 -1
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +11 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +51 -9
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +30 -5
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +5 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
- package/dist/modules/customers/backend/customers/people/page.js +4 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +21 -34
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -7
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +6 -5
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +32 -3
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +5 -0
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
- package/dist/modules/customers/lib/closureStage.js +45 -0
- package/dist/modules/customers/lib/closureStage.js.map +7 -0
- package/dist/modules/customers/lib/dealStatus.js +30 -0
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/detailReadAccess.js +12 -0
- package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +100 -2
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +12 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +6 -1
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
- package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +72 -6
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +5 -1
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +5 -1
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +9 -1
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +14 -1
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +99 -12
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/deviceSerialization.js +46 -0
- package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +3 -1
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +9 -1
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +17 -1
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +28 -34
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
- package/dist/modules/devices/backend/devices/userOptions.js +52 -0
- package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
- package/dist/modules/devices/setup.js +6 -2
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +9 -0
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
- package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
- package/dist/modules/directory/services/organizationScopeService.js +56 -0
- package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +4 -2
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +5 -1
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +0 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +4 -1
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +0 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
- package/dist/modules/integrations/data/validators.js +11 -3
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +6 -2
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +29 -1
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +17 -2
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +17 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +15 -0
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +14 -2
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +18 -4
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
- package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +150 -51
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
- package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
- package/dist/modules/query_index/lib/search-tokens.js +79 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +79 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +8 -2
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +1 -0
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
- package/dist/modules/sales/setup.js +2 -0
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +4 -7
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +3 -0
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +121 -9
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +3 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +9 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +3 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +3 -1
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -1
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -0
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +9 -10
- package/src/helpers/integration/api.ts +33 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
- package/src/modules/api_keys/api/keys/route.ts +3 -1
- package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
- package/src/modules/api_keys/di.ts +7 -0
- package/src/modules/api_keys/services/principalService.ts +33 -0
- package/src/modules/attachments/AGENTS.md +15 -0
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
- package/src/modules/attachments/di.ts +16 -0
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/index.ts +10 -0
- package/src/modules/attachments/lib/attachment-service.ts +468 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
- package/src/modules/attachments/lib/upload-limits.ts +6 -2
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
- package/src/modules/audit_logs/services/actionLogService.ts +74 -11
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/auth/api/feature-check.ts +10 -3
- package/src/modules/auth/api/login.ts +9 -1
- package/src/modules/auth/api/reset/validate.ts +57 -0
- package/src/modules/auth/api/roles/acl/route.ts +42 -39
- package/src/modules/auth/api/session/refresh.ts +32 -1
- package/src/modules/auth/api/users/acl/route.ts +177 -53
- package/src/modules/auth/api/users/route.ts +18 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/roles/page.tsx +4 -2
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/users/page.tsx +3 -2
- package/src/modules/auth/commands/acl.ts +495 -0
- package/src/modules/auth/components/AclEditor.tsx +63 -33
- package/src/modules/auth/data/entities.ts +4 -1
- package/src/modules/auth/data/validators.ts +5 -0
- package/src/modules/auth/di.ts +46 -16
- package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
- package/src/modules/auth/i18n/de.json +389 -0
- package/src/modules/auth/i18n/en.json +389 -0
- package/src/modules/auth/i18n/es.json +389 -0
- package/src/modules/auth/i18n/ko.json +389 -0
- package/src/modules/auth/i18n/pl.json +391 -2
- package/src/modules/auth/lib/grantChecks.ts +6 -0
- package/src/modules/auth/lib/userIdFilter.ts +31 -0
- package/src/modules/auth/services/authService.ts +18 -2
- package/src/modules/auth/services/principalService.ts +266 -0
- package/src/modules/auth/services/rbacService.ts +110 -24
- package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
- package/src/modules/business_rules/backend/logs/page.tsx +4 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -1
- package/src/modules/business_rules/backend/sets/page.tsx +4 -1
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
- package/src/modules/communication_channels/di.ts +7 -0
- package/src/modules/communication_channels/lib/adapter.ts +14 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
- package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
- package/src/modules/communication_channels/lib/test-seed.ts +64 -4
- package/src/modules/configs/i18n/de.json +2 -0
- package/src/modules/configs/i18n/en.json +2 -0
- package/src/modules/configs/i18n/es.json +2 -0
- package/src/modules/configs/i18n/ko.json +2 -0
- package/src/modules/configs/i18n/pl.json +2 -0
- package/src/modules/configs/lib/system-status.ts +9 -0
- package/src/modules/currencies/AGENTS.md +3 -0
- package/src/modules/currencies/backend/currencies/page.tsx +4 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
- package/src/modules/currencies/services/README.md +45 -0
- package/src/modules/currencies/services/rateFetchingService.ts +6 -1
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
- package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
- package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
- package/src/modules/customers/ai-tools/people-pack.ts +4 -1
- package/src/modules/customers/api/activities/route.ts +45 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
- package/src/modules/customers/api/companies/[id]/route.ts +24 -107
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
- package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/route.ts +17 -28
- package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
- package/src/modules/customers/api/deals/aggregate/route.ts +17 -9
- package/src/modules/customers/api/deals/map/route.ts +4 -4
- package/src/modules/customers/api/deals/route.ts +50 -1
- package/src/modules/customers/api/entity-roles-factory.ts +8 -4
- package/src/modules/customers/api/interactions/route.ts +8 -2
- package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
- package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
- package/src/modules/customers/api/people/[id]/route.ts +16 -11
- package/src/modules/customers/api/people/check-phone/route.ts +75 -10
- package/src/modules/customers/api/todos/route.ts +27 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
- package/src/modules/customers/backend/customers/people/page.tsx +5 -2
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
- package/src/modules/customers/commands/deals.ts +34 -59
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
- package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
- package/src/modules/customers/components/detail/DealForm.tsx +22 -2
- package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +15 -5
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +50 -9
- package/src/modules/customers/events.ts +5 -0
- package/src/modules/customers/i18n/de.json +9 -1
- package/src/modules/customers/i18n/en.json +9 -1
- package/src/modules/customers/i18n/es.json +9 -1
- package/src/modules/customers/i18n/ko.json +9 -1
- package/src/modules/customers/i18n/pl.json +9 -1
- package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
- package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
- package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
- package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
- package/src/modules/customers/lib/closureStage.ts +76 -0
- package/src/modules/customers/lib/dealStatus.ts +42 -0
- package/src/modules/customers/lib/detailReadAccess.ts +35 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
- package/src/modules/customers/lib/personCompanies.ts +136 -1
- package/src/modules/customers/lib/todoCompatibility.ts +19 -1
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +6 -0
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
- package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
- package/src/modules/data_sync/lib/adapter.ts +36 -0
- package/src/modules/data_sync/lib/sync-engine.ts +113 -5
- package/src/modules/data_sync/workers/sync-export.ts +4 -0
- package/src/modules/data_sync/workers/sync-import.ts +4 -0
- package/src/modules/devices/AGENTS.md +20 -1
- package/src/modules/devices/acl.ts +9 -1
- package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
- package/src/modules/devices/api/admin/devices/route.ts +14 -1
- package/src/modules/devices/api/deviceList.ts +135 -11
- package/src/modules/devices/api/deviceSerialization.ts +50 -0
- package/src/modules/devices/api/openapi.ts +9 -1
- package/src/modules/devices/api/route.ts +9 -1
- package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
- package/src/modules/devices/backend/devices/create/page.tsx +17 -1
- package/src/modules/devices/backend/devices/page.tsx +44 -45
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
- package/src/modules/devices/backend/devices/userOptions.ts +99 -0
- package/src/modules/devices/i18n/de.json +3 -2
- package/src/modules/devices/i18n/en.json +3 -2
- package/src/modules/devices/i18n/es.json +3 -2
- package/src/modules/devices/i18n/ko.json +3 -2
- package/src/modules/devices/i18n/pl.json +3 -2
- package/src/modules/devices/setup.ts +6 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
- package/src/modules/directory/di.ts +14 -2
- package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
- package/src/modules/directory/services/organizationScopeService.ts +85 -0
- package/src/modules/directory/utils/organizationScope.ts +4 -15
- package/src/modules/entities/api/records.ts +2 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
- package/src/modules/eudr/api/plots/route.ts +4 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
- package/src/modules/eudr/commands/statements.ts +0 -3
- package/src/modules/eudr/data/validators.ts +16 -1
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/feature_toggles/defaults.json +0 -8
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
- package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
- package/src/modules/integrations/data/validators.ts +12 -2
- package/src/modules/integrations/i18n/de.json +1 -0
- package/src/modules/integrations/i18n/en.json +1 -0
- package/src/modules/integrations/i18n/es.json +1 -0
- package/src/modules/integrations/i18n/ko.json +1 -0
- package/src/modules/integrations/i18n/pl.json +1 -0
- package/src/modules/integrations/lib/credentials-masking.ts +10 -6
- package/src/modules/messages/api/[id]/route.ts +55 -1
- package/src/modules/messages/api/openapi.ts +20 -0
- package/src/modules/messages/api/route.ts +31 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
- package/src/modules/messages/components/inboxFilters.ts +36 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
- package/src/modules/messages/components/message-detail/types.ts +3 -0
- package/src/modules/messages/components/messageListLabels.ts +52 -3
- package/src/modules/messages/data/validators.ts +43 -4
- package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
- package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
- package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +249 -61
- package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
- package/src/modules/query_index/lib/search-tokens.ts +135 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
- package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
- package/src/modules/sales/commands/documents.ts +93 -0
- package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
- package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
- package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
- package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
- package/src/modules/sales/data/entities.ts +6 -0
- package/src/modules/sales/extension-points.ts +1 -0
- package/src/modules/sales/i18n/de.json +8 -0
- package/src/modules/sales/i18n/en.json +8 -0
- package/src/modules/sales/i18n/es.json +8 -0
- package/src/modules/sales/i18n/ko.json +8 -0
- package/src/modules/sales/i18n/pl.json +8 -0
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
- package/src/modules/sales/setup.ts +2 -0
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
- package/src/modules/sales/widgets/injection-table.ts +4 -7
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
- package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
- package/src/modules/warranty_claims/backend/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +159 -10
- package/src/modules/wms/commands/inventory-actions.ts +3 -0
- package/src/modules/wms/commands/shared.ts +17 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/page.tsx +4 -1
- package/src/modules/workflows/backend/events/page.tsx +4 -1
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/lib/activity-executor.ts +9 -0
|
@@ -46,6 +46,7 @@ function EudrStatementsPage() {
|
|
|
46
46
|
const [pageSize, setPageSize] = React.useState(20);
|
|
47
47
|
const [total, setTotal] = React.useState(0);
|
|
48
48
|
const [totalPages, setTotalPages] = React.useState(1);
|
|
49
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false);
|
|
49
50
|
const [search, setSearch] = React.useState("");
|
|
50
51
|
const [sorting, setSorting] = React.useState([]);
|
|
51
52
|
const [filters, setFilters] = React.useState({});
|
|
@@ -94,6 +95,7 @@ function EudrStatementsPage() {
|
|
|
94
95
|
setRows(Array.isArray(payload.items) ? payload.items : []);
|
|
95
96
|
setTotal(typeof payload.total === "number" ? payload.total : 0);
|
|
96
97
|
setTotalPages(typeof payload.totalPages === "number" ? payload.totalPages : 1);
|
|
98
|
+
setTotalIsCapped(payload?.totalIsCapped === true);
|
|
97
99
|
} catch {
|
|
98
100
|
if (!cancelled) flash(translate("eudr.statements.list.loadError"), "error");
|
|
99
101
|
} finally {
|
|
@@ -293,6 +295,7 @@ function EudrStatementsPage() {
|
|
|
293
295
|
pageSize,
|
|
294
296
|
total,
|
|
295
297
|
totalPages,
|
|
298
|
+
totalIsCapped,
|
|
296
299
|
onPageChange: setPage,
|
|
297
300
|
pageSizeOptions: [20, 50, 100],
|
|
298
301
|
onPageSizeChange: (nextPageSize) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/eudr/backend/eudr/statements/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport { RowActions, type RowActionItem } from '@open-mercato/ui/backend/RowActions'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus } from 'lucide-react'\nimport type { SortingState } from '@tanstack/react-table'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { EudrActivityType, EudrCommodity, EudrRiskConclusion, EudrRiskTier, EudrStatementStatus } from '../../../data/validators'\nimport { commodityOptions, statementStatusOptions, statusBadgeVariant, translateEudrErrorMessage } from '../../../components/formConfig'\nimport { canDeleteStatement } from '../../../lib/statement-lifecycle'\nimport {\n riskConclusionBadgeVariant,\n riskTierBadgeVariant,\n} from '../../../components/StatementRiskSection'\n\ntype StatementRow = {\n id: string\n title: string\n commodity: EudrCommodity\n referenceNumber: string | null\n verificationNumber: string | null\n status: EudrStatementStatus\n activityType: EudrActivityType | null\n quantityKg: number | string | null\n orderId: string | null\n notes: string | null\n latestRisk: {\n conclusion: EudrRiskConclusion\n overallTier: EudrRiskTier\n reviewDueAt: string | null\n } | null\n createdAt: string\n updatedAt: string\n}\n\ntype StatementsResponse = {\n items: StatementRow[]\n total: number\n totalPages: number\n}\n\nfunction formatDateTime(value: string | null | undefined, emptyLabel: string, locale: string): string {\n if (!value) return emptyLabel\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return emptyLabel\n return date.toLocaleString(locale || undefined)\n}\n\nfunction formatQuantityKg(value: number | string | null, emptyLabel: string): string {\n if (value === null || value === undefined) return emptyLabel\n if (typeof value === 'string' && !value.trim()) return emptyLabel\n return String(value)\n}\n\nexport default function EudrStatementsPage() {\n const translate = useT()\n const locale = useLocale()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [rows, setRows] = React.useState<StatementRow[]>([])\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [filters, setFilters] = React.useState<FilterValues>({})\n const [loading, setLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n const mutationContextId = 'eudr-statements-list:delete'\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: translate('ui.forms.flash.saveBlocked'),\n })\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n if (search.trim()) params.set('search', search.trim())\n if (typeof filters.commodity === 'string' && filters.commodity.trim()) {\n params.set('commodity', filters.commodity.trim())\n }\n if (typeof filters.status === 'string' && filters.status.trim()) {\n params.set('status', filters.status.trim())\n }\n const firstSort = sorting[0]\n if (firstSort) {\n params.set('sortField', firstSort.id)\n params.set('sortDir', firstSort.desc ? 'desc' : 'asc')\n }\n return params.toString()\n }, [filters.commodity, filters.status, page, pageSize, search, sorting])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadRows() {\n setLoading(true)\n try {\n const fallback: StatementsResponse = { items: [], total: 0, totalPages: 1 }\n const call = await apiCall<StatementsResponse>(\n `/api/eudr/statements?${queryParams}`,\n undefined,\n { fallback },\n )\n if (!call.ok) {\n flash(translate('eudr.statements.list.loadError'), 'error')\n return\n }\n const payload = call.result ?? fallback\n if (cancelled) return\n setRows(Array.isArray(payload.items) ? payload.items : [])\n setTotal(typeof payload.total === 'number' ? payload.total : 0)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)\n } catch {\n if (!cancelled) flash(translate('eudr.statements.list.loadError'), 'error')\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n loadRows()\n return () => {\n cancelled = true\n }\n }, [queryParams, reloadToken, scopeVersion, translate])\n\n const refreshRows = React.useCallback(() => {\n setReloadToken((currentToken) => currentToken + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (row: StatementRow) => {\n const confirmed = await confirm({\n title: translate('eudr.statements.list.confirmDelete', { title: row.title }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(row.updatedAt),\n () => apiCall(\n `/api/eudr/statements?id=${encodeURIComponent(row.id)}`,\n { method: 'DELETE' },\n ),\n )\n if (!call.ok) {\n throw Object.assign(new Error('[internal] eudr statement delete failed'), {\n status: call.status,\n ...((call.result as Record<string, unknown> | null) ?? {}),\n })\n }\n return call\n },\n context: {\n formId: mutationContextId,\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: row.id,\n retryLastMutation,\n },\n mutationPayload: { id: row.id },\n })\n flash(translate('eudr.statements.list.deleteSuccess'), 'success')\n refreshRows()\n } catch (error) {\n if (surfaceRecordConflict(error, translate, { onRefresh: refreshRows })) return\n flash(\n translateEudrErrorMessage(error, translate, translate('eudr.statements.list.deleteError')),\n 'error',\n )\n refreshRows()\n }\n }, [confirm, mutationContextId, refreshRows, retryLastMutation, runMutation, translate])\n\n const columns = React.useMemo<ColumnDef<StatementRow>[]>(() => [\n {\n accessorKey: 'title',\n header: translate('eudr.statements.list.columns.title'),\n cell: ({ row }) => (\n <Link href={`/backend/eudr/statements/${row.original.id}`} className=\"font-medium hover:underline\">\n {row.original.title}\n </Link>\n ),\n meta: { maxWidth: '260px', truncate: true },\n },\n {\n accessorKey: 'commodity',\n header: translate('eudr.statements.list.columns.commodity'),\n cell: ({ row }) => translate(`eudr.commodity.${row.original.commodity}`),\n },\n {\n accessorKey: 'status',\n header: translate('eudr.statements.list.columns.status'),\n cell: ({ row }) => (\n <StatusBadge variant={statusBadgeVariant(row.original.status)} dot>\n {translate(`eudr.statementStatus.${row.original.status}`)}\n </StatusBadge>\n ),\n },\n {\n accessorKey: 'activityType',\n header: translate('eudr.statements.list.columns.activityType'),\n cell: ({ row }) => row.original.activityType\n ? translate(`eudr.activityType.${row.original.activityType}`)\n : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskConclusion',\n header: translate('eudr.statements.list.columns.latestRiskConclusion'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskConclusionBadgeVariant(row.original.latestRisk.conclusion)}>\n {translate(`eudr.conclusion.${row.original.latestRisk.conclusion}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskTier',\n header: translate('eudr.statements.list.columns.latestRiskTier'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskTierBadgeVariant(row.original.latestRisk.overallTier)}>\n {translate(`eudr.riskTier.${row.original.latestRisk.overallTier}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n accessorKey: 'referenceNumber',\n header: translate('eudr.statements.list.columns.referenceNumber'),\n cell: ({ row }) => row.original.referenceNumber || translate('eudr.common.empty'),\n },\n {\n accessorKey: 'quantityKg',\n header: translate('eudr.statements.list.columns.quantityKg'),\n cell: ({ row }) => formatQuantityKg(row.original.quantityKg, translate('eudr.common.empty')),\n },\n {\n accessorKey: 'updatedAt',\n header: translate('eudr.statements.list.columns.updatedAt'),\n cell: ({ row }) => formatDateTime(row.original.updatedAt, translate('eudr.common.empty'), locale),\n },\n ], [locale, translate])\n\n const filterDefs = React.useMemo<FilterDef[]>(() => [\n {\n id: 'commodity',\n label: translate('eudr.statements.list.filters.commodity'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allCommodities') },\n ...commodityOptions(translate),\n ],\n },\n {\n id: 'status',\n label: translate('eudr.statements.list.filters.status'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allStatuses') },\n ...statementStatusOptions(translate),\n ],\n },\n ], [locale, translate])\n\n return (\n <Page>\n <PageBody>\n <DataTable<StatementRow>\n title={translate('eudr.statements.list.title')}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(nextSearch) => {\n setSearch(nextSearch)\n setPage(1)\n }}\n searchPlaceholder={translate('eudr.statements.list.searchPlaceholder')}\n filters={filterDefs}\n filterValues={filters}\n onFiltersApply={(nextFilters) => {\n setFilters(nextFilters)\n setPage(1)\n }}\n onFiltersClear={() => {\n setFilters({})\n setPage(1)\n }}\n actions={(\n <Button asChild>\n <Link href=\"/backend/eudr/statements/create\">\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('eudr.statements.list.actions.create')}\n </Link>\n </Button>\n )}\n rowActions={(row) => {\n const items: RowActionItem[] = [\n {\n id: 'edit',\n label: translate('eudr.statements.list.actions.edit'),\n href: `/backend/eudr/statements/${row.id}`,\n },\n {\n id: 'duplicate',\n label: translate('eudr.statements.duplicateAction'),\n href: `/backend/eudr/statements/create?duplicateFrom=${encodeURIComponent(row.id)}`,\n },\n ]\n if (canDeleteStatement(row.status)) {\n items.push({\n id: 'delete',\n label: translate('eudr.statements.list.actions.delete'),\n destructive: true,\n onSelect: () => {\n void handleDelete(row)\n },\n })\n }\n return <RowActions items={items} />\n }}\n onRowClick={(row) => router.push(`/backend/eudr/statements/${row.id}`)}\n rowClickActionIds={['edit']}\n emptyState={(\n <ListEmptyState\n entityName={translate('eudr.statements.list.entityName')}\n createHref=\"/backend/eudr/statements/create\"\n createLabel={translate('eudr.statements.list.actions.create')}\n />\n )}\n sortable\n manualSorting\n sorting={sorting}\n onSortingChange={(nextSorting) => {\n setSorting(nextSorting)\n setPage(1)\n }}\n pagination={{\n page,\n pageSize,\n total,\n totalPages,\n onPageChange: setPage,\n pageSizeOptions: [20, 50, 100],\n onPageSizeChange: (nextPageSize) => {\n setPageSize(nextPageSize)\n setPage(1)\n },\n }}\n isLoading={loading}\n perspective={{ tableId: 'eudr.statements.list' }}\n stickyActionsColumn\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport { RowActions, type RowActionItem } from '@open-mercato/ui/backend/RowActions'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus } from 'lucide-react'\nimport type { SortingState } from '@tanstack/react-table'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { EudrActivityType, EudrCommodity, EudrRiskConclusion, EudrRiskTier, EudrStatementStatus } from '../../../data/validators'\nimport { commodityOptions, statementStatusOptions, statusBadgeVariant, translateEudrErrorMessage } from '../../../components/formConfig'\nimport { canDeleteStatement } from '../../../lib/statement-lifecycle'\nimport {\n riskConclusionBadgeVariant,\n riskTierBadgeVariant,\n} from '../../../components/StatementRiskSection'\n\ntype StatementRow = {\n id: string\n title: string\n commodity: EudrCommodity\n referenceNumber: string | null\n verificationNumber: string | null\n status: EudrStatementStatus\n activityType: EudrActivityType | null\n quantityKg: number | string | null\n orderId: string | null\n notes: string | null\n latestRisk: {\n conclusion: EudrRiskConclusion\n overallTier: EudrRiskTier\n reviewDueAt: string | null\n } | null\n createdAt: string\n updatedAt: string\n}\n\ntype StatementsResponse = {\n items: StatementRow[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nfunction formatDateTime(value: string | null | undefined, emptyLabel: string, locale: string): string {\n if (!value) return emptyLabel\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return emptyLabel\n return date.toLocaleString(locale || undefined)\n}\n\nfunction formatQuantityKg(value: number | string | null, emptyLabel: string): string {\n if (value === null || value === undefined) return emptyLabel\n if (typeof value === 'string' && !value.trim()) return emptyLabel\n return String(value)\n}\n\nexport default function EudrStatementsPage() {\n const translate = useT()\n const locale = useLocale()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [rows, setRows] = React.useState<StatementRow[]>([])\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [filters, setFilters] = React.useState<FilterValues>({})\n const [loading, setLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n const mutationContextId = 'eudr-statements-list:delete'\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: translate('ui.forms.flash.saveBlocked'),\n })\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n if (search.trim()) params.set('search', search.trim())\n if (typeof filters.commodity === 'string' && filters.commodity.trim()) {\n params.set('commodity', filters.commodity.trim())\n }\n if (typeof filters.status === 'string' && filters.status.trim()) {\n params.set('status', filters.status.trim())\n }\n const firstSort = sorting[0]\n if (firstSort) {\n params.set('sortField', firstSort.id)\n params.set('sortDir', firstSort.desc ? 'desc' : 'asc')\n }\n return params.toString()\n }, [filters.commodity, filters.status, page, pageSize, search, sorting])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadRows() {\n setLoading(true)\n try {\n const fallback: StatementsResponse = { items: [], total: 0, totalPages: 1 }\n const call = await apiCall<StatementsResponse>(\n `/api/eudr/statements?${queryParams}`,\n undefined,\n { fallback },\n )\n if (!call.ok) {\n flash(translate('eudr.statements.list.loadError'), 'error')\n return\n }\n const payload = call.result ?? fallback\n if (cancelled) return\n setRows(Array.isArray(payload.items) ? payload.items : [])\n setTotal(typeof payload.total === 'number' ? payload.total : 0)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)\n setTotalIsCapped(payload?.totalIsCapped === true)\n } catch {\n if (!cancelled) flash(translate('eudr.statements.list.loadError'), 'error')\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n loadRows()\n return () => {\n cancelled = true\n }\n }, [queryParams, reloadToken, scopeVersion, translate])\n\n const refreshRows = React.useCallback(() => {\n setReloadToken((currentToken) => currentToken + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (row: StatementRow) => {\n const confirmed = await confirm({\n title: translate('eudr.statements.list.confirmDelete', { title: row.title }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(row.updatedAt),\n () => apiCall(\n `/api/eudr/statements?id=${encodeURIComponent(row.id)}`,\n { method: 'DELETE' },\n ),\n )\n if (!call.ok) {\n throw Object.assign(new Error('[internal] eudr statement delete failed'), {\n status: call.status,\n ...((call.result as Record<string, unknown> | null) ?? {}),\n })\n }\n return call\n },\n context: {\n formId: mutationContextId,\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: row.id,\n retryLastMutation,\n },\n mutationPayload: { id: row.id },\n })\n flash(translate('eudr.statements.list.deleteSuccess'), 'success')\n refreshRows()\n } catch (error) {\n if (surfaceRecordConflict(error, translate, { onRefresh: refreshRows })) return\n flash(\n translateEudrErrorMessage(error, translate, translate('eudr.statements.list.deleteError')),\n 'error',\n )\n refreshRows()\n }\n }, [confirm, mutationContextId, refreshRows, retryLastMutation, runMutation, translate])\n\n const columns = React.useMemo<ColumnDef<StatementRow>[]>(() => [\n {\n accessorKey: 'title',\n header: translate('eudr.statements.list.columns.title'),\n cell: ({ row }) => (\n <Link href={`/backend/eudr/statements/${row.original.id}`} className=\"font-medium hover:underline\">\n {row.original.title}\n </Link>\n ),\n meta: { maxWidth: '260px', truncate: true },\n },\n {\n accessorKey: 'commodity',\n header: translate('eudr.statements.list.columns.commodity'),\n cell: ({ row }) => translate(`eudr.commodity.${row.original.commodity}`),\n },\n {\n accessorKey: 'status',\n header: translate('eudr.statements.list.columns.status'),\n cell: ({ row }) => (\n <StatusBadge variant={statusBadgeVariant(row.original.status)} dot>\n {translate(`eudr.statementStatus.${row.original.status}`)}\n </StatusBadge>\n ),\n },\n {\n accessorKey: 'activityType',\n header: translate('eudr.statements.list.columns.activityType'),\n cell: ({ row }) => row.original.activityType\n ? translate(`eudr.activityType.${row.original.activityType}`)\n : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskConclusion',\n header: translate('eudr.statements.list.columns.latestRiskConclusion'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskConclusionBadgeVariant(row.original.latestRisk.conclusion)}>\n {translate(`eudr.conclusion.${row.original.latestRisk.conclusion}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskTier',\n header: translate('eudr.statements.list.columns.latestRiskTier'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskTierBadgeVariant(row.original.latestRisk.overallTier)}>\n {translate(`eudr.riskTier.${row.original.latestRisk.overallTier}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n accessorKey: 'referenceNumber',\n header: translate('eudr.statements.list.columns.referenceNumber'),\n cell: ({ row }) => row.original.referenceNumber || translate('eudr.common.empty'),\n },\n {\n accessorKey: 'quantityKg',\n header: translate('eudr.statements.list.columns.quantityKg'),\n cell: ({ row }) => formatQuantityKg(row.original.quantityKg, translate('eudr.common.empty')),\n },\n {\n accessorKey: 'updatedAt',\n header: translate('eudr.statements.list.columns.updatedAt'),\n cell: ({ row }) => formatDateTime(row.original.updatedAt, translate('eudr.common.empty'), locale),\n },\n ], [locale, translate])\n\n const filterDefs = React.useMemo<FilterDef[]>(() => [\n {\n id: 'commodity',\n label: translate('eudr.statements.list.filters.commodity'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allCommodities') },\n ...commodityOptions(translate),\n ],\n },\n {\n id: 'status',\n label: translate('eudr.statements.list.filters.status'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allStatuses') },\n ...statementStatusOptions(translate),\n ],\n },\n ], [locale, translate])\n\n return (\n <Page>\n <PageBody>\n <DataTable<StatementRow>\n title={translate('eudr.statements.list.title')}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(nextSearch) => {\n setSearch(nextSearch)\n setPage(1)\n }}\n searchPlaceholder={translate('eudr.statements.list.searchPlaceholder')}\n filters={filterDefs}\n filterValues={filters}\n onFiltersApply={(nextFilters) => {\n setFilters(nextFilters)\n setPage(1)\n }}\n onFiltersClear={() => {\n setFilters({})\n setPage(1)\n }}\n actions={(\n <Button asChild>\n <Link href=\"/backend/eudr/statements/create\">\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('eudr.statements.list.actions.create')}\n </Link>\n </Button>\n )}\n rowActions={(row) => {\n const items: RowActionItem[] = [\n {\n id: 'edit',\n label: translate('eudr.statements.list.actions.edit'),\n href: `/backend/eudr/statements/${row.id}`,\n },\n {\n id: 'duplicate',\n label: translate('eudr.statements.duplicateAction'),\n href: `/backend/eudr/statements/create?duplicateFrom=${encodeURIComponent(row.id)}`,\n },\n ]\n if (canDeleteStatement(row.status)) {\n items.push({\n id: 'delete',\n label: translate('eudr.statements.list.actions.delete'),\n destructive: true,\n onSelect: () => {\n void handleDelete(row)\n },\n })\n }\n return <RowActions items={items} />\n }}\n onRowClick={(row) => router.push(`/backend/eudr/statements/${row.id}`)}\n rowClickActionIds={['edit']}\n emptyState={(\n <ListEmptyState\n entityName={translate('eudr.statements.list.entityName')}\n createHref=\"/backend/eudr/statements/create\"\n createLabel={translate('eudr.statements.list.actions.create')}\n />\n )}\n sortable\n manualSorting\n sorting={sorting}\n onSortingChange={(nextSorting) => {\n setSorting(nextSorting)\n setPage(1)\n }}\n pagination={{\n page,\n pageSize,\n total,\n totalPages,\n totalIsCapped,\n onPageChange: setPage,\n pageSizeOptions: [20, 50, 100],\n onPageSizeChange: (nextPageSize) => {\n setPageSize(nextPageSize)\n setPage(1)\n },\n }}\n isLoading={loading}\n perspective={{ tableId: 'eudr.statements.list' }}\n stickyActionsColumn\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AA6MQ,cA4GM,YA5GN;AA3MR,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,MAAM,gBAAgB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,kBAAsC;AAE/C,SAAS,SAAS,mCAAmC;AACrD,SAAS,iCAAiC;AAC1C,SAAS,0BAA0B;AACnC,SAAS,aAAa;AACtB,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AAGrB,SAAS,mCAAmC;AAC5C,SAAS,WAAW,YAAY;AAEhC,SAAS,kBAAkB,wBAAwB,oBAAoB,iCAAiC;AACxG,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AA6BP,SAAS,eAAe,OAAkC,YAAoB,QAAwB;AACpG,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO,KAAK,eAAe,UAAU,MAAS;AAChD;AAEA,SAAS,iBAAiB,OAA+B,YAA4B;AACnF,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAG,QAAO;AACvD,SAAO,OAAO,KAAK;AACrB;AAEe,SAAR,qBAAsC;AAC3C,QAAM,YAAY,KAAK;AACvB,QAAM,SAAS,UAAU;AACzB,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,4BAA4B;AACjD,QAAM,EAAE,SAAS,qBAAqB,IAAI,iBAAiB;AAC3D,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAyB,CAAC,CAAC;AACzD,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;AACxC,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,EAAE;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,CAAC;AAC1C,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,CAAC;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAuB,CAAC,CAAC;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAuB,CAAC,CAAC;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,IAAI;AACjD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,CAAC;AACtD,QAAM,oBAAoB;AAC1B,QAAM,EAAE,aAAa,kBAAkB,IAAI,mBAKxC;AAAA,IACD,WAAW;AAAA,IACX,gBAAgB,UAAU,4BAA4B;AAAA,EACxD,CAAC;AAED,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,QAAQ,OAAO,IAAI,CAAC;AAC/B,WAAO,IAAI,YAAY,OAAO,QAAQ,CAAC;AACvC,QAAI,OAAO,KAAK,EAAG,QAAO,IAAI,UAAU,OAAO,KAAK,CAAC;AACrD,QAAI,OAAO,QAAQ,cAAc,YAAY,QAAQ,UAAU,KAAK,GAAG;AACrE,aAAO,IAAI,aAAa,QAAQ,UAAU,KAAK,CAAC;AAAA,IAClD;AACA,QAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,KAAK,GAAG;AAC/D,aAAO,IAAI,UAAU,QAAQ,OAAO,KAAK,CAAC;AAAA,IAC5C;AACA,UAAM,YAAY,QAAQ,CAAC;AAC3B,QAAI,WAAW;AACb,aAAO,IAAI,aAAa,UAAU,EAAE;AACpC,aAAO,IAAI,WAAW,UAAU,OAAO,SAAS,KAAK;AAAA,IACvD;AACA,WAAO,OAAO,SAAS;AAAA,EACzB,GAAG,CAAC,QAAQ,WAAW,QAAQ,QAAQ,MAAM,UAAU,QAAQ,OAAO,CAAC;AAEvE,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,mBAAe,WAAW;AACxB,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,WAA+B,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,YAAY,EAAE;AAC1E,cAAM,OAAO,MAAM;AAAA,UACjB,wBAAwB,WAAW;AAAA,UACnC;AAAA,UACA,EAAE,SAAS;AAAA,QACb;AACA,YAAI,CAAC,KAAK,IAAI;AACZ,gBAAM,UAAU,gCAAgC,GAAG,OAAO;AAC1D;AAAA,QACF;AACA,cAAM,UAAU,KAAK,UAAU;AAC/B,YAAI,UAAW;AACf,gBAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,CAAC;AACzD,iBAAS,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ,CAAC;AAC9D,sBAAc,OAAO,QAAQ,eAAe,WAAW,QAAQ,aAAa,CAAC;AAC7E,yBAAiB,SAAS,kBAAkB,IAAI;AAAA,MAClD,QAAQ;AACN,YAAI,CAAC,UAAW,OAAM,UAAU,gCAAgC,GAAG,OAAO;AAAA,MAC5E,UAAE;AACA,YAAI,CAAC,UAAW,YAAW,KAAK;AAAA,MAClC;AAAA,IACF;AACA,aAAS;AACT,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,cAAc,SAAS,CAAC;AAEtD,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,mBAAe,CAAC,iBAAiB,eAAe,CAAC;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM,YAAY,OAAO,QAAsB;AAClE,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,OAAO,UAAU,sCAAsC,EAAE,OAAO,IAAI,MAAM,CAAC;AAAA,MAC3E,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,YAAY;AAAA,QAChB,WAAW,YAAY;AACrB,gBAAM,OAAO,MAAM;AAAA,YACjB,0BAA0B,IAAI,SAAS;AAAA,YACvC,MAAM;AAAA,cACJ,2BAA2B,mBAAmB,IAAI,EAAE,CAAC;AAAA,cACrD,EAAE,QAAQ,SAAS;AAAA,YACrB;AAAA,UACF;AACA,cAAI,CAAC,KAAK,IAAI;AACZ,kBAAM,OAAO,OAAO,IAAI,MAAM,yCAAyC,GAAG;AAAA,cACxE,QAAQ,KAAK;AAAA,cACb,GAAK,KAAK,UAA6C,CAAC;AAAA,YAC1D,CAAC;AAAA,UACH;AACA,iBAAO;AAAA,QACT;AAAA,QACA,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,QACA,iBAAiB,EAAE,IAAI,IAAI,GAAG;AAAA,MAChC,CAAC;AACD,YAAM,UAAU,oCAAoC,GAAG,SAAS;AAChE,kBAAY;AAAA,IACd,SAAS,OAAO;AACd,UAAI,sBAAsB,OAAO,WAAW,EAAE,WAAW,YAAY,CAAC,EAAG;AACzE;AAAA,QACE,0BAA0B,OAAO,WAAW,UAAU,kCAAkC,CAAC;AAAA,QACzF;AAAA,MACF;AACA,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,SAAS,mBAAmB,aAAa,mBAAmB,aAAa,SAAS,CAAC;AAEvF,QAAM,UAAU,MAAM,QAAmC,MAAM;AAAA,IAC7D;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,oCAAoC;AAAA,MACtD,MAAM,CAAC,EAAE,IAAI,MACX,oBAAC,QAAK,MAAM,4BAA4B,IAAI,SAAS,EAAE,IAAI,WAAU,+BAClE,cAAI,SAAS,OAChB;AAAA,MAEF,MAAM,EAAE,UAAU,SAAS,UAAU,KAAK;AAAA,IAC5C;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,wCAAwC;AAAA,MAC1D,MAAM,CAAC,EAAE,IAAI,MAAM,UAAU,kBAAkB,IAAI,SAAS,SAAS,EAAE;AAAA,IACzE;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,qCAAqC;AAAA,MACvD,MAAM,CAAC,EAAE,IAAI,MACX,oBAAC,eAAY,SAAS,mBAAmB,IAAI,SAAS,MAAM,GAAG,KAAG,MAC/D,oBAAU,wBAAwB,IAAI,SAAS,MAAM,EAAE,GAC1D;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,2CAA2C;AAAA,MAC7D,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,eAC5B,UAAU,qBAAqB,IAAI,SAAS,YAAY,EAAE,IAC1D,UAAU,mBAAmB;AAAA,IACnC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ,UAAU,mDAAmD;AAAA,MACrE,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,aAC9B,oBAAC,eAAY,SAAS,2BAA2B,IAAI,SAAS,WAAW,UAAU,GAChF,oBAAU,mBAAmB,IAAI,SAAS,WAAW,UAAU,EAAE,GACpE,IACE,UAAU,mBAAmB;AAAA,IACnC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ,UAAU,6CAA6C;AAAA,MAC/D,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,aAC9B,oBAAC,eAAY,SAAS,qBAAqB,IAAI,SAAS,WAAW,WAAW,GAC3E,oBAAU,iBAAiB,IAAI,SAAS,WAAW,WAAW,EAAE,GACnE,IACE,UAAU,mBAAmB;AAAA,IACnC;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,8CAA8C;AAAA,MAChE,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,mBAAmB,UAAU,mBAAmB;AAAA,IAClF;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,yCAAyC;AAAA,MAC3D,MAAM,CAAC,EAAE,IAAI,MAAM,iBAAiB,IAAI,SAAS,YAAY,UAAU,mBAAmB,CAAC;AAAA,IAC7F;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,UAAU,wCAAwC;AAAA,MAC1D,MAAM,CAAC,EAAE,IAAI,MAAM,eAAe,IAAI,SAAS,WAAW,UAAU,mBAAmB,GAAG,MAAM;AAAA,IAClG;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,QAAM,aAAa,MAAM,QAAqB,MAAM;AAAA,IAClD;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,UAAU,wCAAwC;AAAA,MACzD,MAAM;AAAA,MACN,SAAS;AAAA,QACP,EAAE,OAAO,IAAI,OAAO,UAAU,6CAA6C,EAAE;AAAA,QAC7E,GAAG,iBAAiB,SAAS;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,UAAU,qCAAqC;AAAA,MACtD,MAAM;AAAA,MACN,SAAS;AAAA,QACP,EAAE,OAAO,IAAI,OAAO,UAAU,0CAA0C,EAAE;AAAA,QAC1E,GAAG,uBAAuB,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,SACE,qBAAC,QACC;AAAA,wBAAC,YACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,UAAU,4BAA4B;AAAA,QAC7C;AAAA,QACA,MAAM;AAAA,QACN,aAAa;AAAA,QACb,gBAAgB,CAAC,eAAe;AAC9B,oBAAU,UAAU;AACpB,kBAAQ,CAAC;AAAA,QACX;AAAA,QACA,mBAAmB,UAAU,wCAAwC;AAAA,QACrE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,gBAAgB,CAAC,gBAAgB;AAC/B,qBAAW,WAAW;AACtB,kBAAQ,CAAC;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM;AACpB,qBAAW,CAAC,CAAC;AACb,kBAAQ,CAAC;AAAA,QACX;AAAA,QACA,SACE,oBAAC,UAAO,SAAO,MACb,+BAAC,QAAK,MAAK,mCACT;AAAA,8BAAC,QAAK,WAAU,gBAAe,eAAW,MAAC;AAAA,UAC1C,UAAU,qCAAqC;AAAA,WAClD,GACF;AAAA,QAEF,YAAY,CAAC,QAAQ;AACnB,gBAAM,QAAyB;AAAA,YAC7B;AAAA,cACE,IAAI;AAAA,cACJ,OAAO,UAAU,mCAAmC;AAAA,cACpD,MAAM,4BAA4B,IAAI,EAAE;AAAA,YAC1C;AAAA,YACA;AAAA,cACE,IAAI;AAAA,cACJ,OAAO,UAAU,iCAAiC;AAAA,cAClD,MAAM,iDAAiD,mBAAmB,IAAI,EAAE,CAAC;AAAA,YACnF;AAAA,UACF;AACA,cAAI,mBAAmB,IAAI,MAAM,GAAG;AAClC,kBAAM,KAAK;AAAA,cACT,IAAI;AAAA,cACJ,OAAO,UAAU,qCAAqC;AAAA,cACtD,aAAa;AAAA,cACb,UAAU,MAAM;AACd,qBAAK,aAAa,GAAG;AAAA,cACvB;AAAA,YACF,CAAC;AAAA,UACH;AACA,iBAAO,oBAAC,cAAW,OAAc;AAAA,QACnC;AAAA,QACA,YAAY,CAAC,QAAQ,OAAO,KAAK,4BAA4B,IAAI,EAAE,EAAE;AAAA,QACrE,mBAAmB,CAAC,MAAM;AAAA,QAC1B,YACE;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,UAAU,iCAAiC;AAAA,YACvD,YAAW;AAAA,YACX,aAAa,UAAU,qCAAqC;AAAA;AAAA,QAC9D;AAAA,QAEF,UAAQ;AAAA,QACR,eAAa;AAAA,QACb;AAAA,QACA,iBAAiB,CAAC,gBAAgB;AAChC,qBAAW,WAAW;AACtB,kBAAQ,CAAC;AAAA,QACX;AAAA,QACA,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,iBAAiB,CAAC,IAAI,IAAI,GAAG;AAAA,UAC7B,kBAAkB,CAAC,iBAAiB;AAClC,wBAAY,YAAY;AACxB,oBAAQ,CAAC;AAAA,UACX;AAAA,QACF;AAAA,QACA,WAAW;AAAA,QACX,aAAa,EAAE,SAAS,uBAAuB;AAAA,QAC/C,qBAAmB;AAAA;AAAA,IACrB,GACF;AAAA,IACC;AAAA,KACH;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -413,9 +413,6 @@ const createStatementCommand = {
|
|
|
413
413
|
if (parsed.status !== void 0 && parsed.status !== "draft") {
|
|
414
414
|
throw new CrudHttpError(400, { error: "eudr.errors.invalidTransition" });
|
|
415
415
|
}
|
|
416
|
-
if (parsed.referenceIssuedAt !== void 0) {
|
|
417
|
-
throw new CrudHttpError(400, { error: "eudr.errors.referenceIssuedAtImmutable" });
|
|
418
|
-
}
|
|
419
416
|
const entityManager = ctx.container.resolve("em").fork();
|
|
420
417
|
let record;
|
|
421
418
|
await runCrudCommandWrite({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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 canDeleteStatement,\n canTransition,\n evaluateSubmissionGate,\n isAmendWindowOpen,\n isStatementReadOnly,\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 (isStatementReadOnly(record.status) && (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 (isStatementStatus(record.status) && !canDeleteStatement(record.status)) {\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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",
|
|
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 canDeleteStatement,\n canTransition,\n evaluateSubmissionGate,\n isAmendWindowOpen,\n isStatementReadOnly,\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 (isStatementReadOnly(record.status) && (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\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 (isStatementStatus(record.status) && !canDeleteStatement(record.status)) {\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": "AAAA,SAAS,uBAAuB;AAGhC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,yBAAyB,yBAAyB;AAC3D;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAGP,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AAEpC,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AACvC,SAAS,SAAS;AAClB,SAAS,WAAW;AACpB,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP,MAAM,sBAAsB;AA8C5B,MAAM,2BAA2B,EAAE,OAAO;AAAA,EACxC,UAAU,EAAE,OAAO,EAAE,KAAK;AAAA,EAC1B,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAClC,CAAC;AAED,MAAM,uBAAqE;AAAA,EACzE,YAAY,EAAE,KAAK;AACrB;AAEA,MAAM,sBAAmE;AAAA,EACvE,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,cAAc,CAAC,iBAAiB;AAAA,IAC9B,IAAI,YAAY,YAAY;AAAA,IAC5B,UAAU,YAAY,QAAQ,MAAM,YAAY,YAAY;AAAA,IAC5D,gBAAgB,YAAY,YAAY;AAAA,IACxC,UAAU,YAAY,YAAY;AAAA,EACpC;AACF;AAEA,SAAS,wBAAwB,OAAoC;AACnE,SAAO,yBAAyB,MAAM,KAAK;AAC7C;AAEA,SAAS,gBAAgB,OAAiD;AACxE,SAAO,SAAS,OAAO,OAAO,OAAO,KAAK;AAC5C;AAEA,SAAS,OAAO,OAAmC;AACjD,SAAO,QAAQ,IAAI,KAAK,KAAK,IAAI;AACnC;AAEA,SAAS,0BAA0B,UAA4E;AAC7G,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,gBAAgB,SAAS;AAAA,IACzB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,WAAW,SAAS;AAAA,IACpB,iBAAiB,SAAS;AAAA,IAC1B,oBAAoB,SAAS;AAAA,IAC7B,QAAQ,SAAS;AAAA,IACjB,cAAc,SAAS;AAAA,IACvB,WAAW,SAAS;AAAA,IACpB,sBAAsB,SAAS,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAAA,IACjF,YAAY,SAAS;AAAA,IACrB,mBAAmB,SAAS;AAAA,IAC5B,uBAAuB,SAAS;AAAA,IAChC,SAAS,SAAS;AAAA,IAClB,aAAa,OAAO,SAAS,WAAW;AAAA,IACxC,mBAAmB,OAAO,SAAS,iBAAiB;AAAA,IACpD,eAAe,SAAS;AAAA,IACxB,OAAO,SAAS;AAAA,IAChB,WAAW,IAAI,KAAK,SAAS,SAAS;AAAA,IACtC,WAAW,IAAI,KAAK,SAAS,SAAS;AAAA,IACtC,WAAW,OAAO,SAAS,SAAS;AAAA,EACtC;AACF;AAEA,eAAe,sBAAsB,IAAmB,UAAqD;AAC3G,QAAM,SAAS,MAAM,GAAG,QAAQ,2BAA2B,EAAE,IAAI,SAAS,CAAC;AAC3E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,MAAM,wBAAwB,IAAI;AAAA,IAC/C,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AACD,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,gBAAgB,OAAO;AAAA,IACvB,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,iBAAiB,OAAO,mBAAmB;AAAA,IAC3C,oBAAoB,OAAO,sBAAsB;AAAA,IACjD,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO,gBAAgB;AAAA,IACrC,WAAW,OAAO,aAAa;AAAA,IAC/B,sBAAsB,MAAM,QAAQ,OAAO,oBAAoB,IAC3D,OAAO,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,IACzD,CAAC;AAAA,IACL,YAAY,OAAO,cAAc;AAAA,IACjC,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C,uBAAuB,OAAO,yBAAyB;AAAA,IACvD,SAAS,OAAO,WAAW;AAAA,IAC3B,aAAa,OAAO,cAAc,OAAO,YAAY,YAAY,IAAI;AAAA,IACrE,mBAAmB,OAAO,oBAAoB,OAAO,kBAAkB,YAAY,IAAI;AAAA,IACvF,eAAe,OAAO,iBAAiB;AAAA,IACvC,OAAO,OAAO,SAAS;AAAA,IACvB,WAAW,OAAO,UAAU,YAAY;AAAA,IACxC,WAAW,OAAO,UAAU,YAAY;AAAA,IACxC,WAAW,OAAO,YAAY,OAAO,UAAU,YAAY,IAAI;AAAA,IAC/D,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,EAChD;AACF;AAEA,SAAS,qBAAqB,QAAmC,QAAoC;AACnG,MAAI,OAAO,UAAU,OAAW,QAAO,QAAQ,OAAO;AACtD,MAAI,OAAO,cAAc,OAAW,QAAO,YAAY,OAAO;AAC9D,MAAI,OAAO,oBAAoB,OAAW,QAAO,kBAAkB,OAAO,mBAAmB;AAC7F,MAAI,OAAO,uBAAuB,OAAW,QAAO,qBAAqB,OAAO,sBAAsB;AACtG,MAAI,OAAO,WAAW,OAAW,QAAO,SAAS,OAAO;AACxD,MAAI,OAAO,iBAAiB,OAAW,QAAO,eAAe,OAAO,gBAAgB;AACpF,MAAI,OAAO,cAAc,OAAW,QAAO,YAAY,OAAO,aAAa;AAC3E,MAAI,OAAO,yBAAyB,QAAW;AAC7C,WAAO,uBAAuB,OAAO,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAAA,EACzF;AACA,MAAI,OAAO,eAAe,OAAW,QAAO,aAAa,gBAAgB,OAAO,UAAU;AAC1F,MAAI,OAAO,sBAAsB,OAAW,QAAO,oBAAoB,OAAO,qBAAqB;AACnG,MAAI,OAAO,0BAA0B,OAAW,QAAO,wBAAwB,gBAAgB,OAAO,qBAAqB;AAC3H,MAAI,OAAO,YAAY,OAAW,QAAO,UAAU,OAAO,WAAW;AACrE,MAAI,OAAO,sBAAsB,OAAW,QAAO,oBAAoB,OAAO;AAC9E,MAAI,OAAO,kBAAkB,OAAW,QAAO,gBAAgB,OAAO,iBAAiB;AACvF,MAAI,OAAO,UAAU,OAAW,QAAO,QAAQ,OAAO,SAAS;AACjE;AAEA,SAAS,iBAAiB,QAAmC,UAAmC;AAC9F,SAAO,iBAAiB,SAAS;AACjC,SAAO,WAAW,SAAS;AAC3B,SAAO,QAAQ,SAAS;AACxB,SAAO,YAAY,SAAS;AAC5B,SAAO,kBAAkB,SAAS;AAClC,SAAO,qBAAqB,SAAS;AACrC,SAAO,SAAS,SAAS;AACzB,SAAO,eAAe,SAAS;AAC/B,SAAO,YAAY,SAAS;AAC5B,SAAO,uBAAuB,SAAS,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AACzF,SAAO,aAAa,SAAS;AAC7B,SAAO,oBAAoB,SAAS;AACpC,SAAO,wBAAwB,SAAS;AACxC,SAAO,UAAU,SAAS;AAC1B,SAAO,cAAc,OAAO,SAAS,WAAW;AAChD,SAAO,oBAAoB,OAAO,SAAS,iBAAiB;AAC5D,SAAO,gBAAgB,SAAS;AAChC,SAAO,QAAQ,SAAS;AACxB,SAAO,YAAY,IAAI,KAAK,SAAS,SAAS;AAC9C,SAAO,YAAY,IAAI,KAAK,SAAS,SAAS;AAC9C,SAAO,YAAY,OAAO,SAAS,SAAS;AAC9C;AAEA,eAAe,yBACb,YACA,UACA,gBACA,UACA,QACe;AACf,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACH;AAcA,MAAM,uBAAuB,IAAI,IAAY,uBAAuB;AAEpE,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,SAAS,kBAAkB,OAA6C;AACtE,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEA,SAAS,WAAW,OAA2C;AAC7D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEA,SAAS,gBAAgB,MAA+B,OAAyC;AAC/F,QAAM,WAAW,OAAO,KAAK,QAAQ,IAAI;AACzC,QAAM,YAAY,QAAQ,MAAM,QAAQ,IAAI;AAC5C,SAAO,aAAa;AACtB;AAEA,SAAS,gBAAgB,MAAe,OAAyB;AAC/D,SAAO,KAAK,UAAU,QAAQ,IAAI,MAAM,KAAK,UAAU,SAAS,IAAI;AACtE;AAIA,SAAS,mBAAmB,MAAiC,OAA2C;AACtG,QAAM,aAAa,SAAS,QAAQ,SAAS,UAAa,SAAS,KAAK,OAAO,OAAO,IAAI;AAC1F,QAAM,cAAc,UAAU,QAAQ,UAAU,UAAa,UAAU,KAAK,OAAO,OAAO,KAAK;AAC/F,MAAI,eAAe,QAAQ,gBAAgB,KAAM,QAAO,eAAe;AACvE,SAAO,OAAO,SAAS,UAAU,KAAK,OAAO,SAAS,WAAW,KAAK,eAAe;AACvF;AAEA,SAAS,0BACP,MACA,OACS;AACT,SAAO,KAAK,UAAU,QAAQ,CAAC,CAAC,MAAM,KAAK,UAAU,SAAS,CAAC,CAAC;AAClE;AAEA,SAAS,sBACP,QACA,QACA,OACS;AACT,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,OAAO,UAAU,UAAa,OAAO,UAAU,OAAO;AAAA,IAC/D,KAAK;AACH,aAAO,OAAO,cAAc,UAAa,OAAO,cAAc,OAAO;AAAA,IACvE,KAAK;AACH,aAAO,OAAO,oBAAoB,WAAc,OAAO,mBAAmB,WAAW,OAAO,mBAAmB;AAAA,IACjH,KAAK;AACH,aAAO,OAAO,uBAAuB,WAAc,OAAO,sBAAsB,WAAW,OAAO,sBAAsB;AAAA,IAC1H,KAAK;AACH,aAAO,OAAO,WAAW,UAAa,OAAO,WAAW,OAAO;AAAA,IACjE,KAAK;AACH,aAAO,OAAO,iBAAiB,WAAc,OAAO,gBAAgB,WAAW,OAAO,gBAAgB;AAAA,IACxG,KAAK;AACH,aAAO,OAAO,cAAc,WAAc,OAAO,aAAa,WAAW,OAAO,aAAa;AAAA,IAC/F,KAAK;AACH,aAAO,OAAO,yBAAyB,UAAa,CAAC,0BAA0B,OAAO,sBAAsB,OAAO,oBAAoB;AAAA,IACzI,KAAK;AACH,aAAO,OAAO,eAAe,UAAa,CAAC,mBAAmB,gBAAgB,OAAO,UAAU,GAAG,OAAO,cAAc,IAAI;AAAA,IAC7H,KAAK;AACH,aAAO,OAAO,sBAAsB,WAAc,OAAO,qBAAqB,WAAW,OAAO,qBAAqB;AAAA,IACvH,KAAK;AACH,aAAO,OAAO,0BAA0B,UAAa,CAAC,mBAAmB,gBAAgB,OAAO,qBAAqB,GAAG,OAAO,yBAAyB,IAAI;AAAA,IAC9J,KAAK;AACH,aAAO,OAAO,YAAY,WAAc,OAAO,WAAW,WAAW,OAAO,WAAW;AAAA,IACzF,KAAK;AACH,aAAO,OAAO,sBAAsB,UAAa,CAAC,gBAAgB,OAAO,mBAAmB,OAAO,qBAAqB,IAAI;AAAA,IAC9H,KAAK;AACH,aAAO,OAAO,kBAAkB,UAAa,CAAC,gBAAgB,OAAO,iBAAiB,MAAM,OAAO,iBAAiB,IAAI;AAAA,IAC1H,KAAK;AACH,aAAO,OAAO,UAAU,WAAc,OAAO,SAAS,WAAW,OAAO,SAAS;AAAA,EACrF;AACF;AAEA,SAAS,yBAAyB,QAAmC,QAAuC;AAC1G,SAAO,wBAAwB,KAAK,CAAC,UAAU,sBAAsB,QAAQ,QAAQ,KAAK,CAAC;AAC7F;AAEA,SAAS,0BAA0B,QAAmC,QAAoD;AACxH,SAAO;AAAA,IACL,iBAAiB,OAAO,oBAAoB,SAAY,OAAO,mBAAmB,OAAO,OAAO,mBAAmB;AAAA,IACnH,oBAAoB,OAAO,uBAAuB,SAAY,OAAO,sBAAsB,OAAO,OAAO,sBAAsB;AAAA,IAC/H,WAAW,OAAO,cAAc,SAAY,OAAO,aAAa,OAAO,OAAO,aAAa;AAAA,IAC3F,sBAAsB,OAAO,yBAAyB,SAClD,OAAO,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,IACzD,MAAM,QAAQ,OAAO,oBAAoB,IACvC,OAAO,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,IACzD,CAAC;AAAA,EACT;AACF;AAEA,SAAS,4BAA4B,QAAmC,QAAuC;AAC7G,SAAO,0BAA0B,KAAK,CAAC,UAAU,sBAAsB,QAAQ,QAAQ,KAAK,CAAC;AAC/F;AAEA,SAAS,kBAAkB,UAA6E;AACtG,SAAO,OAAO,OAAO,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS;AAC3E;AAEA,eAAsB,gCACpB,IACA,QAC+B;AAC/B,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,WAAW;AAAA,IACb;AAAA,IACA;AAAA,IACA,EAAE,UAAU,OAAO,UAAU,gBAAgB,OAAO,eAAe;AAAA,EACrE;AACA,SAAO,YAAY,IAAI,CAAC,gBAAgB;AAAA,IACtC,QAAQ,WAAW;AAAA,IACnB,mBAAmB,WAAW;AAAA,IAC9B,eAAe,WAAW,iBAAiB;AAAA,EAC7C,EAAE;AACJ;AAEA,eAAsB,4BACpB,IACA,QAC6B;AAC7B,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,SAAS,EAAE,YAAY,QAAQ,WAAW,OAAO;AAAA,MACjD,OAAO;AAAA,IACT;AAAA,IACA,EAAE,UAAU,OAAO,UAAU,gBAAgB,OAAO,eAAe;AAAA,EACrE;AACA,QAAM,aAAa,YAAY,CAAC;AAChC,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,2BAA2B,MAAM,GAAG,MAAM,sBAAsB;AAAA,IACpE,kBAAkB,WAAW;AAAA,IAC7B,UAAU,OAAO;AAAA,IACjB,gBAAgB,OAAO;AAAA,IACvB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb,CAAC;AACD,SAAO;AAAA,IACL,YAAY,WAAW;AAAA,IACvB,cAAc,WAAW,aAAa,IAAI,CAAC,UAAU,EAAE,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK,EAAE;AAAA,IAChG,aAAa,WAAW,eAAe;AAAA,IACvC,mBAAmB,kBAAkB,WAAW,QAAQ;AAAA,IACxD,wBAAwB,2BAA2B;AAAA,EACrD;AACF;AAEA,eAAe,6BACb,IACA,QACe;AACf,QAAM,kBAAkB,OAAO,iBAAiB,KAAK,EAAE,YAAY,KAAK;AACxE,MAAI,CAAC,gBAAiB;AACtB,QAAM,KAAK,GAAG,UAQX;AACH,QAAM,cAAc,KAAK,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACxD,QAAM,gBAAgB,MAAM,GACzB,WAAW,+BAA+B,EAC1C,OAAO,cAAsB,GAAG,OAAO,CAAC,EACxC,MAAM,aAAa,KAAK,OAAO,QAAQ,EACvC,MAAM,mBAAmB,KAAK,OAAO,cAAc,EACnD,MAAM,cAAc,MAAM,IAAI,EAC9B,MAAM,MAAM,MAAM,OAAO,EAAE,EAC3B,MAAM,+BAAwC,WAAW,SAAS,EAClE,iBAAiB;AACpB,MAAI,OAAO,eAAe,SAAS,CAAC,IAAI,GAAG;AACzC,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,mCAAmC,CAAC;AAAA,EAC5E;AACF;AAEA,eAAe,wBACb,IACA,QACA,QACA,QACgC;AAChC,MAAI,CAAC,kBAAkB,OAAO,MAAM,GAAG;AACrC,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,EACzE;AAEA,QAAM,kBAAkB,OAAO;AAC/B,QAAM,gBAAgB,oBAAoB,UAAa,oBAAoB,OAAO;AAClF,MAAI,kBAAkB,CAAC,kBAAkB,eAAe,KAAK,CAAC,cAAc,OAAO,QAAQ,eAAe,IAAI;AAC5G,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,EACzE;AAEA,QAAM,iBAAiB,yBAAyB,QAAQ,MAAM;AAC9D,MAAI,oBAAoB,OAAO,MAAM,MAAM,kBAAkB,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI;AAC5F,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACxE;AAEA,QAAM,UAAU,0BAA0B,QAAQ,MAAM;AACxD,QAAM,eAAsC,CAAC;AAC7C,QAAM,yBAAyB,OAAO,WAAW,eAAe,oBAAoB;AAEpF,MAAI,eAAe;AACjB,QAAI,OAAO,WAAW,WAAW,oBAAoB,aAAa;AAChE,YAAM,cAAc,MAAM,gCAAgC,IAAI,MAAM;AACpE,YAAM,mBAAmB,MAAM,4BAA4B,IAAI,MAAM;AACrE,YAAM,OAAO,uBAAuB;AAAA,QAClC,WAAW,QAAQ;AAAA,QACnB,2BAA2B,QAAQ,qBAAqB;AAAA,QACxD;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,CAAC,KAAK,SAAS;AACjB,cAAM,IAAI,cAAc,KAAK;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,YACP,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,aAAa,MAAM,EAAE;AAAA,UAC7D;AAAA,QACF,CAAC;AAAA,MACH;AACA,mBAAa,cAAc,oBAAI,KAAK;AAAA,IACtC;AAEA,QAAI,wBAAwB;AAC1B,UAAI,CAAC,WAAW,QAAQ,eAAe,KAAK,CAAC,WAAW,QAAQ,kBAAkB,GAAG;AACnF,cAAM,IAAI,cAAc,KAAK;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,YACP,SAAS,CAAC,oCAAoC;AAAA,UAChD;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,WAAW,OAAO,qBAAqB,oBAAI,KAAK;AACtD,UAAI,SAAS,QAAQ,IAAI,KAAK,IAAI,GAAG;AACnC,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,uCAAuC,CAAC;AAAA,MAChF;AACA,mBAAa,oBAAoB;AAAA,IACnC;AAEA,QAAI,OAAO,WAAW,eAAe,oBAAoB,aAAa;AACpE,UAAI,CAAC,kBAAkB,OAAO,qBAAqB,IAAI,GAAG;AACxD,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC1E;AACA,YAAM,6BAA6B,IAAI,MAAM;AAAA,IAC/C;AAAA,EACF;AAEA,MACE,OAAO,sBAAsB,UAC1B,CAAC,0BACD,CAAC,gBAAgB,OAAO,mBAAmB,OAAO,qBAAqB,IAAI,GAC9E;AACA,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,yCAAyC,CAAC;AAAA,EAClF;AAKA,MACE,OAAO,WAAW,eACf,CAAC,kBAAkB,OAAO,qBAAqB,IAAI,KACnD,4BAA4B,QAAQ,MAAM,GAC7C;AACA,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,MAAM,yBAA6F;AAAA,EACjG,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,EAAE,QAAQ,OAAO,IAAI,sBAAsB,uBAAuB,QAAQ;AAChF,UAAM,QAAQ,wBAAwB,QAAQ;AAC9C,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,QAAI,OAAO,WAAW,UAAa,OAAO,WAAW,SAAS;AAC5D,YAAM,IAAI,cAAc,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,IACzE;AAEA,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,QAAI;AAEJ,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR,aAAa;AAAA,UACX,IAAI,OAAO;AAAA,UACX,gBAAgB,OAAO;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AACJ,mBAAS,cAAc,OAAO,2BAA2B;AAAA,YACvD,gBAAgB,MAAM;AAAA,YACtB,UAAU,MAAM;AAAA,YAChB,OAAO,OAAO;AAAA,YACd,WAAW,OAAO;AAAA,YAClB,iBAAiB,OAAO,mBAAmB;AAAA,YAC3C,oBAAoB,OAAO,sBAAsB;AAAA,YACjD,QAAQ,OAAO,UAAU;AAAA,YACzB,cAAc,OAAO,gBAAgB;AAAA,YACrC,WAAW,OAAO,aAAa;AAAA,YAC/B,sBAAsB,OAAO,uBAAuB,OAAO,qBAAqB,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,IAAI,CAAC;AAAA,YAClH,YAAY,gBAAgB,OAAO,UAAU;AAAA,YAC7C,mBAAmB,OAAO,qBAAqB;AAAA,YAC/C,uBAAuB,gBAAgB,OAAO,qBAAqB;AAAA,YACnE,SAAS,OAAO,WAAW;AAAA,YAC3B,mBAAmB;AAAA,YACnB,eAAe,OAAO,iBAAiB;AAAA,YACvC,OAAO,OAAO,SAAS;AAAA,UACzB,CAAC;AACD,wBAAc,QAAQ,MAAM;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,UAAU,OAAO,GAAG;AAAA,EAC/B;AAAA,EACA,cAAc,OAAO,WAAW,QAAQ,QAAQ;AAC9C,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,WAAO,sBAAsB,eAAe,OAAO,QAAQ;AAAA,EAC7D;AAAA,EACA,UAAU,OAAO,EAAE,UAAU,MAAM;AACjC,UAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,WAAO;AAAA,MACL,aAAa,UAAU,gCAAgC,qCAAqC;AAAA,MAC5F,cAAc;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,gBAAgB,MAAM;AAAA,MACtB,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM,EAAE,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAAyC,QAAQ;AACjE,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO;AACZ,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,SAAS,MAAM,cAAc,QAAQ,2BAA2B,EAAE,IAAI,MAAM,GAAG,CAAC;AACtF,QAAI,CAAC,OAAQ;AACb,sBAAkB,KAAK,OAAO,QAAQ;AACtC,4BAAwB,KAAK,OAAO,cAAc;AAClD,WAAO,YAAY,oBAAI,KAAK;AAC5B,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,UAAM,cAAc,yBAAyB,QAAW,MAAM,UAAU,MAAS;AACjF,UAAM,yBAAyB,YAAY,MAAM,IAAI,MAAM,gBAAgB,MAAM,UAAU,WAAW;AACtG,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EACA,MAAM,eAAiH;AAAA,IACrH,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,aAAa,CAAC,YAAY,EAAE,UAAU,OAAO,GAAG;AAAA,IAChD,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc,OAAO,EAAE,KAAK,QAAQ,SAAS,MAAM;AACjD,UAAI,CAAC,SAAS,UAAU,CAAC,OAAO,KAAK,SAAS,MAAM,EAAE,OAAQ;AAC9D,YAAM;AAAA,QACJ,IAAI,UAAU,QAAQ,YAAY;AAAA,QAClC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,MAAM,yBAA6F;AAAA,EACjG,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,EAAE,OAAO,IAAI,sBAAsB,uBAAuB,QAAQ;AACxE,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,WAAW,MAAM,sBAAsB,eAAe,OAAO,EAAE;AACrE,QAAI,UAAU;AACZ,wBAAkB,KAAK,SAAS,QAAQ;AACxC,8BAAwB,KAAK,SAAS,cAAc;AAAA,IACtD;AACA,WAAO,WAAW,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,EAC5C;AAAA,EACA,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,EAAE,QAAQ,OAAO,IAAI,sBAAsB,uBAAuB,QAAQ;AAChF,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,SAAS,MAAM,cAAc,QAAQ,2BAA2B,EAAE,IAAI,OAAO,IAAI,WAAW,KAAK,CAAC;AACxG,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,yCAAyC,CAAC;AAC7F,sBAAkB,KAAK,OAAO,QAAQ;AACtC,4BAAwB,KAAK,OAAO,cAAc;AAClD,UAAM,iBAAiB,OAAO;AAE9B,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO,EAAE,UAAU,OAAO,UAAU,gBAAgB,OAAO,eAAe;AAAA,MAC1E,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR,aAAa;AAAA,UACX,IAAI,OAAO;AAAA,UACX,gBAAgB,OAAO;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,YAAY;AACV,gBAAM,eAAe,MAAM,wBAAwB,eAAe,QAAQ,QAAQ,MAAM;AACxF,+BAAqB,QAAQ,MAAM;AACnC,cAAI,aAAa,gBAAgB,OAAW,QAAO,cAAc,aAAa;AAC9E,cAAI,aAAa,sBAAsB,OAAW,QAAO,oBAAoB,aAAa;AAAA,QAC5F;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,mBAAmB,OAAO,WAAW,iBACvC,OACA,mBAAmB,WAAW,OAAO,WAAW,cAC9C,2CACA,mBAAmB,eAAe,OAAO,WAAW,cAClD,kDACA,mBAAmB,eAAe,OAAO,WAAW,cAClD,2CACA;AACV,QAAI,kBAAkB;AACpB,YAAM,uBAAuB,IAAI,WAAW,kBAAkB;AAAA,QAC5D,IAAI,OAAO;AAAA,QACX,UAAU,OAAO;AAAA,QACjB,gBAAgB,OAAO;AAAA,QACvB,OAAO,OAAO;AAAA,QACd,iBAAiB,OAAO,mBAAmB;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,UAAU,OAAO,IAAI,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA,EACA,cAAc,OAAO,WAAW,QAAQ,QAAQ;AAC9C,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,WAAO,sBAAsB,eAAe,OAAO,QAAQ;AAAA,EAC7D;AAAA,EACA,UAAU,OAAO,EAAE,UAAU,MAAM;AACjC,UAAM,SAAS,UAAU;AACzB,UAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,SAAS,eAAe,QAAQ,KAAK,EAAG,QAAO,EAAE,SAAS,KAAK;AACnE,UAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,WAAO;AAAA,MACL,aAAa,UAAU,gCAAgC,qCAAqC;AAAA,MAC5F,cAAc;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,gBAAgB;AAAA,MAChB,eAAe,SAAS;AAAA,MACxB,SAAS;AAAA,QACP,MAAM,EAAE,QAAQ,OAAO,SAAS,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAAyC,QAAQ;AACjE,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,QAAI,SAAS,MAAM,cAAc,QAAQ,2BAA2B,EAAE,IAAI,OAAO,GAAG,CAAC;AACrF,QAAI,CAAC,QAAQ;AACX,eAAS,cAAc,OAAO,2BAA2B,0BAA0B,MAAM,CAAC;AAC1F,oBAAc,QAAQ,MAAM;AAAA,IAC9B,OAAO;AACL,wBAAkB,KAAK,OAAO,QAAQ;AACtC,8BAAwB,KAAK,OAAO,cAAc;AAClD,uBAAiB,QAAQ,MAAM;AAAA,IACjC;AACA,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,UAAM,cAAc,yBAAyB,OAAO,UAAU,QAAW,SAAS,OAAO,UAAU,MAAS;AAC5G,UAAM,yBAAyB,YAAY,OAAO,IAAI,OAAO,gBAAgB,OAAO,UAAU,WAAW;AACzG,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,MAAM,yBAAsI;AAAA,EAC1I,IAAI;AAAA,EACJ,MAAM,QAAQ,OAAO,KAAK;AACxB,UAAM,WAAW,UAAU,OAAO,0CAA0C;AAC5E,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,WAAW,MAAM,sBAAsB,eAAe,QAAQ;AACpE,QAAI,UAAU;AACZ,wBAAkB,KAAK,SAAS,QAAQ;AACxC,8BAAwB,KAAK,SAAS,cAAc;AAAA,IACtD;AACA,WAAO,WAAW,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,EAC5C;AAAA,EACA,MAAM,QAAQ,OAAO,KAAK;AACxB,UAAM,WAAW,UAAU,OAAO,0CAA0C;AAC5E,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,UAAM,SAAS,MAAM,cAAc,QAAQ,2BAA2B,EAAE,IAAI,UAAU,WAAW,KAAK,CAAC;AACvG,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,yCAAyC,CAAC;AAC7F,sBAAkB,KAAK,OAAO,QAAQ;AACtC,4BAAwB,KAAK,OAAO,cAAc;AAClD,QAAI,kBAAkB,OAAO,MAAM,KAAK,CAAC,mBAAmB,OAAO,MAAM,GAAG;AAC1E,YAAM,IAAI,cAAc,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,IACxE;AACA,QAAI,OAAO,WAAW,aAAa;AACjC,UAAI,CAAC,kBAAkB,OAAO,qBAAqB,IAAI,GAAG;AACxD,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC1E;AACA,YAAM,6BAA6B,eAAe,MAAM;AAAA,IAC1D;AAEA,UAAM,WAAW,MAAM,sBAAsB,eAAe,QAAQ;AACpE,WAAO,YAAY,oBAAI,KAAK;AAC5B,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,QAAI,UAAU,QAAQ;AACpB,YAAM,cAAc,yBAAyB,SAAS,QAAQ,MAAS;AACvE,YAAM,yBAAyB,YAAY,SAAS,IAAI,SAAS,gBAAgB,SAAS,UAAU,WAAW;AAAA,IACjH;AACA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,EAAE,UAAU,OAAO,IAAI,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA,EACA,UAAU,OAAO,EAAE,UAAU,MAAM;AACjC,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,WAAO;AAAA,MACL,aAAa,UAAU,gCAAgC,qCAAqC;AAAA,MAC5F,cAAc;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,gBAAgB;AAAA,MAChB,SAAS;AAAA,QACP,MAAM,EAAE,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAAyC,QAAQ;AACjE,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAiB,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC1E,QAAI,SAAS,MAAM,cAAc,QAAQ,2BAA2B,EAAE,IAAI,OAAO,GAAG,CAAC;AACrF,QAAI,CAAC,QAAQ;AACX,eAAS,cAAc,OAAO,2BAA2B,0BAA0B,MAAM,CAAC;AAC1F,oBAAc,QAAQ,MAAM;AAAA,IAC9B,OAAO;AACL,wBAAkB,KAAK,OAAO,QAAQ;AACtC,8BAAwB,KAAK,OAAO,cAAc;AAClD,uBAAiB,QAAQ,MAAM;AAAA,IACjC;AACA,UAAM,cAAc,MAAM;AAE1B,UAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,QAAI,OAAO,QAAQ;AACjB,YAAM,yBAAyB,YAAY,OAAO,IAAI,OAAO,gBAAgB,OAAO,UAAU,OAAO,MAAM;AAAA,IAC7G;AACA,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,OAAO;AAAA,QACX,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,gBAAgB,sBAAsB;AACtC,gBAAgB,sBAAsB;AACtC,gBAAgB,sBAAsB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -43,6 +43,7 @@ function rejectServerComputedFields(fields) {
|
|
|
43
43
|
const record = input;
|
|
44
44
|
for (const field of fields) {
|
|
45
45
|
if (!(field in record)) continue;
|
|
46
|
+
if (record[field] === null || record[field] === void 0) continue;
|
|
46
47
|
context.addIssue({
|
|
47
48
|
code: z.ZodIssueCode.custom,
|
|
48
49
|
path: [field],
|
|
@@ -234,7 +235,9 @@ const statementBaseSchema = z.object({
|
|
|
234
235
|
orderSnapshot: orderSnapshotSchema.optional().nullable(),
|
|
235
236
|
notes: z.string().max(5e3).optional().nullable()
|
|
236
237
|
});
|
|
237
|
-
const statementCreateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(
|
|
238
|
+
const statementCreateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(
|
|
239
|
+
statementBaseSchema.omit({ referenceIssuedAt: true })
|
|
240
|
+
);
|
|
238
241
|
const statementUpdateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(
|
|
239
242
|
z.object({
|
|
240
243
|
id: uuid()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/eudr/data/validators.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\n\nimport { EUDR_RISK_CRITERIA_KEYS } from '../lib/reference-data'\n\nexport const EUDR_COMMODITIES = ['cattle', 'cocoa', 'coffee', 'oil_palm', 'rubber', 'soya', 'wood'] as const\nexport type EudrCommodity = (typeof EUDR_COMMODITIES)[number]\n\nexport const EUDR_SUBMISSION_STATUSES = ['draft', 'submitted', 'verified', 'rejected'] as const\nexport type EudrSubmissionStatus = (typeof EUDR_SUBMISSION_STATUSES)[number]\n\nexport const EUDR_STATEMENT_STATUSES = ['draft', 'submitted', 'available', 'withdrawn', 'archived'] as const\nexport type EudrStatementStatus = (typeof EUDR_STATEMENT_STATUSES)[number]\n\nexport const EUDR_PLOT_TYPES = ['point', 'polygon'] as const\nexport type EudrPlotType = (typeof EUDR_PLOT_TYPES)[number]\n\nexport const EUDR_RISK_TIERS = ['low', 'standard', 'high', 'mixed', 'unknown'] as const\nexport type EudrRiskTier = (typeof EUDR_RISK_TIERS)[number]\n\nexport const EUDR_RISK_CONCLUSIONS = ['negligible', 'non_negligible'] as const\nexport type EudrRiskConclusion = (typeof EUDR_RISK_CONCLUSIONS)[number]\n\nexport const EUDR_CRITERIA_ANSWERS = ['no_concern', 'concern', 'not_applicable'] as const\nexport type EudrCriteriaAnswer = (typeof EUDR_CRITERIA_ANSWERS)[number]\n\nexport const EUDR_MITIGATION_TYPES = [\n 'request_documents',\n 'supplier_audit',\n 'satellite_verification',\n 'certification_check',\n 'switch_sourcing',\n 'other',\n] as const\nexport type EudrMitigationType = (typeof EUDR_MITIGATION_TYPES)[number]\n\nexport const EUDR_MITIGATION_STATUSES = ['planned', 'in_progress', 'completed', 'cancelled'] as const\nexport type EudrMitigationStatus = (typeof EUDR_MITIGATION_STATUSES)[number]\n\nexport const EUDR_ACTIVITY_TYPES = ['import', 'export', 'domestic_production', 'trade'] as const\nexport type EudrActivityType = (typeof EUDR_ACTIVITY_TYPES)[number]\n\nexport const EUDR_ACTOR_ROLES = ['operator', 'non_sme_trader', 'sme_trader'] as const\nexport type EudrActorRole = (typeof EUDR_ACTOR_ROLES)[number]\n\nexport const GEOJSON_TYPES = ['Feature', 'FeatureCollection', 'Point', 'Polygon', 'MultiPolygon'] as const\n\nconst uuid = () => z.string().uuid()\nconst geoJsonSizeLimit = 1_048_576\nconst serverComputedSubmissionFields = ['completenessScore', 'missingFields'] as const\nconst serverComputedPlotFields = ['validationWarnings', 'computedArea'] as const\nconst serverComputedRiskAssessmentFields = ['countryRisks', 'overallTier', 'isSimplified', 'assessedByName'] as const\nconst serverComputedMitigationActionFields = ['completedAt'] as const\nconst serverComputedStatementFields = ['submittedAt'] as const\nconst riskCriteriaKeySet = new Set(EUDR_RISK_CRITERIA_KEYS)\n\nconst productSnapshotSchema = z.object({\n name: z.string().max(500).optional().nullable(),\n sku: z.string().max(255).optional().nullable(),\n})\nconst supplierSnapshotSchema = z.object({\n displayName: z.string().max(500).optional().nullable(),\n})\nconst orderSnapshotSchema = z.object({\n orderNumber: z.string().max(255).optional().nullable(),\n})\n\nfunction rejectServerComputedFields(fields: readonly string[]): z.ZodType<unknown> {\n return z.unknown().superRefine((input, context) => {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) return\n const record = input as Record<string, unknown>\n for (const field of fields) {\n if (!(field in record)) continue\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [field],\n message: 'eudr.errors.serverComputedField',\n })\n }\n })\n}\n\nfunction requiredUnknown(message: string): z.ZodType<unknown> {\n return z.unknown().refine((value) => value !== undefined, { message })\n}\n\nfunction isIsoDate(value: string): boolean {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (match === null) return false\n const year = Number(match[1])\n const month = Number(match[2])\n const day = Number(match[3])\n const date = new Date(Date.UTC(year, month - 1, day))\n return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n}\n\n// Route mapInput parses these schemas first (string -> Date) and commands parse\n// the mapped input again, so both schemas must also accept Date instances.\nconst isoDateSchema = () => z.union([\n z.date(),\n z\n .string()\n .refine(isIsoDate, { message: 'eudr.errors.invalidDate' })\n .transform((value) => new Date(`${value}T00:00:00.000Z`)),\n])\n\nconst isoDateTimeSchema = () => z.union([\n z.date(),\n z\n .string()\n .datetime({ message: 'eudr.errors.invalidDateTime' })\n .transform((value) => new Date(value)),\n])\n\nconst pastOrNowIsoDateTimeSchema = () => isoDateTimeSchema().refine((value) => value.getTime() <= Date.now(), {\n message: 'eudr.errors.assessedAtInFuture',\n})\n\nconst isoDateOrDateTimeSchema = () => z.union([isoDateSchema(), isoDateTimeSchema()])\n\n// Country codes are validated through ICU rather than the shared country helper.\n// That helper imports language-subtag-registry's JSON, and the build strips the\n// import attribute Node's ESM loader requires, so importing it from server-side\n// code (CLI, workers) fails with ERR_IMPORT_ATTRIBUTE_MISSING. UI components can\n// keep using the helper because bundlers resolve the JSON themselves.\nconst countryDisplayNames = typeof Intl !== 'undefined' && typeof Intl.DisplayNames !== 'undefined'\n ? new Intl.DisplayNames(['en'], { type: 'region' })\n : null\n\nfunction isIsoCountryCode(value: string): boolean {\n // Without ICU data there is nothing to check against, so accept the shape.\n if (!countryDisplayNames) return true\n try {\n // Intl echoes the input back when it cannot resolve the region.\n const label = countryDisplayNames.of(value)\n return typeof label === 'string' && label !== value\n } catch {\n return false\n }\n}\n\nconst countryCodeSchema = () => z\n .string()\n .regex(/^[A-Za-z]{2}$/)\n .transform((value) => value.toUpperCase())\n .refine(isIsoCountryCode, { message: 'eudr.errors.invalidCountry' })\n\nconst referencedStatementCodeSchema = (maxLength: number) => z\n .string()\n .trim()\n .min(1)\n .max(maxLength)\n .regex(/^[A-Za-z0-9._/-]+$/, { message: 'eudr.errors.invalidReferenceIdentifier' })\n .transform((value) => value.toUpperCase())\n\nexport const referencedStatementSchema = z.object({\n referenceNumber: referencedStatementCodeSchema(32),\n verificationNumber: referencedStatementCodeSchema(16).optional(),\n})\n\nexport const geoJsonSchema = z\n .object({\n type: z.enum(GEOJSON_TYPES),\n })\n .passthrough()\n .superRefine((value, context) => {\n try {\n const serialized = JSON.stringify(value)\n if (serialized.length <= geoJsonSizeLimit) return\n } catch {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'eudr.errors.geolocationTooLarge',\n })\n return\n }\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'eudr.errors.geolocationTooLarge',\n })\n })\n\nexport const productMappingCreateSchema = z.object({\n productId: uuid(),\n productSnapshot: productSnapshotSchema.optional().nullable(),\n commodity: z.enum(EUDR_COMMODITIES),\n hsCode: z.string().max(20).optional().nullable(),\n speciesScientificName: z.string().trim().max(256).optional().nullable(),\n speciesCommonName: z.string().trim().max(256).optional().nullable(),\n isInScope: z.boolean().optional(),\n notes: z.string().max(5000).optional().nullable(),\n})\n\nexport const productMappingUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(productMappingCreateSchema.partial())\n\nconst plotBaseSchema = z.object({\n supplierEntityId: uuid(),\n supplierSnapshot: supplierSnapshotSchema.optional().nullable(),\n name: z.string().min(1).max(200),\n externalId: z.string().max(100).optional().nullable(),\n description: z.string().max(2000).optional().nullable(),\n originCountry: countryCodeSchema(),\n geometry: requiredUnknown('eudr.errors.geometryRequired'),\n areaHa: z.coerce.number().positive().max(100_000).optional().nullable(),\n producerName: z.string().max(500).optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const plotCreateSchema = rejectServerComputedFields(serverComputedPlotFields).pipe(plotBaseSchema)\n\nexport const plotUpdateSchema = rejectServerComputedFields(serverComputedPlotFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(plotBaseSchema.partial()),\n)\n\nconst evidenceSubmissionBaseSchema = z.object({\n supplierEntityId: uuid(),\n supplierSnapshot: supplierSnapshotSchema.optional().nullable(),\n commodity: z.enum(EUDR_COMMODITIES),\n productMappingId: uuid().optional().nullable(),\n statementId: uuid().optional().nullable(),\n originCountry: countryCodeSchema().optional().nullable(),\n geolocation: geoJsonSchema.optional().nullable(),\n quantityKg: z.coerce.number().positive().optional().nullable(),\n batchNumber: z.string().max(255).optional().nullable(),\n harvestFrom: z.coerce.date().optional().nullable(),\n harvestTo: z.coerce.date().optional().nullable(),\n producerName: z.string().max(500).optional().nullable(),\n attachmentIds: z.array(uuid()).max(100).optional(),\n plotIds: z.array(uuid()).max(200).optional(),\n status: z.enum(EUDR_SUBMISSION_STATUSES).optional(),\n notes: z.string().max(5000).optional().nullable(),\n})\n\nfunction validateHarvestRange(input: { harvestFrom?: Date | null; harvestTo?: Date | null }, context: z.RefinementCtx): void {\n if (!input.harvestFrom || !input.harvestTo || input.harvestFrom <= input.harvestTo) return\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['harvestTo'],\n message: 'eudr.errors.harvestRange',\n })\n}\n\nexport const evidenceSubmissionCreateSchema = rejectServerComputedFields(serverComputedSubmissionFields).pipe(\n evidenceSubmissionBaseSchema.superRefine(validateHarvestRange),\n)\n\nexport const evidenceSubmissionUpdateSchema = rejectServerComputedFields(serverComputedSubmissionFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(evidenceSubmissionBaseSchema.partial())\n .superRefine(validateHarvestRange),\n)\n\nconst riskCriteriaEntrySchema = z.object({\n answer: z.enum(EUDR_CRITERIA_ANSWERS),\n note: z.string().max(2000).optional().nullable(),\n})\n\nconst riskCriteriaSchema = z.record(z.string(), riskCriteriaEntrySchema).superRefine((criteria, context) => {\n for (const key of Object.keys(criteria)) {\n if (riskCriteriaKeySet.has(key)) continue\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [key],\n message: 'eudr.errors.invalidRiskCriterion',\n })\n }\n})\n\nconst riskAssessmentBaseSchema = z.object({\n statementId: uuid(),\n criteria: riskCriteriaSchema,\n conclusion: z.enum(EUDR_RISK_CONCLUSIONS),\n reviewDueAt: isoDateOrDateTimeSchema().optional().nullable(),\n assessedAt: pastOrNowIsoDateTimeSchema().optional(),\n notes: z.string().max(4000).optional().nullable(),\n})\n\nexport const riskAssessmentCreateSchema = rejectServerComputedFields(serverComputedRiskAssessmentFields).pipe(riskAssessmentBaseSchema)\n\nexport const riskAssessmentUpdateSchema = rejectServerComputedFields(serverComputedRiskAssessmentFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(riskAssessmentBaseSchema.partial()),\n)\n\nconst mitigationActionBaseSchema = z.object({\n riskAssessmentId: uuid(),\n actionType: z.enum(EUDR_MITIGATION_TYPES).optional(),\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional().nullable(),\n status: z.enum(EUDR_MITIGATION_STATUSES).optional(),\n dueDate: isoDateSchema().optional().nullable(),\n notes: z.string().max(2000).optional().nullable(),\n})\n\nexport const mitigationActionCreateSchema = rejectServerComputedFields(serverComputedMitigationActionFields).pipe(mitigationActionBaseSchema)\n\nexport const mitigationActionUpdateSchema = rejectServerComputedFields(serverComputedMitigationActionFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(mitigationActionBaseSchema.partial()),\n)\n\nconst statementBaseSchema = z.object({\n title: z.string().min(1).max(500),\n commodity: z.enum(EUDR_COMMODITIES),\n referenceNumber: z.string().max(255).optional().nullable(),\n verificationNumber: z.string().max(255).optional().nullable(),\n status: z.enum(EUDR_STATEMENT_STATUSES).optional(),\n activityType: z.enum(EUDR_ACTIVITY_TYPES).optional().nullable(),\n actorRole: z.enum(EUDR_ACTOR_ROLES).optional().nullable(),\n referencedStatements: z.array(referencedStatementSchema).max(100).optional(),\n quantityKg: z.coerce.number().positive().optional().nullable(),\n supplementaryUnit: z.string().max(16).optional().nullable(),\n supplementaryQuantity: z.coerce.number().positive().optional().nullable(),\n orderId: uuid().optional().nullable(),\n referenceIssuedAt: isoDateTimeSchema().optional().nullable(),\n orderSnapshot: orderSnapshotSchema.optional().nullable(),\n notes: z.string().max(5000).optional().nullable(),\n})\n\nexport const statementCreateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(statementBaseSchema)\n\nexport const statementUpdateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(statementBaseSchema.partial()),\n)\n\nexport type ProductMappingCreateInput = z.infer<typeof productMappingCreateSchema>\nexport type ProductMappingUpdateInput = z.infer<typeof productMappingUpdateSchema>\nexport type PlotCreateInput = z.infer<typeof plotCreateSchema>\nexport type PlotUpdateInput = z.infer<typeof plotUpdateSchema>\nexport type EvidenceSubmissionCreateInput = z.infer<typeof evidenceSubmissionCreateSchema>\nexport type EvidenceSubmissionUpdateInput = z.infer<typeof evidenceSubmissionUpdateSchema>\nexport type RiskAssessmentCreateInput = z.infer<typeof riskAssessmentCreateSchema>\nexport type RiskAssessmentUpdateInput = z.infer<typeof riskAssessmentUpdateSchema>\nexport type MitigationActionCreateInput = z.infer<typeof mitigationActionCreateSchema>\nexport type MitigationActionUpdateInput = z.infer<typeof mitigationActionUpdateSchema>\nexport type StatementCreateInput = z.infer<typeof statementCreateSchema>\nexport type StatementUpdateInput = z.infer<typeof statementUpdateSchema>\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,+BAA+B;AAEjC,MAAM,mBAAmB,CAAC,UAAU,SAAS,UAAU,YAAY,UAAU,QAAQ,MAAM;AAG3F,MAAM,2BAA2B,CAAC,SAAS,aAAa,YAAY,UAAU;AAG9E,MAAM,0BAA0B,CAAC,SAAS,aAAa,aAAa,aAAa,UAAU;AAG3F,MAAM,kBAAkB,CAAC,SAAS,SAAS;AAG3C,MAAM,kBAAkB,CAAC,OAAO,YAAY,QAAQ,SAAS,SAAS;AAGtE,MAAM,wBAAwB,CAAC,cAAc,gBAAgB;AAG7D,MAAM,wBAAwB,CAAC,cAAc,WAAW,gBAAgB;AAGxE,MAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,2BAA2B,CAAC,WAAW,eAAe,aAAa,WAAW;AAGpF,MAAM,sBAAsB,CAAC,UAAU,UAAU,uBAAuB,OAAO;AAG/E,MAAM,mBAAmB,CAAC,YAAY,kBAAkB,YAAY;AAGpE,MAAM,gBAAgB,CAAC,WAAW,qBAAqB,SAAS,WAAW,cAAc;AAEhG,MAAM,OAAO,MAAM,EAAE,OAAO,EAAE,KAAK;AACnC,MAAM,mBAAmB;
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\n\nimport { EUDR_RISK_CRITERIA_KEYS } from '../lib/reference-data'\n\nexport const EUDR_COMMODITIES = ['cattle', 'cocoa', 'coffee', 'oil_palm', 'rubber', 'soya', 'wood'] as const\nexport type EudrCommodity = (typeof EUDR_COMMODITIES)[number]\n\nexport const EUDR_SUBMISSION_STATUSES = ['draft', 'submitted', 'verified', 'rejected'] as const\nexport type EudrSubmissionStatus = (typeof EUDR_SUBMISSION_STATUSES)[number]\n\nexport const EUDR_STATEMENT_STATUSES = ['draft', 'submitted', 'available', 'withdrawn', 'archived'] as const\nexport type EudrStatementStatus = (typeof EUDR_STATEMENT_STATUSES)[number]\n\nexport const EUDR_PLOT_TYPES = ['point', 'polygon'] as const\nexport type EudrPlotType = (typeof EUDR_PLOT_TYPES)[number]\n\nexport const EUDR_RISK_TIERS = ['low', 'standard', 'high', 'mixed', 'unknown'] as const\nexport type EudrRiskTier = (typeof EUDR_RISK_TIERS)[number]\n\nexport const EUDR_RISK_CONCLUSIONS = ['negligible', 'non_negligible'] as const\nexport type EudrRiskConclusion = (typeof EUDR_RISK_CONCLUSIONS)[number]\n\nexport const EUDR_CRITERIA_ANSWERS = ['no_concern', 'concern', 'not_applicable'] as const\nexport type EudrCriteriaAnswer = (typeof EUDR_CRITERIA_ANSWERS)[number]\n\nexport const EUDR_MITIGATION_TYPES = [\n 'request_documents',\n 'supplier_audit',\n 'satellite_verification',\n 'certification_check',\n 'switch_sourcing',\n 'other',\n] as const\nexport type EudrMitigationType = (typeof EUDR_MITIGATION_TYPES)[number]\n\nexport const EUDR_MITIGATION_STATUSES = ['planned', 'in_progress', 'completed', 'cancelled'] as const\nexport type EudrMitigationStatus = (typeof EUDR_MITIGATION_STATUSES)[number]\n\nexport const EUDR_ACTIVITY_TYPES = ['import', 'export', 'domestic_production', 'trade'] as const\nexport type EudrActivityType = (typeof EUDR_ACTIVITY_TYPES)[number]\n\nexport const EUDR_ACTOR_ROLES = ['operator', 'non_sme_trader', 'sme_trader'] as const\nexport type EudrActorRole = (typeof EUDR_ACTOR_ROLES)[number]\n\nexport const GEOJSON_TYPES = ['Feature', 'FeatureCollection', 'Point', 'Polygon', 'MultiPolygon'] as const\n\nconst uuid = () => z.string().uuid()\nconst geoJsonSizeLimit = 1_048_576\n// Two conventions for server-managed fields on these entities: fields listed below\n// are never advertised as create inputs, so a client sending a real value is rejected\n// (`rejectServerComputedFields` tolerates a null/undefined no-op echo). A field that\n// WAS advertised in the create schema \u2014 statements' `referenceIssuedAt` \u2014 is instead\n// dropped from the create schema, so it is stripped rather than rejected (#5508).\nconst serverComputedSubmissionFields = ['completenessScore', 'missingFields'] as const\nconst serverComputedPlotFields = ['validationWarnings', 'computedArea'] as const\nconst serverComputedRiskAssessmentFields = ['countryRisks', 'overallTier', 'isSimplified', 'assessedByName'] as const\nconst serverComputedMitigationActionFields = ['completedAt'] as const\nconst serverComputedStatementFields = ['submittedAt'] as const\nconst riskCriteriaKeySet = new Set(EUDR_RISK_CRITERIA_KEYS)\n\nconst productSnapshotSchema = z.object({\n name: z.string().max(500).optional().nullable(),\n sku: z.string().max(255).optional().nullable(),\n})\nconst supplierSnapshotSchema = z.object({\n displayName: z.string().max(500).optional().nullable(),\n})\nconst orderSnapshotSchema = z.object({\n orderNumber: z.string().max(255).optional().nullable(),\n})\n\n// A whole-object POST echoes server-computed fields back with their no-op value\n// (a fresh draft's `submittedAt` is null), so tolerate a null/undefined echo and\n// reject only a meaningful attempt to set server-owned state (#5508).\nfunction rejectServerComputedFields(fields: readonly string[]): z.ZodType<unknown> {\n return z.unknown().superRefine((input, context) => {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) return\n const record = input as Record<string, unknown>\n for (const field of fields) {\n if (!(field in record)) continue\n if (record[field] === null || record[field] === undefined) continue\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [field],\n message: 'eudr.errors.serverComputedField',\n })\n }\n })\n}\n\nfunction requiredUnknown(message: string): z.ZodType<unknown> {\n return z.unknown().refine((value) => value !== undefined, { message })\n}\n\nfunction isIsoDate(value: string): boolean {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (match === null) return false\n const year = Number(match[1])\n const month = Number(match[2])\n const day = Number(match[3])\n const date = new Date(Date.UTC(year, month - 1, day))\n return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n}\n\n// Route mapInput parses these schemas first (string -> Date) and commands parse\n// the mapped input again, so both schemas must also accept Date instances.\nconst isoDateSchema = () => z.union([\n z.date(),\n z\n .string()\n .refine(isIsoDate, { message: 'eudr.errors.invalidDate' })\n .transform((value) => new Date(`${value}T00:00:00.000Z`)),\n])\n\nconst isoDateTimeSchema = () => z.union([\n z.date(),\n z\n .string()\n .datetime({ message: 'eudr.errors.invalidDateTime' })\n .transform((value) => new Date(value)),\n])\n\nconst pastOrNowIsoDateTimeSchema = () => isoDateTimeSchema().refine((value) => value.getTime() <= Date.now(), {\n message: 'eudr.errors.assessedAtInFuture',\n})\n\nconst isoDateOrDateTimeSchema = () => z.union([isoDateSchema(), isoDateTimeSchema()])\n\n// Country codes are validated through ICU rather than the shared country helper.\n// That helper imports language-subtag-registry's JSON, and the build strips the\n// import attribute Node's ESM loader requires, so importing it from server-side\n// code (CLI, workers) fails with ERR_IMPORT_ATTRIBUTE_MISSING. UI components can\n// keep using the helper because bundlers resolve the JSON themselves.\nconst countryDisplayNames = typeof Intl !== 'undefined' && typeof Intl.DisplayNames !== 'undefined'\n ? new Intl.DisplayNames(['en'], { type: 'region' })\n : null\n\nfunction isIsoCountryCode(value: string): boolean {\n // Without ICU data there is nothing to check against, so accept the shape.\n if (!countryDisplayNames) return true\n try {\n // Intl echoes the input back when it cannot resolve the region.\n const label = countryDisplayNames.of(value)\n return typeof label === 'string' && label !== value\n } catch {\n return false\n }\n}\n\nconst countryCodeSchema = () => z\n .string()\n .regex(/^[A-Za-z]{2}$/)\n .transform((value) => value.toUpperCase())\n .refine(isIsoCountryCode, { message: 'eudr.errors.invalidCountry' })\n\nconst referencedStatementCodeSchema = (maxLength: number) => z\n .string()\n .trim()\n .min(1)\n .max(maxLength)\n .regex(/^[A-Za-z0-9._/-]+$/, { message: 'eudr.errors.invalidReferenceIdentifier' })\n .transform((value) => value.toUpperCase())\n\nexport const referencedStatementSchema = z.object({\n referenceNumber: referencedStatementCodeSchema(32),\n verificationNumber: referencedStatementCodeSchema(16).optional(),\n})\n\nexport const geoJsonSchema = z\n .object({\n type: z.enum(GEOJSON_TYPES),\n })\n .passthrough()\n .superRefine((value, context) => {\n try {\n const serialized = JSON.stringify(value)\n if (serialized.length <= geoJsonSizeLimit) return\n } catch {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'eudr.errors.geolocationTooLarge',\n })\n return\n }\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'eudr.errors.geolocationTooLarge',\n })\n })\n\nexport const productMappingCreateSchema = z.object({\n productId: uuid(),\n productSnapshot: productSnapshotSchema.optional().nullable(),\n commodity: z.enum(EUDR_COMMODITIES),\n hsCode: z.string().max(20).optional().nullable(),\n speciesScientificName: z.string().trim().max(256).optional().nullable(),\n speciesCommonName: z.string().trim().max(256).optional().nullable(),\n isInScope: z.boolean().optional(),\n notes: z.string().max(5000).optional().nullable(),\n})\n\nexport const productMappingUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(productMappingCreateSchema.partial())\n\nconst plotBaseSchema = z.object({\n supplierEntityId: uuid(),\n supplierSnapshot: supplierSnapshotSchema.optional().nullable(),\n name: z.string().min(1).max(200),\n externalId: z.string().max(100).optional().nullable(),\n description: z.string().max(2000).optional().nullable(),\n originCountry: countryCodeSchema(),\n geometry: requiredUnknown('eudr.errors.geometryRequired'),\n areaHa: z.coerce.number().positive().max(100_000).optional().nullable(),\n producerName: z.string().max(500).optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const plotCreateSchema = rejectServerComputedFields(serverComputedPlotFields).pipe(plotBaseSchema)\n\nexport const plotUpdateSchema = rejectServerComputedFields(serverComputedPlotFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(plotBaseSchema.partial()),\n)\n\nconst evidenceSubmissionBaseSchema = z.object({\n supplierEntityId: uuid(),\n supplierSnapshot: supplierSnapshotSchema.optional().nullable(),\n commodity: z.enum(EUDR_COMMODITIES),\n productMappingId: uuid().optional().nullable(),\n statementId: uuid().optional().nullable(),\n originCountry: countryCodeSchema().optional().nullable(),\n geolocation: geoJsonSchema.optional().nullable(),\n quantityKg: z.coerce.number().positive().optional().nullable(),\n batchNumber: z.string().max(255).optional().nullable(),\n harvestFrom: z.coerce.date().optional().nullable(),\n harvestTo: z.coerce.date().optional().nullable(),\n producerName: z.string().max(500).optional().nullable(),\n attachmentIds: z.array(uuid()).max(100).optional(),\n plotIds: z.array(uuid()).max(200).optional(),\n status: z.enum(EUDR_SUBMISSION_STATUSES).optional(),\n notes: z.string().max(5000).optional().nullable(),\n})\n\nfunction validateHarvestRange(input: { harvestFrom?: Date | null; harvestTo?: Date | null }, context: z.RefinementCtx): void {\n if (!input.harvestFrom || !input.harvestTo || input.harvestFrom <= input.harvestTo) return\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['harvestTo'],\n message: 'eudr.errors.harvestRange',\n })\n}\n\nexport const evidenceSubmissionCreateSchema = rejectServerComputedFields(serverComputedSubmissionFields).pipe(\n evidenceSubmissionBaseSchema.superRefine(validateHarvestRange),\n)\n\nexport const evidenceSubmissionUpdateSchema = rejectServerComputedFields(serverComputedSubmissionFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(evidenceSubmissionBaseSchema.partial())\n .superRefine(validateHarvestRange),\n)\n\nconst riskCriteriaEntrySchema = z.object({\n answer: z.enum(EUDR_CRITERIA_ANSWERS),\n note: z.string().max(2000).optional().nullable(),\n})\n\nconst riskCriteriaSchema = z.record(z.string(), riskCriteriaEntrySchema).superRefine((criteria, context) => {\n for (const key of Object.keys(criteria)) {\n if (riskCriteriaKeySet.has(key)) continue\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [key],\n message: 'eudr.errors.invalidRiskCriterion',\n })\n }\n})\n\nconst riskAssessmentBaseSchema = z.object({\n statementId: uuid(),\n criteria: riskCriteriaSchema,\n conclusion: z.enum(EUDR_RISK_CONCLUSIONS),\n reviewDueAt: isoDateOrDateTimeSchema().optional().nullable(),\n assessedAt: pastOrNowIsoDateTimeSchema().optional(),\n notes: z.string().max(4000).optional().nullable(),\n})\n\nexport const riskAssessmentCreateSchema = rejectServerComputedFields(serverComputedRiskAssessmentFields).pipe(riskAssessmentBaseSchema)\n\nexport const riskAssessmentUpdateSchema = rejectServerComputedFields(serverComputedRiskAssessmentFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(riskAssessmentBaseSchema.partial()),\n)\n\nconst mitigationActionBaseSchema = z.object({\n riskAssessmentId: uuid(),\n actionType: z.enum(EUDR_MITIGATION_TYPES).optional(),\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional().nullable(),\n status: z.enum(EUDR_MITIGATION_STATUSES).optional(),\n dueDate: isoDateSchema().optional().nullable(),\n notes: z.string().max(2000).optional().nullable(),\n})\n\nexport const mitigationActionCreateSchema = rejectServerComputedFields(serverComputedMitigationActionFields).pipe(mitigationActionBaseSchema)\n\nexport const mitigationActionUpdateSchema = rejectServerComputedFields(serverComputedMitigationActionFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(mitigationActionBaseSchema.partial()),\n)\n\nconst statementBaseSchema = z.object({\n title: z.string().min(1).max(500),\n commodity: z.enum(EUDR_COMMODITIES),\n referenceNumber: z.string().max(255).optional().nullable(),\n verificationNumber: z.string().max(255).optional().nullable(),\n status: z.enum(EUDR_STATEMENT_STATUSES).optional(),\n activityType: z.enum(EUDR_ACTIVITY_TYPES).optional().nullable(),\n actorRole: z.enum(EUDR_ACTOR_ROLES).optional().nullable(),\n referencedStatements: z.array(referencedStatementSchema).max(100).optional(),\n quantityKg: z.coerce.number().positive().optional().nullable(),\n supplementaryUnit: z.string().max(16).optional().nullable(),\n supplementaryQuantity: z.coerce.number().positive().optional().nullable(),\n orderId: uuid().optional().nullable(),\n referenceIssuedAt: isoDateTimeSchema().optional().nullable(),\n orderSnapshot: orderSnapshotSchema.optional().nullable(),\n notes: z.string().max(5000).optional().nullable(),\n})\n\n// referenceIssuedAt is server-managed (only set at the submitted->available\n// transition) and is never a create input, so it is dropped from the create\n// schema. A whole-object POST that echoes it (null or a value) is accepted and\n// the field ignored, instead of a self-contradictory 400 (#5508).\nexport const statementCreateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(\n statementBaseSchema.omit({ referenceIssuedAt: true }),\n)\n\nexport const statementUpdateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(\n z\n .object({\n id: uuid(),\n })\n .merge(statementBaseSchema.partial()),\n)\n\nexport type ProductMappingCreateInput = z.infer<typeof productMappingCreateSchema>\nexport type ProductMappingUpdateInput = z.infer<typeof productMappingUpdateSchema>\nexport type PlotCreateInput = z.infer<typeof plotCreateSchema>\nexport type PlotUpdateInput = z.infer<typeof plotUpdateSchema>\nexport type EvidenceSubmissionCreateInput = z.infer<typeof evidenceSubmissionCreateSchema>\nexport type EvidenceSubmissionUpdateInput = z.infer<typeof evidenceSubmissionUpdateSchema>\nexport type RiskAssessmentCreateInput = z.infer<typeof riskAssessmentCreateSchema>\nexport type RiskAssessmentUpdateInput = z.infer<typeof riskAssessmentUpdateSchema>\nexport type MitigationActionCreateInput = z.infer<typeof mitigationActionCreateSchema>\nexport type MitigationActionUpdateInput = z.infer<typeof mitigationActionUpdateSchema>\nexport type StatementCreateInput = z.infer<typeof statementCreateSchema>\nexport type StatementUpdateInput = z.infer<typeof statementUpdateSchema>\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -180,6 +180,7 @@ function FeatureTogglesTable() {
|
|
|
180
180
|
pageSize: featureTogglesData?.pageSize ?? 25,
|
|
181
181
|
total: featureTogglesData?.total ?? 0,
|
|
182
182
|
totalPages: featureTogglesData?.totalPages ?? 0,
|
|
183
|
+
totalIsCapped: featureTogglesData?.totalIsCapped === true,
|
|
183
184
|
onPageChange: handlePageChange
|
|
184
185
|
},
|
|
185
186
|
rowActions: (row) => /* @__PURE__ */ jsx(RowActions, { items: [
|