@open-mercato/core 0.7.0 → 0.7.1-develop.7103.1.41ff100d93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/api.js +13 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/di.js +9 -0
- package/dist/modules/api_keys/di.js.map +7 -0
- package/dist/modules/api_keys/services/principalService.js +31 -0
- package/dist/modules/api_keys/services/principalService.js.map +7 -0
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +11 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/attachment-service.js +313 -0
- package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +6 -2
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +57 -12
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +8 -2
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +4 -1
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/validate.js +55 -0
- package/dist/modules/auth/api/reset/validate.js.map +7 -0
- package/dist/modules/auth/api/roles/acl/route.js +28 -33
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/session/refresh.js +25 -1
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +96 -51
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +13 -5
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/commands/acl.js +254 -0
- package/dist/modules/auth/commands/acl.js.map +7 -0
- package/dist/modules/auth/components/AclEditor.js +39 -30
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +5 -1
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +35 -9
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/userIdFilter.js +16 -0
- package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
- package/dist/modules/auth/services/authService.js +16 -2
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/principalService.js +200 -0
- package/dist/modules/auth/services/principalService.js.map +7 -0
- package/dist/modules/auth/services/rbacService.js +67 -24
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
- package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
- package/dist/modules/business_rules/backend/logs/page.js +3 -1
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +3 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -1
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +7 -1
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +41 -2
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +9 -0
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/services/rateFetchingService.js +6 -1
- package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +4 -1
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +48 -6
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +17 -94
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +8 -25
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +14 -9
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +5 -5
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +38 -1
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +3 -1
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +11 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +51 -9
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +30 -5
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +5 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
- package/dist/modules/customers/backend/customers/people/page.js +4 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +21 -34
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -7
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +6 -5
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +32 -3
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +5 -0
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
- package/dist/modules/customers/lib/closureStage.js +45 -0
- package/dist/modules/customers/lib/closureStage.js.map +7 -0
- package/dist/modules/customers/lib/dealStatus.js +30 -0
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/detailReadAccess.js +12 -0
- package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +100 -2
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +12 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +6 -1
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
- package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +72 -6
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +5 -1
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +5 -1
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +9 -1
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +14 -1
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +99 -12
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/deviceSerialization.js +46 -0
- package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +3 -1
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +9 -1
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +17 -1
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +28 -34
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
- package/dist/modules/devices/backend/devices/userOptions.js +52 -0
- package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
- package/dist/modules/devices/setup.js +6 -2
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +9 -0
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
- package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
- package/dist/modules/directory/services/organizationScopeService.js +56 -0
- package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +4 -2
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +5 -1
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +0 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +4 -1
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +0 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
- package/dist/modules/integrations/data/validators.js +11 -3
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +6 -2
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +29 -1
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +17 -2
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +17 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +15 -0
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +14 -2
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +18 -4
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
- package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +150 -51
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
- package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
- package/dist/modules/query_index/lib/search-tokens.js +79 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +79 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +8 -2
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +1 -0
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
- package/dist/modules/sales/setup.js +2 -0
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +4 -7
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +3 -0
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +121 -9
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +3 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +9 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +3 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +3 -1
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -1
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -0
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +9 -10
- package/src/helpers/integration/api.ts +33 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
- package/src/modules/api_keys/api/keys/route.ts +3 -1
- package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
- package/src/modules/api_keys/di.ts +7 -0
- package/src/modules/api_keys/services/principalService.ts +33 -0
- package/src/modules/attachments/AGENTS.md +15 -0
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
- package/src/modules/attachments/di.ts +16 -0
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/index.ts +10 -0
- package/src/modules/attachments/lib/attachment-service.ts +468 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
- package/src/modules/attachments/lib/upload-limits.ts +6 -2
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
- package/src/modules/audit_logs/services/actionLogService.ts +74 -11
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/auth/api/feature-check.ts +10 -3
- package/src/modules/auth/api/login.ts +9 -1
- package/src/modules/auth/api/reset/validate.ts +57 -0
- package/src/modules/auth/api/roles/acl/route.ts +42 -39
- package/src/modules/auth/api/session/refresh.ts +32 -1
- package/src/modules/auth/api/users/acl/route.ts +177 -53
- package/src/modules/auth/api/users/route.ts +18 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/roles/page.tsx +4 -2
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/users/page.tsx +3 -2
- package/src/modules/auth/commands/acl.ts +495 -0
- package/src/modules/auth/components/AclEditor.tsx +63 -33
- package/src/modules/auth/data/entities.ts +4 -1
- package/src/modules/auth/data/validators.ts +5 -0
- package/src/modules/auth/di.ts +46 -16
- package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
- package/src/modules/auth/i18n/de.json +389 -0
- package/src/modules/auth/i18n/en.json +389 -0
- package/src/modules/auth/i18n/es.json +389 -0
- package/src/modules/auth/i18n/ko.json +389 -0
- package/src/modules/auth/i18n/pl.json +391 -2
- package/src/modules/auth/lib/grantChecks.ts +6 -0
- package/src/modules/auth/lib/userIdFilter.ts +31 -0
- package/src/modules/auth/services/authService.ts +18 -2
- package/src/modules/auth/services/principalService.ts +266 -0
- package/src/modules/auth/services/rbacService.ts +110 -24
- package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
- package/src/modules/business_rules/backend/logs/page.tsx +4 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -1
- package/src/modules/business_rules/backend/sets/page.tsx +4 -1
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
- package/src/modules/communication_channels/di.ts +7 -0
- package/src/modules/communication_channels/lib/adapter.ts +14 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
- package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
- package/src/modules/communication_channels/lib/test-seed.ts +64 -4
- package/src/modules/configs/i18n/de.json +2 -0
- package/src/modules/configs/i18n/en.json +2 -0
- package/src/modules/configs/i18n/es.json +2 -0
- package/src/modules/configs/i18n/ko.json +2 -0
- package/src/modules/configs/i18n/pl.json +2 -0
- package/src/modules/configs/lib/system-status.ts +9 -0
- package/src/modules/currencies/AGENTS.md +3 -0
- package/src/modules/currencies/backend/currencies/page.tsx +4 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
- package/src/modules/currencies/services/README.md +45 -0
- package/src/modules/currencies/services/rateFetchingService.ts +6 -1
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
- package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
- package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
- package/src/modules/customers/ai-tools/people-pack.ts +4 -1
- package/src/modules/customers/api/activities/route.ts +45 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
- package/src/modules/customers/api/companies/[id]/route.ts +24 -107
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
- package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/route.ts +17 -28
- package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
- package/src/modules/customers/api/deals/aggregate/route.ts +17 -9
- package/src/modules/customers/api/deals/map/route.ts +4 -4
- package/src/modules/customers/api/deals/route.ts +50 -1
- package/src/modules/customers/api/entity-roles-factory.ts +8 -4
- package/src/modules/customers/api/interactions/route.ts +8 -2
- package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
- package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
- package/src/modules/customers/api/people/[id]/route.ts +16 -11
- package/src/modules/customers/api/people/check-phone/route.ts +75 -10
- package/src/modules/customers/api/todos/route.ts +27 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
- package/src/modules/customers/backend/customers/people/page.tsx +5 -2
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
- package/src/modules/customers/commands/deals.ts +34 -59
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
- package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
- package/src/modules/customers/components/detail/DealForm.tsx +22 -2
- package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +15 -5
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +50 -9
- package/src/modules/customers/events.ts +5 -0
- package/src/modules/customers/i18n/de.json +9 -1
- package/src/modules/customers/i18n/en.json +9 -1
- package/src/modules/customers/i18n/es.json +9 -1
- package/src/modules/customers/i18n/ko.json +9 -1
- package/src/modules/customers/i18n/pl.json +9 -1
- package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
- package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
- package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
- package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
- package/src/modules/customers/lib/closureStage.ts +76 -0
- package/src/modules/customers/lib/dealStatus.ts +42 -0
- package/src/modules/customers/lib/detailReadAccess.ts +35 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
- package/src/modules/customers/lib/personCompanies.ts +136 -1
- package/src/modules/customers/lib/todoCompatibility.ts +19 -1
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +6 -0
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
- package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
- package/src/modules/data_sync/lib/adapter.ts +36 -0
- package/src/modules/data_sync/lib/sync-engine.ts +113 -5
- package/src/modules/data_sync/workers/sync-export.ts +4 -0
- package/src/modules/data_sync/workers/sync-import.ts +4 -0
- package/src/modules/devices/AGENTS.md +20 -1
- package/src/modules/devices/acl.ts +9 -1
- package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
- package/src/modules/devices/api/admin/devices/route.ts +14 -1
- package/src/modules/devices/api/deviceList.ts +135 -11
- package/src/modules/devices/api/deviceSerialization.ts +50 -0
- package/src/modules/devices/api/openapi.ts +9 -1
- package/src/modules/devices/api/route.ts +9 -1
- package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
- package/src/modules/devices/backend/devices/create/page.tsx +17 -1
- package/src/modules/devices/backend/devices/page.tsx +44 -45
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
- package/src/modules/devices/backend/devices/userOptions.ts +99 -0
- package/src/modules/devices/i18n/de.json +3 -2
- package/src/modules/devices/i18n/en.json +3 -2
- package/src/modules/devices/i18n/es.json +3 -2
- package/src/modules/devices/i18n/ko.json +3 -2
- package/src/modules/devices/i18n/pl.json +3 -2
- package/src/modules/devices/setup.ts +6 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
- package/src/modules/directory/di.ts +14 -2
- package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
- package/src/modules/directory/services/organizationScopeService.ts +85 -0
- package/src/modules/directory/utils/organizationScope.ts +4 -15
- package/src/modules/entities/api/records.ts +2 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
- package/src/modules/eudr/api/plots/route.ts +4 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
- package/src/modules/eudr/commands/statements.ts +0 -3
- package/src/modules/eudr/data/validators.ts +16 -1
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/feature_toggles/defaults.json +0 -8
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
- package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
- package/src/modules/integrations/data/validators.ts +12 -2
- package/src/modules/integrations/i18n/de.json +1 -0
- package/src/modules/integrations/i18n/en.json +1 -0
- package/src/modules/integrations/i18n/es.json +1 -0
- package/src/modules/integrations/i18n/ko.json +1 -0
- package/src/modules/integrations/i18n/pl.json +1 -0
- package/src/modules/integrations/lib/credentials-masking.ts +10 -6
- package/src/modules/messages/api/[id]/route.ts +55 -1
- package/src/modules/messages/api/openapi.ts +20 -0
- package/src/modules/messages/api/route.ts +31 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
- package/src/modules/messages/components/inboxFilters.ts +36 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
- package/src/modules/messages/components/message-detail/types.ts +3 -0
- package/src/modules/messages/components/messageListLabels.ts +52 -3
- package/src/modules/messages/data/validators.ts +43 -4
- package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
- package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
- package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +249 -61
- package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
- package/src/modules/query_index/lib/search-tokens.ts +135 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
- package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
- package/src/modules/sales/commands/documents.ts +93 -0
- package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
- package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
- package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
- package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
- package/src/modules/sales/data/entities.ts +6 -0
- package/src/modules/sales/extension-points.ts +1 -0
- package/src/modules/sales/i18n/de.json +8 -0
- package/src/modules/sales/i18n/en.json +8 -0
- package/src/modules/sales/i18n/es.json +8 -0
- package/src/modules/sales/i18n/ko.json +8 -0
- package/src/modules/sales/i18n/pl.json +8 -0
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
- package/src/modules/sales/setup.ts +2 -0
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
- package/src/modules/sales/widgets/injection-table.ts +4 -7
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
- package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
- package/src/modules/warranty_claims/backend/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +159 -10
- package/src/modules/wms/commands/inventory-actions.ts +3 -0
- package/src/modules/wms/commands/shared.ts +17 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/page.tsx +4 -1
- package/src/modules/workflows/backend/events/page.tsx +4 -1
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/lib/activity-executor.ts +9 -0
|
@@ -173,7 +173,7 @@ interface ParticipantsFieldProps {
|
|
|
173
173
|
activityType: ActivityType
|
|
174
174
|
participants: Participant[]
|
|
175
175
|
setParticipants: React.Dispatch<React.SetStateAction<Participant[]>>
|
|
176
|
-
removeParticipant: (
|
|
176
|
+
removeParticipant: (index: number) => void
|
|
177
177
|
guestPermissions: { canInviteOthers: boolean; canModify: boolean; canSeeList: boolean }
|
|
178
178
|
setGuestPermissions: React.Dispatch<React.SetStateAction<{ canInviteOthers: boolean; canModify: boolean; canSeeList: boolean }>>
|
|
179
179
|
}
|
|
@@ -205,19 +205,19 @@ export function ParticipantsField({
|
|
|
205
205
|
{sectionLabel}
|
|
206
206
|
</label>
|
|
207
207
|
<div className="mt-2.5 flex flex-wrap content-center items-center gap-2 rounded-lg border border-border bg-background px-3 py-2.5">
|
|
208
|
-
{participants.map((p) => (
|
|
209
|
-
<div key={p.userId} className="inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-2.5 py-1.5">
|
|
208
|
+
{participants.map((p, index) => (
|
|
209
|
+
<div key={p.userId ?? p.email ?? index} className="inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-2.5 py-1.5">
|
|
210
210
|
<span className={cn('inline-flex size-5 items-center justify-center rounded-full text-xs font-bold text-white', p.color ?? 'bg-primary')}>
|
|
211
211
|
{p.name.charAt(0).toUpperCase()}
|
|
212
212
|
</span>
|
|
213
213
|
<span className="text-xs text-foreground">{p.name}</span>
|
|
214
|
-
<IconButton type="button" variant="ghost" size="sm" onClick={() => removeParticipant(
|
|
214
|
+
<IconButton type="button" variant="ghost" size="sm" onClick={() => removeParticipant(index)} className="h-auto text-muted-foreground hover:text-foreground p-0" aria-label={t('customers.schedule.removeParticipant', 'Remove participant')}>
|
|
215
215
|
<X className="size-3" />
|
|
216
216
|
</IconButton>
|
|
217
217
|
</div>
|
|
218
218
|
))}
|
|
219
219
|
<ParticipantSearchPopover
|
|
220
|
-
existingIds={new Set(participants.map((p) => p.userId))}
|
|
220
|
+
existingIds={new Set(participants.map((p) => p.userId).filter((userId): userId is string => Boolean(userId)))}
|
|
221
221
|
onAdd={(p) => setParticipants((prev) => [...prev, { ...p, status: 'pending' as RsvpStatus }])}
|
|
222
222
|
onAddMany={(nextParticipants) => {
|
|
223
223
|
setParticipants((prev) => [
|
|
@@ -4,7 +4,7 @@ import type { ActivityType } from './fieldConfig'
|
|
|
4
4
|
export type RsvpStatus = 'pending' | 'accepted' | 'declined' | 'tentative'
|
|
5
5
|
|
|
6
6
|
export type Participant = {
|
|
7
|
-
userId
|
|
7
|
+
userId?: string
|
|
8
8
|
name: string
|
|
9
9
|
email?: string
|
|
10
10
|
color?: string
|
|
@@ -36,7 +36,7 @@ export type ScheduleActivityEditData = {
|
|
|
36
36
|
allDay?: boolean | null
|
|
37
37
|
recurrenceRule?: string | null
|
|
38
38
|
recurrenceEnd?: string | null
|
|
39
|
-
participants?: Array<{ userId
|
|
39
|
+
participants?: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
|
|
40
40
|
reminderMinutes?: number | null
|
|
41
41
|
visibility?: string | null
|
|
42
42
|
linkedEntities?: Array<{ id: string; type: string; label: string }> | null
|
|
@@ -136,7 +136,7 @@ export function useScheduleFormState({ open, editData }: UseScheduleFormStatePar
|
|
|
136
136
|
Array.isArray(editData.participants)
|
|
137
137
|
? editData.participants.map((p, i) => ({
|
|
138
138
|
userId: p.userId,
|
|
139
|
-
name: p.name ?? p.userId,
|
|
139
|
+
name: p.name ?? p.email ?? p.userId ?? '',
|
|
140
140
|
email: p.email,
|
|
141
141
|
color: PARTICIPANT_COLORS[i % PARTICIPANT_COLORS.length],
|
|
142
142
|
status: (p.status ?? 'pending') as RsvpStatus,
|
|
@@ -219,8 +219,8 @@ export function useScheduleFormState({ open, editData }: UseScheduleFormStatePar
|
|
|
219
219
|
setReminderMinutes(DEFAULT_REMINDER_MINUTES[activityType])
|
|
220
220
|
}, [activityType, editData, open])
|
|
221
221
|
|
|
222
|
-
const removeParticipant = React.useCallback((
|
|
223
|
-
setParticipants((prev) => prev.filter((
|
|
222
|
+
const removeParticipant = React.useCallback((index: number) => {
|
|
223
|
+
setParticipants((prev) => prev.filter((_, i) => i !== index))
|
|
224
224
|
}, [])
|
|
225
225
|
|
|
226
226
|
const toggleRecurrenceDay = React.useCallback((index: number) => {
|
|
@@ -144,7 +144,7 @@ export type InteractionSummary = {
|
|
|
144
144
|
authorEmail?: string | null
|
|
145
145
|
dealTitle?: string | null
|
|
146
146
|
customValues?: Record<string, unknown> | null
|
|
147
|
-
participants?: Array<{ userId
|
|
147
|
+
participants?: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
|
|
148
148
|
reminderMinutes?: number | null
|
|
149
149
|
visibility?: string | null
|
|
150
150
|
linkedEntities?: Array<{ id: string; type: string; label: string }> | null
|
|
@@ -5,11 +5,16 @@ import type { CustomerDictionaryKind } from '../../lib/dictionaries'
|
|
|
5
5
|
import { CUSTOMER_INTERACTION_TASK_SOURCE, CUSTOMER_INTERACTION_TASK_TYPE } from '../../lib/interactionCompatibility'
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Pass `locale` to format in the application locale (`useLocale()` in client components).
|
|
10
|
+
* Omitting it keeps the runtime default, which varies per machine and is therefore not
|
|
11
|
+
* assertable in tests.
|
|
12
|
+
*/
|
|
13
|
+
export function formatDate(value?: string | null, locale?: string): string | null {
|
|
9
14
|
if (!value) return null
|
|
10
15
|
const date = new Date(value)
|
|
11
16
|
if (Number.isNaN(date.getTime())) return null
|
|
12
|
-
return date.toLocaleDateString()
|
|
17
|
+
return date.toLocaleDateString(locale)
|
|
13
18
|
}
|
|
14
19
|
|
|
15
20
|
export function formatTemplate(template: string, params?: Record<string, string | number>): string {
|
|
@@ -148,15 +153,20 @@ export function createDictionarySelectLabels(
|
|
|
148
153
|
}
|
|
149
154
|
}
|
|
150
155
|
|
|
151
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Pass `locale` to format in the application locale (`useLocale()` in client components).
|
|
158
|
+
* Omitting it keeps the runtime default, which varies per machine and is therefore not
|
|
159
|
+
* assertable in tests.
|
|
160
|
+
*/
|
|
161
|
+
export function formatCurrency(amount: number, currency?: string | null, locale?: string): string {
|
|
152
162
|
try {
|
|
153
|
-
return new Intl.NumberFormat(
|
|
163
|
+
return new Intl.NumberFormat(locale, {
|
|
154
164
|
style: 'currency',
|
|
155
165
|
currency: currency || 'PLN',
|
|
156
166
|
maximumFractionDigits: 0,
|
|
157
167
|
}).format(amount)
|
|
158
168
|
} catch {
|
|
159
|
-
return `${amount.toLocaleString()} ${currency || 'PLN'}`
|
|
169
|
+
return `${amount.toLocaleString(locale)} ${currency || 'PLN'}`
|
|
160
170
|
}
|
|
161
171
|
}
|
|
162
172
|
|
|
@@ -650,7 +650,7 @@ export class CustomerInteraction {
|
|
|
650
650
|
recurrenceEnd?: Date | null
|
|
651
651
|
|
|
652
652
|
@Property({ name: 'participants', type: 'jsonb', nullable: true })
|
|
653
|
-
participants?: Array<{ userId
|
|
653
|
+
participants?: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
|
|
654
654
|
|
|
655
655
|
@Property({ name: 'reminder_minutes', type: 'int', nullable: true })
|
|
656
656
|
reminderMinutes?: number | null
|
|
@@ -10,6 +10,8 @@ export const ACTIVITY_DATE_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.d
|
|
|
10
10
|
export const ACTIVITY_TIME_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.timeRequired'
|
|
11
11
|
export const ACTIVITY_PHONE_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.phoneRequired'
|
|
12
12
|
export const ACTIVITY_PHONE_INVALID_MESSAGE_KEY = 'customers.activities.errors.phoneInvalid'
|
|
13
|
+
export const INTERACTION_PARTICIPANT_IDENTITY_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.participantIdentityRequired'
|
|
14
|
+
export const INTERACTION_PARTICIPANT_EMAIL_INVALID_MESSAGE_KEY = 'customers.activities.errors.participantEmailInvalid'
|
|
13
15
|
|
|
14
16
|
// customer_deals.description is an unbounded `text` column; this cap only exists to keep
|
|
15
17
|
// request bodies, fulltext search documents and query-index documents from growing without limit.
|
|
@@ -424,12 +426,36 @@ export const interactionStatusValues = ['planned', 'done', 'canceled'] as const
|
|
|
424
426
|
/** @deprecated See {@link interactionStatusValues}. */
|
|
425
427
|
export type InteractionStatus = typeof interactionStatusValues[number]
|
|
426
428
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
429
|
+
// A participant is either a real record (`userId`) or an external guest carrying
|
|
430
|
+
// no id at all. A guest is only addressable through its email, so that email is
|
|
431
|
+
// required and must actually be routable — an unparseable string would persist
|
|
432
|
+
// and only fail later, at invitation or calendar-sync time. Participants that DO
|
|
433
|
+
// have a userId keep an unvalidated auxiliary email, as before.
|
|
434
|
+
const interactionParticipantSchema = z
|
|
435
|
+
.object({
|
|
436
|
+
userId: z.string().uuid().optional(),
|
|
437
|
+
name: z.string().trim().max(200).optional(),
|
|
438
|
+
email: z.string().trim().max(320).optional(),
|
|
439
|
+
status: z.string().trim().max(50).optional(),
|
|
440
|
+
})
|
|
441
|
+
.superRefine((participant, ctx) => {
|
|
442
|
+
if (participant.userId) return
|
|
443
|
+
if (!participant.email) {
|
|
444
|
+
ctx.addIssue({
|
|
445
|
+
code: z.ZodIssueCode.custom,
|
|
446
|
+
path: ['email'],
|
|
447
|
+
message: INTERACTION_PARTICIPANT_IDENTITY_REQUIRED_MESSAGE_KEY,
|
|
448
|
+
})
|
|
449
|
+
return
|
|
450
|
+
}
|
|
451
|
+
if (!z.string().email().safeParse(participant.email).success) {
|
|
452
|
+
ctx.addIssue({
|
|
453
|
+
code: z.ZodIssueCode.custom,
|
|
454
|
+
path: ['email'],
|
|
455
|
+
message: INTERACTION_PARTICIPANT_EMAIL_INVALID_MESSAGE_KEY,
|
|
456
|
+
})
|
|
457
|
+
}
|
|
458
|
+
})
|
|
433
459
|
|
|
434
460
|
const interactionLinkedEntitySchema = z.object({
|
|
435
461
|
id: z.string().uuid(),
|
|
@@ -774,9 +800,24 @@ export const personCompanyLinkUpdateSchema = scopedSchema.extend({
|
|
|
774
800
|
isPrimary: z.boolean(),
|
|
775
801
|
})
|
|
776
802
|
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
803
|
+
// Two shapes are accepted, because a person can belong to a company in two ways:
|
|
804
|
+
// through a `customer_person_company_links` row (`linkId`), or through a legacy
|
|
805
|
+
// profile-only assignment where `customer_person_profiles.company_id` is set and no
|
|
806
|
+
// link row was ever created (migrated CRM data, #5114). Both detaches go through the
|
|
807
|
+
// same command so audit, undo and cache invalidation stay consistent.
|
|
808
|
+
export const personCompanyLinkDeleteSchema = scopedSchema
|
|
809
|
+
.extend({
|
|
810
|
+
linkId: uuid().optional(),
|
|
811
|
+
personEntityId: uuid().optional(),
|
|
812
|
+
companyEntityId: uuid().optional(),
|
|
813
|
+
})
|
|
814
|
+
.refine(
|
|
815
|
+
(payload) => Boolean(payload.linkId) || Boolean(payload.personEntityId && payload.companyEntityId),
|
|
816
|
+
{
|
|
817
|
+
message: 'Provide either linkId or both personEntityId and companyEntityId.',
|
|
818
|
+
path: ['linkId'],
|
|
819
|
+
}
|
|
820
|
+
)
|
|
780
821
|
|
|
781
822
|
export type PersonCompanyLinkCreateInput = z.infer<typeof personCompanyLinkCreateSchema>
|
|
782
823
|
export type PersonCompanyLinkUpdateInput = z.infer<typeof personCompanyLinkUpdateSchema>
|
|
@@ -78,6 +78,11 @@ const events = [
|
|
|
78
78
|
{ id: 'customers.person_company_link.created', label: 'Person Linked To Company', entity: 'person_company_link', category: 'crud', clientBroadcast: true },
|
|
79
79
|
{ id: 'customers.person_company_link.updated', label: 'Person-Company Link Updated', entity: 'person_company_link', category: 'crud', clientBroadcast: true },
|
|
80
80
|
{ id: 'customers.person_company_link.deleted', label: 'Person Unlinked From Company', entity: 'person_company_link', category: 'crud', clientBroadcast: true },
|
|
81
|
+
// Legacy profile-only company assignments (`customer_person_profiles.company_id` set with no
|
|
82
|
+
// backing link row, #5114) have no link entity, so detaching one cannot honestly emit
|
|
83
|
+
// `customers.person_company_link.deleted` — that event's payload promises a link id that never
|
|
84
|
+
// existed. This sibling carries the same live-refresh signal for that shape instead.
|
|
85
|
+
{ id: 'customers.person.company_assignment.detached', label: 'Legacy Company Assignment Detached', entity: 'person_company_link', category: 'lifecycle', clientBroadcast: true },
|
|
81
86
|
|
|
82
87
|
// ── Email integration (2026-05-27) ────────────────────────────────────────
|
|
83
88
|
{ id: 'customers.email.linked', label: 'Email Linked To Person', entity: 'email_link', category: 'lifecycle', clientBroadcast: true },
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"customers.activities.card.overdue": "{count} überfällig",
|
|
29
29
|
"customers.activities.card.title": "Aktivitäten",
|
|
30
30
|
"customers.activities.errors.dateRequired": "Datum ist erforderlich",
|
|
31
|
+
"customers.activities.errors.participantEmailInvalid": "Geben Sie eine gültige E-Mail-Adresse für einen Gastteilnehmer ein (z. B. gast@example.org)",
|
|
32
|
+
"customers.activities.errors.participantIdentityRequired": "Ein Teilnehmer benötigt entweder einen Benutzerdatensatz oder eine E-Mail-Adresse",
|
|
31
33
|
"customers.activities.errors.phoneInvalid": "Geben Sie eine gültige Telefonnummer mit Ländervorwahl ein (z. B. +49 30 1234567)",
|
|
32
34
|
"customers.activities.errors.phoneRequired": "Telefonnummer ist für Anrufaktivitäten erforderlich",
|
|
33
35
|
"customers.activities.errors.timeRequired": "Uhrzeit ist erforderlich",
|
|
@@ -222,6 +224,7 @@
|
|
|
222
224
|
"customers.calendar.day.thu": "DO",
|
|
223
225
|
"customers.calendar.day.tue": "DI",
|
|
224
226
|
"customers.calendar.day.wed": "MI",
|
|
227
|
+
"customers.calendar.editor.addGuest": "{email} als Gast einladen",
|
|
225
228
|
"customers.calendar.editor.addPeoplePlaceholder": "Mitarbeiter oder Kunden hinzufügen…",
|
|
226
229
|
"customers.calendar.editor.addRecipientPlaceholder": "Empfänger hinzufügen…",
|
|
227
230
|
"customers.calendar.editor.allDay": "Ganztägig",
|
|
@@ -247,6 +250,7 @@
|
|
|
247
250
|
"customers.calendar.editor.description": "Beschreibung",
|
|
248
251
|
"customers.calendar.editor.descriptionPlaceholder": "Details hinzufügen…",
|
|
249
252
|
"customers.calendar.editor.error": "Termin konnte nicht gespeichert werden",
|
|
253
|
+
"customers.calendar.editor.guestBadge": "Gast",
|
|
250
254
|
"customers.calendar.editor.location": "Ort",
|
|
251
255
|
"customers.calendar.editor.locationPlaceholder": "Ort oder Link hinzufügen…",
|
|
252
256
|
"customers.calendar.editor.multiDayHint": "Mehrtägiger Termin · {count} Tage",
|
|
@@ -354,7 +358,7 @@
|
|
|
354
358
|
"customers.calendar.settings.activityTypesHint": "Die Aktivitätstypen, die Ihr Kalender beim Erstellen eines Ereignisses anbietet. Aus dem Workspace-Wörterbuch übernommen.",
|
|
355
359
|
"customers.calendar.settings.addCategory": "Kategorie hinzufügen…",
|
|
356
360
|
"customers.calendar.settings.addType": "Typ hinzufügen…",
|
|
357
|
-
"customers.calendar.settings.aiSummaries": "KI-Zusammenfassungen
|
|
361
|
+
"customers.calendar.settings.aiSummaries": "KI-Zusammenfassungen",
|
|
358
362
|
"customers.calendar.settings.cancel": "Abbrechen",
|
|
359
363
|
"customers.calendar.settings.close": "Schließen",
|
|
360
364
|
"customers.calendar.settings.conflictScope": "Konfliktbereich",
|
|
@@ -1319,6 +1323,9 @@
|
|
|
1319
1323
|
"customers.deals.kanban.filter.searchPlaceholder": "Search…",
|
|
1320
1324
|
"customers.deals.kanban.filter.selected": "selected",
|
|
1321
1325
|
"customers.deals.kanban.filter.status": "Status",
|
|
1326
|
+
"customers.deals.kanban.filter.status.closed": "Geschlossen",
|
|
1327
|
+
"customers.deals.kanban.filter.status.inProgress": "In Bearbeitung",
|
|
1328
|
+
"customers.deals.kanban.filter.status.loading": "Status werden geladen…",
|
|
1322
1329
|
"customers.deals.kanban.filter.status.lost": "Lost",
|
|
1323
1330
|
"customers.deals.kanban.filter.status.open": "Open",
|
|
1324
1331
|
"customers.deals.kanban.filter.status.title": "Filter · Status",
|
|
@@ -2409,6 +2416,7 @@
|
|
|
2409
2416
|
"customers.personTags.newLabel": "New label",
|
|
2410
2417
|
"customers.personTags.newLabelPlaceholder": "Label name...",
|
|
2411
2418
|
"customers.personTags.newTag": "Neuer Tag",
|
|
2419
|
+
"customers.personTags.retry": "Erneut versuchen",
|
|
2412
2420
|
"customers.personTags.save": "Save",
|
|
2413
2421
|
"customers.personTags.saveError": "Failed to save tags",
|
|
2414
2422
|
"customers.personTags.saveSuccess": "Tags updated.",
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"customers.activities.card.overdue": "{count} overdue",
|
|
29
29
|
"customers.activities.card.title": "Activities",
|
|
30
30
|
"customers.activities.errors.dateRequired": "Date is required",
|
|
31
|
+
"customers.activities.errors.participantEmailInvalid": "Enter a valid email address for a guest participant (e.g. guest@example.org)",
|
|
32
|
+
"customers.activities.errors.participantIdentityRequired": "A participant needs either a user record or an email address",
|
|
31
33
|
"customers.activities.errors.phoneInvalid": "Enter a valid phone number with country code (e.g. +1 212 555 1234)",
|
|
32
34
|
"customers.activities.errors.phoneRequired": "Phone number is required for Call activities",
|
|
33
35
|
"customers.activities.errors.timeRequired": "Time is required",
|
|
@@ -222,6 +224,7 @@
|
|
|
222
224
|
"customers.calendar.day.thu": "THU",
|
|
223
225
|
"customers.calendar.day.tue": "TUE",
|
|
224
226
|
"customers.calendar.day.wed": "WED",
|
|
227
|
+
"customers.calendar.editor.addGuest": "Invite {email} as a guest",
|
|
225
228
|
"customers.calendar.editor.addPeoplePlaceholder": "Add staff or customer…",
|
|
226
229
|
"customers.calendar.editor.addRecipientPlaceholder": "Add recipient…",
|
|
227
230
|
"customers.calendar.editor.allDay": "All day",
|
|
@@ -247,6 +250,7 @@
|
|
|
247
250
|
"customers.calendar.editor.description": "Description",
|
|
248
251
|
"customers.calendar.editor.descriptionPlaceholder": "Add details…",
|
|
249
252
|
"customers.calendar.editor.error": "Failed to save event",
|
|
253
|
+
"customers.calendar.editor.guestBadge": "Guest",
|
|
250
254
|
"customers.calendar.editor.location": "Location",
|
|
251
255
|
"customers.calendar.editor.locationPlaceholder": "Add a location or link…",
|
|
252
256
|
"customers.calendar.editor.multiDayHint": "Multi-day event · {count} days",
|
|
@@ -354,7 +358,7 @@
|
|
|
354
358
|
"customers.calendar.settings.activityTypesHint": "The activity types your calendar surfaces when creating an event. Seeded from your workspace dictionary.",
|
|
355
359
|
"customers.calendar.settings.addCategory": "Add a category…",
|
|
356
360
|
"customers.calendar.settings.addType": "Add a type…",
|
|
357
|
-
"customers.calendar.settings.aiSummaries": "AI summaries
|
|
361
|
+
"customers.calendar.settings.aiSummaries": "AI summaries",
|
|
358
362
|
"customers.calendar.settings.cancel": "Cancel",
|
|
359
363
|
"customers.calendar.settings.close": "Close",
|
|
360
364
|
"customers.calendar.settings.conflictScope": "Conflict scope",
|
|
@@ -1319,6 +1323,9 @@
|
|
|
1319
1323
|
"customers.deals.kanban.filter.searchPlaceholder": "Search…",
|
|
1320
1324
|
"customers.deals.kanban.filter.selected": "selected",
|
|
1321
1325
|
"customers.deals.kanban.filter.status": "Status",
|
|
1326
|
+
"customers.deals.kanban.filter.status.closed": "Closed",
|
|
1327
|
+
"customers.deals.kanban.filter.status.inProgress": "In progress",
|
|
1328
|
+
"customers.deals.kanban.filter.status.loading": "Loading statuses…",
|
|
1322
1329
|
"customers.deals.kanban.filter.status.lost": "Lost",
|
|
1323
1330
|
"customers.deals.kanban.filter.status.open": "Open",
|
|
1324
1331
|
"customers.deals.kanban.filter.status.title": "Filter · Status",
|
|
@@ -2409,6 +2416,7 @@
|
|
|
2409
2416
|
"customers.personTags.newLabel": "New label",
|
|
2410
2417
|
"customers.personTags.newLabelPlaceholder": "Label name...",
|
|
2411
2418
|
"customers.personTags.newTag": "New tag",
|
|
2419
|
+
"customers.personTags.retry": "Retry",
|
|
2412
2420
|
"customers.personTags.save": "Save",
|
|
2413
2421
|
"customers.personTags.saveError": "Failed to save tags",
|
|
2414
2422
|
"customers.personTags.saveSuccess": "Tags updated.",
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"customers.activities.card.overdue": "{count} vencidas",
|
|
29
29
|
"customers.activities.card.title": "Actividades",
|
|
30
30
|
"customers.activities.errors.dateRequired": "La fecha es obligatoria",
|
|
31
|
+
"customers.activities.errors.participantEmailInvalid": "Introduce una dirección de correo electrónico válida para un invitado (p. ej., invitado@example.org)",
|
|
32
|
+
"customers.activities.errors.participantIdentityRequired": "Un participante necesita un registro de usuario o una dirección de correo electrónico",
|
|
31
33
|
"customers.activities.errors.phoneInvalid": "Introduce un número de teléfono válido con prefijo internacional (p. ej., +34 912 345 678)",
|
|
32
34
|
"customers.activities.errors.phoneRequired": "El número de teléfono es obligatorio para actividades de llamada",
|
|
33
35
|
"customers.activities.errors.timeRequired": "La hora es obligatoria",
|
|
@@ -222,6 +224,7 @@
|
|
|
222
224
|
"customers.calendar.day.thu": "JUE",
|
|
223
225
|
"customers.calendar.day.tue": "MAR",
|
|
224
226
|
"customers.calendar.day.wed": "MIÉ",
|
|
227
|
+
"customers.calendar.editor.addGuest": "Invitar a {email} como invitado",
|
|
225
228
|
"customers.calendar.editor.addPeoplePlaceholder": "Añadir personal o cliente…",
|
|
226
229
|
"customers.calendar.editor.addRecipientPlaceholder": "Añadir destinatario…",
|
|
227
230
|
"customers.calendar.editor.allDay": "Todo el día",
|
|
@@ -247,6 +250,7 @@
|
|
|
247
250
|
"customers.calendar.editor.description": "Descripción",
|
|
248
251
|
"customers.calendar.editor.descriptionPlaceholder": "Añadir detalles…",
|
|
249
252
|
"customers.calendar.editor.error": "No se pudo guardar el evento",
|
|
253
|
+
"customers.calendar.editor.guestBadge": "Invitado",
|
|
250
254
|
"customers.calendar.editor.location": "Ubicación",
|
|
251
255
|
"customers.calendar.editor.locationPlaceholder": "Añadir una ubicación o enlace…",
|
|
252
256
|
"customers.calendar.editor.multiDayHint": "Evento de varios días · {count} días",
|
|
@@ -354,7 +358,7 @@
|
|
|
354
358
|
"customers.calendar.settings.activityTypesHint": "Los tipos de actividad que muestra tu calendario al crear un evento. Tomados del diccionario del espacio de trabajo.",
|
|
355
359
|
"customers.calendar.settings.addCategory": "Añadir una categoría…",
|
|
356
360
|
"customers.calendar.settings.addType": "Añadir un tipo…",
|
|
357
|
-
"customers.calendar.settings.aiSummaries": "Resúmenes de IA
|
|
361
|
+
"customers.calendar.settings.aiSummaries": "Resúmenes de IA",
|
|
358
362
|
"customers.calendar.settings.cancel": "Cancelar",
|
|
359
363
|
"customers.calendar.settings.close": "Cerrar",
|
|
360
364
|
"customers.calendar.settings.conflictScope": "Ámbito de conflictos",
|
|
@@ -1319,6 +1323,9 @@
|
|
|
1319
1323
|
"customers.deals.kanban.filter.searchPlaceholder": "Search…",
|
|
1320
1324
|
"customers.deals.kanban.filter.selected": "selected",
|
|
1321
1325
|
"customers.deals.kanban.filter.status": "Status",
|
|
1326
|
+
"customers.deals.kanban.filter.status.closed": "Cerrado",
|
|
1327
|
+
"customers.deals.kanban.filter.status.inProgress": "En curso",
|
|
1328
|
+
"customers.deals.kanban.filter.status.loading": "Cargando estados…",
|
|
1322
1329
|
"customers.deals.kanban.filter.status.lost": "Lost",
|
|
1323
1330
|
"customers.deals.kanban.filter.status.open": "Open",
|
|
1324
1331
|
"customers.deals.kanban.filter.status.title": "Filter · Status",
|
|
@@ -2409,6 +2416,7 @@
|
|
|
2409
2416
|
"customers.personTags.newLabel": "New label",
|
|
2410
2417
|
"customers.personTags.newLabelPlaceholder": "Label name...",
|
|
2411
2418
|
"customers.personTags.newTag": "Nueva etiqueta",
|
|
2419
|
+
"customers.personTags.retry": "Reintentar",
|
|
2412
2420
|
"customers.personTags.save": "Save",
|
|
2413
2421
|
"customers.personTags.saveError": "Failed to save tags",
|
|
2414
2422
|
"customers.personTags.saveSuccess": "Tags updated.",
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"customers.activities.card.overdue": "{count}건 기한 초과",
|
|
29
29
|
"customers.activities.card.title": "활동",
|
|
30
30
|
"customers.activities.errors.dateRequired": "날짜는 필수입니다",
|
|
31
|
+
"customers.activities.errors.participantEmailInvalid": "게스트 참가자의 유효한 이메일 주소를 입력하세요(예: guest@example.org)",
|
|
32
|
+
"customers.activities.errors.participantIdentityRequired": "참가자에게는 사용자 레코드 또는 이메일 주소가 필요합니다",
|
|
31
33
|
"customers.activities.errors.phoneInvalid": "국가 코드를 포함한 유효한 전화번호를 입력하세요(예: +1 212 555 1234)",
|
|
32
34
|
"customers.activities.errors.phoneRequired": "통화 활동에는 전화번호가 필요합니다",
|
|
33
35
|
"customers.activities.errors.timeRequired": "시간은 필수입니다",
|
|
@@ -222,6 +224,7 @@
|
|
|
222
224
|
"customers.calendar.day.thu": "목",
|
|
223
225
|
"customers.calendar.day.tue": "화",
|
|
224
226
|
"customers.calendar.day.wed": "수",
|
|
227
|
+
"customers.calendar.editor.addGuest": "{email}을(를) 게스트로 초대",
|
|
225
228
|
"customers.calendar.editor.addPeoplePlaceholder": "직원 또는 고객 추가…",
|
|
226
229
|
"customers.calendar.editor.addRecipientPlaceholder": "받는 사람 추가…",
|
|
227
230
|
"customers.calendar.editor.allDay": "종일",
|
|
@@ -247,6 +250,7 @@
|
|
|
247
250
|
"customers.calendar.editor.description": "설명",
|
|
248
251
|
"customers.calendar.editor.descriptionPlaceholder": "세부 정보 추가…",
|
|
249
252
|
"customers.calendar.editor.error": "이벤트를 저장하지 못했습니다",
|
|
253
|
+
"customers.calendar.editor.guestBadge": "게스트",
|
|
250
254
|
"customers.calendar.editor.location": "장소",
|
|
251
255
|
"customers.calendar.editor.locationPlaceholder": "장소 또는 링크 추가…",
|
|
252
256
|
"customers.calendar.editor.multiDayHint": "여러 날 이벤트 · {count}일",
|
|
@@ -354,7 +358,7 @@
|
|
|
354
358
|
"customers.calendar.settings.activityTypesHint": "이벤트를 생성할 때 캘린더에 표시되는 활동 유형입니다. 워크스페이스 사전에서 초기화됩니다.",
|
|
355
359
|
"customers.calendar.settings.addCategory": "카테고리 추가…",
|
|
356
360
|
"customers.calendar.settings.addType": "유형 추가…",
|
|
357
|
-
"customers.calendar.settings.aiSummaries": "AI 요약
|
|
361
|
+
"customers.calendar.settings.aiSummaries": "AI 요약",
|
|
358
362
|
"customers.calendar.settings.cancel": "취소",
|
|
359
363
|
"customers.calendar.settings.close": "닫기",
|
|
360
364
|
"customers.calendar.settings.conflictScope": "충돌 범위",
|
|
@@ -1319,6 +1323,9 @@
|
|
|
1319
1323
|
"customers.deals.kanban.filter.searchPlaceholder": "검색…",
|
|
1320
1324
|
"customers.deals.kanban.filter.selected": "선택됨",
|
|
1321
1325
|
"customers.deals.kanban.filter.status": "상태",
|
|
1326
|
+
"customers.deals.kanban.filter.status.closed": "마감",
|
|
1327
|
+
"customers.deals.kanban.filter.status.inProgress": "진행 중",
|
|
1328
|
+
"customers.deals.kanban.filter.status.loading": "상태 로드 중…",
|
|
1322
1329
|
"customers.deals.kanban.filter.status.lost": "실패",
|
|
1323
1330
|
"customers.deals.kanban.filter.status.open": "열림",
|
|
1324
1331
|
"customers.deals.kanban.filter.status.title": "필터 · 상태",
|
|
@@ -2409,6 +2416,7 @@
|
|
|
2409
2416
|
"customers.personTags.newLabel": "새 라벨",
|
|
2410
2417
|
"customers.personTags.newLabelPlaceholder": "라벨 이름...",
|
|
2411
2418
|
"customers.personTags.newTag": "새 태그",
|
|
2419
|
+
"customers.personTags.retry": "다시 시도",
|
|
2412
2420
|
"customers.personTags.save": "저장",
|
|
2413
2421
|
"customers.personTags.saveError": "태그 저장에 실패했습니다",
|
|
2414
2422
|
"customers.personTags.saveSuccess": "태그가 업데이트되었습니다.",
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"customers.activities.card.overdue": "{count} zaległych",
|
|
29
29
|
"customers.activities.card.title": "Aktywności",
|
|
30
30
|
"customers.activities.errors.dateRequired": "Data jest wymagana",
|
|
31
|
+
"customers.activities.errors.participantEmailInvalid": "Wprowadź prawidłowy adres e-mail uczestnika zewnętrznego (np. gosc@example.org)",
|
|
32
|
+
"customers.activities.errors.participantIdentityRequired": "Uczestnik wymaga rekordu użytkownika lub adresu e-mail",
|
|
31
33
|
"customers.activities.errors.phoneInvalid": "Wprowadź prawidłowy numer telefonu z numerem kierunkowym kraju (np. +48 123 456 789)",
|
|
32
34
|
"customers.activities.errors.phoneRequired": "Numer telefonu jest wymagany dla aktywności typu Połączenie",
|
|
33
35
|
"customers.activities.errors.timeRequired": "Godzina jest wymagana",
|
|
@@ -222,6 +224,7 @@
|
|
|
222
224
|
"customers.calendar.day.thu": "CZ",
|
|
223
225
|
"customers.calendar.day.tue": "WT",
|
|
224
226
|
"customers.calendar.day.wed": "ŚR",
|
|
227
|
+
"customers.calendar.editor.addGuest": "Zaproś {email} jako gościa",
|
|
225
228
|
"customers.calendar.editor.addPeoplePlaceholder": "Dodaj pracownika lub klienta…",
|
|
226
229
|
"customers.calendar.editor.addRecipientPlaceholder": "Dodaj odbiorcę…",
|
|
227
230
|
"customers.calendar.editor.allDay": "Cały dzień",
|
|
@@ -247,6 +250,7 @@
|
|
|
247
250
|
"customers.calendar.editor.description": "Opis",
|
|
248
251
|
"customers.calendar.editor.descriptionPlaceholder": "Dodaj szczegóły…",
|
|
249
252
|
"customers.calendar.editor.error": "Nie udało się zapisać wydarzenia",
|
|
253
|
+
"customers.calendar.editor.guestBadge": "Gość",
|
|
250
254
|
"customers.calendar.editor.location": "Lokalizacja",
|
|
251
255
|
"customers.calendar.editor.locationPlaceholder": "Dodaj lokalizację lub link…",
|
|
252
256
|
"customers.calendar.editor.multiDayHint": "Wydarzenie wielodniowe · {count} dni",
|
|
@@ -354,7 +358,7 @@
|
|
|
354
358
|
"customers.calendar.settings.activityTypesHint": "Typy aktywności udostępniane przez kalendarz podczas tworzenia wydarzenia. Pobrane ze słownika obszaru roboczego.",
|
|
355
359
|
"customers.calendar.settings.addCategory": "Dodaj kategorię…",
|
|
356
360
|
"customers.calendar.settings.addType": "Dodaj typ…",
|
|
357
|
-
"customers.calendar.settings.aiSummaries": "Podsumowania AI
|
|
361
|
+
"customers.calendar.settings.aiSummaries": "Podsumowania AI",
|
|
358
362
|
"customers.calendar.settings.cancel": "Anuluj",
|
|
359
363
|
"customers.calendar.settings.close": "Zamknij",
|
|
360
364
|
"customers.calendar.settings.conflictScope": "Zakres konfliktów",
|
|
@@ -1319,6 +1323,9 @@
|
|
|
1319
1323
|
"customers.deals.kanban.filter.searchPlaceholder": "Szukaj…",
|
|
1320
1324
|
"customers.deals.kanban.filter.selected": "zaznaczono",
|
|
1321
1325
|
"customers.deals.kanban.filter.status": "Status",
|
|
1326
|
+
"customers.deals.kanban.filter.status.closed": "Zamknięta",
|
|
1327
|
+
"customers.deals.kanban.filter.status.inProgress": "W toku",
|
|
1328
|
+
"customers.deals.kanban.filter.status.loading": "Ładowanie statusów…",
|
|
1322
1329
|
"customers.deals.kanban.filter.status.lost": "Przegrana",
|
|
1323
1330
|
"customers.deals.kanban.filter.status.open": "Otwarta",
|
|
1324
1331
|
"customers.deals.kanban.filter.status.title": "Filtr · Status",
|
|
@@ -2409,6 +2416,7 @@
|
|
|
2409
2416
|
"customers.personTags.newLabel": "Nowa etykieta",
|
|
2410
2417
|
"customers.personTags.newLabelPlaceholder": "Nazwa etykiety...",
|
|
2411
2418
|
"customers.personTags.newTag": "Nowy tag",
|
|
2419
|
+
"customers.personTags.retry": "Ponów próbę",
|
|
2412
2420
|
"customers.personTags.save": "Zapisz",
|
|
2413
2421
|
"customers.personTags.saveError": "Nie udało się zapisać tagów",
|
|
2414
2422
|
"customers.personTags.saveSuccess": "Tagi zostały zaktualizowane.",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CalendarItem, CalendarItemStatus, CalendarParticipant } from '../../components/calendar/types'
|
|
2
|
+
import { participantActorKey } from './participantIdentity'
|
|
2
3
|
import type { ConflictScope } from './preferences'
|
|
3
4
|
|
|
4
5
|
export const EDITOR_DRAFT_CONFLICT_ID = '__draft__'
|
|
@@ -14,8 +15,15 @@ export type FindConflictsOptions = {
|
|
|
14
15
|
function sharesActor(first: CalendarItem, second: CalendarItem): boolean {
|
|
15
16
|
if (first.ownerUserId && second.ownerUserId && first.ownerUserId === second.ownerUserId) return true
|
|
16
17
|
if (first.participants.length === 0 || second.participants.length === 0) return false
|
|
17
|
-
const
|
|
18
|
-
|
|
18
|
+
const firstActorKeys = new Set(
|
|
19
|
+
first.participants
|
|
20
|
+
.map(participantActorKey)
|
|
21
|
+
.filter((actorKey): actorKey is string => actorKey !== null),
|
|
22
|
+
)
|
|
23
|
+
return second.participants.some((participant) => {
|
|
24
|
+
const actorKey = participantActorKey(participant)
|
|
25
|
+
return actorKey !== null && firstActorKeys.has(actorKey)
|
|
26
|
+
})
|
|
19
27
|
}
|
|
20
28
|
|
|
21
29
|
function isActor(item: CalendarItem, userId: string): boolean {
|
|
@@ -112,7 +112,7 @@ export type EditorRelatedTo = {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
export type EditorParticipant = {
|
|
115
|
-
userId
|
|
115
|
+
userId?: string
|
|
116
116
|
name: string
|
|
117
117
|
email?: string
|
|
118
118
|
isCustomer: boolean
|
|
@@ -405,13 +405,14 @@ function parseParticipants(item: CalendarItem): EditorParticipant[] {
|
|
|
405
405
|
const rawParticipants = Array.isArray(item.raw.participants) ? item.raw.participants : []
|
|
406
406
|
const statusByUserId = new Map<string, string | null>()
|
|
407
407
|
for (const raw of rawParticipants) {
|
|
408
|
+
if (!raw.userId) continue
|
|
408
409
|
statusByUserId.set(raw.userId, readUnknownString((raw as Record<string, unknown>).status))
|
|
409
410
|
}
|
|
410
411
|
return item.participants.map((participant) => ({
|
|
411
412
|
userId: participant.userId,
|
|
412
|
-
name: participant.name ?? participant.email ?? participant.userId,
|
|
413
|
+
name: participant.name ?? participant.email ?? participant.userId ?? '',
|
|
413
414
|
email: participant.email,
|
|
414
|
-
isCustomer: statusByUserId.get(participant.userId) === 'customer',
|
|
415
|
+
isCustomer: participant.userId ? statusByUserId.get(participant.userId) === 'customer' : false,
|
|
415
416
|
}))
|
|
416
417
|
}
|
|
417
418
|
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
CalendarPlatform,
|
|
11
11
|
} from '../../components/calendar/types'
|
|
12
12
|
import { categoryOf } from './categories'
|
|
13
|
+
import { participantActorKey } from './participantIdentity'
|
|
13
14
|
|
|
14
15
|
const DEFAULT_DURATION_MINUTES = 30
|
|
15
16
|
|
|
@@ -43,9 +44,13 @@ function mapParticipants(payload: CalendarInteractionPayload): CalendarParticipa
|
|
|
43
44
|
const seen = new Set<string>()
|
|
44
45
|
const mapped: CalendarParticipant[] = []
|
|
45
46
|
for (const participant of participants) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
const dedupeKey = participantActorKey(participant)
|
|
48
|
+
if (dedupeKey) {
|
|
49
|
+
if (seen.has(dedupeKey)) continue
|
|
50
|
+
seen.add(dedupeKey)
|
|
51
|
+
}
|
|
52
|
+
const entry: CalendarParticipant = {}
|
|
53
|
+
if (typeof participant.userId === 'string') entry.userId = participant.userId
|
|
49
54
|
if (typeof participant.name === 'string') entry.name = participant.name
|
|
50
55
|
if (typeof participant.email === 'string') entry.email = participant.email
|
|
51
56
|
mapped.push(entry)
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
}
|