@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,266 +0,0 @@
|
|
|
1
|
-
import type { FilterQuery } from '@mikro-orm/core'
|
|
2
|
-
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
3
|
-
import { sql } from 'kysely'
|
|
4
|
-
import type {
|
|
5
|
-
AuthPrincipalLabel,
|
|
6
|
-
AuthPrincipalRolePage,
|
|
7
|
-
AuthPrincipalService,
|
|
8
|
-
OrganizationHierarchyService,
|
|
9
|
-
PrincipalScope,
|
|
10
|
-
} from '@open-mercato/shared/lib/auth/principal-service'
|
|
11
|
-
import { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'
|
|
12
|
-
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
13
|
-
import { Role, RoleAcl, User, UserRole } from '../data/entities'
|
|
14
|
-
import { listSuperAdminUserIds } from '../lib/grantChecks'
|
|
15
|
-
import { resolveRoleOrganizationScope, roleAclGrantsPrincipalOrganization } from './roleOrganizationScope'
|
|
16
|
-
|
|
17
|
-
const MAX_ROLE_PAGE_SIZE = 100
|
|
18
|
-
const MAX_ROLE_RESULTS = 1_000
|
|
19
|
-
|
|
20
|
-
type AuthPrincipalDatabase = {
|
|
21
|
-
roles: {
|
|
22
|
-
id: string
|
|
23
|
-
tenant_id: string
|
|
24
|
-
name: string
|
|
25
|
-
deleted_at: Date | null
|
|
26
|
-
}
|
|
27
|
-
role_acls: {
|
|
28
|
-
role_id: string
|
|
29
|
-
tenant_id: string
|
|
30
|
-
organizations_json: string[] | null
|
|
31
|
-
deleted_at: Date | null
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function normalizeIds(ids: string[]): string[] {
|
|
36
|
-
return Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)))
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function relationId(value: unknown): string | null {
|
|
40
|
-
if (typeof value === 'string') return value.trim() || null
|
|
41
|
-
if (!value || typeof value !== 'object') return null
|
|
42
|
-
const id = (value as { id?: unknown }).id
|
|
43
|
-
return typeof id === 'string' && id.trim().length > 0 ? id.trim() : null
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export class DefaultAuthPrincipalService implements AuthPrincipalService {
|
|
47
|
-
constructor(
|
|
48
|
-
private readonly em: EntityManager,
|
|
49
|
-
private readonly organizationHierarchyService?: OrganizationHierarchyService,
|
|
50
|
-
) {}
|
|
51
|
-
|
|
52
|
-
async principalExists(input: {
|
|
53
|
-
type: 'user' | 'role'
|
|
54
|
-
id: string
|
|
55
|
-
scope: PrincipalScope
|
|
56
|
-
}): Promise<boolean> {
|
|
57
|
-
if (input.type === 'role') {
|
|
58
|
-
return (await this.filterActiveRoleIds([input.id], input.scope)).includes(input.id)
|
|
59
|
-
}
|
|
60
|
-
return Boolean(await findOneWithDecryption(
|
|
61
|
-
this.em,
|
|
62
|
-
User,
|
|
63
|
-
{
|
|
64
|
-
id: input.id,
|
|
65
|
-
tenantId: input.scope.tenantId,
|
|
66
|
-
deletedAt: null,
|
|
67
|
-
$or: [{ organizationId: null }, { organizationId: input.scope.organizationId }],
|
|
68
|
-
} as FilterQuery<User>,
|
|
69
|
-
{ fields: ['id'] as const },
|
|
70
|
-
input.scope,
|
|
71
|
-
))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async resolveActiveUserRoleIds(userId: string, scope: PrincipalScope): Promise<string[]> {
|
|
75
|
-
const links = await findWithDecryption(
|
|
76
|
-
this.em,
|
|
77
|
-
UserRole,
|
|
78
|
-
{
|
|
79
|
-
user: userId,
|
|
80
|
-
deletedAt: null,
|
|
81
|
-
role: { tenantId: scope.tenantId, deletedAt: null },
|
|
82
|
-
} as FilterQuery<UserRole>,
|
|
83
|
-
{ fields: ['role'] as const },
|
|
84
|
-
scope,
|
|
85
|
-
)
|
|
86
|
-
return this.filterActiveRoleIds(
|
|
87
|
-
normalizeIds(links.flatMap((link) => {
|
|
88
|
-
const id = relationId(link.role)
|
|
89
|
-
return id ? [id] : []
|
|
90
|
-
})),
|
|
91
|
-
scope,
|
|
92
|
-
)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
async filterActiveRoleIds(roleIds: string[], scope: PrincipalScope): Promise<string[]> {
|
|
96
|
-
const ids = normalizeIds(roleIds)
|
|
97
|
-
if (ids.length === 0) return []
|
|
98
|
-
const roles = await findWithDecryption(
|
|
99
|
-
this.em,
|
|
100
|
-
Role,
|
|
101
|
-
{ id: { $in: ids }, tenantId: scope.tenantId, deletedAt: null } as FilterQuery<Role>,
|
|
102
|
-
{ fields: ['id'] as const },
|
|
103
|
-
scope,
|
|
104
|
-
)
|
|
105
|
-
const activeIds = normalizeIds(roles.map((role) => role.id))
|
|
106
|
-
if (activeIds.length === 0) return []
|
|
107
|
-
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
108
|
-
this.organizationHierarchyService,
|
|
109
|
-
scope.tenantId,
|
|
110
|
-
scope.organizationId,
|
|
111
|
-
)
|
|
112
|
-
const acls = await findWithDecryption(
|
|
113
|
-
this.em,
|
|
114
|
-
RoleAcl,
|
|
115
|
-
{
|
|
116
|
-
tenantId: scope.tenantId,
|
|
117
|
-
role: { $in: activeIds },
|
|
118
|
-
deletedAt: null,
|
|
119
|
-
} as FilterQuery<RoleAcl>,
|
|
120
|
-
{ fields: ['role', 'organizationsJson'] as const },
|
|
121
|
-
scope,
|
|
122
|
-
)
|
|
123
|
-
const eligibilityById = new Map<string, boolean>()
|
|
124
|
-
for (const acl of acls) {
|
|
125
|
-
const id = relationId(acl.role)
|
|
126
|
-
if (!id) continue
|
|
127
|
-
eligibilityById.set(
|
|
128
|
-
id,
|
|
129
|
-
eligibilityById.get(id) === true || roleAclGrantsPrincipalOrganization(acl, roleOrganizationScope),
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
// A tenant role without an ACL remains a valid explicit-share principal.
|
|
133
|
-
// Only an existing ACL can restrict that role away from this organization.
|
|
134
|
-
return activeIds.filter((id) => eligibilityById.get(id) !== false)
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async resolveLabels(input: {
|
|
138
|
-
type: 'user' | 'role'
|
|
139
|
-
ids: string[]
|
|
140
|
-
scope: PrincipalScope
|
|
141
|
-
}): Promise<AuthPrincipalLabel[]> {
|
|
142
|
-
const ids = normalizeIds(input.ids)
|
|
143
|
-
if (ids.length === 0) return []
|
|
144
|
-
if (input.type === 'role') {
|
|
145
|
-
const eligibleIds = await this.filterActiveRoleIds(ids, input.scope)
|
|
146
|
-
if (eligibleIds.length === 0) return []
|
|
147
|
-
const roles = await findWithDecryption(
|
|
148
|
-
this.em,
|
|
149
|
-
Role,
|
|
150
|
-
{ id: { $in: eligibleIds }, tenantId: input.scope.tenantId, deletedAt: null } as FilterQuery<Role>,
|
|
151
|
-
{ fields: ['id', 'name'] as const },
|
|
152
|
-
input.scope,
|
|
153
|
-
)
|
|
154
|
-
return roles.map((role) => ({ id: role.id, label: role.name, secondary: null }))
|
|
155
|
-
}
|
|
156
|
-
const users = await findWithDecryption(
|
|
157
|
-
this.em,
|
|
158
|
-
User,
|
|
159
|
-
{
|
|
160
|
-
id: { $in: ids },
|
|
161
|
-
tenantId: input.scope.tenantId,
|
|
162
|
-
deletedAt: null,
|
|
163
|
-
$or: [{ organizationId: null }, { organizationId: input.scope.organizationId }],
|
|
164
|
-
} as FilterQuery<User>,
|
|
165
|
-
{ fields: ['id', 'name', 'email'] as const },
|
|
166
|
-
input.scope,
|
|
167
|
-
)
|
|
168
|
-
return users.map((user) => ({
|
|
169
|
-
id: user.id,
|
|
170
|
-
label: user.name?.trim() || user.email,
|
|
171
|
-
secondary: user.name?.trim() && user.email !== user.name.trim() ? user.email : null,
|
|
172
|
-
}))
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async queryActiveRolePage(input: {
|
|
176
|
-
scope: PrincipalScope
|
|
177
|
-
search?: string
|
|
178
|
-
excludedIds?: string[]
|
|
179
|
-
page: number
|
|
180
|
-
pageSize: number
|
|
181
|
-
}): Promise<AuthPrincipalRolePage> {
|
|
182
|
-
const page = Math.max(1, Math.floor(input.page))
|
|
183
|
-
const pageSize = Math.min(MAX_ROLE_PAGE_SIZE, Math.max(1, Math.floor(input.pageSize)))
|
|
184
|
-
const offset = (page - 1) * pageSize
|
|
185
|
-
const excludedIds = normalizeIds(input.excludedIds ?? [])
|
|
186
|
-
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
187
|
-
this.organizationHierarchyService,
|
|
188
|
-
input.scope.tenantId,
|
|
189
|
-
input.scope.organizationId,
|
|
190
|
-
)
|
|
191
|
-
const db = this.em.getKysely<AuthPrincipalDatabase>()
|
|
192
|
-
let eligibleRoles = db
|
|
193
|
-
.selectFrom('roles as r')
|
|
194
|
-
.where('r.tenant_id', '=', input.scope.tenantId)
|
|
195
|
-
.where('r.deleted_at', 'is', null)
|
|
196
|
-
|
|
197
|
-
if (roleOrganizationScope) {
|
|
198
|
-
const allowedOrganizations = Array.from(roleOrganizationScope)
|
|
199
|
-
const organizationPredicates = [
|
|
200
|
-
sql<boolean>`ra.organizations_json is null`,
|
|
201
|
-
sql<boolean>`ra.organizations_json::jsonb @> ${JSON.stringify(['__all__'])}::jsonb`,
|
|
202
|
-
...allowedOrganizations.map((organizationId) => (
|
|
203
|
-
sql<boolean>`ra.organizations_json::jsonb @> ${JSON.stringify([organizationId])}::jsonb`
|
|
204
|
-
)),
|
|
205
|
-
]
|
|
206
|
-
const organizationAllowed = sql<boolean>`(${sql.join(organizationPredicates, sql` or `)})`
|
|
207
|
-
eligibleRoles = eligibleRoles.where(sql<boolean>`(
|
|
208
|
-
not exists (
|
|
209
|
-
select 1
|
|
210
|
-
from role_acls as ra_any
|
|
211
|
-
where ra_any.role_id = r.id
|
|
212
|
-
and ra_any.tenant_id = ${input.scope.tenantId}
|
|
213
|
-
and ra_any.deleted_at is null
|
|
214
|
-
)
|
|
215
|
-
or exists (
|
|
216
|
-
select 1
|
|
217
|
-
from role_acls as ra
|
|
218
|
-
where ra.role_id = r.id
|
|
219
|
-
and ra.tenant_id = ${input.scope.tenantId}
|
|
220
|
-
and ra.deleted_at is null
|
|
221
|
-
and ${organizationAllowed}
|
|
222
|
-
)
|
|
223
|
-
)`)
|
|
224
|
-
}
|
|
225
|
-
if (input.search?.trim()) {
|
|
226
|
-
const searchPattern = `%${escapeLikePattern(input.search.trim())}%`
|
|
227
|
-
eligibleRoles = eligibleRoles.where(sql<boolean>`r.name ilike ${searchPattern}`)
|
|
228
|
-
}
|
|
229
|
-
if (excludedIds.length > 0) {
|
|
230
|
-
eligibleRoles = eligibleRoles.where('r.id', 'not in', excludedIds)
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const boundedRoleIds = eligibleRoles
|
|
234
|
-
.select('r.id')
|
|
235
|
-
.limit(MAX_ROLE_RESULTS)
|
|
236
|
-
.as('bounded_roles')
|
|
237
|
-
const countQuery = db
|
|
238
|
-
.selectFrom(boundedRoleIds)
|
|
239
|
-
.select(sql<string>`count(*)`.as('count'))
|
|
240
|
-
const pageQuery = eligibleRoles
|
|
241
|
-
.select(['r.id', 'r.name'])
|
|
242
|
-
.orderBy('r.id', 'asc')
|
|
243
|
-
.limit(offset < MAX_ROLE_RESULTS ? Math.min(pageSize, MAX_ROLE_RESULTS - offset) : 0)
|
|
244
|
-
.offset(Math.min(offset, MAX_ROLE_RESULTS))
|
|
245
|
-
|
|
246
|
-
const [rows, countRow] = await Promise.all([
|
|
247
|
-
pageQuery.execute() as Promise<Array<{ id: string; name: string }>>,
|
|
248
|
-
countQuery.executeTakeFirst() as Promise<{ count?: string | number } | undefined>,
|
|
249
|
-
])
|
|
250
|
-
const parsedTotal = Number(countRow?.count ?? 0)
|
|
251
|
-
const total = Number.isFinite(parsedTotal)
|
|
252
|
-
? Math.min(MAX_ROLE_RESULTS, Math.max(0, Math.floor(parsedTotal)))
|
|
253
|
-
: 0
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
items: rows.map((role) => ({ id: role.id, label: role.name, secondary: null })),
|
|
257
|
-
page,
|
|
258
|
-
pageSize,
|
|
259
|
-
total,
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
async listSuperAdminUserIds(tenantId: string): Promise<string[]> {
|
|
264
|
-
return Array.from(await listSuperAdminUserIds(this.em, tenantId))
|
|
265
|
-
}
|
|
266
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { OrganizationHierarchyService } from '@open-mercato/shared/lib/auth/principal-service'
|
|
2
|
-
import type { RoleAcl } from '../data/entities'
|
|
3
|
-
|
|
4
|
-
export type RoleOrganizationScope = ReadonlySet<string> | null
|
|
5
|
-
|
|
6
|
-
function normalizeId(value: unknown): string | null {
|
|
7
|
-
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export async function resolveRoleOrganizationScope(
|
|
11
|
-
hierarchyService: OrganizationHierarchyService | null | undefined,
|
|
12
|
-
tenantId: string | null | undefined,
|
|
13
|
-
organizationId: string | null | undefined,
|
|
14
|
-
): Promise<RoleOrganizationScope> {
|
|
15
|
-
const selectedId = normalizeId(organizationId)
|
|
16
|
-
if (!selectedId) return null
|
|
17
|
-
const normalizedTenantId = normalizeId(tenantId)
|
|
18
|
-
if (!normalizedTenantId) return new Set()
|
|
19
|
-
|
|
20
|
-
const ids = new Set<string>([selectedId])
|
|
21
|
-
// Auth remains independently usable when Directory is disabled: exact-org
|
|
22
|
-
// grants still apply, while parent-to-descendant expansion fails closed.
|
|
23
|
-
if (!hierarchyService) return ids
|
|
24
|
-
|
|
25
|
-
const ancestorIds = await hierarchyService.resolveAncestorIds({
|
|
26
|
-
tenantId: normalizedTenantId,
|
|
27
|
-
organizationId: selectedId,
|
|
28
|
-
})
|
|
29
|
-
// A registered Directory seam can prove an invalid/wrong-tenant selection.
|
|
30
|
-
// Fail closed for restricted roles in that case.
|
|
31
|
-
if (ancestorIds === null) return new Set()
|
|
32
|
-
for (const ancestorId of ancestorIds) {
|
|
33
|
-
const normalized = normalizeId(ancestorId)
|
|
34
|
-
if (normalized) ids.add(normalized)
|
|
35
|
-
}
|
|
36
|
-
return ids
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function roleAclAllowsOrganization(
|
|
40
|
-
acl: Pick<RoleAcl, 'organizationsJson'>,
|
|
41
|
-
scope: RoleOrganizationScope,
|
|
42
|
-
): boolean {
|
|
43
|
-
if (!scope) return true
|
|
44
|
-
const organizations = Array.isArray(acl.organizationsJson) ? acl.organizationsJson : null
|
|
45
|
-
if (!organizations || organizations.length === 0 || organizations.includes('__all__')) return true
|
|
46
|
-
return organizations.some((organizationId) => scope.has(organizationId))
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Principal eligibility — which roles may be selected as, or resolved into, an explicit share
|
|
51
|
-
* target — follows the human-principal deny-all contract instead: an empty allowlist grants no
|
|
52
|
-
* organization reach, so such a role must not become a share principal here (#4033).
|
|
53
|
-
*
|
|
54
|
-
* This deliberately differs from `roleAclAllowsOrganization` above, which governs *feature*
|
|
55
|
-
* evaluation and keeps the wider "an empty list applies everywhere" meaning, and from the
|
|
56
|
-
* API-key projection, where an empty list means "inherit the key's own organization binding".
|
|
57
|
-
* Without this split a user who reaches an organization through a second role could inherit
|
|
58
|
-
* viewer/editor access from a share assigned to a deny-all role.
|
|
59
|
-
*/
|
|
60
|
-
export function roleAclGrantsPrincipalOrganization(
|
|
61
|
-
acl: Pick<RoleAcl, 'organizationsJson'>,
|
|
62
|
-
scope: RoleOrganizationScope,
|
|
63
|
-
): boolean {
|
|
64
|
-
if (!scope) return true
|
|
65
|
-
const organizations = Array.isArray(acl.organizationsJson) ? acl.organizationsJson : null
|
|
66
|
-
if (!organizations) return true
|
|
67
|
-
if (organizations.length === 0) return false
|
|
68
|
-
if (organizations.includes('__all__')) return true
|
|
69
|
-
return organizations.some((organizationId) => scope.has(organizationId))
|
|
70
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
import type { ChannelCapabilities } from './adapter'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Upper bound shared by both recipient shapes. 320 is the RFC 5321 maximum for
|
|
6
|
-
* an email address (64 local + `@` + 255 domain); provider-native identifiers
|
|
7
|
-
* are far shorter, so one ceiling covers both.
|
|
8
|
-
*/
|
|
9
|
-
export const MAX_OUTBOUND_RECIPIENT_LENGTH = 320
|
|
10
|
-
|
|
11
|
-
const emailRecipientSchema = z.string().email()
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Characters a provider-native recipient may contain. This is an allowlist, not a
|
|
15
|
-
* denylist, because the recipient reaches adapters that interpolate it into a REST
|
|
16
|
-
* path (Discord posts to `/channels/{recipient}/messages`), and a denylist fails
|
|
17
|
-
* open on every character nobody thought of — percent-encoded separators
|
|
18
|
-
* (`%2F`, `%2e%2e%2f`) and control bytes (NUL, DEL) all walked through the
|
|
19
|
-
* previous `[\r\n\s/\\?#]` class. An allowlist fails closed instead: the worst
|
|
20
|
-
* case is a provider whose identifier alphabet needs widening, which is a
|
|
21
|
-
* reviewable one-line change rather than a silent path-steering primitive.
|
|
22
|
-
*
|
|
23
|
-
* The set covers every provider-native identifier shape the hub has to carry
|
|
24
|
-
* today — Discord snowflakes (digits), Slack-style ids (alphanumerics), and email
|
|
25
|
-
* addresses, since `'provider-native'` must never narrow what `'email'` accepts.
|
|
26
|
-
*/
|
|
27
|
-
const PROVIDER_NATIVE_ALLOWED = /^[A-Za-z0-9._:@+-]+$/
|
|
28
|
-
|
|
29
|
-
export type OutboundRecipientCheck = { ok: true } | { ok: false; error: string }
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Validate an outbound recipient against the provider's declared recipient
|
|
33
|
-
* shape.
|
|
34
|
-
*
|
|
35
|
-
* The hub used to hard-wire `z.string().email()` on every outbound endpoint,
|
|
36
|
-
* which left providers whose recipients are not email addresses with no product
|
|
37
|
-
* path to send at all (#4976). Validation now follows the adapter's
|
|
38
|
-
* `capabilities.recipientFormat`, defaulting to `'email'` so every existing
|
|
39
|
-
* provider keeps byte-identical behavior.
|
|
40
|
-
*/
|
|
41
|
-
export function validateOutboundRecipient(
|
|
42
|
-
recipient: unknown,
|
|
43
|
-
capabilities: Pick<ChannelCapabilities, 'recipientFormat'> | null | undefined,
|
|
44
|
-
): OutboundRecipientCheck {
|
|
45
|
-
if (typeof recipient !== 'string' || recipient.length === 0) {
|
|
46
|
-
return { ok: false, error: 'Recipient is required' }
|
|
47
|
-
}
|
|
48
|
-
if (recipient.length > MAX_OUTBOUND_RECIPIENT_LENGTH) {
|
|
49
|
-
return {
|
|
50
|
-
ok: false,
|
|
51
|
-
error: `Recipient must be at most ${MAX_OUTBOUND_RECIPIENT_LENGTH} characters`,
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (capabilities?.recipientFormat !== 'provider-native') {
|
|
55
|
-
return emailRecipientSchema.safeParse(recipient).success
|
|
56
|
-
? { ok: true }
|
|
57
|
-
: { ok: false, error: 'Recipient must be a valid email address' }
|
|
58
|
-
}
|
|
59
|
-
if (!PROVIDER_NATIVE_ALLOWED.test(recipient)) {
|
|
60
|
-
return {
|
|
61
|
-
ok: false,
|
|
62
|
-
error: 'Recipient may only contain letters, digits, and the characters . _ : @ + -',
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// `.` is allowed (email addresses need it), so traversal still has to be
|
|
66
|
-
// rejected explicitly even though the separators it would need are not.
|
|
67
|
-
if (recipient.includes('..')) {
|
|
68
|
-
return { ok: false, error: 'Recipient must not contain ".."' }
|
|
69
|
-
}
|
|
70
|
-
return { ok: true }
|
|
71
|
-
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
-
import type { AppContainer } from '@open-mercato/shared/lib/di/container'
|
|
3
|
-
import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
4
|
-
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
5
|
-
import { CommunicationChannel, ExternalConversation, MessageChannelLink } from '../data/entities'
|
|
6
|
-
|
|
7
|
-
const logger = createLogger('communication_channels').child({ component: 'resolve-channel-type' })
|
|
8
|
-
|
|
9
|
-
export type ChannelTypeScope = {
|
|
10
|
-
tenantId: string
|
|
11
|
-
organizationId: string | null
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type ChannelTypeReference = {
|
|
15
|
-
/** `ExternalConversation.id`, as carried by a message's `sourceEntityId`. */
|
|
16
|
-
externalConversationId?: string | null
|
|
17
|
-
/** A platform `messages.message` id that may be linked to a channel. */
|
|
18
|
-
messageId?: string | null
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Resolve the channel type behind a platform message or conversation (#4975).
|
|
23
|
-
*
|
|
24
|
-
* Cross-module callers (the `messages` compose route) need to know whether an
|
|
25
|
-
* external correspondent is reachable by email before validating a compose
|
|
26
|
-
* payload, but `messages` may not reach into this module's entities. They
|
|
27
|
-
* resolve this facade from DI instead — mirroring `communicationChannelsSendAsUser`
|
|
28
|
-
* — and treat a `null` result as "unknown", which the messages validator
|
|
29
|
-
* handles fail-closed.
|
|
30
|
-
*
|
|
31
|
-
* Always tenant/organization scoped: a reference that does not resolve inside
|
|
32
|
-
* the caller's scope is reported as unknown rather than looked up globally.
|
|
33
|
-
*/
|
|
34
|
-
export async function resolveChannelType(
|
|
35
|
-
container: AppContainer,
|
|
36
|
-
scope: ChannelTypeScope,
|
|
37
|
-
reference: ChannelTypeReference,
|
|
38
|
-
): Promise<string | null> {
|
|
39
|
-
const em = (container.resolve('em') as EntityManager).fork()
|
|
40
|
-
const dscope = { tenantId: scope.tenantId, organizationId: scope.organizationId ?? null }
|
|
41
|
-
const baseFilter = { tenantId: scope.tenantId, organizationId: scope.organizationId ?? null }
|
|
42
|
-
|
|
43
|
-
let externalConversationId = reference.externalConversationId ?? null
|
|
44
|
-
|
|
45
|
-
if (!externalConversationId && reference.messageId) {
|
|
46
|
-
// The message is linked to a channel directly — `MessageChannelLink` carries
|
|
47
|
-
// a denormalized channel type, so this is the cheapest hop when it exists.
|
|
48
|
-
const link = await findOneWithDecryption(
|
|
49
|
-
em,
|
|
50
|
-
MessageChannelLink,
|
|
51
|
-
{ messageId: reference.messageId, ...baseFilter },
|
|
52
|
-
undefined,
|
|
53
|
-
dscope,
|
|
54
|
-
)
|
|
55
|
-
if (link?.channelType) return link.channelType
|
|
56
|
-
externalConversationId = link?.externalConversationId ?? null
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (!externalConversationId) return null
|
|
60
|
-
|
|
61
|
-
const conversation = await findOneWithDecryption(
|
|
62
|
-
em,
|
|
63
|
-
ExternalConversation,
|
|
64
|
-
{ id: externalConversationId, ...baseFilter },
|
|
65
|
-
undefined,
|
|
66
|
-
dscope,
|
|
67
|
-
)
|
|
68
|
-
if (!conversation?.channelId) return null
|
|
69
|
-
|
|
70
|
-
const channel = await findOneWithDecryption(
|
|
71
|
-
em,
|
|
72
|
-
CommunicationChannel,
|
|
73
|
-
{ id: conversation.channelId, ...baseFilter, deletedAt: null },
|
|
74
|
-
undefined,
|
|
75
|
-
dscope,
|
|
76
|
-
)
|
|
77
|
-
return channel?.channelType ?? null
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Same contract, but never throws: a lookup failure degrades to "unknown" so a
|
|
82
|
-
* transient database error cannot turn into a 500 on an otherwise valid compose.
|
|
83
|
-
* Unknown is the safe answer — the messages validator fails closed on it.
|
|
84
|
-
*/
|
|
85
|
-
export async function resolveChannelTypeSafely(
|
|
86
|
-
container: AppContainer,
|
|
87
|
-
scope: ChannelTypeScope,
|
|
88
|
-
reference: ChannelTypeReference,
|
|
89
|
-
): Promise<string | null> {
|
|
90
|
-
try {
|
|
91
|
-
return await resolveChannelType(container, scope, reference)
|
|
92
|
-
} catch (err) {
|
|
93
|
-
logger.warn('channel type resolution failed, treating the channel as unknown', { err })
|
|
94
|
-
return null
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** DI service type for cross-module callers (resolve `communicationChannelsResolveChannelType`). */
|
|
99
|
-
export type ResolveChannelTypeService = typeof resolveChannelTypeSafely
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { FilterOptionTone } from '@open-mercato/shared/lib/query/advanced-filter'
|
|
2
|
-
|
|
3
|
-
// Saturated icon tokens shared by the kanban lane accent bar and the status filter
|
|
4
|
-
// pills, so both surfaces render the same tone identically (#5107 review).
|
|
5
|
-
export const TONE_DOT_CLASS: Record<FilterOptionTone, string> = {
|
|
6
|
-
success: 'bg-status-success-icon',
|
|
7
|
-
error: 'bg-status-error-icon',
|
|
8
|
-
warning: 'bg-status-warning-icon',
|
|
9
|
-
info: 'bg-status-info-icon',
|
|
10
|
-
neutral: 'bg-status-neutral-icon',
|
|
11
|
-
brand: 'bg-brand-violet',
|
|
12
|
-
pink: 'bg-status-pink-icon',
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function toneToDotClass(
|
|
16
|
-
tone: FilterOptionTone | null | undefined,
|
|
17
|
-
fallback = 'bg-status-neutral-icon',
|
|
18
|
-
): string {
|
|
19
|
-
if (tone && tone in TONE_DOT_CLASS) return TONE_DOT_CLASS[tone]
|
|
20
|
-
return fallback
|
|
21
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The one canonical actor key for a calendar participant.
|
|
3
|
-
*
|
|
4
|
-
* A staff/customer attendee is identified by `userId`. An external guest has no
|
|
5
|
-
* record in the system, so the normalized email is the only stable identity it
|
|
6
|
-
* carries. Mapping, dedupe, conflict detection and the editor's conflict-probe
|
|
7
|
-
* dependency key all derive their key from here, so a guest is treated as the
|
|
8
|
-
* same actor across events instead of dropping out of actor comparisons.
|
|
9
|
-
*
|
|
10
|
-
* Returns `null` for a participant with neither — such a participant cannot be
|
|
11
|
-
* compared to any other and must never collide with one that can.
|
|
12
|
-
*/
|
|
13
|
-
export function participantActorKey(participant: { userId?: string; email?: string }): string | null {
|
|
14
|
-
if (participant.userId) return `user:${participant.userId}`
|
|
15
|
-
const email = participant.email?.trim().toLowerCase()
|
|
16
|
-
return email ? `email:${email}` : null
|
|
17
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
-
import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
3
|
-
import { CustomerPipelineStage } from '../data/entities'
|
|
4
|
-
|
|
5
|
-
export type DealClosureOutcome = 'won' | 'lost'
|
|
6
|
-
|
|
7
|
-
export type PipelineStageSnapshot = {
|
|
8
|
-
id: string
|
|
9
|
-
pipelineId: string
|
|
10
|
-
label: string
|
|
11
|
-
order: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// Stage labels that mark a pipeline as terminal for a given closure outcome. Matching is
|
|
15
|
-
// label-based because stages are tenant-configurable rows; see #5107.
|
|
16
|
-
export const TERMINAL_PIPELINE_STAGE_LABELS: Record<DealClosureOutcome, ReadonlySet<string>> = {
|
|
17
|
-
won: new Set(['won', 'win', 'closed won', 'closed win']),
|
|
18
|
-
lost: new Set(['lost', 'loose', 'closed lost', 'closed loose']),
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Map a deal status spelling (UI `win`/`loose` or AI `won`/`lost`) to its closure
|
|
23
|
-
* outcome. Case-insensitive because callers such as the AI tool pass free-form model
|
|
24
|
-
* text through, while every persisted status is lower-case.
|
|
25
|
-
*/
|
|
26
|
-
export function dealClosureOutcomeFromStatus(status: string | null | undefined): DealClosureOutcome | null {
|
|
27
|
-
const normalized = typeof status === 'string' ? status.trim().toLowerCase() : status
|
|
28
|
-
if (normalized === 'win' || normalized === 'won') return 'won'
|
|
29
|
-
if (normalized === 'loose' || normalized === 'lost') return 'lost'
|
|
30
|
-
return null
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function normalizePipelineStageLabel(value: string): string {
|
|
34
|
-
return value
|
|
35
|
-
.trim()
|
|
36
|
-
.toLowerCase()
|
|
37
|
-
.replace(/[^a-z0-9]+/g, ' ')
|
|
38
|
-
.trim()
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Resolve the terminal stage of the deal's pipeline for a closure outcome, so every
|
|
43
|
-
* writer (command, AI tool preview) agrees on where a closed deal lands (#5107).
|
|
44
|
-
*/
|
|
45
|
-
export async function loadClosurePipelineStageSnapshot(
|
|
46
|
-
em: EntityManager,
|
|
47
|
-
input: {
|
|
48
|
-
pipelineId: string | null
|
|
49
|
-
closureOutcome: DealClosureOutcome
|
|
50
|
-
tenantId: string
|
|
51
|
-
organizationId: string
|
|
52
|
-
},
|
|
53
|
-
): Promise<PipelineStageSnapshot | null> {
|
|
54
|
-
if (!input.pipelineId) return null
|
|
55
|
-
|
|
56
|
-
const stages = await findWithDecryption(
|
|
57
|
-
em,
|
|
58
|
-
CustomerPipelineStage,
|
|
59
|
-
{
|
|
60
|
-
pipelineId: input.pipelineId,
|
|
61
|
-
tenantId: input.tenantId,
|
|
62
|
-
organizationId: input.organizationId,
|
|
63
|
-
},
|
|
64
|
-
{ orderBy: { order: 'ASC' } },
|
|
65
|
-
{ tenantId: input.tenantId, organizationId: input.organizationId },
|
|
66
|
-
)
|
|
67
|
-
const aliases = TERMINAL_PIPELINE_STAGE_LABELS[input.closureOutcome]
|
|
68
|
-
const stage = stages.find((candidate) => aliases.has(normalizePipelineStageLabel(candidate.label)))
|
|
69
|
-
if (!stage) return null
|
|
70
|
-
return {
|
|
71
|
-
id: stage.id,
|
|
72
|
-
pipelineId: stage.pipelineId,
|
|
73
|
-
label: stage.label,
|
|
74
|
-
order: stage.order,
|
|
75
|
-
}
|
|
76
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { NextResponse } from 'next/server'
|
|
2
|
-
import {
|
|
3
|
-
isOrganizationReadAccessAllowed,
|
|
4
|
-
type OrganizationReadAccessInput,
|
|
5
|
-
} from '@open-mercato/core/modules/directory/utils/organizationScopeGuard'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Single-record customers detail routes (person / company / deal) must not leak
|
|
9
|
-
* whether a record exists through the organization-scope check.
|
|
10
|
-
*
|
|
11
|
-
* The API dispatcher already enforces each route's `metadata.requireFeatures`
|
|
12
|
-
* before the handler runs, returning a uniform `403` for callers who lack the
|
|
13
|
-
* grant — so that path never distinguishes an existing id from a missing one.
|
|
14
|
-
* The only remaining existence signal is the *post-load* organization guard: a
|
|
15
|
-
* caller who holds the feature but whose scope excludes the record's
|
|
16
|
-
* organization previously received `403` (record exists in another org) while a
|
|
17
|
-
* non-existent id received `404`. That 403-vs-404 split is an existence oracle
|
|
18
|
-
* (issue #5504).
|
|
19
|
-
*
|
|
20
|
-
* Collapse the organization-scope denial into the route's own not-found
|
|
21
|
-
* response so an out-of-scope caller cannot tell "exists in an organization you
|
|
22
|
-
* cannot see" from "does not exist" — the shape the api_keys hardening
|
|
23
|
-
* (#4033 / PR-4051) established. Sharing this decision keeps the three customers
|
|
24
|
-
* detail routes from drifting apart again.
|
|
25
|
-
*
|
|
26
|
-
* @returns the `404` response to return when read access is denied, or `null`
|
|
27
|
-
* when the caller may read the record.
|
|
28
|
-
*/
|
|
29
|
-
export function denyCustomerDetailReadAsNotFound(
|
|
30
|
-
input: OrganizationReadAccessInput,
|
|
31
|
-
notFoundMessage: string,
|
|
32
|
-
): NextResponse | null {
|
|
33
|
-
if (isOrganizationReadAccessAllowed(input)) return null
|
|
34
|
-
return NextResponse.json({ error: notFoundMessage }, { status: 404 })
|
|
35
|
-
}
|