@open-mercato/core 0.6.8-develop.7100.1.fbf66fca35 → 0.7.0
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 +1 -13
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +0 -19
- 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 +1 -3
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- 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 +0 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +1 -11
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/scoped-upload-service.js +2 -15
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +2 -6
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +0 -6
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +11 -19
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +12 -57
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +5 -30
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +2 -8
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +20 -4
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/roles/acl/route.js +33 -28
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/routeError.js +11 -0
- package/dist/modules/auth/api/routeError.js.map +7 -0
- package/dist/modules/auth/api/session/refresh.js +1 -25
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +73 -102
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +5 -13
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +1 -3
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/components/AclEditor.js +30 -39
- 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 +1 -5
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +9 -35
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +0 -46
- 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/services/authService.js +2 -16
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +24 -67
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/business_rules/backend/logs/page.js +1 -3
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +1 -3
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +1 -3
- 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 +9 -10
- 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 +2 -5
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +0 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +1 -7
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +0 -2
- 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 +1 -9
- 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 +10 -95
- 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 +0 -3
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +1 -14
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +1 -7
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +1 -4
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/test-seed.js +2 -41
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +0 -9
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +1 -3
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +1 -3
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +0 -9
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +1 -3
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +523 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/extension-points.js +1 -1
- package/dist/modules/customer_accounts/extension-points.js.map +2 -2
- package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
- package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js +0 -10
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +1 -4
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +2 -13
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +6 -52
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +1 -4
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +6 -48
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +64 -20
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +94 -17
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +5 -8
- 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 +25 -8
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +22 -3
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +4 -11
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +1 -2
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +1 -38
- 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 +1 -3
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +4 -27
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +3 -4
- 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 +10 -11
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +9 -51
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +5 -30
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -6
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +1 -6
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +4 -7
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +13 -4
- 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 +14 -85
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +4 -6
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +3 -9
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +34 -21
- 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 +2 -131
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +6 -7
- 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 +2 -3
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +5 -40
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +1 -2
- 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/AssignRoleDialog.js +33 -28
- package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +4 -5
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +1 -3
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +7 -19
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +5 -6
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +11 -35
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +1 -3
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +13 -19
- 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 +3 -32
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +0 -5
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +2 -8
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +2 -3
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +3 -8
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/dealStatus.js +0 -30
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/findPeopleByAddresses.js +0 -1
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +2 -100
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +0 -12
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +1 -6
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +1 -3
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-engine.js +6 -72
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +1 -5
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +1 -5
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +1 -9
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +32 -5
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +1 -14
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +12 -99
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/openapi.js +1 -3
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +1 -9
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +26 -10
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +1 -17
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +34 -28
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/setup.js +2 -6
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +1 -2
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +1 -2
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +0 -9
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +2 -4
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +1 -3
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +1 -5
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +30 -28
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +8 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
- package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
- package/dist/modules/eudr/components/formConfig.js +6 -2
- package/dist/modules/eudr/components/formConfig.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +1 -4
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
- package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +0 -1
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +0 -1
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +8 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +12 -1
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +1 -6
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +29 -38
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +9 -36
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/data/validators.js +3 -11
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +2 -6
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +1 -29
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +2 -17
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +2 -17
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +14 -7
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +0 -15
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +1 -11
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +1 -3
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +1 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +2 -14
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +4 -18
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +6 -4
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +1 -3
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +0 -7
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +0 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +1 -3
- 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 +51 -150
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +3 -79
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +1 -3
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +1 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +8 -10
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +1 -79
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +5 -7
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -3
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +22 -51
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +19 -84
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +9 -23
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +6 -8
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +14 -68
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +5 -6
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +4 -5
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- 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 +2 -8
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +0 -1
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/setup.js +0 -2
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +2 -10
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +7 -4
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +18 -29
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +0 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +0 -1
- 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 +9 -12
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +0 -3
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +0 -3
- 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 +0 -3
- 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 +0 -3
- 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 +0 -3
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouses/route.js +9 -13
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +2 -15
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +9 -121
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +0 -3
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +1 -9
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +111 -76
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +0 -1
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +0 -1
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +20 -27
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +1 -3
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +1 -3
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +1 -3
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -3
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +0 -4
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +10 -9
- package/src/helpers/integration/api.ts +1 -33
- package/src/helpers/integration/communicationChannelsFixtures.ts +1 -69
- package/src/modules/api_keys/api/keys/route.ts +1 -3
- package/src/modules/api_keys/backend/api-keys/page.tsx +1 -4
- package/src/modules/attachments/AGENTS.md +0 -15
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -3
- package/src/modules/attachments/di.ts +0 -16
- package/src/modules/attachments/i18n/de.json +0 -5
- package/src/modules/attachments/i18n/en.json +0 -5
- package/src/modules/attachments/i18n/es.json +0 -5
- package/src/modules/attachments/i18n/ko.json +0 -5
- package/src/modules/attachments/i18n/pl.json +0 -5
- package/src/modules/attachments/index.ts +0 -10
- package/src/modules/attachments/lib/scoped-upload-service.ts +0 -46
- package/src/modules/attachments/lib/upload-limits.ts +2 -6
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +0 -8
- package/src/modules/audit_logs/lib/display-helpers.tsx +32 -42
- package/src/modules/audit_logs/services/actionLogService.ts +11 -74
- package/src/modules/auth/acl.ts +6 -30
- package/src/modules/auth/api/feature-check.ts +3 -10
- package/src/modules/auth/api/login.ts +24 -9
- package/src/modules/auth/api/roles/acl/route.ts +39 -42
- package/src/modules/auth/api/routeError.ts +30 -0
- package/src/modules/auth/api/session/refresh.ts +1 -32
- package/src/modules/auth/api/users/acl/route.ts +101 -185
- package/src/modules/auth/api/users/route.ts +5 -18
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/roles/page.tsx +2 -4
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/users/page.tsx +2 -3
- package/src/modules/auth/components/AclEditor.tsx +33 -63
- package/src/modules/auth/data/entities.ts +1 -4
- package/src/modules/auth/data/validators.ts +0 -5
- package/src/modules/auth/di.ts +16 -46
- package/src/modules/auth/frontend/reset/[token]/page.tsx +0 -74
- package/src/modules/auth/i18n/de.json +0 -389
- package/src/modules/auth/i18n/en.json +0 -389
- package/src/modules/auth/i18n/es.json +0 -389
- package/src/modules/auth/i18n/ko.json +0 -389
- package/src/modules/auth/i18n/pl.json +2 -391
- package/src/modules/auth/lib/grantChecks.ts +0 -6
- package/src/modules/auth/services/authService.ts +2 -18
- package/src/modules/auth/services/rbacService.ts +24 -110
- package/src/modules/business_rules/backend/logs/page.tsx +1 -4
- package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/rules/page.tsx +1 -4
- package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/sets/page.tsx +1 -4
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +9 -10
- 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 +5 -12
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +0 -3
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -7
- package/src/modules/catalog/i18n/de.json +0 -1
- package/src/modules/catalog/i18n/en.json +0 -1
- package/src/modules/catalog/i18n/es.json +0 -1
- package/src/modules/catalog/i18n/ko.json +0 -1
- package/src/modules/catalog/i18n/pl.json +0 -1
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +0 -4
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +1 -17
- package/src/modules/communication_channels/api/post/test-seed/route.ts +16 -155
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +0 -4
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +1 -38
- package/src/modules/communication_channels/di.ts +0 -7
- package/src/modules/communication_channels/lib/adapter.ts +0 -14
- package/src/modules/communication_channels/lib/email-capabilities.ts +0 -4
- package/src/modules/communication_channels/lib/test-seed.ts +4 -64
- package/src/modules/configs/i18n/de.json +0 -2
- package/src/modules/configs/i18n/en.json +0 -2
- package/src/modules/configs/i18n/es.json +0 -2
- package/src/modules/configs/i18n/ko.json +0 -2
- package/src/modules/configs/i18n/pl.json +0 -2
- package/src/modules/configs/lib/system-status.ts +0 -9
- package/src/modules/currencies/backend/currencies/page.tsx +1 -4
- package/src/modules/currencies/backend/exchange-rates/page.tsx +1 -4
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +0 -7
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +1 -4
- package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
- package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +598 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
- package/src/modules/customer_accounts/extension-points.ts +1 -1
- package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
- package/src/modules/customer_accounts/services/domainMappingService.ts +0 -10
- package/src/modules/customers/ai-tools/companies-pack.ts +1 -4
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +2 -17
- package/src/modules/customers/ai-tools/deals-pack.ts +1 -66
- package/src/modules/customers/ai-tools/people-pack.ts +1 -4
- package/src/modules/customers/api/activities/route.ts +0 -45
- package/src/modules/customers/api/companies/[id]/people/route.ts +73 -24
- package/src/modules/customers/api/companies/[id]/route.ts +107 -24
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +8 -16
- package/src/modules/customers/api/deals/[id]/companies/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/people/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/route.ts +28 -17
- package/src/modules/customers/api/deals/[id]/stats/route.ts +25 -10
- package/src/modules/customers/api/deals/aggregate/route.ts +4 -14
- package/src/modules/customers/api/deals/map/route.ts +0 -1
- package/src/modules/customers/api/deals/route.ts +1 -50
- package/src/modules/customers/api/entity-roles-factory.ts +4 -8
- package/src/modules/customers/api/interactions/route.ts +2 -8
- package/src/modules/customers/api/interactions/tasks/route.ts +1 -24
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +4 -12
- package/src/modules/customers/api/people/[id]/companies/context.ts +1 -4
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +1 -4
- package/src/modules/customers/api/people/[id]/route.ts +11 -16
- package/src/modules/customers/api/people/check-phone/route.ts +10 -75
- package/src/modules/customers/api/todos/route.ts +2 -27
- package/src/modules/customers/backend/customers/companies/page.tsx +4 -7
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +2 -7
- package/src/modules/customers/backend/customers/deals/page.tsx +4 -10
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +14 -5
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +27 -109
- package/src/modules/customers/backend/customers/people/page.tsx +4 -7
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +4 -12
- package/src/modules/customers/commands/deals.ts +59 -34
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +8 -224
- package/src/modules/customers/components/CustomerTodosTable.tsx +0 -2
- 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 +2 -4
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +5 -61
- package/src/modules/customers/components/calendar/editor/hooks.ts +1 -7
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +4 -5
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +1 -8
- package/src/modules/customers/components/detail/DealForm.tsx +2 -22
- package/src/modules/customers/components/detail/DealsSection.tsx +5 -11
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +12 -58
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +1 -8
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +14 -23
- 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 +5 -15
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +9 -50
- package/src/modules/customers/events.ts +0 -5
- package/src/modules/customers/i18n/de.json +1 -9
- package/src/modules/customers/i18n/en.json +1 -9
- package/src/modules/customers/i18n/es.json +1 -9
- package/src/modules/customers/i18n/ko.json +1 -9
- package/src/modules/customers/i18n/pl.json +1 -9
- package/src/modules/customers/lib/calendar/conflicts.ts +2 -10
- package/src/modules/customers/lib/calendar/editorPayload.ts +3 -4
- package/src/modules/customers/lib/calendar/mapItem.ts +3 -8
- package/src/modules/customers/lib/dealStatus.ts +0 -42
- package/src/modules/customers/lib/findPeopleByAddresses.ts +6 -8
- package/src/modules/customers/lib/personCompanies.ts +1 -136
- package/src/modules/customers/lib/todoCompatibility.ts +1 -19
- 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 +0 -6
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +1 -4
- package/src/modules/data_sync/lib/adapter.ts +0 -36
- package/src/modules/data_sync/lib/sync-engine.ts +5 -113
- package/src/modules/data_sync/workers/sync-export.ts +0 -4
- package/src/modules/data_sync/workers/sync-import.ts +0 -4
- package/src/modules/devices/AGENTS.md +1 -20
- package/src/modules/devices/acl.ts +1 -9
- package/src/modules/devices/api/admin/devices/[id]/route.ts +34 -5
- package/src/modules/devices/api/admin/devices/route.ts +1 -14
- package/src/modules/devices/api/deviceList.ts +11 -135
- package/src/modules/devices/api/openapi.ts +1 -9
- package/src/modules/devices/api/route.ts +1 -9
- package/src/modules/devices/backend/devices/[id]/page.tsx +32 -18
- package/src/modules/devices/backend/devices/create/page.tsx +1 -17
- package/src/modules/devices/backend/devices/page.tsx +45 -44
- package/src/modules/devices/i18n/de.json +2 -3
- package/src/modules/devices/i18n/en.json +2 -3
- package/src/modules/devices/i18n/es.json +2 -3
- package/src/modules/devices/i18n/ko.json +2 -3
- package/src/modules/devices/i18n/pl.json +2 -3
- package/src/modules/devices/setup.ts +2 -6
- package/src/modules/directory/backend/directory/organizations/page.tsx +1 -3
- package/src/modules/directory/backend/directory/tenants/page.tsx +1 -3
- package/src/modules/directory/di.ts +2 -14
- package/src/modules/directory/utils/organizationScope.ts +15 -4
- package/src/modules/entities/api/records.ts +0 -2
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +1 -4
- package/src/modules/eudr/api/plots/route.ts +0 -4
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
- package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/plots/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -30
- package/src/modules/eudr/commands/statements.ts +7 -2
- package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
- package/src/modules/eudr/components/formConfig.tsx +9 -1
- package/src/modules/eudr/data/validators.ts +1 -16
- package/src/modules/eudr/i18n/de.json +3 -2
- package/src/modules/eudr/i18n/en.json +3 -2
- package/src/modules/eudr/i18n/es.json +3 -2
- package/src/modules/eudr/i18n/ko.json +3 -2
- package/src/modules/eudr/i18n/pl.json +3 -2
- package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +1 -2
- package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -2
- package/src/modules/feature_toggles/defaults.json +8 -0
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +0 -4
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +0 -4
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +17 -1
- package/src/modules/integrations/api/[id]/credentials/route.ts +4 -6
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +31 -61
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +9 -44
- package/src/modules/integrations/data/validators.ts +2 -12
- package/src/modules/integrations/i18n/de.json +0 -1
- package/src/modules/integrations/i18n/en.json +0 -1
- package/src/modules/integrations/i18n/es.json +0 -1
- package/src/modules/integrations/i18n/ko.json +0 -1
- package/src/modules/integrations/i18n/pl.json +0 -1
- package/src/modules/integrations/lib/credentials-masking.ts +6 -10
- package/src/modules/messages/api/[id]/route.ts +1 -55
- package/src/modules/messages/api/openapi.ts +0 -20
- package/src/modules/messages/api/route.ts +2 -31
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +16 -9
- package/src/modules/messages/components/inboxFilters.ts +0 -36
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +1 -14
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +1 -3
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +1 -2
- package/src/modules/messages/components/message-detail/types.ts +0 -3
- package/src/modules/messages/components/messageListLabels.ts +3 -52
- package/src/modules/messages/data/validators.ts +4 -43
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +6 -4
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +1 -4
- package/src/modules/payment_gateways/lib/webhook-processor.ts +0 -11
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +0 -4
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +1 -4
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +61 -249
- package/src/modules/query_index/lib/search-tokens.ts +3 -135
- package/src/modules/resources/backend/resources/resource-types/page.tsx +1 -4
- package/src/modules/resources/backend/resources/resources/page.tsx +1 -4
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -4
- package/src/modules/sales/backend/sales/channels/page.tsx +0 -4
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +8 -14
- package/src/modules/sales/commands/documents.ts +0 -93
- package/src/modules/sales/components/PriceWithCurrency.tsx +5 -17
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -4
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/ItemsSection.tsx +18 -56
- package/src/modules/sales/components/documents/LineItemDialog.tsx +21 -138
- package/src/modules/sales/components/documents/PaymentsSection.tsx +9 -20
- package/src/modules/sales/components/documents/ReturnsSection.tsx +5 -6
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +14 -106
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +5 -6
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +4 -5
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/lineItemUtils.ts +2 -7
- package/src/modules/sales/data/entities.ts +0 -6
- package/src/modules/sales/extension-points.ts +0 -1
- package/src/modules/sales/i18n/de.json +37 -8
- package/src/modules/sales/i18n/en.json +37 -8
- package/src/modules/sales/i18n/es.json +37 -8
- package/src/modules/sales/i18n/ko.json +37 -8
- package/src/modules/sales/i18n/pl.json +37 -8
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +0 -60
- package/src/modules/sales/setup.ts +0 -2
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +1 -9
- package/src/modules/sales/widgets/injection-table.ts +7 -4
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/team-members/page.tsx +0 -6
- package/src/modules/staff/backend/staff/team-roles/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/page.tsx +0 -4
- package/src/modules/staff/backend/staff/timesheets/page.tsx +1 -12
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +0 -4
- package/src/modules/sync_excel/lib/adapters/customers.ts +0 -5
- 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 +9 -12
- package/src/modules/warranty_claims/backend/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +0 -4
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +0 -4
- package/src/modules/wms/api/warehouses/route.ts +9 -13
- package/src/modules/wms/api/zones/route.ts +0 -16
- package/src/modules/wms/commands/configuration.ts +10 -159
- package/src/modules/wms/commands/inventory-actions.ts +0 -3
- package/src/modules/wms/commands/shared.ts +0 -17
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +141 -95
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +20 -36
- package/src/modules/wms/i18n/de.json +0 -2
- package/src/modules/wms/i18n/en.json +0 -2
- package/src/modules/wms/i18n/es.json +0 -2
- package/src/modules/wms/i18n/ko.json +0 -2
- package/src/modules/wms/i18n/pl.json +0 -2
- package/src/modules/workflows/backend/definitions/page.tsx +1 -4
- package/src/modules/workflows/backend/events/page.tsx +1 -4
- package/src/modules/workflows/backend/instances/page.tsx +1 -4
- package/src/modules/workflows/backend/tasks/page.tsx +1 -4
- package/src/modules/workflows/lib/activity-executor.ts +0 -9
- package/dist/modules/api_keys/di.js +0 -9
- package/dist/modules/api_keys/di.js.map +0 -7
- package/dist/modules/api_keys/services/principalService.js +0 -31
- package/dist/modules/api_keys/services/principalService.js.map +0 -7
- package/dist/modules/attachments/lib/attachment-service.js +0 -313
- package/dist/modules/attachments/lib/attachment-service.js.map +0 -7
- package/dist/modules/auth/api/reset/validate.js +0 -55
- package/dist/modules/auth/api/reset/validate.js.map +0 -7
- package/dist/modules/auth/commands/acl.js +0 -254
- package/dist/modules/auth/commands/acl.js.map +0 -7
- package/dist/modules/auth/lib/userIdFilter.js +0 -16
- package/dist/modules/auth/lib/userIdFilter.js.map +0 -7
- package/dist/modules/auth/services/principalService.js +0 -200
- package/dist/modules/auth/services/principalService.js.map +0 -7
- package/dist/modules/auth/services/roleOrganizationScope.js +0 -41
- package/dist/modules/auth/services/roleOrganizationScope.js.map +0 -7
- package/dist/modules/communication_channels/lib/outbound-recipient.js +0 -33
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +0 -7
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +0 -51
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +0 -7
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +0 -18
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +0 -7
- package/dist/modules/customers/lib/calendar/participantIdentity.js +0 -9
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +0 -7
- package/dist/modules/customers/lib/closureStage.js +0 -45
- package/dist/modules/customers/lib/closureStage.js.map +0 -7
- package/dist/modules/customers/lib/detailReadAccess.js +0 -12
- package/dist/modules/customers/lib/detailReadAccess.js.map +0 -7
- package/dist/modules/data_sync/lib/abandoned-run.js +0 -19
- package/dist/modules/data_sync/lib/abandoned-run.js.map +0 -7
- package/dist/modules/devices/api/deviceSerialization.js +0 -46
- package/dist/modules/devices/api/deviceSerialization.js.map +0 -7
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +0 -34
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +0 -7
- package/dist/modules/devices/backend/devices/userOptions.js +0 -52
- package/dist/modules/devices/backend/devices/userOptions.js.map +0 -7
- package/dist/modules/directory/services/organizationHierarchyService.js +0 -29
- package/dist/modules/directory/services/organizationHierarchyService.js.map +0 -7
- package/dist/modules/directory/services/organizationScopeService.js +0 -56
- package/dist/modules/directory/services/organizationScopeService.js.map +0 -7
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +0 -55
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +0 -7
- package/dist/modules/messages/lib/channel-sender-identity.js +0 -26
- package/dist/modules/messages/lib/channel-sender-identity.js.map +0 -7
- package/dist/modules/messages/lib/composeSourceChannelType.js +0 -41
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +0 -7
- package/dist/modules/query_index/lib/search-entity-policy.js +0 -14
- package/dist/modules/query_index/lib/search-entity-policy.js.map +0 -7
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +0 -54
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +0 -7
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +0 -33
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +0 -7
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +0 -32
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +0 -7
- package/dist/modules/wms/api/warehouseSearch.js +0 -21
- package/dist/modules/wms/api/warehouseSearch.js.map +0 -7
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +0 -158
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +0 -7
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +0 -66
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +0 -7
- package/src/modules/api_keys/di.ts +0 -7
- package/src/modules/api_keys/services/principalService.ts +0 -33
- package/src/modules/attachments/lib/attachment-service.ts +0 -468
- package/src/modules/auth/api/reset/validate.ts +0 -57
- package/src/modules/auth/commands/acl.ts +0 -495
- package/src/modules/auth/lib/userIdFilter.ts +0 -31
- package/src/modules/auth/services/principalService.ts +0 -266
- package/src/modules/auth/services/roleOrganizationScope.ts +0 -70
- package/src/modules/communication_channels/lib/outbound-recipient.ts +0 -71
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +0 -99
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +0 -21
- package/src/modules/customers/lib/calendar/participantIdentity.ts +0 -17
- package/src/modules/customers/lib/closureStage.ts +0 -76
- package/src/modules/customers/lib/detailReadAccess.ts +0 -35
- package/src/modules/data_sync/lib/abandoned-run.ts +0 -56
- package/src/modules/devices/api/deviceSerialization.ts +0 -50
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +0 -45
- package/src/modules/devices/backend/devices/userOptions.ts +0 -99
- package/src/modules/directory/services/organizationHierarchyService.ts +0 -34
- package/src/modules/directory/services/organizationScopeService.ts +0 -85
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +0 -84
- package/src/modules/messages/lib/channel-sender-identity.ts +0 -55
- package/src/modules/messages/lib/composeSourceChannelType.ts +0 -95
- package/src/modules/query_index/lib/search-entity-policy.ts +0 -46
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +0 -74
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +0 -42
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +0 -87
- package/src/modules/wms/api/warehouseSearch.ts +0 -23
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +0 -216
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +0 -72
|
@@ -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 canTransition,\n evaluateSubmissionGate,\n isAmendWindowOpen,\n type GateAssessmentView,\n type GateSubmissionView,\n} from '../lib/statement-lifecycle'\n\nconst STATEMENT_ENTITY_ID = 'eudr:eudr_due_diligence_statement'\n\ntype ScopedCommandInput = {\n tenantId: string\n organizationId: string\n}\n\ntype StatementSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n title: string\n commodity: string\n referenceNumber: string | null\n verificationNumber: string | null\n status: string\n activityType: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n quantityKg: string | null\n supplementaryUnit: string | null\n supplementaryQuantity: string | null\n orderId: string | null\n submittedAt: string | null\n referenceIssuedAt: string | null\n orderSnapshot: { orderNumber?: string | null } | null\n notes: string | null\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n custom?: Record<string, unknown> | null\n}\n\ntype StatementUndoPayload = {\n before?: StatementSnapshot | null\n after?: StatementSnapshot | null\n}\n\ntype ScopedStatementCreateInput = StatementCreateInput & ScopedCommandInput\ntype ScopedStatementUpdateInput = StatementUpdateInput & Partial<ScopedCommandInput>\n\ntype StatementCommandResult = {\n entityId: string\n updatedAt?: Date\n}\n\nconst scopedCommandInputSchema = z.object({\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n})\n\nconst statementCrudIndexer: CrudIndexerConfig<EudrDueDiligenceStatement> = {\n entityType: E.eudr.eudr_due_diligence_statement,\n}\n\nconst statementCrudEvents: CrudEventsConfig<EudrDueDiligenceStatement> = {\n module: 'eudr',\n entity: 'due_diligence_statement',\n persistent: true,\n buildPayload: (emitContext) => ({\n id: emitContext.identifiers.id,\n entityId: emitContext.entity?.id ?? emitContext.identifiers.id,\n organizationId: emitContext.identifiers.organizationId,\n tenantId: emitContext.identifiers.tenantId,\n }),\n}\n\nfunction parseScopedCommandInput(input: unknown): ScopedCommandInput {\n return scopedCommandInputSchema.parse(input)\n}\n\nfunction toNumericString(value: number | null | undefined): string | null {\n return value == null ? null : String(value)\n}\n\nfunction toDate(value: string | null): Date | null {\n return value ? new Date(value) : null\n}\n\nfunction statementSeedFromSnapshot(snapshot: StatementSnapshot): RequiredEntityData<EudrDueDiligenceStatement> {\n return {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n title: snapshot.title,\n commodity: snapshot.commodity,\n referenceNumber: snapshot.referenceNumber,\n verificationNumber: snapshot.verificationNumber,\n status: snapshot.status,\n activityType: snapshot.activityType,\n actorRole: snapshot.actorRole,\n referencedStatements: snapshot.referencedStatements.map((entry) => ({ ...entry })),\n quantityKg: snapshot.quantityKg,\n supplementaryUnit: snapshot.supplementaryUnit,\n supplementaryQuantity: snapshot.supplementaryQuantity,\n orderId: snapshot.orderId,\n submittedAt: toDate(snapshot.submittedAt),\n referenceIssuedAt: toDate(snapshot.referenceIssuedAt),\n orderSnapshot: snapshot.orderSnapshot,\n notes: snapshot.notes,\n createdAt: new Date(snapshot.createdAt),\n updatedAt: new Date(snapshot.updatedAt),\n deletedAt: toDate(snapshot.deletedAt),\n }\n}\n\nasync function loadStatementSnapshot(em: EntityManager, entityId: string): Promise<StatementSnapshot | null> {\n const record = await em.findOne(EudrDueDiligenceStatement, { id: entityId })\n if (!record) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: STATEMENT_ENTITY_ID,\n recordId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n })\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n title: record.title,\n commodity: record.commodity,\n referenceNumber: record.referenceNumber ?? null,\n verificationNumber: record.verificationNumber ?? null,\n status: record.status,\n activityType: record.activityType ?? null,\n actorRole: record.actorRole ?? null,\n referencedStatements: Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n quantityKg: record.quantityKg ?? null,\n supplementaryUnit: record.supplementaryUnit ?? null,\n supplementaryQuantity: record.supplementaryQuantity ?? null,\n orderId: record.orderId ?? null,\n submittedAt: record.submittedAt ? record.submittedAt.toISOString() : null,\n referenceIssuedAt: record.referenceIssuedAt ? record.referenceIssuedAt.toISOString() : null,\n orderSnapshot: record.orderSnapshot ?? null,\n notes: record.notes ?? null,\n createdAt: record.createdAt.toISOString(),\n updatedAt: record.updatedAt.toISOString(),\n deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,\n custom: Object.keys(custom).length ? custom : null,\n }\n}\n\nfunction applyStatementUpdate(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): void {\n if (parsed.title !== undefined) record.title = parsed.title\n if (parsed.commodity !== undefined) record.commodity = parsed.commodity\n if (parsed.referenceNumber !== undefined) record.referenceNumber = parsed.referenceNumber ?? null\n if (parsed.verificationNumber !== undefined) record.verificationNumber = parsed.verificationNumber ?? null\n if (parsed.status !== undefined) record.status = parsed.status\n if (parsed.activityType !== undefined) record.activityType = parsed.activityType ?? null\n if (parsed.actorRole !== undefined) record.actorRole = parsed.actorRole ?? null\n if (parsed.referencedStatements !== undefined) {\n record.referencedStatements = parsed.referencedStatements.map((entry) => ({ ...entry }))\n }\n if (parsed.quantityKg !== undefined) record.quantityKg = toNumericString(parsed.quantityKg)\n if (parsed.supplementaryUnit !== undefined) record.supplementaryUnit = parsed.supplementaryUnit ?? null\n if (parsed.supplementaryQuantity !== undefined) record.supplementaryQuantity = toNumericString(parsed.supplementaryQuantity)\n if (parsed.orderId !== undefined) record.orderId = parsed.orderId ?? null\n if (parsed.referenceIssuedAt !== undefined) record.referenceIssuedAt = parsed.referenceIssuedAt\n if (parsed.orderSnapshot !== undefined) record.orderSnapshot = parsed.orderSnapshot ?? null\n if (parsed.notes !== undefined) record.notes = parsed.notes ?? null\n}\n\nfunction restoreStatement(record: EudrDueDiligenceStatement, snapshot: StatementSnapshot): void {\n record.organizationId = snapshot.organizationId\n record.tenantId = snapshot.tenantId\n record.title = snapshot.title\n record.commodity = snapshot.commodity\n record.referenceNumber = snapshot.referenceNumber\n record.verificationNumber = snapshot.verificationNumber\n record.status = snapshot.status\n record.activityType = snapshot.activityType\n record.actorRole = snapshot.actorRole\n record.referencedStatements = snapshot.referencedStatements.map((entry) => ({ ...entry }))\n record.quantityKg = snapshot.quantityKg\n record.supplementaryUnit = snapshot.supplementaryUnit\n record.supplementaryQuantity = snapshot.supplementaryQuantity\n record.orderId = snapshot.orderId\n record.submittedAt = toDate(snapshot.submittedAt)\n record.referenceIssuedAt = toDate(snapshot.referenceIssuedAt)\n record.orderSnapshot = snapshot.orderSnapshot\n record.notes = snapshot.notes\n record.createdAt = new Date(snapshot.createdAt)\n record.updatedAt = new Date(snapshot.updatedAt)\n record.deletedAt = toDate(snapshot.deletedAt)\n}\n\nasync function setStatementCustomFields(\n dataEngine: DataEngine,\n entityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>,\n): Promise<void> {\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: STATEMENT_ENTITY_ID,\n recordId: entityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\ntype PatchedStatementView = {\n referenceNumber: string | null\n verificationNumber: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n}\n\ntype StatementServerFields = {\n submittedAt?: Date\n referenceIssuedAt?: Date | null\n}\n\nconst STATEMENT_STATUS_SET = new Set<string>(EUDR_STATEMENT_STATUSES)\n\nconst STATEMENT_UPDATE_FIELDS = [\n 'title',\n 'commodity',\n 'referenceNumber',\n 'verificationNumber',\n 'status',\n 'activityType',\n 'actorRole',\n 'referencedStatements',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'orderId',\n 'referenceIssuedAt',\n 'orderSnapshot',\n 'notes',\n] as const\n\ntype StatementUpdateField = (typeof STATEMENT_UPDATE_FIELDS)[number]\n\nfunction isStatementStatus(value: string): value is EudrStatementStatus {\n return STATEMENT_STATUS_SET.has(value)\n}\n\nfunction isNonEmpty(value: string | null | undefined): boolean {\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction dateValuesEqual(left: Date | null | undefined, right: Date | null | undefined): boolean {\n const leftTime = left ? left.getTime() : null\n const rightTime = right ? right.getTime() : null\n return leftTime === rightTime\n}\n\nfunction jsonValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left ?? null) === JSON.stringify(right ?? null)\n}\n\n// PG numeric columns read back scale-padded ('100.000'); compare numerically so\n// an unchanged echo from a whole-document save is not treated as an amendment.\nfunction numericValuesEqual(left: string | null | undefined, right: string | null | undefined): boolean {\n const leftNumber = left === null || left === undefined || left === '' ? null : Number(left)\n const rightNumber = right === null || right === undefined || right === '' ? null : Number(right)\n if (leftNumber === null || rightNumber === null) return leftNumber === rightNumber\n return Number.isFinite(leftNumber) && Number.isFinite(rightNumber) && leftNumber === rightNumber\n}\n\nfunction referencedStatementsEqual(\n left: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n right: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n): boolean {\n return JSON.stringify(left ?? []) === JSON.stringify(right ?? [])\n}\n\nfunction statementFieldChanged(\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n field: StatementUpdateField,\n): boolean {\n switch (field) {\n case 'title':\n return parsed.title !== undefined && parsed.title !== record.title\n case 'commodity':\n return parsed.commodity !== undefined && parsed.commodity !== record.commodity\n case 'referenceNumber':\n return parsed.referenceNumber !== undefined && (parsed.referenceNumber ?? null) !== (record.referenceNumber ?? null)\n case 'verificationNumber':\n return parsed.verificationNumber !== undefined && (parsed.verificationNumber ?? null) !== (record.verificationNumber ?? null)\n case 'status':\n return parsed.status !== undefined && parsed.status !== record.status\n case 'activityType':\n return parsed.activityType !== undefined && (parsed.activityType ?? null) !== (record.activityType ?? null)\n case 'actorRole':\n return parsed.actorRole !== undefined && (parsed.actorRole ?? null) !== (record.actorRole ?? null)\n case 'referencedStatements':\n return parsed.referencedStatements !== undefined && !referencedStatementsEqual(parsed.referencedStatements, record.referencedStatements)\n case 'quantityKg':\n return parsed.quantityKg !== undefined && !numericValuesEqual(toNumericString(parsed.quantityKg), record.quantityKg ?? null)\n case 'supplementaryUnit':\n return parsed.supplementaryUnit !== undefined && (parsed.supplementaryUnit ?? null) !== (record.supplementaryUnit ?? null)\n case 'supplementaryQuantity':\n return parsed.supplementaryQuantity !== undefined && !numericValuesEqual(toNumericString(parsed.supplementaryQuantity), record.supplementaryQuantity ?? null)\n case 'orderId':\n return parsed.orderId !== undefined && (parsed.orderId ?? null) !== (record.orderId ?? null)\n case 'referenceIssuedAt':\n return parsed.referenceIssuedAt !== undefined && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n case 'orderSnapshot':\n return parsed.orderSnapshot !== undefined && !jsonValuesEqual(parsed.orderSnapshot ?? null, record.orderSnapshot ?? null)\n case 'notes':\n return parsed.notes !== undefined && (parsed.notes ?? null) !== (record.notes ?? null)\n }\n}\n\nfunction hasStatementFieldChanges(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return STATEMENT_UPDATE_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction buildPatchedStatementView(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): PatchedStatementView {\n return {\n referenceNumber: parsed.referenceNumber !== undefined ? parsed.referenceNumber ?? null : record.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber !== undefined ? parsed.verificationNumber ?? null : record.verificationNumber ?? null,\n actorRole: parsed.actorRole !== undefined ? parsed.actorRole ?? null : record.actorRole ?? null,\n referencedStatements: parsed.referencedStatements !== undefined\n ? parsed.referencedStatements.map((entry) => ({ ...entry }))\n : Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n }\n}\n\nfunction hasChangedAmendGuardedField(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return EUDR_AMEND_GUARDED_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction hasConcernAnswers(criteria: Record<string, { answer: string; note?: string | null }>): boolean {\n return Object.values(criteria).some((entry) => entry.answer === 'concern')\n}\n\nexport async function loadStatementSubmissionsForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateSubmissionView[]> {\n const submissions = await findWithDecryption(\n em,\n EudrEvidenceSubmission,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n return submissions.map((submission) => ({\n status: submission.status,\n completenessScore: submission.completenessScore,\n originCountry: submission.originCountry ?? null,\n }))\n}\n\nexport async function loadLatestAssessmentForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateAssessmentView> {\n const assessments = await findWithDecryption(\n em,\n EudrRiskAssessment,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n {\n orderBy: { assessedAt: 'desc', createdAt: 'desc' },\n limit: 1,\n },\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n const assessment = assessments[0]\n if (!assessment) return null\n const completedMitigationCount = await em.count(EudrMitigationAction, {\n riskAssessmentId: assessment.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n status: 'completed',\n deletedAt: null,\n })\n return {\n conclusion: assessment.conclusion,\n countryRisks: assessment.countryRisks.map((risk) => ({ country: risk.country, tier: risk.tier })),\n reviewDueAt: assessment.reviewDueAt ?? null,\n hasConcernAnswers: hasConcernAnswers(assessment.criteria),\n hasCompletedMitigation: completedMitigationCount > 0,\n }\n}\n\nasync function assertNoDownstreamReferences(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<void> {\n const referenceNumber = record.referenceNumber?.trim().toUpperCase() ?? ''\n if (!referenceNumber) return\n const db = em.getKysely<{\n eudr_due_diligence_statements: {\n id: string\n tenant_id: string\n organization_id: string\n deleted_at: Date | null\n referenced_statements: unknown\n }\n }>()\n const containment = JSON.stringify([{ referenceNumber }])\n const downstreamRow = await db\n .selectFrom('eudr_due_diligence_statements')\n .select(sql<number>`count(*)`.as('total'))\n .where('tenant_id', '=', record.tenantId)\n .where('organization_id', '=', record.organizationId)\n .where('deleted_at', 'is', null)\n .where('id', '!=', record.id)\n .where(sql<boolean>`referenced_statements @> ${containment}::jsonb`)\n .executeTakeFirst()\n if (Number(downstreamRow?.total ?? 0) > 0) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referencedDownstream' })\n }\n}\n\nasync function validateStatementUpdate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n custom: Record<string, unknown>,\n): Promise<StatementServerFields> {\n if (!isStatementStatus(record.status)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const requestedStatus = parsed.status\n const statusChanged = requestedStatus !== undefined && requestedStatus !== record.status\n if (statusChanged && (!isStatementStatus(requestedStatus) || !canTransition(record.status, requestedStatus))) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const hasBaseChanges = hasStatementFieldChanges(record, parsed)\n if (record.status === 'archived' && (hasBaseChanges || Object.keys(custom).length > 0)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n\n const patched = buildPatchedStatementView(record, parsed)\n const serverFields: StatementServerFields = {}\n const isSubmittedToAvailable = record.status === 'submitted' && requestedStatus === 'available'\n\n if (statusChanged) {\n if (record.status === 'draft' && requestedStatus === 'submitted') {\n const submissions = await loadStatementSubmissionsForGate(em, record)\n const latestAssessment = await loadLatestAssessmentForGate(em, record)\n const gate = evaluateSubmissionGate({\n actorRole: patched.actorRole,\n referencedStatementsCount: patched.referencedStatements.length,\n submissions,\n latestAssessment,\n })\n if (!gate.allowed) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.gateFailed',\n details: {\n reasons: gate.reasons.map((reason) => `eudr.gate.${reason}`),\n },\n })\n }\n serverFields.submittedAt = new Date()\n }\n\n if (isSubmittedToAvailable) {\n if (!isNonEmpty(patched.referenceNumber) || !isNonEmpty(patched.verificationNumber)) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.referenceNumbersRequired',\n details: {\n reasons: ['eudr.gate.referenceNumbersRequired'],\n },\n })\n }\n const issuedAt = parsed.referenceIssuedAt ?? new Date()\n if (issuedAt.getTime() > Date.now()) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtInvalid' })\n }\n serverFields.referenceIssuedAt = issuedAt\n }\n\n if (record.status === 'available' && requestedStatus === 'withdrawn') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(em, record)\n }\n }\n\n if (\n parsed.referenceIssuedAt !== undefined\n && !isSubmittedToAvailable\n && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtImmutable' })\n }\n\n // Guarded fields freeze once the amend window elapses, regardless of any\n // status transition requested in the same call (available\u2192archived must not\n // smuggle in a quantity/commodity change).\n if (\n record.status === 'available'\n && !isAmendWindowOpen(record.referenceIssuedAt ?? null)\n && hasChangedAmendGuardedField(record, parsed)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n\n return serverFields\n}\n\nconst createStatementCommand: CommandHandler<ScopedStatementCreateInput, StatementCommandResult> = {\n id: 'eudr.statements.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(statementCreateSchema, rawInput)\n const scope = parseScopedCommandInput(rawInput)\n ensureTenantScope(ctx, scope.tenantId)\n ensureOrganizationScope(ctx, scope.organizationId)\n if (parsed.status !== undefined && parsed.status !== 'draft') {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record!: EudrDueDiligenceStatement\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'created',\n scope,\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n () => {\n record = entityManager.create(EudrDueDiligenceStatement, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n title: parsed.title,\n commodity: parsed.commodity,\n referenceNumber: parsed.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber ?? null,\n status: parsed.status ?? 'draft',\n activityType: parsed.activityType ?? null,\n actorRole: parsed.actorRole ?? null,\n referencedStatements: parsed.referencedStatements ? parsed.referencedStatements.map((entry) => ({ ...entry })) : [],\n quantityKg: toNumericString(parsed.quantityKg),\n supplementaryUnit: parsed.supplementaryUnit ?? null,\n supplementaryQuantity: toNumericString(parsed.supplementaryQuantity),\n orderId: parsed.orderId ?? null,\n referenceIssuedAt: null,\n orderSnapshot: parsed.orderSnapshot ?? null,\n notes: parsed.notes ?? null,\n })\n entityManager.persist(record)\n },\n ],\n })\n\n return { entityId: record.id }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const after = snapshots.after as StatementSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.create', 'Create EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: after.id,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: {\n undo: { after } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: after.id })\n if (!record) return\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(undefined, after.custom ?? undefined)\n await setStatementCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n redo: makeCreateRedo<EudrDueDiligenceStatement, StatementSnapshot, ScopedStatementCreateInput, StatementCommandResult>({\n entityClass: EudrDueDiligenceStatement,\n seedFromSnapshot: statementSeedFromSnapshot,\n buildResult: (entity) => ({ entityId: entity.id }),\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n afterRestore: async ({ ctx, entity, snapshot }) => {\n if (!snapshot.custom || !Object.keys(snapshot.custom).length) return\n await setStatementCustomFields(\n ctx.container.resolve('dataEngine') as DataEngine,\n entity.id,\n entity.organizationId,\n entity.tenantId,\n snapshot.custom,\n )\n },\n }),\n}\n\nconst updateStatementCommand: CommandHandler<ScopedStatementUpdateInput, StatementCommandResult> = {\n id: 'eudr.statements.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(entityManager, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: parsed.id, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n const previousStatus = record.status\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'updated',\n scope: { tenantId: record.tenantId, organizationId: record.organizationId },\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n async () => {\n const serverFields = await validateStatementUpdate(entityManager, record, parsed, custom)\n applyStatementUpdate(record, parsed)\n if (serverFields.submittedAt !== undefined) record.submittedAt = serverFields.submittedAt\n if (serverFields.referenceIssuedAt !== undefined) record.referenceIssuedAt = serverFields.referenceIssuedAt\n },\n ],\n })\n\n const lifecycleEventId = record.status === previousStatus\n ? null\n : previousStatus === 'draft' && record.status === 'submitted'\n ? 'eudr.due_diligence_statement.submitted'\n : previousStatus === 'submitted' && record.status === 'available'\n ? 'eudr.due_diligence_statement.reference_issued'\n : previousStatus === 'available' && record.status === 'withdrawn'\n ? 'eudr.due_diligence_statement.withdrawn'\n : null\n if (lifecycleEventId) {\n await emitEudrLifecycleEvent(ctx.container, lifecycleEventId, {\n id: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n title: record.title,\n referenceNumber: record.referenceNumber ?? null,\n })\n }\n\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n const after = snapshots.after as StatementSnapshot | undefined\n if (!before) return null\n if (after && snapshotsEqual(before, after)) return { skipLog: true }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.update', 'Update EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: { before, after: after ?? null } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(before.custom ?? undefined, payload?.after?.custom ?? undefined)\n await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'updated',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nconst deleteStatementCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, StatementCommandResult> = {\n id: 'eudr.statements.delete',\n async prepare(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(entityManager, entityId)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: entityId, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n if (record.status === 'archived') {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n if (record.status === 'available') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(entityManager, record)\n }\n\n const snapshot = await loadStatementSnapshot(entityManager, entityId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (snapshot?.custom) {\n const resetValues = buildCustomFieldResetMap(snapshot.custom, undefined)\n await setStatementCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues)\n }\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.delete', 'Delete EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: { before } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (before.custom) {\n await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom)\n }\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'created',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nregisterCommand(createStatementCommand)\nregisterCommand(updateStatementCommand)\nregisterCommand(deleteStatementCommand)\n"],
|
|
5
|
-
"mappings": "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",
|
|
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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,6 +6,25 @@ function translateEudrErrorToken(token, translate) {
|
|
|
6
6
|
const translated = translate(trimmed);
|
|
7
7
|
return translated === trimmed ? token : translated;
|
|
8
8
|
}
|
|
9
|
+
function readEudrErrorToken(err) {
|
|
10
|
+
if (err == null || typeof err !== "object") return null;
|
|
11
|
+
const candidates = [
|
|
12
|
+
err.error,
|
|
13
|
+
err.message
|
|
14
|
+
];
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
if (typeof candidate !== "string") continue;
|
|
17
|
+
const trimmed = candidate.trim();
|
|
18
|
+
if (EUDR_ERROR_KEY_PATTERN.test(trimmed)) return trimmed;
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
function translateEudrErrorMessage(err, translate, fallbackMessage) {
|
|
23
|
+
const token = readEudrErrorToken(err);
|
|
24
|
+
if (!token) return fallbackMessage;
|
|
25
|
+
const translated = translate(token);
|
|
26
|
+
return translated === token ? fallbackMessage : translated;
|
|
27
|
+
}
|
|
9
28
|
function translateEudrCrudError(err, translate) {
|
|
10
29
|
if (!(err instanceof Error)) return err;
|
|
11
30
|
const rawMessage = typeof err.message === "string" ? err.message : "";
|
|
@@ -26,6 +45,7 @@ function translateEudrCrudError(err, translate) {
|
|
|
26
45
|
return createCrudFormError(translatedMessage, translatedFieldErrors ?? rawFieldErrors);
|
|
27
46
|
}
|
|
28
47
|
export {
|
|
29
|
-
translateEudrCrudError
|
|
48
|
+
translateEudrCrudError,
|
|
49
|
+
translateEudrErrorMessage
|
|
30
50
|
};
|
|
31
51
|
//# sourceMappingURL=crudErrorI18n.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/eudr/components/crudErrorI18n.ts"],
|
|
4
|
-
"sourcesContent": ["import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\n\ntype Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nconst EUDR_ERROR_KEY_PATTERN = /^eudr\\.errors\\.[A-Za-z0-9_.-]+$/\n\nfunction translateEudrErrorToken(token: string, translate: Translator): string {\n const trimmed = token.trim()\n if (!EUDR_ERROR_KEY_PATTERN.test(trimmed)) return token\n const translated = translate(trimmed)\n return translated === trimmed ? token : translated\n}\n\nexport function translateEudrCrudError(err: unknown, translate: Translator): unknown {\n if (!(err instanceof Error)) return err\n const rawMessage = typeof err.message === 'string' ? err.message : ''\n const translatedMessage = translateEudrErrorToken(rawMessage, translate)\n const rawFieldErrors = (err as { fieldErrors?: Record<string, string> }).fieldErrors\n let fieldErrorsChanged = false\n let translatedFieldErrors: Record<string, string> | undefined\n if (rawFieldErrors && typeof rawFieldErrors === 'object') {\n translatedFieldErrors = {}\n for (const [field, fieldMessage] of Object.entries(rawFieldErrors)) {\n if (typeof fieldMessage !== 'string') continue\n const translatedFieldMessage = translateEudrErrorToken(fieldMessage, translate)\n if (translatedFieldMessage !== fieldMessage) fieldErrorsChanged = true\n translatedFieldErrors[field] = translatedFieldMessage\n }\n }\n if (translatedMessage === rawMessage && !fieldErrorsChanged) return err\n return createCrudFormError(translatedMessage, translatedFieldErrors ?? rawFieldErrors)\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,2BAA2B;AAQpC,MAAM,yBAAyB;AAE/B,SAAS,wBAAwB,OAAe,WAA+B;AAC7E,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,uBAAuB,KAAK,OAAO,EAAG,QAAO;AAClD,QAAM,aAAa,UAAU,OAAO;AACpC,SAAO,eAAe,UAAU,QAAQ;AAC1C;AAEO,SAAS,uBAAuB,KAAc,WAAgC;AACnF,MAAI,EAAE,eAAe,OAAQ,QAAO;AACpC,QAAM,aAAa,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AACnE,QAAM,oBAAoB,wBAAwB,YAAY,SAAS;AACvE,QAAM,iBAAkB,IAAiD;AACzE,MAAI,qBAAqB;AACzB,MAAI;AACJ,MAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACxD,4BAAwB,CAAC;AACzB,eAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,cAAc,GAAG;AAClE,UAAI,OAAO,iBAAiB,SAAU;AACtC,YAAM,yBAAyB,wBAAwB,cAAc,SAAS;AAC9E,UAAI,2BAA2B,aAAc,sBAAqB;AAClE,4BAAsB,KAAK,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,sBAAsB,cAAc,CAAC,mBAAoB,QAAO;AACpE,SAAO,oBAAoB,mBAAmB,yBAAyB,cAAc;AACvF;",
|
|
4
|
+
"sourcesContent": ["import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\n\ntype Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nconst EUDR_ERROR_KEY_PATTERN = /^eudr\\.errors\\.[A-Za-z0-9_.-]+$/\n\nfunction translateEudrErrorToken(token: string, translate: Translator): string {\n const trimmed = token.trim()\n if (!EUDR_ERROR_KEY_PATTERN.test(trimmed)) return token\n const translated = translate(trimmed)\n return translated === trimmed ? token : translated\n}\n\nfunction readEudrErrorToken(err: unknown): string | null {\n if (err == null || typeof err !== 'object') return null\n const candidates = [\n (err as { error?: unknown }).error,\n (err as { message?: unknown }).message,\n ]\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue\n const trimmed = candidate.trim()\n if (EUDR_ERROR_KEY_PATTERN.test(trimmed)) return trimmed\n }\n return null\n}\n\n/**\n * Resolves the user-facing message for a rejected EUDR mutation, preferring the\n * server's `eudr.errors.*` token over the caller's generic copy so the reason\n * survives to the user. Falls back to `fallbackMessage` when the rejection\n * carries no known token (network errors, 5xx, unmapped tokens).\n */\nexport function translateEudrErrorMessage(\n err: unknown,\n translate: Translator,\n fallbackMessage: string,\n): string {\n const token = readEudrErrorToken(err)\n if (!token) return fallbackMessage\n const translated = translate(token)\n return translated === token ? fallbackMessage : translated\n}\n\nexport function translateEudrCrudError(err: unknown, translate: Translator): unknown {\n if (!(err instanceof Error)) return err\n const rawMessage = typeof err.message === 'string' ? err.message : ''\n const translatedMessage = translateEudrErrorToken(rawMessage, translate)\n const rawFieldErrors = (err as { fieldErrors?: Record<string, string> }).fieldErrors\n let fieldErrorsChanged = false\n let translatedFieldErrors: Record<string, string> | undefined\n if (rawFieldErrors && typeof rawFieldErrors === 'object') {\n translatedFieldErrors = {}\n for (const [field, fieldMessage] of Object.entries(rawFieldErrors)) {\n if (typeof fieldMessage !== 'string') continue\n const translatedFieldMessage = translateEudrErrorToken(fieldMessage, translate)\n if (translatedFieldMessage !== fieldMessage) fieldErrorsChanged = true\n translatedFieldErrors[field] = translatedFieldMessage\n }\n }\n if (translatedMessage === rawMessage && !fieldErrorsChanged) return err\n return createCrudFormError(translatedMessage, translatedFieldErrors ?? rawFieldErrors)\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,2BAA2B;AAQpC,MAAM,yBAAyB;AAE/B,SAAS,wBAAwB,OAAe,WAA+B;AAC7E,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,uBAAuB,KAAK,OAAO,EAAG,QAAO;AAClD,QAAM,aAAa,UAAU,OAAO;AACpC,SAAO,eAAe,UAAU,QAAQ;AAC1C;AAEA,SAAS,mBAAmB,KAA6B;AACvD,MAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACnD,QAAM,aAAa;AAAA,IAChB,IAA4B;AAAA,IAC5B,IAA8B;AAAA,EACjC;AACA,aAAW,aAAa,YAAY;AAClC,QAAI,OAAO,cAAc,SAAU;AACnC,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,uBAAuB,KAAK,OAAO,EAAG,QAAO;AAAA,EACnD;AACA,SAAO;AACT;AAQO,SAAS,0BACd,KACA,WACA,iBACQ;AACR,QAAM,QAAQ,mBAAmB,GAAG;AACpC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,UAAU,KAAK;AAClC,SAAO,eAAe,QAAQ,kBAAkB;AAClD;AAEO,SAAS,uBAAuB,KAAc,WAAgC;AACnF,MAAI,EAAE,eAAe,OAAQ,QAAO;AACpC,QAAM,aAAa,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AACnE,QAAM,oBAAoB,wBAAwB,YAAY,SAAS;AACvE,QAAM,iBAAkB,IAAiD;AACzE,MAAI,qBAAqB;AACzB,MAAI;AACJ,MAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACxD,4BAAwB,CAAC;AACzB,eAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,cAAc,GAAG;AAClE,UAAI,OAAO,iBAAiB,SAAU;AACtC,YAAM,yBAAyB,wBAAwB,cAAc,SAAS;AAC9E,UAAI,2BAA2B,aAAc,sBAAqB;AAClE,4BAAsB,KAAK,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,sBAAsB,cAAc,CAAC,mBAAoB,QAAO;AACpE,SAAO,oBAAoB,mBAAmB,yBAAyB,cAAc;AACvF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -172,8 +172,11 @@ function LookupSelectField({
|
|
|
172
172
|
cancelled = true;
|
|
173
173
|
};
|
|
174
174
|
}, [loadSelectedOption, selectedOption, selectedValue, translate]);
|
|
175
|
+
const hydratedValueRef = React.useRef(selectedValue);
|
|
175
176
|
React.useEffect(() => {
|
|
176
177
|
if (!onSnapshot || !selectedOption || selectedOption.unavailable) return;
|
|
178
|
+
if (hydratedValueRef.current === selectedOption.value) return;
|
|
179
|
+
hydratedValueRef.current = null;
|
|
177
180
|
onSnapshot(selectedOption.snapshot ?? null);
|
|
178
181
|
}, [onSnapshot, selectedOption]);
|
|
179
182
|
const selectedOptionRef = React.useRef(selectedOption);
|
|
@@ -476,7 +479,7 @@ function parseGeolocationInput(raw, translate) {
|
|
|
476
479
|
}
|
|
477
480
|
return parsed;
|
|
478
481
|
}
|
|
479
|
-
import { translateEudrCrudError } from "./crudErrorI18n.js";
|
|
482
|
+
import { translateEudrCrudError, translateEudrErrorMessage } from "./crudErrorI18n.js";
|
|
480
483
|
let referencedStatementRowKeySeq = 0;
|
|
481
484
|
function normalizeReferencedStatements(value) {
|
|
482
485
|
if (!Array.isArray(value)) return [];
|
|
@@ -588,6 +591,7 @@ export {
|
|
|
588
591
|
statementStatusOptions,
|
|
589
592
|
statusBadgeVariant,
|
|
590
593
|
submissionStatusOptions,
|
|
591
|
-
translateEudrCrudError
|
|
594
|
+
translateEudrCrudError,
|
|
595
|
+
translateEudrErrorMessage
|
|
592
596
|
};
|
|
593
597
|
//# sourceMappingURL=formConfig.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/eudr/components/formConfig.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { LookupSelect } from '@open-mercato/ui/backend/inputs'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport type { StatusBadgeVariant } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n EUDR_ACTIVITY_TYPES,\n EUDR_ACTOR_ROLES,\n EUDR_COMMODITIES,\n EUDR_STATEMENT_STATUSES,\n EUDR_SUBMISSION_STATUSES,\n GEOJSON_TYPES,\n type EudrActivityType,\n type EudrActorRole,\n type EudrCommodity,\n type EudrStatementStatus,\n type EudrSubmissionStatus,\n} from '../data/validators'\n\nexport type Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nexport type ProductSnapshot = {\n name?: string\n sku?: string\n}\n\nexport type CompanySnapshot = {\n displayName?: string\n}\n\nexport type OrderSnapshot = {\n orderNumber?: string | null\n}\n\nexport type ReferencedStatementValue = {\n referenceNumber: string\n verificationNumber?: string\n}\n\nexport type PickerOption<Snapshot extends Record<string, unknown>> = {\n value: string\n label: string\n subtitle?: string | null\n snapshot?: Snapshot | null\n unavailable?: boolean\n}\n\ntype PickerPayload = {\n items?: unknown[]\n}\n\ntype LookupSelectFieldProps<Snapshot extends Record<string, unknown>> = {\n id: string\n value?: string | null\n onChange: (value: string | undefined) => void\n onSnapshot?: (snapshot: Snapshot | null) => void\n placeholder: string\n emptyLabel?: string\n loadError: string\n disabled?: boolean\n loadOptions: (search: string) => Promise<PickerOption<Snapshot>[]>\n loadSelectedOption?: (id: string) => Promise<PickerOption<Snapshot> | null>\n}\n\nconst GEOJSON_SIZE_LIMIT = 1_048_576\nexport const PICKER_PAGE_SIZE = 20\n\nexport function commodityOptions(translate: Translator): Array<{ value: EudrCommodity; label: string }> {\n return EUDR_COMMODITIES.map((commodity) => ({\n value: commodity,\n label: translate(`eudr.commodity.${commodity}`),\n }))\n}\n\nexport function submissionStatusOptions(translate: Translator): Array<{ value: EudrSubmissionStatus; label: string }> {\n return EUDR_SUBMISSION_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.submissionStatus.${status}`),\n }))\n}\n\nexport function statementStatusOptions(translate: Translator): Array<{ value: EudrStatementStatus; label: string }> {\n return EUDR_STATEMENT_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.statementStatus.${status}`),\n }))\n}\n\nexport function activityTypeOptions(translate: Translator): Array<{ value: EudrActivityType; label: string }> {\n return EUDR_ACTIVITY_TYPES.map((activityType) => ({\n value: activityType,\n label: translate(`eudr.activityType.${activityType}`),\n }))\n}\n\nexport function actorRoleOptions(translate: Translator): Array<{ value: EudrActorRole; label: string }> {\n return EUDR_ACTOR_ROLES.map((actorRole) => ({\n value: actorRole,\n label: translate(`eudr.actorRole.${actorRole}`),\n }))\n}\n\nexport function statusBadgeVariant(\n status: EudrSubmissionStatus | EudrStatementStatus | string | null | undefined,\n): StatusBadgeVariant {\n if (status === 'submitted') return 'info'\n if (status === 'verified' || status === 'available') return 'success'\n if (status === 'rejected') return 'error'\n if (status === 'withdrawn') return 'warning'\n return 'neutral'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value !== 'string') continue\n const trimmed = value.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction normalizeProductOption(raw: unknown): PickerOption<ProductSnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const sku = readString(raw, ['sku'])\n if (!title && !sku) return null\n const snapshot = {\n ...(title ? { name: title } : {}),\n ...(sku ? { sku } : {}),\n }\n return { value: id, label: title ?? sku ?? '', subtitle: title ? sku : null, snapshot }\n}\n\nfunction normalizeCompanyOption(raw: unknown): PickerOption<CompanySnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const displayName = readString(raw, ['display_name', 'displayName', 'name'])\n if (!displayName) return null\n return {\n value: id,\n label: displayName,\n snapshot: { displayName },\n }\n}\n\nfunction normalizeMappingOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const productSnapshot = isRecord(raw.productSnapshot) ? raw.productSnapshot : null\n const productName = productSnapshot ? readString(productSnapshot, ['name']) : null\n const productSku = productSnapshot ? readString(productSnapshot, ['sku']) : null\n const commodity = readString(raw, ['commodity'])\n const hsCode = readString(raw, ['hsCode'])\n const label = productName ?? productSku ?? translate('eudr.common.recordUnavailable')\n const subtitleSegments = [\n productName ? productSku : null,\n commodity ? translate(`eudr.commodity.${commodity}`) : null,\n hsCode,\n ].filter((segment): segment is string => typeof segment === 'string' && segment.length > 0)\n return { value: id, label, subtitle: subtitleSegments.length ? subtitleSegments.join(' - ') : null }\n}\n\nfunction normalizeStatementOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const referenceNumber = readString(raw, ['referenceNumber'])\n const label = title ?? referenceNumber ?? translate('eudr.common.recordUnavailable')\n return { value: id, label, subtitle: title ? referenceNumber : null }\n}\n\nexport function LookupSelectField<Snapshot extends Record<string, unknown>>({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n disabled,\n loadOptions,\n loadSelectedOption,\n}: LookupSelectFieldProps<Snapshot>) {\n const translate = useT()\n const selectedValue = typeof value === 'string' && value.length > 0 ? value : null\n const [selectedOption, setSelectedOption] = React.useState<PickerOption<Snapshot> | null>(null)\n const knownOptionsRef = React.useRef<Map<string, PickerOption<Snapshot>>>(new Map())\n\n React.useEffect(() => {\n if (!selectedValue) {\n setSelectedOption(null)\n return\n }\n if (selectedOption?.value === selectedValue) return\n const known = knownOptionsRef.current.get(selectedValue)\n if (known) {\n setSelectedOption(known)\n return\n }\n let cancelled = false\n const markUnavailable = () => {\n if (!cancelled) {\n setSelectedOption({\n value: selectedValue,\n label: translate('eudr.common.recordUnavailable'),\n unavailable: true,\n })\n }\n }\n if (!loadSelectedOption) {\n markUnavailable()\n return\n }\n loadSelectedOption(selectedValue)\n .then((resolved) => {\n if (cancelled) return\n if (resolved) {\n knownOptionsRef.current.set(resolved.value, resolved)\n setSelectedOption(resolved)\n } else {\n markUnavailable()\n }\n })\n .catch(markUnavailable)\n return () => {\n cancelled = true\n }\n }, [loadSelectedOption, selectedOption, selectedValue, translate])\n\n React.useEffect(() => {\n if (!onSnapshot || !selectedOption || selectedOption.unavailable) return\n onSnapshot(selectedOption.snapshot ?? null)\n }, [onSnapshot, selectedOption])\n\n const selectedOptionRef = React.useRef(selectedOption)\n React.useEffect(() => {\n selectedOptionRef.current = selectedOption\n }, [selectedOption])\n\n const setQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const fetchItems = React.useCallback(async (query: string) => {\n let options: Array<PickerOption<Snapshot>> = []\n try {\n options = await loadOptions(query)\n } catch (error) {\n const message = error instanceof Error && error.message ? error.message : loadError\n flash(message, 'error')\n options = []\n }\n for (const option of options) knownOptionsRef.current.set(option.value, option)\n const selected = selectedOptionRef.current\n const merged = selected && !options.some((option) => option.value === selected.value)\n ? [selected, ...options]\n : options\n return merged.map((option) => ({\n id: option.value,\n title: option.label,\n subtitle: option.subtitle ?? undefined,\n }))\n }, [loadError, loadOptions])\n\n return (\n <div id={id} className=\"space-y-2\">\n {selectedValue ? (\n <p className=\"text-sm text-foreground\">\n <span className=\"font-medium\">{selectedOption?.label ?? ''}</span>\n {selectedOption?.subtitle ? (\n <span className=\"text-muted-foreground\"> \u2014 {selectedOption.subtitle}</span>\n ) : null}\n </p>\n ) : null}\n <LookupSelect\n value={selectedValue}\n disabled={disabled}\n searchPlaceholder={placeholder}\n fetchItems={fetchItems}\n onReady={(controls) => { setQueryRef.current = controls.setQuery }}\n onChange={(nextValue) => {\n if (!nextValue) {\n onChange(undefined)\n onSnapshot?.(null)\n setSelectedOption(null)\n return\n }\n onChange(nextValue)\n const nextOption = knownOptionsRef.current.get(nextValue) ?? null\n setSelectedOption(nextOption)\n onSnapshot?.(nextOption?.snapshot ?? null)\n // Clearing the query drops LookupSelect back below its minQuery, which\n // collapses the result panel \u2014 otherwise it stays open over the form.\n setQueryRef.current?.('')\n }}\n />\n </div>\n )\n}\n\nexport function ProductSelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<ProductSnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadProductOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .filter((option): option is PickerOption<ProductSnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedProduct = React.useCallback(async (productId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .find((option): option is PickerOption<ProductSnapshot> => option?.value === productId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadProductOptions}\n loadSelectedOption={loadSelectedProduct}\n />\n )\n}\n\nexport function CompanySelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<CompanySnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadCompanyOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n sortField: 'name',\n sortDir: 'asc',\n })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .filter((option): option is PickerOption<CompanySnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedCompany = React.useCallback(async (companyId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?id=${encodeURIComponent(companyId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .find((option): option is PickerOption<CompanySnapshot> => option?.value === companyId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadCompanyOptions}\n loadSelectedOption={loadSelectedCompany}\n />\n )\n}\n\nfunction collectProductIds(items: unknown[]): string[] {\n const ids: string[] = []\n for (const item of items) {\n if (!isRecord(item)) continue\n const id = readString(item, ['id'])\n if (id) ids.push(id)\n }\n return ids\n}\n\nexport function MappingSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadMappingOptions = React.useCallback(async (search: string) => {\n const mappingParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (!search) {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${mappingParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }\n const productParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const directParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const [productsPayload, directPayload] = await Promise.all([\n readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${productParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${directParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n ])\n const productIds = collectProductIds(Array.isArray(productsPayload.items) ? productsPayload.items : [])\n let byProductItems: unknown[] = []\n if (productIds.length) {\n const byProductParams = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n productId: productIds.join(','),\n })\n const byProductPayload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${byProductParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n byProductItems = Array.isArray(byProductPayload.items) ? byProductPayload.items : []\n }\n const directItems = Array.isArray(directPayload.items) ? directPayload.items : []\n const merged = new Map<string, PickerOption<Record<string, unknown>>>()\n for (const item of [...byProductItems, ...directItems]) {\n const option = normalizeMappingOption(item, translate)\n if (option && !merged.has(option.value)) merged.set(option.value, option)\n }\n return Array.from(merged.values())\n }, [loadError, translate])\n\n const loadSelectedMapping = React.useCallback(async (mappingId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?id=${encodeURIComponent(mappingId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === mappingId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadMappingOptions}\n loadSelectedOption={loadSelectedMapping}\n />\n )\n}\n\nexport function StatementSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadStatementOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }, [loadError, translate])\n\n const loadSelectedStatement = React.useCallback(async (statementId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?id=${encodeURIComponent(statementId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === statementId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadStatementOptions}\n loadSelectedOption={loadSelectedStatement}\n />\n )\n}\n\nexport function parseGeolocationInput(raw: string, translate: Translator): Record<string, unknown> | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (!isRecord(parsed)) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n const geoJsonType = parsed.type\n if (\n typeof geoJsonType !== 'string' ||\n !GEOJSON_TYPES.some((allowedType) => allowedType === geoJsonType)\n ) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (JSON.stringify(parsed).length > GEOJSON_SIZE_LIMIT) {\n const message = translate('eudr.errors.geolocationTooLarge')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n return parsed\n}\n\nexport { translateEudrCrudError } from './crudErrorI18n'\n\nlet referencedStatementRowKeySeq = 0\n\nfunction normalizeReferencedStatements(value: unknown): ReferencedStatementValue[] {\n if (!Array.isArray(value)) return []\n return value\n .map((entry) => {\n if (!isRecord(entry)) return null\n const referenceNumber = readString(entry, ['referenceNumber']) ?? ''\n const verificationNumber = readString(entry, ['verificationNumber']) ?? ''\n return verificationNumber\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n .filter((entry): entry is ReferencedStatementValue => entry !== null)\n}\n\nexport function ReferencedStatementsField({\n id,\n value,\n onChange,\n disabled,\n}: {\n id: string\n value: ReferencedStatementValue[] | unknown\n onChange: (value: ReferencedStatementValue[]) => void\n disabled?: boolean\n}) {\n const translate = useT()\n const rows = React.useMemo(() => normalizeReferencedStatements(value), [value])\n const hasIncompleteRows = rows.some((row) => row.referenceNumber.trim().length === 0)\n\n const updateRow = React.useCallback((index: number, patch: Partial<ReferencedStatementValue>) => {\n const nextRows = rows.map((row, rowIndex) => {\n if (rowIndex !== index) return row\n const referenceNumber = patch.referenceNumber ?? row.referenceNumber\n const verificationNumber = patch.verificationNumber ?? row.verificationNumber ?? ''\n return verificationNumber.trim()\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n onChange(nextRows)\n }, [onChange, rows])\n\n // Row identity lives outside the persisted value (which is the API's\n // [{referenceNumber, verificationNumber?}] contract), so keys are tracked\n // alongside it. Indexes as keys make React reuse the wrong input when a middle\n // row is removed, which steals focus from the row that shifts up.\n const rowKeysRef = React.useRef<string[]>([])\n if (rowKeysRef.current.length < rows.length) {\n const nextKeys = [...rowKeysRef.current]\n while (nextKeys.length < rows.length) {\n referencedStatementRowKeySeq += 1\n nextKeys.push(`referenced-statement-${referencedStatementRowKeySeq}`)\n }\n rowKeysRef.current = nextKeys\n } else if (rowKeysRef.current.length > rows.length) {\n rowKeysRef.current = rowKeysRef.current.slice(0, rows.length)\n }\n const rowKeys = rowKeysRef.current\n\n const removeRow = React.useCallback((index: number) => {\n rowKeysRef.current = rowKeysRef.current.filter((_, keyIndex) => keyIndex !== index)\n onChange(rows.filter((_, rowIndex) => rowIndex !== index))\n }, [onChange, rows])\n\n return (\n <div id={id} className=\"space-y-3\">\n {rows.length > 0 ? (\n <div className=\"space-y-2\">\n {rows.map((row, index) => (\n <div key={rowKeys[index]} className=\"grid gap-2 md:grid-cols-[1fr_1fr_auto]\">\n <Input\n value={row.referenceNumber}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.referenceNumber')}\n onChange={(event) => updateRow(index, { referenceNumber: event.target.value })}\n />\n <Input\n value={row.verificationNumber ?? ''}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.verificationNumber')}\n onChange={(event) => updateRow(index, { verificationNumber: event.target.value })}\n />\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.removeReferencedStatement')}\n onClick={() => removeRow(index)}\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {translate('eudr.statements.form.noReferencedStatements')}\n </p>\n )}\n {hasIncompleteRows ? (\n <p className=\"text-sm text-status-warning-text\">\n {translate('eudr.statements.form.referencedStatementsValidation')}\n </p>\n ) : null}\n <IconButton\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.addReferencedStatement')}\n onClick={() => onChange([...rows, { referenceNumber: '' }])}\n >\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n )\n}\n\nexport { CountrySelectField } from './CountrySelectField'\nexport { OrderSelectField } from './OrderSelectField'\nexport { PlotMultiSelectField } from './PlotMultiSelectField'\n"],
|
|
5
|
-
"mappings": ";AA8RU,cAEE,YAFF;AA5RV,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AAEtB,SAAS,MAAM,cAAc;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AAmDP,MAAM,qBAAqB;AACpB,MAAM,mBAAmB;AAEzB,SAAS,iBAAiB,WAAuE;AACtG,SAAO,iBAAiB,IAAI,CAAC,eAAe;AAAA,IAC1C,OAAO;AAAA,IACP,OAAO,UAAU,kBAAkB,SAAS,EAAE;AAAA,EAChD,EAAE;AACJ;AAEO,SAAS,wBAAwB,WAA8E;AACpH,SAAO,yBAAyB,IAAI,CAAC,YAAY;AAAA,IAC/C,OAAO;AAAA,IACP,OAAO,UAAU,yBAAyB,MAAM,EAAE;AAAA,EACpD,EAAE;AACJ;AAEO,SAAS,uBAAuB,WAA6E;AAClH,SAAO,wBAAwB,IAAI,CAAC,YAAY;AAAA,IAC9C,OAAO;AAAA,IACP,OAAO,UAAU,wBAAwB,MAAM,EAAE;AAAA,EACnD,EAAE;AACJ;AAEO,SAAS,oBAAoB,WAA0E;AAC5G,SAAO,oBAAoB,IAAI,CAAC,kBAAkB;AAAA,IAChD,OAAO;AAAA,IACP,OAAO,UAAU,qBAAqB,YAAY,EAAE;AAAA,EACtD,EAAE;AACJ;AAEO,SAAS,iBAAiB,WAAuE;AACtG,SAAO,iBAAiB,IAAI,CAAC,eAAe;AAAA,IAC1C,OAAO;AAAA,IACP,OAAO,UAAU,kBAAkB,SAAS,EAAE;AAAA,EAChD,EAAE;AACJ;AAEO,SAAS,mBACd,QACoB;AACpB,MAAI,WAAW,YAAa,QAAO;AACnC,MAAI,WAAW,cAAc,WAAW,YAAa,QAAO;AAC5D,MAAI,WAAW,WAAY,QAAO;AAClC,MAAI,WAAW,YAAa,QAAO;AACnC,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,QAAiC,MAA+B;AAClF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,SAAU;AAC/B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,QAAQ,SAAS,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAoD;AAClF,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,QAAM,KAAK,WAAW,KAAK,CAAC,IAAI,CAAC;AACjC,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,QAAQ,WAAW,KAAK,CAAC,OAAO,CAAC;AACvC,QAAM,MAAM,WAAW,KAAK,CAAC,KAAK,CAAC;AACnC,MAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAC3B,QAAM,WAAW;AAAA,IACf,GAAI,QAAQ,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,IAC/B,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,EACvB;AACA,SAAO,EAAE,OAAO,IAAI,OAAO,SAAS,OAAO,IAAI,UAAU,QAAQ,MAAM,MAAM,SAAS;AACxF;AAEA,SAAS,uBAAuB,KAAoD;AAClF,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,QAAM,KAAK,WAAW,KAAK,CAAC,IAAI,CAAC;AACjC,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,cAAc,WAAW,KAAK,CAAC,gBAAgB,eAAe,MAAM,CAAC;AAC3E,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU,EAAE,YAAY;AAAA,EAC1B;AACF;AAEA,SAAS,uBAAuB,KAAc,WAAqE;AACjH,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,QAAM,KAAK,WAAW,KAAK,CAAC,IAAI,CAAC;AACjC,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,kBAAkB,SAAS,IAAI,eAAe,IAAI,IAAI,kBAAkB;AAC9E,QAAM,cAAc,kBAAkB,WAAW,iBAAiB,CAAC,MAAM,CAAC,IAAI;AAC9E,QAAM,aAAa,kBAAkB,WAAW,iBAAiB,CAAC,KAAK,CAAC,IAAI;AAC5E,QAAM,YAAY,WAAW,KAAK,CAAC,WAAW,CAAC;AAC/C,QAAM,SAAS,WAAW,KAAK,CAAC,QAAQ,CAAC;AACzC,QAAM,QAAQ,eAAe,cAAc,UAAU,+BAA+B;AACpF,QAAM,mBAAmB;AAAA,IACvB,cAAc,aAAa;AAAA,IAC3B,YAAY,UAAU,kBAAkB,SAAS,EAAE,IAAI;AAAA,IACvD;AAAA,EACF,EAAE,OAAO,CAAC,YAA+B,OAAO,YAAY,YAAY,QAAQ,SAAS,CAAC;AAC1F,SAAO,EAAE,OAAO,IAAI,OAAO,UAAU,iBAAiB,SAAS,iBAAiB,KAAK,KAAK,IAAI,KAAK;AACrG;AAEA,SAAS,yBAAyB,KAAc,WAAqE;AACnH,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,QAAM,KAAK,WAAW,KAAK,CAAC,IAAI,CAAC;AACjC,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,QAAQ,WAAW,KAAK,CAAC,OAAO,CAAC;AACvC,QAAM,kBAAkB,WAAW,KAAK,CAAC,iBAAiB,CAAC;AAC3D,QAAM,QAAQ,SAAS,mBAAmB,UAAU,+BAA+B;AACnF,SAAO,EAAE,OAAO,IAAI,OAAO,UAAU,QAAQ,kBAAkB,KAAK;AACtE;AAEO,SAAS,kBAA4D;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqC;AACnC,QAAM,YAAY,KAAK;AACvB,QAAM,gBAAgB,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AAC9E,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAwC,IAAI;AAC9F,QAAM,kBAAkB,MAAM,OAA4C,oBAAI,IAAI,CAAC;AAEnF,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,eAAe;AAClB,wBAAkB,IAAI;AACtB;AAAA,IACF;AACA,QAAI,gBAAgB,UAAU,cAAe;AAC7C,UAAM,QAAQ,gBAAgB,QAAQ,IAAI,aAAa;AACvD,QAAI,OAAO;AACT,wBAAkB,KAAK;AACvB;AAAA,IACF;AACA,QAAI,YAAY;AAChB,UAAM,kBAAkB,MAAM;AAC5B,UAAI,CAAC,WAAW;AACd,0BAAkB;AAAA,UAChB,OAAO;AAAA,UACP,OAAO,UAAU,+BAA+B;AAAA,UAChD,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB;AACvB,sBAAgB;AAChB;AAAA,IACF;AACA,uBAAmB,aAAa,EAC7B,KAAK,CAAC,aAAa;AAClB,UAAI,UAAW;AACf,UAAI,UAAU;AACZ,wBAAgB,QAAQ,IAAI,SAAS,OAAO,QAAQ;AACpD,0BAAkB,QAAQ;AAAA,MAC5B,OAAO;AACL,wBAAgB;AAAA,MAClB;AAAA,IACF,CAAC,EACA,MAAM,eAAe;AACxB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,oBAAoB,gBAAgB,eAAe,SAAS,CAAC;AAEjE,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,cAAc,CAAC,kBAAkB,eAAe,YAAa;AAClE,eAAW,eAAe,YAAY,IAAI;AAAA,EAC5C,GAAG,CAAC,YAAY,cAAc,CAAC;AAE/B,QAAM,oBAAoB,MAAM,OAAO,cAAc;AACrD,QAAM,UAAU,MAAM;AACpB,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,cAAc,MAAM,OAAyC,IAAI;AAEvE,QAAM,aAAa,MAAM,YAAY,OAAO,UAAkB;AAC5D,QAAI,UAAyC,CAAC;AAC9C,QAAI;AACF,gBAAU,MAAM,YAAY,KAAK;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,SAAS,MAAM,UAAU,MAAM,UAAU;AAC1E,YAAM,SAAS,OAAO;AACtB,gBAAU,CAAC;AAAA,IACb;AACA,eAAW,UAAU,QAAS,iBAAgB,QAAQ,IAAI,OAAO,OAAO,MAAM;AAC9E,UAAM,WAAW,kBAAkB;AACnC,UAAM,SAAS,YAAY,CAAC,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,SAAS,KAAK,IAChF,CAAC,UAAU,GAAG,OAAO,IACrB;AACJ,WAAO,OAAO,IAAI,CAAC,YAAY;AAAA,MAC7B,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,MACd,UAAU,OAAO,YAAY;AAAA,IAC/B,EAAE;AAAA,EACJ,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SACE,qBAAC,SAAI,IAAQ,WAAU,aACpB;AAAA,oBACC,qBAAC,OAAE,WAAU,2BACX;AAAA,0BAAC,UAAK,WAAU,eAAe,0BAAgB,SAAS,IAAG;AAAA,MAC1D,gBAAgB,WACf,qBAAC,UAAK,WAAU,yBAAwB;AAAA;AAAA,QAAI,eAAe;AAAA,SAAS,IAClE;AAAA,OACN,IACE;AAAA,IACJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,mBAAmB;AAAA,QACnB;AAAA,QACA,SAAS,CAAC,aAAa;AAAE,sBAAY,UAAU,SAAS;AAAA,QAAS;AAAA,QACjE,UAAU,CAAC,cAAc;AACvB,cAAI,CAAC,WAAW;AACd,qBAAS,MAAS;AAClB,yBAAa,IAAI;AACjB,8BAAkB,IAAI;AACtB;AAAA,UACF;AACA,mBAAS,SAAS;AAClB,gBAAM,aAAa,gBAAgB,QAAQ,IAAI,SAAS,KAAK;AAC7D,4BAAkB,UAAU;AAC5B,uBAAa,YAAY,YAAY,IAAI;AAGzC,sBAAY,UAAU,EAAE;AAAA,QAC1B;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuG;AACrG,QAAM,qBAAqB,MAAM,YAAY,OAAO,WAAmB;AACrE,UAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,OAAO,gBAAgB,EAAE,CAAC;AACpF,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,UAAM,UAAU,MAAM;AAAA,MACpB,yBAAyB,OAAO,SAAS,CAAC;AAAA,MAC1C;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,EAC1C,OAAO,CAAC,WAAoD,WAAW,IAAI;AAAA,EAChF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,sBAAsB,MAAM,YAAY,OAAO,cAAsB;AACzE,UAAM,UAAU,MAAM;AAAA,MACpB,4BAA4B,mBAAmB,SAAS,CAAC;AAAA,MACzD;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,EAC1C,KAAK,CAAC,WAAoD,QAAQ,UAAU,SAAS,KAAK;AAAA,EAC/F,GAAG,CAAC,SAAS,CAAC;AAEd,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA;AAAA,EACtB;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuG;AACrG,QAAM,qBAAqB,MAAM,YAAY,OAAO,WAAmB;AACrE,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,MAAM;AAAA,MACN,UAAU,OAAO,gBAAgB;AAAA,MACjC,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AACD,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,UAAM,UAAU,MAAM;AAAA,MACpB,4BAA4B,OAAO,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,EAC1C,OAAO,CAAC,WAAoD,WAAW,IAAI;AAAA,EAChF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,sBAAsB,MAAM,YAAY,OAAO,cAAsB;AACzE,UAAM,UAAU,MAAM;AAAA,MACpB,+BAA+B,mBAAmB,SAAS,CAAC;AAAA,MAC5D;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,EAC1C,KAAK,CAAC,WAAoD,QAAQ,UAAU,SAAS,KAAK;AAAA,EAC/F,GAAG,CAAC,SAAS,CAAC;AAEd,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA;AAAA,EACtB;AAEJ;AAEA,SAAS,kBAAkB,OAA4B;AACrD,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,SAAS,IAAI,EAAG;AACrB,UAAM,KAAK,WAAW,MAAM,CAAC,IAAI,CAAC;AAClC,QAAI,GAAI,KAAI,KAAK,EAAE;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+G;AAC7G,QAAM,YAAY,KAAK;AACvB,QAAM,qBAAqB,MAAM,YAAY,OAAO,WAAmB;AACrE,UAAM,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,OAAO,gBAAgB,EAAE,CAAC;AAC3F,QAAI,CAAC,QAAQ;AACX,YAAM,UAAU,MAAM;AAAA,QACpB,8BAA8B,cAAc,SAAS,CAAC;AAAA,QACtD;AAAA,QACA,EAAE,cAAc,UAAU;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,aAAO,MACJ,IAAI,CAAC,SAAS,uBAAuB,MAAM,SAAS,CAAC,EACrD,OAAO,CAAC,WAA4D,WAAW,IAAI;AAAA,IACxF;AACA,UAAM,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,OAAO,gBAAgB,GAAG,OAAO,CAAC;AACnG,UAAM,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,OAAO,gBAAgB,GAAG,OAAO,CAAC;AAClG,UAAM,CAAC,iBAAiB,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzD;AAAA,QACE,yBAAyB,cAAc,SAAS,CAAC;AAAA,QACjD;AAAA,QACA,EAAE,cAAc,UAAU;AAAA,MAC5B;AAAA,MACA;AAAA,QACE,8BAA8B,aAAa,SAAS,CAAC;AAAA,QACrD;AAAA,QACA,EAAE,cAAc,UAAU;AAAA,MAC5B;AAAA,IACF,CAAC;AACD,UAAM,aAAa,kBAAkB,MAAM,QAAQ,gBAAgB,KAAK,IAAI,gBAAgB,QAAQ,CAAC,CAAC;AACtG,QAAI,iBAA4B,CAAC;AACjC,QAAI,WAAW,QAAQ;AACrB,YAAM,kBAAkB,IAAI,gBAAgB;AAAA,QAC1C,MAAM;AAAA,QACN,UAAU,OAAO,gBAAgB;AAAA,QACjC,WAAW,WAAW,KAAK,GAAG;AAAA,MAChC,CAAC;AACD,YAAM,mBAAmB,MAAM;AAAA,QAC7B,8BAA8B,gBAAgB,SAAS,CAAC;AAAA,QACxD;AAAA,QACA,EAAE,cAAc,UAAU;AAAA,MAC5B;AACA,uBAAiB,MAAM,QAAQ,iBAAiB,KAAK,IAAI,iBAAiB,QAAQ,CAAC;AAAA,IACrF;AACA,UAAM,cAAc,MAAM,QAAQ,cAAc,KAAK,IAAI,cAAc,QAAQ,CAAC;AAChF,UAAM,SAAS,oBAAI,IAAmD;AACtE,eAAW,QAAQ,CAAC,GAAG,gBAAgB,GAAG,WAAW,GAAG;AACtD,YAAM,SAAS,uBAAuB,MAAM,SAAS;AACrD,UAAI,UAAU,CAAC,OAAO,IAAI,OAAO,KAAK,EAAG,QAAO,IAAI,OAAO,OAAO,MAAM;AAAA,IAC1E;AACA,WAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,EACnC,GAAG,CAAC,WAAW,SAAS,CAAC;AAEzB,QAAM,sBAAsB,MAAM,YAAY,OAAO,cAAsB;AACzE,UAAM,UAAU,MAAM;AAAA,MACpB,iCAAiC,mBAAmB,SAAS,CAAC;AAAA,MAC9D;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,uBAAuB,MAAM,SAAS,CAAC,EACrD,KAAK,CAAC,WAA4D,QAAQ,UAAU,SAAS,KAAK;AAAA,EACvG,GAAG,CAAC,WAAW,SAAS,CAAC;AAEzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA;AAAA,EACtB;AAEJ;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+G;AAC7G,QAAM,YAAY,KAAK;AACvB,QAAM,uBAAuB,MAAM,YAAY,OAAO,WAAmB;AACvE,UAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,OAAO,gBAAgB,EAAE,CAAC;AACpF,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,UAAM,UAAU,MAAM;AAAA,MACpB,wBAAwB,OAAO,SAAS,CAAC;AAAA,MACzC;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,yBAAyB,MAAM,SAAS,CAAC,EACvD,OAAO,CAAC,WAA4D,WAAW,IAAI;AAAA,EACxF,GAAG,CAAC,WAAW,SAAS,CAAC;AAEzB,QAAM,wBAAwB,MAAM,YAAY,OAAO,gBAAwB;AAC7E,UAAM,UAAU,MAAM;AAAA,MACpB,2BAA2B,mBAAmB,WAAW,CAAC;AAAA,MAC1D;AAAA,MACA,EAAE,cAAc,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,WAAO,MACJ,IAAI,CAAC,SAAS,yBAAyB,MAAM,SAAS,CAAC,EACvD,KAAK,CAAC,WAA4D,QAAQ,UAAU,WAAW,KAAK;AAAA,EACzG,GAAG,CAAC,WAAW,SAAS,CAAC;AAEzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA;AAAA,EACtB;AAEJ;AAEO,SAAS,sBAAsB,KAAa,WAAuD;AACxG,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,OAAO;AAAA,EAC7B,QAAQ;AACN,UAAM,UAAU,UAAU,gCAAgC;AAC1D,UAAM,oBAAoB,SAAS,EAAE,aAAa,QAAQ,CAAC;AAAA,EAC7D;AAEA,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,UAAU,UAAU,gCAAgC;AAC1D,UAAM,oBAAoB,SAAS,EAAE,aAAa,QAAQ,CAAC;AAAA,EAC7D;AAEA,QAAM,cAAc,OAAO;AAC3B,MACE,OAAO,gBAAgB,YACvB,CAAC,cAAc,KAAK,CAAC,gBAAgB,gBAAgB,WAAW,GAChE;AACA,UAAM,UAAU,UAAU,gCAAgC;AAC1D,UAAM,oBAAoB,SAAS,EAAE,aAAa,QAAQ,CAAC;AAAA,EAC7D;AAEA,MAAI,KAAK,UAAU,MAAM,EAAE,SAAS,oBAAoB;AACtD,UAAM,UAAU,UAAU,iCAAiC;AAC3D,UAAM,oBAAoB,SAAS,EAAE,aAAa,QAAQ,CAAC;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B;AAEvC,IAAI,+BAA+B;AAEnC,SAAS,8BAA8B,OAA4C;AACjF,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,UAAM,kBAAkB,WAAW,OAAO,CAAC,iBAAiB,CAAC,KAAK;AAClE,UAAM,qBAAqB,WAAW,OAAO,CAAC,oBAAoB,CAAC,KAAK;AACxE,WAAO,qBACH,EAAE,iBAAiB,mBAAmB,IACtC,EAAE,gBAAgB;AAAA,EACxB,CAAC,EACA,OAAO,CAAC,UAA6C,UAAU,IAAI;AACxE;AAEO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,YAAY,KAAK;AACvB,QAAM,OAAO,MAAM,QAAQ,MAAM,8BAA8B,KAAK,GAAG,CAAC,KAAK,CAAC;AAC9E,QAAM,oBAAoB,KAAK,KAAK,CAAC,QAAQ,IAAI,gBAAgB,KAAK,EAAE,WAAW,CAAC;AAEpF,QAAM,YAAY,MAAM,YAAY,CAAC,OAAe,UAA6C;AAC/F,UAAM,WAAW,KAAK,IAAI,CAAC,KAAK,aAAa;AAC3C,UAAI,aAAa,MAAO,QAAO;AAC/B,YAAM,kBAAkB,MAAM,mBAAmB,IAAI;AACrD,YAAM,qBAAqB,MAAM,sBAAsB,IAAI,sBAAsB;AACjF,aAAO,mBAAmB,KAAK,IAC3B,EAAE,iBAAiB,mBAAmB,IACtC,EAAE,gBAAgB;AAAA,IACxB,CAAC;AACD,aAAS,QAAQ;AAAA,EACnB,GAAG,CAAC,UAAU,IAAI,CAAC;AAMnB,QAAM,aAAa,MAAM,OAAiB,CAAC,CAAC;AAC5C,MAAI,WAAW,QAAQ,SAAS,KAAK,QAAQ;AAC3C,UAAM,WAAW,CAAC,GAAG,WAAW,OAAO;AACvC,WAAO,SAAS,SAAS,KAAK,QAAQ;AACpC,sCAAgC;AAChC,eAAS,KAAK,wBAAwB,4BAA4B,EAAE;AAAA,IACtE;AACA,eAAW,UAAU;AAAA,EACvB,WAAW,WAAW,QAAQ,SAAS,KAAK,QAAQ;AAClD,eAAW,UAAU,WAAW,QAAQ,MAAM,GAAG,KAAK,MAAM;AAAA,EAC9D;AACA,QAAM,UAAU,WAAW;AAE3B,QAAM,YAAY,MAAM,YAAY,CAAC,UAAkB;AACrD,eAAW,UAAU,WAAW,QAAQ,OAAO,CAAC,GAAG,aAAa,aAAa,KAAK;AAClF,aAAS,KAAK,OAAO,CAAC,GAAG,aAAa,aAAa,KAAK,CAAC;AAAA,EAC3D,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,SACE,qBAAC,SAAI,IAAQ,WAAU,aACpB;AAAA,SAAK,SAAS,IACb,oBAAC,SAAI,WAAU,aACZ,eAAK,IAAI,CAAC,KAAK,UACd,qBAAC,SAAyB,WAAU,0CAClC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,IAAI;AAAA,UACX;AAAA,UACA,aAAa,UAAU,sCAAsC;AAAA,UAC7D,UAAU,CAAC,UAAU,UAAU,OAAO,EAAE,iBAAiB,MAAM,OAAO,MAAM,CAAC;AAAA;AAAA,MAC/E;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,IAAI,sBAAsB;AAAA,UACjC;AAAA,UACA,aAAa,UAAU,yCAAyC;AAAA,UAChE,UAAU,CAAC,UAAU,UAAU,OAAO,EAAE,oBAAoB,MAAM,OAAO,MAAM,CAAC;AAAA;AAAA,MAClF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR;AAAA,UACA,cAAY,UAAU,gDAAgD;AAAA,UACtE,SAAS,MAAM,UAAU,KAAK;AAAA,UAE9B,8BAAC,UAAO,WAAU,UAAS,eAAY,QAAO;AAAA;AAAA,MAChD;AAAA,SArBQ,QAAQ,KAAK,CAsBvB,CACD,GACH,IAEA,oBAAC,OAAE,WAAU,iCACV,oBAAU,6CAA6C,GAC1D;AAAA,IAED,oBACC,oBAAC,OAAE,WAAU,oCACV,oBAAU,qDAAqD,GAClE,IACE;AAAA,IACJ;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR;AAAA,QACA,cAAY,UAAU,6CAA6C;AAAA,QACnE,SAAS,MAAM,SAAS,CAAC,GAAG,MAAM,EAAE,iBAAiB,GAAG,CAAC,CAAC;AAAA,QAE1D,8BAAC,QAAK,WAAU,UAAS,eAAY,QAAO;AAAA;AAAA,IAC9C;AAAA,KACF;AAEJ;AAEA,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { LookupSelect } from '@open-mercato/ui/backend/inputs'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport type { StatusBadgeVariant } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n EUDR_ACTIVITY_TYPES,\n EUDR_ACTOR_ROLES,\n EUDR_COMMODITIES,\n EUDR_STATEMENT_STATUSES,\n EUDR_SUBMISSION_STATUSES,\n GEOJSON_TYPES,\n type EudrActivityType,\n type EudrActorRole,\n type EudrCommodity,\n type EudrStatementStatus,\n type EudrSubmissionStatus,\n} from '../data/validators'\n\nexport type Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nexport type ProductSnapshot = {\n name?: string\n sku?: string\n}\n\nexport type CompanySnapshot = {\n displayName?: string\n}\n\nexport type OrderSnapshot = {\n orderNumber?: string | null\n}\n\nexport type ReferencedStatementValue = {\n referenceNumber: string\n verificationNumber?: string\n}\n\nexport type PickerOption<Snapshot extends Record<string, unknown>> = {\n value: string\n label: string\n subtitle?: string | null\n snapshot?: Snapshot | null\n unavailable?: boolean\n}\n\ntype PickerPayload = {\n items?: unknown[]\n}\n\ntype LookupSelectFieldProps<Snapshot extends Record<string, unknown>> = {\n id: string\n value?: string | null\n onChange: (value: string | undefined) => void\n onSnapshot?: (snapshot: Snapshot | null) => void\n placeholder: string\n emptyLabel?: string\n loadError: string\n disabled?: boolean\n loadOptions: (search: string) => Promise<PickerOption<Snapshot>[]>\n loadSelectedOption?: (id: string) => Promise<PickerOption<Snapshot> | null>\n}\n\nconst GEOJSON_SIZE_LIMIT = 1_048_576\nexport const PICKER_PAGE_SIZE = 20\n\nexport function commodityOptions(translate: Translator): Array<{ value: EudrCommodity; label: string }> {\n return EUDR_COMMODITIES.map((commodity) => ({\n value: commodity,\n label: translate(`eudr.commodity.${commodity}`),\n }))\n}\n\nexport function submissionStatusOptions(translate: Translator): Array<{ value: EudrSubmissionStatus; label: string }> {\n return EUDR_SUBMISSION_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.submissionStatus.${status}`),\n }))\n}\n\nexport function statementStatusOptions(translate: Translator): Array<{ value: EudrStatementStatus; label: string }> {\n return EUDR_STATEMENT_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.statementStatus.${status}`),\n }))\n}\n\nexport function activityTypeOptions(translate: Translator): Array<{ value: EudrActivityType; label: string }> {\n return EUDR_ACTIVITY_TYPES.map((activityType) => ({\n value: activityType,\n label: translate(`eudr.activityType.${activityType}`),\n }))\n}\n\nexport function actorRoleOptions(translate: Translator): Array<{ value: EudrActorRole; label: string }> {\n return EUDR_ACTOR_ROLES.map((actorRole) => ({\n value: actorRole,\n label: translate(`eudr.actorRole.${actorRole}`),\n }))\n}\n\nexport function statusBadgeVariant(\n status: EudrSubmissionStatus | EudrStatementStatus | string | null | undefined,\n): StatusBadgeVariant {\n if (status === 'submitted') return 'info'\n if (status === 'verified' || status === 'available') return 'success'\n if (status === 'rejected') return 'error'\n if (status === 'withdrawn') return 'warning'\n return 'neutral'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value !== 'string') continue\n const trimmed = value.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction normalizeProductOption(raw: unknown): PickerOption<ProductSnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const sku = readString(raw, ['sku'])\n if (!title && !sku) return null\n const snapshot = {\n ...(title ? { name: title } : {}),\n ...(sku ? { sku } : {}),\n }\n return { value: id, label: title ?? sku ?? '', subtitle: title ? sku : null, snapshot }\n}\n\nfunction normalizeCompanyOption(raw: unknown): PickerOption<CompanySnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const displayName = readString(raw, ['display_name', 'displayName', 'name'])\n if (!displayName) return null\n return {\n value: id,\n label: displayName,\n snapshot: { displayName },\n }\n}\n\nfunction normalizeMappingOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const productSnapshot = isRecord(raw.productSnapshot) ? raw.productSnapshot : null\n const productName = productSnapshot ? readString(productSnapshot, ['name']) : null\n const productSku = productSnapshot ? readString(productSnapshot, ['sku']) : null\n const commodity = readString(raw, ['commodity'])\n const hsCode = readString(raw, ['hsCode'])\n const label = productName ?? productSku ?? translate('eudr.common.recordUnavailable')\n const subtitleSegments = [\n productName ? productSku : null,\n commodity ? translate(`eudr.commodity.${commodity}`) : null,\n hsCode,\n ].filter((segment): segment is string => typeof segment === 'string' && segment.length > 0)\n return { value: id, label, subtitle: subtitleSegments.length ? subtitleSegments.join(' - ') : null }\n}\n\nfunction normalizeStatementOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const referenceNumber = readString(raw, ['referenceNumber'])\n const label = title ?? referenceNumber ?? translate('eudr.common.recordUnavailable')\n return { value: id, label, subtitle: title ? referenceNumber : null }\n}\n\nexport function LookupSelectField<Snapshot extends Record<string, unknown>>({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n disabled,\n loadOptions,\n loadSelectedOption,\n}: LookupSelectFieldProps<Snapshot>) {\n const translate = useT()\n const selectedValue = typeof value === 'string' && value.length > 0 ? value : null\n const [selectedOption, setSelectedOption] = React.useState<PickerOption<Snapshot> | null>(null)\n const knownOptionsRef = React.useRef<Map<string, PickerOption<Snapshot>>>(new Map())\n\n React.useEffect(() => {\n if (!selectedValue) {\n setSelectedOption(null)\n return\n }\n if (selectedOption?.value === selectedValue) return\n const known = knownOptionsRef.current.get(selectedValue)\n if (known) {\n setSelectedOption(known)\n return\n }\n let cancelled = false\n const markUnavailable = () => {\n if (!cancelled) {\n setSelectedOption({\n value: selectedValue,\n label: translate('eudr.common.recordUnavailable'),\n unavailable: true,\n })\n }\n }\n if (!loadSelectedOption) {\n markUnavailable()\n return\n }\n loadSelectedOption(selectedValue)\n .then((resolved) => {\n if (cancelled) return\n if (resolved) {\n knownOptionsRef.current.set(resolved.value, resolved)\n setSelectedOption(resolved)\n } else {\n markUnavailable()\n }\n })\n .catch(markUnavailable)\n return () => {\n cancelled = true\n }\n }, [loadSelectedOption, selectedOption, selectedValue, translate])\n\n // A snapshot is a denormalization captured when the user picks a record, so resolving the\n // value an edit form was hydrated with must not re-emit it. Doing so overwrites the stored\n // snapshot with a freshly fetched one, which makes an untouched CrudForm look dirty and\n // raises the \"You have unsaved changes\" prompt on the way out.\n const hydratedValueRef = React.useRef<string | null>(selectedValue)\n\n React.useEffect(() => {\n if (!onSnapshot || !selectedOption || selectedOption.unavailable) return\n if (hydratedValueRef.current === selectedOption.value) return\n hydratedValueRef.current = null\n onSnapshot(selectedOption.snapshot ?? null)\n }, [onSnapshot, selectedOption])\n\n const selectedOptionRef = React.useRef(selectedOption)\n React.useEffect(() => {\n selectedOptionRef.current = selectedOption\n }, [selectedOption])\n\n const setQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const fetchItems = React.useCallback(async (query: string) => {\n let options: Array<PickerOption<Snapshot>> = []\n try {\n options = await loadOptions(query)\n } catch (error) {\n const message = error instanceof Error && error.message ? error.message : loadError\n flash(message, 'error')\n options = []\n }\n for (const option of options) knownOptionsRef.current.set(option.value, option)\n const selected = selectedOptionRef.current\n const merged = selected && !options.some((option) => option.value === selected.value)\n ? [selected, ...options]\n : options\n return merged.map((option) => ({\n id: option.value,\n title: option.label,\n subtitle: option.subtitle ?? undefined,\n }))\n }, [loadError, loadOptions])\n\n return (\n <div id={id} className=\"space-y-2\">\n {selectedValue ? (\n <p className=\"text-sm text-foreground\">\n <span className=\"font-medium\">{selectedOption?.label ?? ''}</span>\n {selectedOption?.subtitle ? (\n <span className=\"text-muted-foreground\"> \u2014 {selectedOption.subtitle}</span>\n ) : null}\n </p>\n ) : null}\n <LookupSelect\n value={selectedValue}\n disabled={disabled}\n searchPlaceholder={placeholder}\n fetchItems={fetchItems}\n onReady={(controls) => { setQueryRef.current = controls.setQuery }}\n onChange={(nextValue) => {\n if (!nextValue) {\n onChange(undefined)\n onSnapshot?.(null)\n setSelectedOption(null)\n return\n }\n onChange(nextValue)\n const nextOption = knownOptionsRef.current.get(nextValue) ?? null\n setSelectedOption(nextOption)\n onSnapshot?.(nextOption?.snapshot ?? null)\n // Clearing the query drops LookupSelect back below its minQuery, which\n // collapses the result panel \u2014 otherwise it stays open over the form.\n setQueryRef.current?.('')\n }}\n />\n </div>\n )\n}\n\nexport function ProductSelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<ProductSnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadProductOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .filter((option): option is PickerOption<ProductSnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedProduct = React.useCallback(async (productId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .find((option): option is PickerOption<ProductSnapshot> => option?.value === productId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadProductOptions}\n loadSelectedOption={loadSelectedProduct}\n />\n )\n}\n\nexport function CompanySelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<CompanySnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadCompanyOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n sortField: 'name',\n sortDir: 'asc',\n })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .filter((option): option is PickerOption<CompanySnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedCompany = React.useCallback(async (companyId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?id=${encodeURIComponent(companyId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .find((option): option is PickerOption<CompanySnapshot> => option?.value === companyId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadCompanyOptions}\n loadSelectedOption={loadSelectedCompany}\n />\n )\n}\n\nfunction collectProductIds(items: unknown[]): string[] {\n const ids: string[] = []\n for (const item of items) {\n if (!isRecord(item)) continue\n const id = readString(item, ['id'])\n if (id) ids.push(id)\n }\n return ids\n}\n\nexport function MappingSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadMappingOptions = React.useCallback(async (search: string) => {\n const mappingParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (!search) {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${mappingParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }\n const productParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const directParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const [productsPayload, directPayload] = await Promise.all([\n readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${productParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${directParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n ])\n const productIds = collectProductIds(Array.isArray(productsPayload.items) ? productsPayload.items : [])\n let byProductItems: unknown[] = []\n if (productIds.length) {\n const byProductParams = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n productId: productIds.join(','),\n })\n const byProductPayload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${byProductParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n byProductItems = Array.isArray(byProductPayload.items) ? byProductPayload.items : []\n }\n const directItems = Array.isArray(directPayload.items) ? directPayload.items : []\n const merged = new Map<string, PickerOption<Record<string, unknown>>>()\n for (const item of [...byProductItems, ...directItems]) {\n const option = normalizeMappingOption(item, translate)\n if (option && !merged.has(option.value)) merged.set(option.value, option)\n }\n return Array.from(merged.values())\n }, [loadError, translate])\n\n const loadSelectedMapping = React.useCallback(async (mappingId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?id=${encodeURIComponent(mappingId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === mappingId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadMappingOptions}\n loadSelectedOption={loadSelectedMapping}\n />\n )\n}\n\nexport function StatementSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadStatementOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }, [loadError, translate])\n\n const loadSelectedStatement = React.useCallback(async (statementId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?id=${encodeURIComponent(statementId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === statementId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadStatementOptions}\n loadSelectedOption={loadSelectedStatement}\n />\n )\n}\n\nexport function parseGeolocationInput(raw: string, translate: Translator): Record<string, unknown> | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (!isRecord(parsed)) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n const geoJsonType = parsed.type\n if (\n typeof geoJsonType !== 'string' ||\n !GEOJSON_TYPES.some((allowedType) => allowedType === geoJsonType)\n ) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (JSON.stringify(parsed).length > GEOJSON_SIZE_LIMIT) {\n const message = translate('eudr.errors.geolocationTooLarge')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n return parsed\n}\n\nexport { translateEudrCrudError, translateEudrErrorMessage } from './crudErrorI18n'\n\nlet referencedStatementRowKeySeq = 0\n\nfunction normalizeReferencedStatements(value: unknown): ReferencedStatementValue[] {\n if (!Array.isArray(value)) return []\n return value\n .map((entry) => {\n if (!isRecord(entry)) return null\n const referenceNumber = readString(entry, ['referenceNumber']) ?? ''\n const verificationNumber = readString(entry, ['verificationNumber']) ?? ''\n return verificationNumber\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n .filter((entry): entry is ReferencedStatementValue => entry !== null)\n}\n\nexport function ReferencedStatementsField({\n id,\n value,\n onChange,\n disabled,\n}: {\n id: string\n value: ReferencedStatementValue[] | unknown\n onChange: (value: ReferencedStatementValue[]) => void\n disabled?: boolean\n}) {\n const translate = useT()\n const rows = React.useMemo(() => normalizeReferencedStatements(value), [value])\n const hasIncompleteRows = rows.some((row) => row.referenceNumber.trim().length === 0)\n\n const updateRow = React.useCallback((index: number, patch: Partial<ReferencedStatementValue>) => {\n const nextRows = rows.map((row, rowIndex) => {\n if (rowIndex !== index) return row\n const referenceNumber = patch.referenceNumber ?? row.referenceNumber\n const verificationNumber = patch.verificationNumber ?? row.verificationNumber ?? ''\n return verificationNumber.trim()\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n onChange(nextRows)\n }, [onChange, rows])\n\n // Row identity lives outside the persisted value (which is the API's\n // [{referenceNumber, verificationNumber?}] contract), so keys are tracked\n // alongside it. Indexes as keys make React reuse the wrong input when a middle\n // row is removed, which steals focus from the row that shifts up.\n const rowKeysRef = React.useRef<string[]>([])\n if (rowKeysRef.current.length < rows.length) {\n const nextKeys = [...rowKeysRef.current]\n while (nextKeys.length < rows.length) {\n referencedStatementRowKeySeq += 1\n nextKeys.push(`referenced-statement-${referencedStatementRowKeySeq}`)\n }\n rowKeysRef.current = nextKeys\n } else if (rowKeysRef.current.length > rows.length) {\n rowKeysRef.current = rowKeysRef.current.slice(0, rows.length)\n }\n const rowKeys = rowKeysRef.current\n\n const removeRow = React.useCallback((index: number) => {\n rowKeysRef.current = rowKeysRef.current.filter((_, keyIndex) => keyIndex !== index)\n onChange(rows.filter((_, rowIndex) => rowIndex !== index))\n }, [onChange, rows])\n\n return (\n <div id={id} className=\"space-y-3\">\n {rows.length > 0 ? (\n <div className=\"space-y-2\">\n {rows.map((row, index) => (\n <div key={rowKeys[index]} className=\"grid gap-2 md:grid-cols-[1fr_1fr_auto]\">\n <Input\n value={row.referenceNumber}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.referenceNumber')}\n onChange={(event) => updateRow(index, { referenceNumber: event.target.value })}\n />\n <Input\n value={row.verificationNumber ?? ''}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.verificationNumber')}\n onChange={(event) => updateRow(index, { verificationNumber: event.target.value })}\n />\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.removeReferencedStatement')}\n onClick={() => removeRow(index)}\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {translate('eudr.statements.form.noReferencedStatements')}\n </p>\n )}\n {hasIncompleteRows ? (\n <p className=\"text-sm text-status-warning-text\">\n {translate('eudr.statements.form.referencedStatementsValidation')}\n </p>\n ) : null}\n <IconButton\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.addReferencedStatement')}\n onClick={() => onChange([...rows, { referenceNumber: '' }])}\n >\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n )\n}\n\nexport { CountrySelectField } from './CountrySelectField'\nexport { OrderSelectField } from './OrderSelectField'\nexport { PlotMultiSelectField } from './PlotMultiSelectField'\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -43,7 +43,6 @@ 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;
|
|
47
46
|
context.addIssue({
|
|
48
47
|
code: z.ZodIssueCode.custom,
|
|
49
48
|
path: [field],
|
|
@@ -235,9 +234,7 @@ const statementBaseSchema = z.object({
|
|
|
235
234
|
orderSnapshot: orderSnapshotSchema.optional().nullable(),
|
|
236
235
|
notes: z.string().max(5e3).optional().nullable()
|
|
237
236
|
});
|
|
238
|
-
const statementCreateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(
|
|
239
|
-
statementBaseSchema.omit({ referenceIssuedAt: true })
|
|
240
|
-
);
|
|
237
|
+
const statementCreateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(statementBaseSchema);
|
|
241
238
|
const statementUpdateSchema = rejectServerComputedFields(serverComputedStatementFields).pipe(
|
|
242
239
|
z.object({
|
|
243
240
|
id: uuid()
|