@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
|
@@ -23,7 +23,7 @@ import type { SectionAction } from '@open-mercato/core/modules/customers/compone
|
|
|
23
23
|
import type { SalesAdjustmentKind } from '../../data/entities'
|
|
24
24
|
import { PriceWithCurrency } from '../PriceWithCurrency'
|
|
25
25
|
import { AdjustmentDialog, type AdjustmentRowData, type AdjustmentSubmitPayload } from './AdjustmentDialog'
|
|
26
|
-
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
26
|
+
import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
|
|
27
27
|
import { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
28
28
|
import { extractCustomFieldValues } from './customFieldHelpers'
|
|
29
29
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
@@ -60,9 +60,9 @@ function normalizeNumber(value: unknown, fallback = 0): number {
|
|
|
60
60
|
return fallback
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
function formatPercent(value: number | null | undefined): string {
|
|
63
|
+
export function formatPercent(value: number | null | undefined, locale?: string): string {
|
|
64
64
|
if (value === null || value === undefined) return '—'
|
|
65
|
-
const formatter = new Intl.NumberFormat(
|
|
65
|
+
const formatter = new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 2 })
|
|
66
66
|
return formatter.format(value / 100)
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -77,6 +77,7 @@ export function SalesDocumentAdjustmentsSection({
|
|
|
77
77
|
onRowsChange,
|
|
78
78
|
}: SalesDocumentAdjustmentsSectionProps) {
|
|
79
79
|
const t = useT()
|
|
80
|
+
const locale = useLocale()
|
|
80
81
|
const { organizationId, tenantId } = useOrganizationScopeDetail()
|
|
81
82
|
const resolvedOrganizationId = orgFromProps ?? organizationId ?? null
|
|
82
83
|
const resolvedTenantId = tenantFromProps ?? tenantId ?? null
|
|
@@ -433,7 +434,7 @@ export function SalesDocumentAdjustmentsSection({
|
|
|
433
434
|
{
|
|
434
435
|
id: 'rate',
|
|
435
436
|
header: t('sales.documents.adjustments.rate', 'Rate'),
|
|
436
|
-
cell: ({ row }) => <span className="font-mono text-sm text-muted-foreground">{formatPercent(row.original.rate)}</span>,
|
|
437
|
+
cell: ({ row }) => <span className="font-mono text-sm text-muted-foreground">{formatPercent(row.original.rate, locale)}</span>,
|
|
437
438
|
},
|
|
438
439
|
{
|
|
439
440
|
id: 'position',
|
|
@@ -441,7 +442,7 @@ export function SalesDocumentAdjustmentsSection({
|
|
|
441
442
|
cell: ({ row }) => <span className="text-sm text-muted-foreground">{row.original.position}</span>,
|
|
442
443
|
},
|
|
443
444
|
],
|
|
444
|
-
[currencyCode, resolveKindLabel, t]
|
|
445
|
+
[currencyCode, locale, resolveKindLabel, t]
|
|
445
446
|
)
|
|
446
447
|
|
|
447
448
|
const showLoadingState = loading && rows.length === 0
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
createDictionaryMap,
|
|
17
17
|
normalizeDictionaryEntries,
|
|
18
18
|
} from "@open-mercato/core/modules/dictionaries/components/dictionaryAppearance";
|
|
19
|
-
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
19
|
+
import { useT, useLocale } from "@open-mercato/shared/lib/i18n/context";
|
|
20
20
|
import { useOrganizationScopeDetail } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
|
|
21
21
|
import { useConfirmDialog } from "@open-mercato/ui/backend/confirm-dialog";
|
|
22
22
|
import { emitSalesDocumentTotalsRefresh } from "@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents";
|
|
@@ -131,6 +131,11 @@ function resolveInjectedColumnValue(
|
|
|
131
131
|
return current;
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
const SHIPMENTS_PAGE_SIZE = 100;
|
|
135
|
+
// A single order beyond this many shipment pages is pathological; stopping there
|
|
136
|
+
// keeps the shipped state explicitly unresolved rather than silently partial.
|
|
137
|
+
const SHIPMENTS_MAX_PAGES = 50;
|
|
138
|
+
|
|
134
139
|
type SalesDocumentItemsSectionProps = {
|
|
135
140
|
documentId: string;
|
|
136
141
|
kind: "order" | "quote";
|
|
@@ -153,6 +158,7 @@ export function SalesDocumentItemsSection({
|
|
|
153
158
|
onItemsChange,
|
|
154
159
|
}: SalesDocumentItemsSectionProps) {
|
|
155
160
|
const t = useT();
|
|
161
|
+
const locale = useLocale();
|
|
156
162
|
const { organizationId, tenantId } = useOrganizationScopeDetail();
|
|
157
163
|
const { confirm, ConfirmDialogElement } = useConfirmDialog();
|
|
158
164
|
const resolvedOrganizationId = orgFromProps ?? organizationId ?? null;
|
|
@@ -168,6 +174,12 @@ export function SalesDocumentItemsSection({
|
|
|
168
174
|
const [shippedTotals, setShippedTotals] = React.useState<Map<string, number>>(
|
|
169
175
|
new Map(),
|
|
170
176
|
);
|
|
177
|
+
// Quotes have no shipments at all, so their shipped state is known up front.
|
|
178
|
+
// For orders it stays unknown until every shipment page has been read — an
|
|
179
|
+
// empty map from a pending or failed load must never read as "nothing shipped".
|
|
180
|
+
const [shippedTotalsResolved, setShippedTotalsResolved] = React.useState(
|
|
181
|
+
kind !== "order",
|
|
182
|
+
);
|
|
171
183
|
|
|
172
184
|
const { widgets: allColumnWidgets } = useInjectionDataWidgets(
|
|
173
185
|
extensionPoints.hosts.orderItemColumns.spotId,
|
|
@@ -379,22 +391,31 @@ export function SalesDocumentItemsSection({
|
|
|
379
391
|
const loadShippedTotals = React.useCallback(async () => {
|
|
380
392
|
if (kind !== "order") {
|
|
381
393
|
setShippedTotals(new Map());
|
|
394
|
+
setShippedTotalsResolved(true);
|
|
382
395
|
return;
|
|
383
396
|
}
|
|
397
|
+
setShippedTotals(new Map());
|
|
398
|
+
setShippedTotalsResolved(false);
|
|
384
399
|
try {
|
|
385
|
-
const
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
400
|
+
const totals = new Map<string, number>();
|
|
401
|
+
let page = 1;
|
|
402
|
+
let collected = 0;
|
|
403
|
+
let complete = false;
|
|
404
|
+
while (page <= SHIPMENTS_MAX_PAGES) {
|
|
405
|
+
const params = new URLSearchParams({
|
|
406
|
+
page: String(page),
|
|
407
|
+
pageSize: String(SHIPMENTS_PAGE_SIZE),
|
|
408
|
+
orderId: documentId,
|
|
409
|
+
});
|
|
410
|
+
const response = await apiCall<{
|
|
411
|
+
items?: Array<Record<string, unknown>>;
|
|
412
|
+
total?: unknown;
|
|
413
|
+
}>(`/api/sales/shipments?${params.toString()}`, undefined, {
|
|
414
|
+
fallback: { items: [] },
|
|
415
|
+
});
|
|
416
|
+
if (!response.ok || !Array.isArray(response.result?.items)) return;
|
|
417
|
+
const shipments = response.result.items;
|
|
418
|
+
shipments.forEach((shipment) => {
|
|
398
419
|
const entries = Array.isArray(shipment.items)
|
|
399
420
|
? (shipment.items as Array<Record<string, unknown>>)
|
|
400
421
|
: [];
|
|
@@ -412,13 +433,22 @@ export function SalesDocumentItemsSection({
|
|
|
412
433
|
totals.set(lineId, current + quantity);
|
|
413
434
|
});
|
|
414
435
|
});
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
436
|
+
collected += shipments.length;
|
|
437
|
+
const reportedTotal = normalizeNumber(response.result?.total, Number.NaN);
|
|
438
|
+
const hasMore =
|
|
439
|
+
shipments.length >= SHIPMENTS_PAGE_SIZE &&
|
|
440
|
+
(!Number.isFinite(reportedTotal) || collected < reportedTotal);
|
|
441
|
+
if (!hasMore) {
|
|
442
|
+
complete = true;
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
page += 1;
|
|
418
446
|
}
|
|
447
|
+
if (!complete) return;
|
|
448
|
+
setShippedTotals(totals);
|
|
449
|
+
setShippedTotalsResolved(true);
|
|
419
450
|
} catch (err) {
|
|
420
451
|
logger.error('sales.document.shipments.load', { err });
|
|
421
|
-
setShippedTotals(new Map());
|
|
422
452
|
}
|
|
423
453
|
}, [documentId, kind]);
|
|
424
454
|
|
|
@@ -439,6 +469,7 @@ export function SalesDocumentItemsSection({
|
|
|
439
469
|
if (kind !== "order") {
|
|
440
470
|
shipmentsLoadedForDocument.current = null;
|
|
441
471
|
setShippedTotals(new Map());
|
|
472
|
+
setShippedTotalsResolved(true);
|
|
442
473
|
return;
|
|
443
474
|
}
|
|
444
475
|
const key = `${kind}:${documentId}`;
|
|
@@ -797,6 +828,7 @@ export function SalesDocumentItemsSection({
|
|
|
797
828
|
{formatMoney(
|
|
798
829
|
item.unitPriceGross,
|
|
799
830
|
item.currencyCode ?? currencyCode ?? undefined,
|
|
831
|
+
locale,
|
|
800
832
|
)}{" "}
|
|
801
833
|
<span className="text-xs text-muted-foreground">
|
|
802
834
|
{t("sales.documents.items.table.gross", "gross")}
|
|
@@ -806,6 +838,7 @@ export function SalesDocumentItemsSection({
|
|
|
806
838
|
{formatMoney(
|
|
807
839
|
item.unitPriceNet,
|
|
808
840
|
item.currencyCode ?? currencyCode ?? undefined,
|
|
841
|
+
locale,
|
|
809
842
|
)}{" "}
|
|
810
843
|
{t("sales.documents.items.table.net", "net")}
|
|
811
844
|
</span>
|
|
@@ -820,6 +853,7 @@ export function SalesDocumentItemsSection({
|
|
|
820
853
|
item.currencyCode ??
|
|
821
854
|
currencyCode ??
|
|
822
855
|
undefined,
|
|
856
|
+
locale,
|
|
823
857
|
),
|
|
824
858
|
unit: unitPriceReference.referenceUnitCode,
|
|
825
859
|
},
|
|
@@ -843,6 +877,7 @@ export function SalesDocumentItemsSection({
|
|
|
843
877
|
item.currencyCode ??
|
|
844
878
|
currencyCode ??
|
|
845
879
|
undefined,
|
|
880
|
+
locale,
|
|
846
881
|
),
|
|
847
882
|
},
|
|
848
883
|
)}
|
|
@@ -873,6 +908,7 @@ export function SalesDocumentItemsSection({
|
|
|
873
908
|
{formatMoney(
|
|
874
909
|
item.totalGross,
|
|
875
910
|
item.currencyCode ?? currencyCode ?? undefined,
|
|
911
|
+
locale,
|
|
876
912
|
)}{" "}
|
|
877
913
|
<span className="text-xs font-normal text-muted-foreground">
|
|
878
914
|
{t("sales.documents.items.table.gross", "gross")}
|
|
@@ -882,6 +918,7 @@ export function SalesDocumentItemsSection({
|
|
|
882
918
|
{formatMoney(
|
|
883
919
|
item.totalNet,
|
|
884
920
|
item.currencyCode ?? currencyCode ?? undefined,
|
|
921
|
+
locale,
|
|
885
922
|
)}{" "}
|
|
886
923
|
{t("sales.documents.items.table.net", "net")}
|
|
887
924
|
</span>
|
|
@@ -964,6 +1001,7 @@ export function SalesDocumentItemsSection({
|
|
|
964
1001
|
? Math.max(0, shippedTotals.get(lineForEdit.id) ?? 0)
|
|
965
1002
|
: 0
|
|
966
1003
|
}
|
|
1004
|
+
shippedQuantityResolved={shippedTotalsResolved}
|
|
967
1005
|
onSaved={async () => {
|
|
968
1006
|
await loadItems();
|
|
969
1007
|
emitSalesDocumentTotalsRefresh({ documentId, kind });
|
|
@@ -46,10 +46,11 @@ import {
|
|
|
46
46
|
renderDictionaryColor,
|
|
47
47
|
} from "@open-mercato/core/modules/dictionaries/components/dictionaryAppearance";
|
|
48
48
|
import { E } from "#generated/entities.ids.generated";
|
|
49
|
-
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
49
|
+
import { useT, useLocale } from "@open-mercato/shared/lib/i18n/context";
|
|
50
50
|
import { useOrganizationScopeDetail } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
|
|
51
51
|
import { formatMoney, normalizeNumber } from "./lineItemUtils";
|
|
52
52
|
import type { SalesLineRecord } from "./lineItemTypes";
|
|
53
|
+
import { prepareShippedLineUpdatePayload } from "./lineItemShipmentLock";
|
|
53
54
|
import {
|
|
54
55
|
normalizeCustomFieldSubmitValue,
|
|
55
56
|
extractCustomFieldValues,
|
|
@@ -279,6 +280,13 @@ type SalesLineDialogProps = {
|
|
|
279
280
|
tenantId: string | null;
|
|
280
281
|
initialLine?: SalesLineRecord | null;
|
|
281
282
|
shippedQuantity?: number;
|
|
283
|
+
/**
|
|
284
|
+
* Whether `shippedQuantity` reflects a fully resolved shipment state. Defaults
|
|
285
|
+
* to `true` so callers that genuinely know the value keep working; pass `false`
|
|
286
|
+
* while the host is still loading shipments or after the load failed, and the
|
|
287
|
+
* dialog locks pricing instead of assuming the line is unshipped.
|
|
288
|
+
*/
|
|
289
|
+
shippedQuantityResolved?: boolean;
|
|
282
290
|
onOpenChange: (open: boolean) => void;
|
|
283
291
|
onSaved?: () => Promise<void> | void;
|
|
284
292
|
onDraftSaved?: (payload: Record<string, unknown>, lineId: string | null) => Promise<void> | void;
|
|
@@ -475,11 +483,13 @@ export function LineItemDialog({
|
|
|
475
483
|
tenantId,
|
|
476
484
|
initialLine,
|
|
477
485
|
shippedQuantity = 0,
|
|
486
|
+
shippedQuantityResolved = true,
|
|
478
487
|
onOpenChange,
|
|
479
488
|
onSaved,
|
|
480
489
|
onDraftSaved,
|
|
481
490
|
}: SalesLineDialogProps) {
|
|
482
491
|
const t = useT();
|
|
492
|
+
const locale = useLocale();
|
|
483
493
|
const scope = useOrganizationScopeDetail();
|
|
484
494
|
const resolvedOrganizationId = organizationId ?? scope.organizationId ?? null;
|
|
485
495
|
const resolvedTenantId = tenantId ?? scope.tenantId ?? null;
|
|
@@ -513,6 +523,23 @@ export function LineItemDialog({
|
|
|
513
523
|
() => (kind === "order" ? "sales/order-lines" : "sales/quote-lines"),
|
|
514
524
|
[kind],
|
|
515
525
|
);
|
|
526
|
+
// A line the caller has not resolved shipment state for is treated as shipped:
|
|
527
|
+
// the server rejects pricing changes on shipped lines, so guessing "unshipped"
|
|
528
|
+
// from a pending or failed shipments load hands the user an edit that cannot
|
|
529
|
+
// be saved. A brand-new line has no shipments by construction.
|
|
530
|
+
const hasExistingLine = Boolean(initialLine);
|
|
531
|
+
const shipmentStateUnknown = kind === "order" && hasExistingLine && !shippedQuantityResolved;
|
|
532
|
+
const isShippedOrderLine =
|
|
533
|
+
kind === "order" &&
|
|
534
|
+
hasExistingLine &&
|
|
535
|
+
(shipmentStateUnknown || shippedQuantity > 0);
|
|
536
|
+
// While the shipments read is unresolved the shipped quantity is unknown, so the
|
|
537
|
+
// only safe floor for a quantity edit is the quantity already stored on the line:
|
|
538
|
+
// whatever turns out to be shipped can never exceed it. Raising stays allowed,
|
|
539
|
+
// exactly as it is once the state resolves.
|
|
540
|
+
const storedQuantity = Number(initialLine?.quantity ?? 0);
|
|
541
|
+
const safeStoredQuantity = Number.isFinite(storedQuantity) ? storedQuantity : 0;
|
|
542
|
+
const quantityFloor = shipmentStateUnknown ? safeStoredQuantity : shippedQuantity;
|
|
516
543
|
const documentKey = kind === "order" ? "orderId" : "quoteId";
|
|
517
544
|
const customFieldEntityId =
|
|
518
545
|
kind === "order" ? E.sales.sales_order_line : E.sales.sales_quote_line;
|
|
@@ -1018,10 +1045,10 @@ export function LineItemDialog({
|
|
|
1018
1045
|
displayMode === "including-tax" &&
|
|
1019
1046
|
amountGross !== null &&
|
|
1020
1047
|
currency
|
|
1021
|
-
? formatMoney(amountGross, currency)
|
|
1048
|
+
? formatMoney(amountGross, currency, locale)
|
|
1022
1049
|
: null,
|
|
1023
1050
|
displayMode === "excluding-tax" && amountNet !== null && currency
|
|
1024
|
-
? formatMoney(amountNet, currency)
|
|
1051
|
+
? formatMoney(amountNet, currency, locale)
|
|
1025
1052
|
: null,
|
|
1026
1053
|
displayMode
|
|
1027
1054
|
? displayMode === "including-tax"
|
|
@@ -1037,9 +1064,9 @@ export function LineItemDialog({
|
|
|
1037
1064
|
labelParts.length > 0
|
|
1038
1065
|
? labelParts.join(" • ")
|
|
1039
1066
|
: amountGross !== null && currency
|
|
1040
|
-
? formatMoney(amountGross, currency)
|
|
1067
|
+
? formatMoney(amountGross, currency, locale)
|
|
1041
1068
|
: amountNet !== null && currency
|
|
1042
|
-
? formatMoney(amountNet, currency)
|
|
1069
|
+
? formatMoney(amountNet, currency, locale)
|
|
1043
1070
|
: id;
|
|
1044
1071
|
return {
|
|
1045
1072
|
id,
|
|
@@ -1330,12 +1357,17 @@ export function LineItemDialog({
|
|
|
1330
1357
|
},
|
|
1331
1358
|
);
|
|
1332
1359
|
}
|
|
1333
|
-
if (
|
|
1334
|
-
const message =
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1360
|
+
if (quantityFloor > 0 && qtyNumber < quantityFloor) {
|
|
1361
|
+
const message = shipmentStateUnknown
|
|
1362
|
+
? t(
|
|
1363
|
+
"sales.documents.items.errorQuantityShipmentsUnknown",
|
|
1364
|
+
"The quantity cannot be lowered until this order's shipments have been read. Reopen the order to try again.",
|
|
1365
|
+
)
|
|
1366
|
+
: t(
|
|
1367
|
+
"sales.documents.items.errorQuantityBelowShipped",
|
|
1368
|
+
"You cannot lower the quantity below the {{shipped}} already shipped.",
|
|
1369
|
+
{ shipped: shippedQuantity },
|
|
1370
|
+
);
|
|
1339
1371
|
throw createCrudFormError(message, { quantity: message });
|
|
1340
1372
|
}
|
|
1341
1373
|
const resolvedQuantityUnit = (() => {
|
|
@@ -1509,9 +1541,20 @@ export function LineItemDialog({
|
|
|
1509
1541
|
}
|
|
1510
1542
|
if (resolvedName) payload.name = resolvedName;
|
|
1511
1543
|
|
|
1544
|
+
const submittedPayload = prepareShippedLineUpdatePayload(
|
|
1545
|
+
payload,
|
|
1546
|
+
isShippedOrderLine && initialLine
|
|
1547
|
+
? {
|
|
1548
|
+
quantity: initialLine.quantity,
|
|
1549
|
+
totalNetAmount: initialLine.totalNet,
|
|
1550
|
+
totalGrossAmount: initialLine.totalGross,
|
|
1551
|
+
}
|
|
1552
|
+
: null,
|
|
1553
|
+
);
|
|
1554
|
+
|
|
1512
1555
|
try {
|
|
1513
1556
|
if (onDraftSaved) {
|
|
1514
|
-
await onDraftSaved(
|
|
1557
|
+
await onDraftSaved(submittedPayload, editingId);
|
|
1515
1558
|
closeDialog();
|
|
1516
1559
|
return;
|
|
1517
1560
|
}
|
|
@@ -1521,7 +1564,9 @@ export function LineItemDialog({
|
|
|
1521
1564
|
() =>
|
|
1522
1565
|
action(
|
|
1523
1566
|
resourcePath,
|
|
1524
|
-
editingId
|
|
1567
|
+
editingId
|
|
1568
|
+
? { id: editingId, ...submittedPayload }
|
|
1569
|
+
: submittedPayload,
|
|
1525
1570
|
{
|
|
1526
1571
|
errorMessage: t(
|
|
1527
1572
|
"sales.documents.items.errorSave",
|
|
@@ -1552,10 +1597,15 @@ export function LineItemDialog({
|
|
|
1552
1597
|
documentKey,
|
|
1553
1598
|
documentUpdatedAt,
|
|
1554
1599
|
editingId,
|
|
1600
|
+
initialLine,
|
|
1601
|
+
isShippedOrderLine,
|
|
1555
1602
|
onDraftSaved,
|
|
1556
1603
|
priceOptions,
|
|
1557
1604
|
productOption,
|
|
1605
|
+
quantityFloor,
|
|
1558
1606
|
resourcePath,
|
|
1607
|
+
shipmentStateUnknown,
|
|
1608
|
+
shippedQuantity,
|
|
1559
1609
|
t,
|
|
1560
1610
|
variantOption,
|
|
1561
1611
|
onSaved,
|
|
@@ -1613,6 +1663,7 @@ export function LineItemDialog({
|
|
|
1613
1663
|
type="button"
|
|
1614
1664
|
size="sm"
|
|
1615
1665
|
variant={mode === "catalog" ? "default" : "ghost"}
|
|
1666
|
+
disabled={isShippedOrderLine}
|
|
1616
1667
|
onClick={() => switchMode("catalog")}
|
|
1617
1668
|
>
|
|
1618
1669
|
{t("sales.documents.items.lineMode.catalog", "Catalog item")}
|
|
@@ -1621,6 +1672,7 @@ export function LineItemDialog({
|
|
|
1621
1672
|
type="button"
|
|
1622
1673
|
size="sm"
|
|
1623
1674
|
variant={mode === "custom" ? "default" : "ghost"}
|
|
1675
|
+
disabled={isShippedOrderLine}
|
|
1624
1676
|
onClick={() => switchMode("custom")}
|
|
1625
1677
|
>
|
|
1626
1678
|
{t("sales.documents.items.lineMode.custom", "Custom line")}
|
|
@@ -1801,6 +1853,7 @@ export function LineItemDialog({
|
|
|
1801
1853
|
},
|
|
1802
1854
|
)
|
|
1803
1855
|
}
|
|
1856
|
+
disabled={isShippedOrderLine}
|
|
1804
1857
|
/>
|
|
1805
1858
|
),
|
|
1806
1859
|
} satisfies CrudField,
|
|
@@ -1960,7 +2013,7 @@ export function LineItemDialog({
|
|
|
1960
2013
|
},
|
|
1961
2014
|
)
|
|
1962
2015
|
}
|
|
1963
|
-
disabled={!productId}
|
|
2016
|
+
disabled={isShippedOrderLine || !productId}
|
|
1964
2017
|
/>
|
|
1965
2018
|
);
|
|
1966
2019
|
},
|
|
@@ -1984,6 +2037,51 @@ export function LineItemDialog({
|
|
|
1984
2037
|
typeof values?.variantId === "string"
|
|
1985
2038
|
? values.variantId
|
|
1986
2039
|
: null;
|
|
2040
|
+
const selectedPriceId =
|
|
2041
|
+
typeof value === "string" ? value : null;
|
|
2042
|
+
const selectedPrice = selectedPriceId
|
|
2043
|
+
? (priceOptions.find(
|
|
2044
|
+
(entry) => entry.id === selectedPriceId,
|
|
2045
|
+
) ?? null)
|
|
2046
|
+
: null;
|
|
2047
|
+
if (isShippedOrderLine) {
|
|
2048
|
+
const lockedAmount = normalizeNumber(
|
|
2049
|
+
values?.unitPrice,
|
|
2050
|
+
Number.NaN,
|
|
2051
|
+
);
|
|
2052
|
+
const lockedCurrency =
|
|
2053
|
+
selectedPrice?.currencyCode ??
|
|
2054
|
+
(typeof values?.currencyCode === "string"
|
|
2055
|
+
? values.currencyCode
|
|
2056
|
+
: currencyCode) ??
|
|
2057
|
+
undefined;
|
|
2058
|
+
const lockedModeLabel =
|
|
2059
|
+
values?.priceMode === "net"
|
|
2060
|
+
? t("sales.documents.items.priceNet", "Net")
|
|
2061
|
+
: t("sales.documents.items.priceGross", "Gross");
|
|
2062
|
+
const lockedAmountLabel = Number.isFinite(lockedAmount)
|
|
2063
|
+
? `${formatMoney(lockedAmount, lockedCurrency, locale)} — ${lockedModeLabel}`
|
|
2064
|
+
: lockedModeLabel;
|
|
2065
|
+
const lockedPriceDetail =
|
|
2066
|
+
selectedPrice?.priceKindTitle ??
|
|
2067
|
+
selectedPrice?.priceKindCode ??
|
|
2068
|
+
null;
|
|
2069
|
+
return (
|
|
2070
|
+
<div className="space-y-2">
|
|
2071
|
+
<Input
|
|
2072
|
+
readOnly
|
|
2073
|
+
disabled
|
|
2074
|
+
value={lockedAmountLabel}
|
|
2075
|
+
aria-label={t("sales.documents.items.price", "Price")}
|
|
2076
|
+
/>
|
|
2077
|
+
{lockedPriceDetail ? (
|
|
2078
|
+
<p className="text-xs text-muted-foreground">
|
|
2079
|
+
{lockedPriceDetail}
|
|
2080
|
+
</p>
|
|
2081
|
+
) : null}
|
|
2082
|
+
</div>
|
|
2083
|
+
);
|
|
2084
|
+
}
|
|
1987
2085
|
return (
|
|
1988
2086
|
<LookupSelect
|
|
1989
2087
|
key={
|
|
@@ -1991,7 +2089,7 @@ export function LineItemDialog({
|
|
|
1991
2089
|
? `${productId}-${variantId ?? "no-variant"}`
|
|
1992
2090
|
: "price"
|
|
1993
2091
|
}
|
|
1994
|
-
value={
|
|
2092
|
+
value={selectedPriceId}
|
|
1995
2093
|
onChange={(next) => {
|
|
1996
2094
|
setValue(next ?? null);
|
|
1997
2095
|
const selected = next
|
|
@@ -2133,9 +2231,11 @@ export function LineItemDialog({
|
|
|
2133
2231
|
}
|
|
2134
2232
|
onChange={(event) => setValue(event.target.value)}
|
|
2135
2233
|
placeholder="0.00"
|
|
2234
|
+
disabled={isShippedOrderLine}
|
|
2136
2235
|
/>
|
|
2137
2236
|
<Select
|
|
2138
2237
|
value={mode}
|
|
2238
|
+
disabled={isShippedOrderLine}
|
|
2139
2239
|
onValueChange={(value) => {
|
|
2140
2240
|
const nextMode = value === "net" ? "net" : "gross";
|
|
2141
2241
|
setFormValue?.("priceMode", nextMode);
|
|
@@ -2161,11 +2261,11 @@ export function LineItemDialog({
|
|
|
2161
2261
|
"sales.documents.items.priceBasisTemplate",
|
|
2162
2262
|
"Catalog price basis: {{baseAmount}} / {{baseUnit}}. Converted for {{unit}}: {{baseAmount}} × {{factor}} = {{convertedAmount}}.",
|
|
2163
2263
|
{
|
|
2164
|
-
baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency),
|
|
2264
|
+
baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency, locale),
|
|
2165
2265
|
baseUnit: baseUnitCode,
|
|
2166
2266
|
unit: quantityUnitCode,
|
|
2167
2267
|
factor: unitFactor,
|
|
2168
|
-
convertedAmount: formatMoney(convertedAmount, selectedCurrency),
|
|
2268
|
+
convertedAmount: formatMoney(convertedAmount, selectedCurrency, locale),
|
|
2169
2269
|
},
|
|
2170
2270
|
)}
|
|
2171
2271
|
</p>
|
|
@@ -2222,7 +2322,7 @@ export function LineItemDialog({
|
|
|
2222
2322
|
<Select
|
|
2223
2323
|
value={resolvedValue || undefined}
|
|
2224
2324
|
onValueChange={(value) => handleChange({ target: { value } } as React.ChangeEvent<HTMLSelectElement>)}
|
|
2225
|
-
disabled={!taxRates.length}
|
|
2325
|
+
disabled={isShippedOrderLine || !taxRates.length}
|
|
2226
2326
|
>
|
|
2227
2327
|
<SelectTrigger>
|
|
2228
2328
|
<SelectValue
|
|
@@ -2292,6 +2392,7 @@ export function LineItemDialog({
|
|
|
2292
2392
|
<Input
|
|
2293
2393
|
value={typeof value === "string" ? value : ""}
|
|
2294
2394
|
onChange={(event) => setValue(event.target.value || null)}
|
|
2395
|
+
disabled={isShippedOrderLine}
|
|
2295
2396
|
placeholder={t(
|
|
2296
2397
|
"sales.documents.items.quantityUnitPlaceholder",
|
|
2297
2398
|
"e.g. pc",
|
|
@@ -2349,7 +2450,7 @@ export function LineItemDialog({
|
|
|
2349
2450
|
});
|
|
2350
2451
|
}
|
|
2351
2452
|
}}
|
|
2352
|
-
disabled={!productId}
|
|
2453
|
+
disabled={isShippedOrderLine || !productId}
|
|
2353
2454
|
>
|
|
2354
2455
|
<SelectTrigger>
|
|
2355
2456
|
<SelectValue
|
|
@@ -2394,7 +2495,7 @@ export function LineItemDialog({
|
|
|
2394
2495
|
typeof values?.quantityUnit === "string"
|
|
2395
2496
|
? values.quantityUnit
|
|
2396
2497
|
: null;
|
|
2397
|
-
if (productId) {
|
|
2498
|
+
if (productId && !isShippedOrderLine) {
|
|
2398
2499
|
const selectedPriceId =
|
|
2399
2500
|
typeof values?.priceId === "string" ? values.priceId : null;
|
|
2400
2501
|
const selectedPriceKindId =
|
|
@@ -2549,6 +2650,7 @@ export function LineItemDialog({
|
|
|
2549
2650
|
resolveTaxSelection,
|
|
2550
2651
|
selectPriceAfterRefresh,
|
|
2551
2652
|
hasTaxMetadata,
|
|
2653
|
+
isShippedOrderLine,
|
|
2552
2654
|
]);
|
|
2553
2655
|
|
|
2554
2656
|
const groups = React.useMemo<CrudFormGroup[]>(() => {
|
|
@@ -2914,6 +3016,21 @@ export function LineItemDialog({
|
|
|
2914
3016
|
: t("sales.documents.items.addTitle", "Add line")}
|
|
2915
3017
|
</DialogTitle>
|
|
2916
3018
|
</DialogHeader>
|
|
3019
|
+
{isShippedOrderLine ? (
|
|
3020
|
+
<Alert status="information" style="lighter">
|
|
3021
|
+
<AlertDescription>
|
|
3022
|
+
{shipmentStateUnknown
|
|
3023
|
+
? t(
|
|
3024
|
+
"sales.documents.items.shippedLineLockPending",
|
|
3025
|
+
"Pricing is locked until this order's shipments have been read. Reopen the order to try again — you can still edit the name and raise the quantity.",
|
|
3026
|
+
)
|
|
3027
|
+
: t(
|
|
3028
|
+
"sales.documents.items.shippedLineLocked",
|
|
3029
|
+
"Pricing is locked on this line because it already has shipped items. You can still edit the name and quantity.",
|
|
3030
|
+
)}
|
|
3031
|
+
</AlertDescription>
|
|
3032
|
+
</Alert>
|
|
3033
|
+
) : null}
|
|
2917
3034
|
<CrudForm<LineFormState>
|
|
2918
3035
|
key={formResetKey}
|
|
2919
3036
|
embedded
|
|
@@ -13,8 +13,9 @@ import { RowActions } from '@open-mercato/ui/backend/RowActions'
|
|
|
13
13
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
14
14
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
15
15
|
import { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
16
|
-
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
16
|
+
import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
|
|
17
17
|
import { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'
|
|
18
|
+
import { extensionPoints } from '@open-mercato/core/modules/sales/extension-points'
|
|
18
19
|
import { PaymentDialog, type PaymentFormData, type PaymentTotals } from './PaymentDialog'
|
|
19
20
|
import { extractCustomFieldValues } from './customFieldHelpers'
|
|
20
21
|
import { Plus } from 'lucide-react'
|
|
@@ -59,10 +60,10 @@ function normalizeNumber(value: unknown): number {
|
|
|
59
60
|
return 0
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
function formatMoney(value: number, currency: string | null | undefined): string {
|
|
63
|
+
function formatMoney(value: number, currency: string | null | undefined, locale?: string): string {
|
|
63
64
|
if (!currency || currency.trim().length !== 3) return value.toFixed(2)
|
|
64
65
|
try {
|
|
65
|
-
return new Intl.NumberFormat(
|
|
66
|
+
return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)
|
|
66
67
|
} catch {
|
|
67
68
|
return `${currency.toUpperCase()} ${value.toFixed(2)}`
|
|
68
69
|
}
|
|
@@ -79,6 +80,7 @@ export function SalesDocumentPaymentsSection({
|
|
|
79
80
|
onPaymentsChange,
|
|
80
81
|
}: SalesDocumentPaymentsSectionProps) {
|
|
81
82
|
const t = useT()
|
|
83
|
+
const locale = useLocale()
|
|
82
84
|
const { organizationId, tenantId } = useOrganizationScopeDetail()
|
|
83
85
|
const resolvedOrganizationId = orgFromProps ?? organizationId ?? null
|
|
84
86
|
const resolvedTenantId = tenantFromProps ?? tenantId ?? null
|
|
@@ -275,6 +277,10 @@ export function SalesDocumentPaymentsSection({
|
|
|
275
277
|
cell: ({ row }) => row.original.paymentMethodName ?? '—',
|
|
276
278
|
},
|
|
277
279
|
{
|
|
280
|
+
// Injected columns are placed against `ColumnDef.id` before the table is
|
|
281
|
+
// built, so an accessor-derived id is not yet available: the gateway
|
|
282
|
+
// status widget anchors on this explicit id.
|
|
283
|
+
id: 'status',
|
|
278
284
|
accessorKey: 'status',
|
|
279
285
|
header: t('sales.documents.payments.status', 'Status'),
|
|
280
286
|
cell: ({ row }) => row.original.statusLabel ?? row.original.status ?? '—',
|
|
@@ -282,24 +288,24 @@ export function SalesDocumentPaymentsSection({
|
|
|
282
288
|
{
|
|
283
289
|
accessorKey: 'amount',
|
|
284
290
|
header: t('sales.documents.payments.amount', 'Amount'),
|
|
285
|
-
cell: ({ row }) => formatMoney(row.original.amount, row.original.currencyCode ?? currencyCode),
|
|
291
|
+
cell: ({ row }) => formatMoney(row.original.amount, row.original.currencyCode ?? currencyCode, locale),
|
|
286
292
|
},
|
|
287
293
|
{
|
|
288
294
|
accessorKey: 'receivedAt',
|
|
289
295
|
header: t('sales.documents.payments.receivedAt', 'Received'),
|
|
290
296
|
cell: ({ row }) =>
|
|
291
297
|
row.original.receivedAt
|
|
292
|
-
? new Date(row.original.receivedAt).toLocaleDateString()
|
|
298
|
+
? new Date(row.original.receivedAt).toLocaleDateString(locale)
|
|
293
299
|
: '—',
|
|
294
300
|
},
|
|
295
301
|
{
|
|
296
302
|
accessorKey: 'createdAt',
|
|
297
303
|
header: t('sales.documents.payments.createdAt', 'Created'),
|
|
298
304
|
cell: ({ row }) =>
|
|
299
|
-
row.original.createdAt ? new Date(row.original.createdAt).toLocaleString() : '—',
|
|
305
|
+
row.original.createdAt ? new Date(row.original.createdAt).toLocaleString(locale) : '—',
|
|
300
306
|
meta: {
|
|
301
307
|
tooltipContent: (row: PaymentRow) =>
|
|
302
|
-
row.createdAt ? new Date(row.createdAt).toLocaleString() : undefined,
|
|
308
|
+
row.createdAt ? new Date(row.createdAt).toLocaleString(locale) : undefined,
|
|
303
309
|
},
|
|
304
310
|
},
|
|
305
311
|
{
|
|
@@ -322,7 +328,7 @@ export function SalesDocumentPaymentsSection({
|
|
|
322
328
|
},
|
|
323
329
|
},
|
|
324
330
|
],
|
|
325
|
-
[currencyCode, deleteActionLabel, editActionLabel, handleDelete, openEditPayment, t]
|
|
331
|
+
[currencyCode, deleteActionLabel, editActionLabel, handleDelete, locale, openEditPayment, t]
|
|
326
332
|
)
|
|
327
333
|
|
|
328
334
|
if (loading) {
|
|
@@ -350,7 +356,12 @@ export function SalesDocumentPaymentsSection({
|
|
|
350
356
|
return (
|
|
351
357
|
<div className="space-y-4">
|
|
352
358
|
{payments.length ? (
|
|
353
|
-
<DataTable<PaymentRow>
|
|
359
|
+
<DataTable<PaymentRow>
|
|
360
|
+
columns={columns}
|
|
361
|
+
data={payments}
|
|
362
|
+
onRowClick={openEditPayment}
|
|
363
|
+
extensionTableId={extensionPoints.hosts.paymentsTable.tableId}
|
|
364
|
+
/>
|
|
354
365
|
) : (
|
|
355
366
|
<TabEmptyState
|
|
356
367
|
title={t('sales.documents.payments.emptyTitle', 'No payments yet.')}
|