@open-mercato/core 0.7.0 → 0.7.1-develop.7102.1.b41f7e3e51
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 +11 -4
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +2 -1
- 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 +14 -4
- package/src/modules/customers/api/deals/map/route.ts +1 -0
- 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
|
@@ -9,9 +9,17 @@ import {
|
|
|
9
9
|
import { Organization } from '@open-mercato/core/modules/directory/data/entities'
|
|
10
10
|
import { emitCustomerAccountsEvent } from '@open-mercato/core/modules/customer_accounts/events'
|
|
11
11
|
import { normalizeHostname, tryNormalizeHostname } from '@open-mercato/core/modules/customer_accounts/lib/hostname'
|
|
12
|
+
import { findOrganizationInTenant } from '@open-mercato/core/modules/customer_accounts/lib/organizationLookup'
|
|
12
13
|
import { platformDomains } from '@open-mercato/core/modules/customer_accounts/lib/platformDomains'
|
|
13
14
|
import { detectProxy, isInKnownProxyRange } from '@open-mercato/core/modules/customer_accounts/lib/proxyRanges'
|
|
14
15
|
|
|
16
|
+
export class DomainMappingOrgScopeError extends Error {
|
|
17
|
+
constructor(organizationId: string) {
|
|
18
|
+
super(`[internal] organizationId ${organizationId} does not belong to the caller's tenant`)
|
|
19
|
+
this.name = 'DomainMappingOrgScopeError'
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
15
23
|
const DOMAIN_ROUTING_TAG = 'domain_routing'
|
|
16
24
|
const RESOLVE_KEY_PREFIX = 'domain_routing:resolve'
|
|
17
25
|
const ACTIVE_BY_ORG_KEY_PREFIX = 'domain_routing:active-by-org'
|
|
@@ -269,6 +277,8 @@ export class DomainMappingService {
|
|
|
269
277
|
|
|
270
278
|
async register(input: RegisterInput): Promise<DomainMapping> {
|
|
271
279
|
const hostname = normalizeHostname(input.hostname)
|
|
280
|
+
const organization = await findOrganizationInTenant(this.em, input.organizationId, input.tenantId)
|
|
281
|
+
if (!organization) throw new DomainMappingOrgScopeError(input.organizationId)
|
|
272
282
|
|
|
273
283
|
let replacesDomain: DomainMapping | null = null
|
|
274
284
|
if (input.replacesDomainId) {
|
|
@@ -85,7 +85,7 @@ const listCompaniesTool = defineApiBackedAiTool<
|
|
|
85
85
|
name: 'customers.list_companies',
|
|
86
86
|
displayName: 'List companies',
|
|
87
87
|
description:
|
|
88
|
-
'Search / list companies for the caller tenant + organization. Returns { items, total, limit, offset }.',
|
|
88
|
+
'Search / list companies for the caller tenant + organization. Returns { items, total, totalIsCapped, limit, offset }. When totalIsCapped is true, total is a floor ("at least N", render it as "N+"), and pagination is exhausted only when a page returns fewer than limit items — never when offset reaches total.',
|
|
89
89
|
inputSchema: listCompaniesInput,
|
|
90
90
|
requiredFeatures: ['customers.companies.view'],
|
|
91
91
|
toOperation: (input, ctx) => {
|
|
@@ -122,6 +122,9 @@ const listCompaniesTool = defineApiBackedAiTool<
|
|
|
122
122
|
sizeBucket: row.size_bucket ?? row.sizeBucket ?? null,
|
|
123
123
|
})),
|
|
124
124
|
total: typeof data.total === 'number' ? data.total : 0,
|
|
125
|
+
// A capped count reports a floor: phrase the total as "at least N" and
|
|
126
|
+
// never treat it as proof that pagination is exhausted.
|
|
127
|
+
totalIsCapped: (data as { totalIsCapped?: boolean }).totalIsCapped === true,
|
|
125
128
|
limit,
|
|
126
129
|
offset,
|
|
127
130
|
}
|
|
@@ -192,14 +192,29 @@ const analyzeDealsToolDefinition: CustomersAiToolDefinition<AnalyzeDealsInput, A
|
|
|
192
192
|
// has no encrypted columns, but the linked CustomerEntity.display_name is
|
|
193
193
|
// encrypted, so resolve names via findWithDecryption rather than
|
|
194
194
|
// populating the relation through raw em.find.
|
|
195
|
+
// Defense-in-depth: `customer_deal_people` carries no tenant/org columns,
|
|
196
|
+
// so DB-level scoping is via the tenant-filtered `dealIds` set. Filter the
|
|
197
|
+
// returned rows against the caller-scoped deals map so a future refactor
|
|
198
|
+
// that widens `dealIds` cannot surface cross-tenant links.
|
|
199
|
+
const dealById = new Map<string, CustomerDeal>(deals.map((deal) => [deal.id, deal]))
|
|
200
|
+
const scopedDealIds = Array.from(dealById.keys())
|
|
195
201
|
const personLinkWhere: Record<string, unknown> = {
|
|
196
|
-
deal: { $in:
|
|
202
|
+
deal: { $in: scopedDealIds },
|
|
197
203
|
}
|
|
198
|
-
const
|
|
204
|
+
const personLinksRaw = await em.find(
|
|
199
205
|
CustomerDealPersonLink,
|
|
200
206
|
personLinkWhere as any,
|
|
201
207
|
{ limit: 500 },
|
|
202
208
|
)
|
|
209
|
+
const personLinks = personLinksRaw.filter((link) => {
|
|
210
|
+
const dealRefId = refIdOf((link as { deal?: unknown }).deal)
|
|
211
|
+
if (!dealRefId) return false
|
|
212
|
+
const scopedDeal = dealById.get(dealRefId)
|
|
213
|
+
if (!scopedDeal) return false
|
|
214
|
+
if (scopedDeal.tenantId !== tenantId) return false
|
|
215
|
+
if (ctx.organizationId && scopedDeal.organizationId !== ctx.organizationId) return false
|
|
216
|
+
return true
|
|
217
|
+
})
|
|
203
218
|
|
|
204
219
|
const linksByDeal = new Map<string, string>() // dealId → personId (first link wins)
|
|
205
220
|
for (const link of personLinks) {
|
|
@@ -27,6 +27,11 @@ import {
|
|
|
27
27
|
CustomerDeal,
|
|
28
28
|
CustomerPipelineStage,
|
|
29
29
|
} from '../data/entities'
|
|
30
|
+
import {
|
|
31
|
+
dealClosureOutcomeFromStatus,
|
|
32
|
+
loadClosurePipelineStageSnapshot,
|
|
33
|
+
} from '../lib/closureStage'
|
|
34
|
+
import { canonicalDealStatus, isClosedDealStatus } from '../lib/dealStatus'
|
|
30
35
|
import {
|
|
31
36
|
assertTenantScope,
|
|
32
37
|
type CustomersAiToolDefinition,
|
|
@@ -99,7 +104,7 @@ const listDealsTool = defineApiBackedAiTool<ListDealsInput, ListDealsApiResponse
|
|
|
99
104
|
name: 'customers.list_deals',
|
|
100
105
|
displayName: 'List deals',
|
|
101
106
|
description:
|
|
102
|
-
'Search / list deals for the caller tenant + organization. Optional filters include linked person / company / pipeline stage.',
|
|
107
|
+
'Search / list deals for the caller tenant + organization. Optional filters include linked person / company / pipeline stage. Returns { items, total, totalIsCapped, limit, offset }. When totalIsCapped is true, total is a floor ("at least N", render it as "N+"), and pagination is exhausted only when a page returns fewer than limit items — never when offset reaches total.',
|
|
103
108
|
inputSchema: listDealsInput,
|
|
104
109
|
requiredFeatures: ['customers.deals.view'],
|
|
105
110
|
toOperation: (input, ctx) => {
|
|
@@ -155,6 +160,9 @@ const listDealsTool = defineApiBackedAiTool<ListDealsInput, ListDealsApiResponse
|
|
|
155
160
|
}
|
|
156
161
|
}),
|
|
157
162
|
total: typeof data.total === 'number' ? data.total : 0,
|
|
163
|
+
// A capped count reports a floor: phrase the total as "at least N" and
|
|
164
|
+
// never treat it as proof that pagination is exhausted.
|
|
165
|
+
totalIsCapped: (data as { totalIsCapped?: boolean }).totalIsCapped === true,
|
|
158
166
|
limit,
|
|
159
167
|
offset,
|
|
160
168
|
}
|
|
@@ -466,10 +474,48 @@ const updateDealStageTool: CustomersAiToolDefinition = {
|
|
|
466
474
|
afterPipelineStageLabel = stage?.label ?? input.toPipelineStageId
|
|
467
475
|
} else if (input.toStage) {
|
|
468
476
|
afterStatus = input.toStage
|
|
477
|
+
// The update command derives a closure outcome from terminal status spellings and
|
|
478
|
+
// relocates the deal to the pipeline's terminal stage (#5107) — preview that same
|
|
479
|
+
// projection so the approval card states the full blast radius.
|
|
480
|
+
const organizationId = deal.organizationId ?? ctx.organizationId ?? null
|
|
481
|
+
const outcome = dealClosureOutcomeFromStatus(input.toStage)
|
|
482
|
+
if (outcome && organizationId) {
|
|
483
|
+
const terminalStage = await loadClosurePipelineStageSnapshot(em, {
|
|
484
|
+
pipelineId: deal.pipelineId ?? null,
|
|
485
|
+
closureOutcome: outcome,
|
|
486
|
+
tenantId,
|
|
487
|
+
organizationId,
|
|
488
|
+
})
|
|
489
|
+
if (terminalStage) {
|
|
490
|
+
afterPipelineStageId = terminalStage.id
|
|
491
|
+
afterPipelineStageLabel = terminalStage.label
|
|
492
|
+
}
|
|
493
|
+
}
|
|
469
494
|
}
|
|
470
495
|
const beforeStatus = deal.status ?? null
|
|
471
496
|
const beforePipelineStageId = deal.pipelineStageId ?? null
|
|
472
497
|
const beforePipelineStageLabel = deal.pipelineStage ?? beforePipelineStageId
|
|
498
|
+
const beforeClosureOutcome = deal.closureOutcome ?? null
|
|
499
|
+
const beforeLossReasonId = deal.lossReasonId ?? null
|
|
500
|
+
const beforeLossNotes = deal.lossNotes ?? null
|
|
501
|
+
// Mirror the update command exactly (#5107): a status-only write derives the closure
|
|
502
|
+
// outcome for terminal spellings, clears outcome plus loss columns for non-closed
|
|
503
|
+
// non-terminal ones (reopen), and leaves `closed` and stage-only writes untouched.
|
|
504
|
+
// `toStage` is free-form model text, so canonicalize before the `closed` check — the
|
|
505
|
+
// command does the same, and the two must stay in lockstep or the approval card would
|
|
506
|
+
// preview a different write than the one that lands.
|
|
507
|
+
const requestedOutcome = dealClosureOutcomeFromStatus(input.toStage)
|
|
508
|
+
const clearsClosure =
|
|
509
|
+
input.toPipelineStageId === undefined &&
|
|
510
|
+
input.toStage !== undefined &&
|
|
511
|
+
!requestedOutcome &&
|
|
512
|
+
!isClosedDealStatus(canonicalDealStatus(input.toStage))
|
|
513
|
+
const afterClosureOutcome = clearsClosure
|
|
514
|
+
? null
|
|
515
|
+
: requestedOutcome ?? beforeClosureOutcome
|
|
516
|
+
const closureOutcomeCleared = beforeClosureOutcome !== null && afterClosureOutcome === null
|
|
517
|
+
const afterLossReasonId = closureOutcomeCleared ? null : beforeLossReasonId
|
|
518
|
+
const afterLossNotes = closureOutcomeCleared ? null : beforeLossNotes
|
|
473
519
|
return {
|
|
474
520
|
recordId: deal.id,
|
|
475
521
|
entityType: 'customers.deal',
|
|
@@ -477,23 +523,42 @@ const updateDealStageTool: CustomersAiToolDefinition = {
|
|
|
477
523
|
before: {
|
|
478
524
|
status: beforeStatus,
|
|
479
525
|
pipelineStageId: beforePipelineStageId,
|
|
526
|
+
closureOutcome: beforeClosureOutcome,
|
|
527
|
+
lossReasonId: beforeLossReasonId,
|
|
528
|
+
lossNotes: beforeLossNotes,
|
|
480
529
|
},
|
|
481
530
|
after: {
|
|
482
531
|
status: afterStatus,
|
|
483
532
|
pipelineStageId: afterPipelineStageId,
|
|
533
|
+
closureOutcome: afterClosureOutcome,
|
|
534
|
+
lossReasonId: afterLossReasonId,
|
|
535
|
+
lossNotes: afterLossNotes,
|
|
484
536
|
},
|
|
485
537
|
display: {
|
|
486
538
|
fieldLabels: {
|
|
487
539
|
status: 'Status',
|
|
488
540
|
pipelineStageId: 'Pipeline stage',
|
|
541
|
+
closureOutcome: 'Closure outcome',
|
|
542
|
+
lossReasonId: 'Loss reason',
|
|
543
|
+
lossNotes: 'Loss notes',
|
|
489
544
|
},
|
|
490
545
|
before: {
|
|
491
546
|
...(beforeStatus ? { status: titleStatus(beforeStatus) } : {}),
|
|
492
547
|
...(beforePipelineStageLabel ? { pipelineStageId: beforePipelineStageLabel } : {}),
|
|
548
|
+
...(beforeClosureOutcome ? { closureOutcome: titleStatus(beforeClosureOutcome) } : {}),
|
|
549
|
+
...(beforeLossReasonId ? { lossReasonId: beforeLossReasonId } : {}),
|
|
550
|
+
...(beforeLossNotes ? { lossNotes: beforeLossNotes } : {}),
|
|
493
551
|
},
|
|
494
552
|
after: {
|
|
495
553
|
...(afterStatus ? { status: titleStatus(afterStatus) } : {}),
|
|
496
554
|
...(afterPipelineStageLabel ? { pipelineStageId: afterPipelineStageLabel } : {}),
|
|
555
|
+
...(afterClosureOutcome
|
|
556
|
+
? { closureOutcome: titleStatus(afterClosureOutcome) }
|
|
557
|
+
: closureOutcomeCleared
|
|
558
|
+
? { closureOutcome: '—' }
|
|
559
|
+
: {}),
|
|
560
|
+
...(afterLossReasonId ? { lossReasonId: afterLossReasonId } : {}),
|
|
561
|
+
...(afterLossNotes ? { lossNotes: afterLossNotes } : {}),
|
|
497
562
|
},
|
|
498
563
|
},
|
|
499
564
|
}
|
|
@@ -90,7 +90,7 @@ const listPeopleTool = defineApiBackedAiTool<ListPeopleInput, ListPeopleApiRespo
|
|
|
90
90
|
name: 'customers.list_people',
|
|
91
91
|
displayName: 'List people',
|
|
92
92
|
description:
|
|
93
|
-
'Search / list people (CRM persons) for the caller tenant + organization. Returns { items, total, limit, offset }.',
|
|
93
|
+
'Search / list people (CRM persons) for the caller tenant + organization. Returns { items, total, totalIsCapped, limit, offset }. When totalIsCapped is true, total is a floor ("at least N", render it as "N+"), and pagination is exhausted only when a page returns fewer than limit items — never when offset reaches total.',
|
|
94
94
|
inputSchema: listPeopleInput,
|
|
95
95
|
requiredFeatures: ['customers.people.view'],
|
|
96
96
|
toOperation: async (input, ctx) => {
|
|
@@ -144,6 +144,9 @@ const listPeopleTool = defineApiBackedAiTool<ListPeopleInput, ListPeopleApiRespo
|
|
|
144
144
|
return {
|
|
145
145
|
items: rawItems.map((row) => toCustomerListSummary(row)),
|
|
146
146
|
total: typeof data.total === 'number' ? data.total : 0,
|
|
147
|
+
// A capped count reports a floor: phrase the total as "at least N" and
|
|
148
|
+
// never treat it as proof that pagination is exhausted.
|
|
149
|
+
totalIsCapped: (data as { totalIsCapped?: boolean }).totalIsCapped === true,
|
|
147
150
|
limit,
|
|
148
151
|
offset,
|
|
149
152
|
}
|
|
@@ -284,7 +284,22 @@ async function listCanonicalActivities(
|
|
|
284
284
|
organizationIds: string[] | null,
|
|
285
285
|
query: z.infer<typeof listSchema>,
|
|
286
286
|
options?: { includeDeleted?: boolean; source?: string | string[] | null; paginate?: boolean },
|
|
287
|
+
isUnrestricted?: boolean,
|
|
287
288
|
): Promise<CanonicalActivityListResult> {
|
|
289
|
+
if (organizationIds && organizationIds.length === 0 && !isUnrestricted) {
|
|
290
|
+
return {
|
|
291
|
+
items: [],
|
|
292
|
+
total: 0,
|
|
293
|
+
bridgeIds: new Set(),
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (organizationIds === null && !isUnrestricted) {
|
|
297
|
+
return {
|
|
298
|
+
items: [],
|
|
299
|
+
total: 0,
|
|
300
|
+
bridgeIds: new Set(),
|
|
301
|
+
}
|
|
302
|
+
}
|
|
288
303
|
const where: Record<string, unknown> = {
|
|
289
304
|
tenantId,
|
|
290
305
|
interactionType: { $ne: 'task' },
|
|
@@ -361,7 +376,14 @@ async function listLegacyActivities(
|
|
|
361
376
|
query: z.infer<typeof listSchema>,
|
|
362
377
|
options?: { paginate?: boolean },
|
|
363
378
|
selectedOrganizationId?: string | null,
|
|
379
|
+
isUnrestricted?: boolean,
|
|
364
380
|
): Promise<{ items: ActivityItem[]; total: number }> {
|
|
381
|
+
if (organizationIds && organizationIds.length === 0 && !isUnrestricted) {
|
|
382
|
+
return { items: [], total: 0 }
|
|
383
|
+
}
|
|
384
|
+
if (organizationIds === null && !isUnrestricted) {
|
|
385
|
+
return { items: [], total: 0 }
|
|
386
|
+
}
|
|
365
387
|
const where: Record<string, unknown> = { tenantId }
|
|
366
388
|
if (organizationIds && organizationIds.length > 0) {
|
|
367
389
|
where.organizationId = { $in: organizationIds }
|
|
@@ -410,12 +432,31 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
410
432
|
organizationIds,
|
|
411
433
|
container,
|
|
412
434
|
selectedOrganizationId,
|
|
435
|
+
scope,
|
|
413
436
|
} = await resolveCustomersRequestContext(request)
|
|
414
437
|
const flags = await resolveCustomerInteractionFeatureFlags(container, auth.tenantId)
|
|
415
438
|
if (!flags.legacyAdapters) {
|
|
416
439
|
return await legacyAdaptersDisabledResponse()
|
|
417
440
|
}
|
|
418
441
|
|
|
442
|
+
const isUnrestricted = auth.isSuperAdmin === true || scope?.allowedIds === null
|
|
443
|
+
if (!isUnrestricted && (!organizationIds || organizationIds.length === 0)) {
|
|
444
|
+
logger.warn('activities.list collapsed organization scope — returning empty page', {
|
|
445
|
+
tenantId: auth.tenantId,
|
|
446
|
+
organizationIds,
|
|
447
|
+
scope,
|
|
448
|
+
})
|
|
449
|
+
return withAdapterHeaders(
|
|
450
|
+
NextResponse.json({
|
|
451
|
+
items: [],
|
|
452
|
+
total: 0,
|
|
453
|
+
page: query.page,
|
|
454
|
+
pageSize: query.pageSize,
|
|
455
|
+
totalPages: 1,
|
|
456
|
+
}),
|
|
457
|
+
)
|
|
458
|
+
}
|
|
459
|
+
|
|
419
460
|
const sortDir = query.sortDir ?? 'desc'
|
|
420
461
|
|
|
421
462
|
const result = flags.unified
|
|
@@ -427,6 +468,8 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
427
468
|
auth.tenantId,
|
|
428
469
|
organizationIds,
|
|
429
470
|
query,
|
|
471
|
+
undefined,
|
|
472
|
+
isUnrestricted,
|
|
430
473
|
)
|
|
431
474
|
: await (async () => {
|
|
432
475
|
const windowSize = Math.min(
|
|
@@ -442,6 +485,7 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
442
485
|
windowedQuery,
|
|
443
486
|
{ paginate: true },
|
|
444
487
|
selectedOrganizationId,
|
|
488
|
+
isUnrestricted,
|
|
445
489
|
),
|
|
446
490
|
listCanonicalActivities(
|
|
447
491
|
em,
|
|
@@ -456,6 +500,7 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
456
500
|
paginate: true,
|
|
457
501
|
source: CUSTOMER_INTERACTION_ACTIVITY_ADAPTER_SOURCE,
|
|
458
502
|
},
|
|
503
|
+
isUnrestricted,
|
|
459
504
|
),
|
|
460
505
|
])
|
|
461
506
|
const merged = sortActivityItems(
|
|
@@ -7,17 +7,10 @@ import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
|
|
|
7
7
|
import { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'
|
|
8
8
|
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
9
9
|
import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
10
|
-
import { findOneWithDecryption
|
|
10
|
+
import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
11
11
|
import { isOrganizationReadAccessAllowed } from '@open-mercato/core/modules/directory/utils/organizationScopeGuard'
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
CustomerPersonCompanyLink,
|
|
15
|
-
CustomerPersonProfile,
|
|
16
|
-
} from '../../../../data/entities'
|
|
17
|
-
import {
|
|
18
|
-
filterActivePersonCompanyLinks,
|
|
19
|
-
withActiveCustomerPersonCompanyLinkFilter,
|
|
20
|
-
} from '../../../../lib/personCompanyLinkTable'
|
|
12
|
+
import { CustomerEntity } from '../../../../data/entities'
|
|
13
|
+
import { loadCompanyPeopleUnion } from '../../../../lib/personCompanies'
|
|
21
14
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
22
15
|
|
|
23
16
|
const logger = createLogger('customers')
|
|
@@ -119,73 +112,31 @@ export async function GET(req: Request, ctx: { params?: { id?: string } }) {
|
|
|
119
112
|
throw notFound(translate('customers.errors.company_not_found', 'Company not found'))
|
|
120
113
|
}
|
|
121
114
|
|
|
115
|
+
// Existence oracle (#5504): deny a cross-org read as not-found — identical to
|
|
116
|
+
// the parent-not-found above — so it cannot reveal that a company exists in an
|
|
117
|
+
// organization the caller cannot see.
|
|
122
118
|
if (!isOrganizationReadAccessAllowed({ scope, auth, organizationId: company.organizationId })) {
|
|
123
|
-
throw
|
|
119
|
+
throw notFound(translate('customers.errors.company_not_found', 'Company not found'))
|
|
124
120
|
}
|
|
125
121
|
|
|
126
122
|
const entityScope = { tenantId: auth.tenantId, organizationId: company.organizationId }
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
const personIds = links
|
|
147
|
-
.map((link) => link.person?.id)
|
|
148
|
-
.filter((personId): personId is string => typeof personId === 'string' && personId.length > 0)
|
|
149
|
-
|
|
150
|
-
const profiles = personIds.length > 0
|
|
151
|
-
? await findWithDecryption(
|
|
152
|
-
em,
|
|
153
|
-
CustomerPersonProfile,
|
|
154
|
-
{
|
|
155
|
-
entity: { $in: personIds },
|
|
156
|
-
tenantId: company.tenantId,
|
|
157
|
-
organizationId: company.organizationId,
|
|
158
|
-
},
|
|
159
|
-
{},
|
|
160
|
-
entityScope,
|
|
161
|
-
)
|
|
162
|
-
: []
|
|
163
|
-
const profileByPersonId = new Map(
|
|
164
|
-
profiles.map((profile) => [(profile.entity as { id: string }).id, profile]),
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
const items = links
|
|
168
|
-
.map((link) => {
|
|
169
|
-
const person = link.person
|
|
170
|
-
if (!person?.id) return null
|
|
171
|
-
const profile = profileByPersonId.get(person.id) ?? null
|
|
172
|
-
return {
|
|
173
|
-
id: person.id,
|
|
174
|
-
displayName: person.displayName ?? person.primaryEmail ?? person.id,
|
|
175
|
-
primaryEmail: person.primaryEmail ?? null,
|
|
176
|
-
primaryPhone: person.primaryPhone ?? null,
|
|
177
|
-
status: person.status ?? null,
|
|
178
|
-
lifecycleStage: person.lifecycleStage ?? null,
|
|
179
|
-
jobTitle: profile?.jobTitle ?? null,
|
|
180
|
-
department: profile?.department ?? null,
|
|
181
|
-
createdAt: person.createdAt.toISOString(),
|
|
182
|
-
organizationId: person.organizationId,
|
|
183
|
-
temperature: person.temperature ?? null,
|
|
184
|
-
source: person.source ?? null,
|
|
185
|
-
linkedAt: link.createdAt ? link.createdAt.toISOString() : null,
|
|
186
|
-
} satisfies CompanyPersonItem
|
|
187
|
-
})
|
|
188
|
-
.filter((item): item is CompanyPersonItem => item !== null)
|
|
123
|
+
const union = await loadCompanyPeopleUnion(em, company, entityScope)
|
|
124
|
+
|
|
125
|
+
const items = union.map(({ entity: person, profile, linkedAt }) => ({
|
|
126
|
+
id: person.id,
|
|
127
|
+
displayName: person.displayName ?? person.primaryEmail ?? person.id,
|
|
128
|
+
primaryEmail: person.primaryEmail ?? null,
|
|
129
|
+
primaryPhone: person.primaryPhone ?? null,
|
|
130
|
+
status: person.status ?? null,
|
|
131
|
+
lifecycleStage: person.lifecycleStage ?? null,
|
|
132
|
+
jobTitle: profile?.jobTitle ?? null,
|
|
133
|
+
department: profile?.department ?? null,
|
|
134
|
+
createdAt: person.createdAt.toISOString(),
|
|
135
|
+
organizationId: person.organizationId,
|
|
136
|
+
temperature: person.temperature ?? null,
|
|
137
|
+
source: person.source ?? null,
|
|
138
|
+
linkedAt,
|
|
139
|
+
} satisfies CompanyPersonItem))
|
|
189
140
|
|
|
190
141
|
const filtered = query.search?.trim().length ? items.filter((item) => matchesSearch(item, query.search ?? '')) : items
|
|
191
142
|
const sorted = sortItems(filtered, query.sort)
|
|
@@ -17,8 +17,6 @@ import {
|
|
|
17
17
|
CustomerDealCompanyLink,
|
|
18
18
|
CustomerDeal,
|
|
19
19
|
CustomerTodoLink,
|
|
20
|
-
CustomerPersonCompanyLink,
|
|
21
|
-
CustomerPersonProfile,
|
|
22
20
|
CustomerInteraction,
|
|
23
21
|
} from '../../../data/entities'
|
|
24
22
|
import { User } from '@open-mercato/core/modules/auth/data/entities'
|
|
@@ -47,11 +45,12 @@ import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
|
47
45
|
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
48
46
|
import { parseBooleanFromUnknown } from '@open-mercato/shared/lib/boolean'
|
|
49
47
|
import {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
countCompanyPeopleUnion,
|
|
49
|
+
loadCompanyPeopleUnion,
|
|
50
|
+
type CompanyPersonUnionEntry,
|
|
51
|
+
} from '../../../lib/personCompanies'
|
|
53
52
|
import { normalizeCustomerDetailCustomFields } from '../../detailCustomFields'
|
|
54
|
-
import {
|
|
53
|
+
import { denyCustomerDetailReadAsNotFound } from '../../../lib/detailReadAccess'
|
|
55
54
|
import { runWithCacheTenant } from '@open-mercato/cache'
|
|
56
55
|
import {
|
|
57
56
|
buildCollectionTags,
|
|
@@ -146,10 +145,6 @@ function parseIncludeParams(request: Request): Set<string> {
|
|
|
146
145
|
return tokens
|
|
147
146
|
}
|
|
148
147
|
|
|
149
|
-
function forbidden(message: string) {
|
|
150
|
-
return NextResponse.json({ error: message }, { status: 403 })
|
|
151
|
-
}
|
|
152
|
-
|
|
153
148
|
function notFound(message: string) {
|
|
154
149
|
return NextResponse.json({ error: message }, { status: 404 })
|
|
155
150
|
}
|
|
@@ -463,9 +458,16 @@ export async function GET(_req: Request, ctx: { params?: { id?: string } }) {
|
|
|
463
458
|
)
|
|
464
459
|
if (!company) return notFound('Company not found')
|
|
465
460
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
461
|
+
// Existence oracle (issue #5504): a caller who holds customers.companies.view
|
|
462
|
+
// but whose scope excludes the record's organization must get the SAME
|
|
463
|
+
// response as for a non-existent id, so 403-when-present / 404-when-absent
|
|
464
|
+
// collapses to a uniform 404 not-found. The dispatcher already returns a
|
|
465
|
+
// uniform 403 for callers who lack the feature entirely.
|
|
466
|
+
const organizationReadDenied = denyCustomerDetailReadAsNotFound(
|
|
467
|
+
{ scope, auth, organizationId: company.organizationId },
|
|
468
|
+
'Company not found',
|
|
469
|
+
)
|
|
470
|
+
if (organizationReadDenied) return organizationReadDenied
|
|
469
471
|
|
|
470
472
|
const companyScope = {
|
|
471
473
|
tenantId: company.tenantId ?? auth.tenantId ?? null,
|
|
@@ -801,79 +803,13 @@ export async function GET(_req: Request, ctx: { params?: { id?: string } }) {
|
|
|
801
803
|
deal.organizationId === company.organizationId,
|
|
802
804
|
)
|
|
803
805
|
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
806
|
+
const peopleUnionScope = {
|
|
807
|
+
tenantId: company.tenantId ?? auth.tenantId ?? null,
|
|
808
|
+
organizationId: company.organizationId ?? scope?.selectedId ?? auth.orgId ?? null,
|
|
809
|
+
}
|
|
810
|
+
let relatedPeople: CompanyPersonUnionEntry[] = []
|
|
809
811
|
if (includePeople) {
|
|
810
|
-
|
|
811
|
-
tenantId: company.tenantId ?? auth.tenantId ?? null,
|
|
812
|
-
organizationId: company.organizationId ?? scope?.selectedId ?? auth.orgId ?? null,
|
|
813
|
-
}
|
|
814
|
-
const relatedPeopleById = new Map<
|
|
815
|
-
string,
|
|
816
|
-
{ entity: CustomerEntity; profile: CustomerPersonProfile | null; linkedAt: string | null }
|
|
817
|
-
>()
|
|
818
|
-
const companyLinkWhere = await withActiveCustomerPersonCompanyLinkFilter(
|
|
819
|
-
em,
|
|
820
|
-
{
|
|
821
|
-
company: company.id,
|
|
822
|
-
organizationId: company.organizationId,
|
|
823
|
-
tenantId: company.tenantId,
|
|
824
|
-
},
|
|
825
|
-
'customers.companies.GET',
|
|
826
|
-
)
|
|
827
|
-
const companyLinks = filterActivePersonCompanyLinks(
|
|
828
|
-
await findWithDecryption(
|
|
829
|
-
em,
|
|
830
|
-
CustomerPersonCompanyLink,
|
|
831
|
-
companyLinkWhere,
|
|
832
|
-
{
|
|
833
|
-
populate: ['person', 'person.personProfile'],
|
|
834
|
-
orderBy: { isPrimary: 'desc', createdAt: 'asc' },
|
|
835
|
-
},
|
|
836
|
-
peopleDecryptionScope,
|
|
837
|
-
),
|
|
838
|
-
)
|
|
839
|
-
companyLinks.forEach((link) => {
|
|
840
|
-
const entity = typeof link.person === 'string' ? null : link.person
|
|
841
|
-
if (!entity || entity.kind !== 'person' || entity.deletedAt) return
|
|
842
|
-
const personProfile =
|
|
843
|
-
entity.personProfile && typeof entity.personProfile !== 'string'
|
|
844
|
-
? entity.personProfile
|
|
845
|
-
: null
|
|
846
|
-
relatedPeopleById.set(entity.id, {
|
|
847
|
-
entity,
|
|
848
|
-
profile: personProfile,
|
|
849
|
-
linkedAt: link.createdAt instanceof Date ? link.createdAt.toISOString() : null,
|
|
850
|
-
})
|
|
851
|
-
})
|
|
852
|
-
|
|
853
|
-
const profiles = await findWithDecryption(
|
|
854
|
-
em,
|
|
855
|
-
CustomerPersonProfile,
|
|
856
|
-
{
|
|
857
|
-
company: company.id,
|
|
858
|
-
tenantId: company.tenantId,
|
|
859
|
-
organizationId: company.organizationId,
|
|
860
|
-
entity: { deletedAt: null },
|
|
861
|
-
},
|
|
862
|
-
{ populate: ['entity'] },
|
|
863
|
-
peopleDecryptionScope,
|
|
864
|
-
)
|
|
865
|
-
profiles.forEach((entry) => {
|
|
866
|
-
const entity = entry.entity as CustomerEntity | null
|
|
867
|
-
if (!entity || entity.kind !== 'person' || entity.deletedAt) return
|
|
868
|
-
if (!relatedPeopleById.has(entity.id)) {
|
|
869
|
-
relatedPeopleById.set(entity.id, {
|
|
870
|
-
entity,
|
|
871
|
-
profile: entry ?? null,
|
|
872
|
-
linkedAt: entry.createdAt instanceof Date ? entry.createdAt.toISOString() : null,
|
|
873
|
-
})
|
|
874
|
-
}
|
|
875
|
-
})
|
|
876
|
-
relatedPeople = Array.from(relatedPeopleById.values())
|
|
812
|
+
relatedPeople = await loadCompanyPeopleUnion(em, company, peopleUnionScope)
|
|
877
813
|
}
|
|
878
814
|
|
|
879
815
|
// Entity custom fields, profile custom fields, and the routing lookup do not
|
|
@@ -919,26 +855,7 @@ export async function GET(_req: Request, ctx: { params?: { id?: string } }) {
|
|
|
919
855
|
// instead of a waterfall (issue #3203).
|
|
920
856
|
const peopleCountQuery = includePeople
|
|
921
857
|
? Promise.resolve(relatedPeople.length)
|
|
922
|
-
: (
|
|
923
|
-
const peopleLinkWhere = await withActiveCustomerPersonCompanyLinkFilter(
|
|
924
|
-
em,
|
|
925
|
-
{
|
|
926
|
-
company: company.id,
|
|
927
|
-
organizationId: company.organizationId,
|
|
928
|
-
tenantId: company.tenantId,
|
|
929
|
-
},
|
|
930
|
-
'customers.companies.GET',
|
|
931
|
-
)
|
|
932
|
-
return filterActivePersonCompanyLinks(
|
|
933
|
-
await findWithDecryption(
|
|
934
|
-
em,
|
|
935
|
-
CustomerPersonCompanyLink,
|
|
936
|
-
peopleLinkWhere,
|
|
937
|
-
{},
|
|
938
|
-
{ tenantId: company.tenantId, organizationId: company.organizationId },
|
|
939
|
-
),
|
|
940
|
-
).length
|
|
941
|
-
})()
|
|
858
|
+
: countCompanyPeopleUnion(em, company)
|
|
942
859
|
const [
|
|
943
860
|
activityCount,
|
|
944
861
|
interactionCount,
|
|
@@ -1486,8 +1403,8 @@ export const openApi: OpenApiRouteDoc = {
|
|
|
1486
1403
|
errors: [
|
|
1487
1404
|
{ status: 400, description: 'Invalid identifier', schema: companyDetailErrorSchema },
|
|
1488
1405
|
{ status: 401, description: 'Unauthorized', schema: companyDetailErrorSchema },
|
|
1489
|
-
{ status: 403, description: 'Forbidden
|
|
1490
|
-
{ status: 404, description: 'Company not found', schema: companyDetailErrorSchema },
|
|
1406
|
+
{ status: 403, description: 'Forbidden — caller lacks the required feature', schema: companyDetailErrorSchema },
|
|
1407
|
+
{ status: 404, description: 'Company not found, or its organization is not in the caller’s scope', schema: companyDetailErrorSchema },
|
|
1491
1408
|
],
|
|
1492
1409
|
},
|
|
1493
1410
|
},
|