@open-mercato/core 0.7.0 → 0.7.1-develop.7103.1.41ff100d93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/api.js +13 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/di.js +9 -0
- package/dist/modules/api_keys/di.js.map +7 -0
- package/dist/modules/api_keys/services/principalService.js +31 -0
- package/dist/modules/api_keys/services/principalService.js.map +7 -0
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +11 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/attachment-service.js +313 -0
- package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +6 -2
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +57 -12
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +8 -2
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +4 -1
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/validate.js +55 -0
- package/dist/modules/auth/api/reset/validate.js.map +7 -0
- package/dist/modules/auth/api/roles/acl/route.js +28 -33
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/session/refresh.js +25 -1
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +96 -51
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +13 -5
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/commands/acl.js +254 -0
- package/dist/modules/auth/commands/acl.js.map +7 -0
- package/dist/modules/auth/components/AclEditor.js +39 -30
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +5 -1
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +35 -9
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/userIdFilter.js +16 -0
- package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
- package/dist/modules/auth/services/authService.js +16 -2
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/principalService.js +200 -0
- package/dist/modules/auth/services/principalService.js.map +7 -0
- package/dist/modules/auth/services/rbacService.js +67 -24
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
- package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
- package/dist/modules/business_rules/backend/logs/page.js +3 -1
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +3 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -1
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +7 -1
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +41 -2
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +9 -0
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/services/rateFetchingService.js +6 -1
- package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +4 -1
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +48 -6
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +17 -94
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +8 -25
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +14 -9
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +5 -5
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +38 -1
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +3 -1
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +11 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +51 -9
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +30 -5
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +5 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
- package/dist/modules/customers/backend/customers/people/page.js +4 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +21 -34
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -7
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +6 -5
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +32 -3
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +5 -0
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
- package/dist/modules/customers/lib/closureStage.js +45 -0
- package/dist/modules/customers/lib/closureStage.js.map +7 -0
- package/dist/modules/customers/lib/dealStatus.js +30 -0
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/detailReadAccess.js +12 -0
- package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +100 -2
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +12 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +6 -1
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
- package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +72 -6
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +5 -1
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +5 -1
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +9 -1
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +14 -1
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +99 -12
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/deviceSerialization.js +46 -0
- package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +3 -1
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +9 -1
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +17 -1
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +28 -34
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
- package/dist/modules/devices/backend/devices/userOptions.js +52 -0
- package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
- package/dist/modules/devices/setup.js +6 -2
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +9 -0
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
- package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
- package/dist/modules/directory/services/organizationScopeService.js +56 -0
- package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +4 -2
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +5 -1
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +0 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +4 -1
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +0 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
- package/dist/modules/integrations/data/validators.js +11 -3
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +6 -2
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +29 -1
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +17 -2
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +17 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +15 -0
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +14 -2
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +18 -4
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
- package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +150 -51
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
- package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
- package/dist/modules/query_index/lib/search-tokens.js +79 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +79 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +8 -2
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +1 -0
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
- package/dist/modules/sales/setup.js +2 -0
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +4 -7
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +3 -0
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +121 -9
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +3 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +9 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +3 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +3 -1
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -1
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -0
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +9 -10
- package/src/helpers/integration/api.ts +33 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
- package/src/modules/api_keys/api/keys/route.ts +3 -1
- package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
- package/src/modules/api_keys/di.ts +7 -0
- package/src/modules/api_keys/services/principalService.ts +33 -0
- package/src/modules/attachments/AGENTS.md +15 -0
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
- package/src/modules/attachments/di.ts +16 -0
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/index.ts +10 -0
- package/src/modules/attachments/lib/attachment-service.ts +468 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
- package/src/modules/attachments/lib/upload-limits.ts +6 -2
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
- package/src/modules/audit_logs/services/actionLogService.ts +74 -11
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/auth/api/feature-check.ts +10 -3
- package/src/modules/auth/api/login.ts +9 -1
- package/src/modules/auth/api/reset/validate.ts +57 -0
- package/src/modules/auth/api/roles/acl/route.ts +42 -39
- package/src/modules/auth/api/session/refresh.ts +32 -1
- package/src/modules/auth/api/users/acl/route.ts +177 -53
- package/src/modules/auth/api/users/route.ts +18 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/roles/page.tsx +4 -2
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/users/page.tsx +3 -2
- package/src/modules/auth/commands/acl.ts +495 -0
- package/src/modules/auth/components/AclEditor.tsx +63 -33
- package/src/modules/auth/data/entities.ts +4 -1
- package/src/modules/auth/data/validators.ts +5 -0
- package/src/modules/auth/di.ts +46 -16
- package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
- package/src/modules/auth/i18n/de.json +389 -0
- package/src/modules/auth/i18n/en.json +389 -0
- package/src/modules/auth/i18n/es.json +389 -0
- package/src/modules/auth/i18n/ko.json +389 -0
- package/src/modules/auth/i18n/pl.json +391 -2
- package/src/modules/auth/lib/grantChecks.ts +6 -0
- package/src/modules/auth/lib/userIdFilter.ts +31 -0
- package/src/modules/auth/services/authService.ts +18 -2
- package/src/modules/auth/services/principalService.ts +266 -0
- package/src/modules/auth/services/rbacService.ts +110 -24
- package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
- package/src/modules/business_rules/backend/logs/page.tsx +4 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -1
- package/src/modules/business_rules/backend/sets/page.tsx +4 -1
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
- package/src/modules/communication_channels/di.ts +7 -0
- package/src/modules/communication_channels/lib/adapter.ts +14 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
- package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
- package/src/modules/communication_channels/lib/test-seed.ts +64 -4
- package/src/modules/configs/i18n/de.json +2 -0
- package/src/modules/configs/i18n/en.json +2 -0
- package/src/modules/configs/i18n/es.json +2 -0
- package/src/modules/configs/i18n/ko.json +2 -0
- package/src/modules/configs/i18n/pl.json +2 -0
- package/src/modules/configs/lib/system-status.ts +9 -0
- package/src/modules/currencies/AGENTS.md +3 -0
- package/src/modules/currencies/backend/currencies/page.tsx +4 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
- package/src/modules/currencies/services/README.md +45 -0
- package/src/modules/currencies/services/rateFetchingService.ts +6 -1
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
- package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
- package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
- package/src/modules/customers/ai-tools/people-pack.ts +4 -1
- package/src/modules/customers/api/activities/route.ts +45 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
- package/src/modules/customers/api/companies/[id]/route.ts +24 -107
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
- package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/route.ts +17 -28
- package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
- package/src/modules/customers/api/deals/aggregate/route.ts +17 -9
- package/src/modules/customers/api/deals/map/route.ts +4 -4
- package/src/modules/customers/api/deals/route.ts +50 -1
- package/src/modules/customers/api/entity-roles-factory.ts +8 -4
- package/src/modules/customers/api/interactions/route.ts +8 -2
- package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
- package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
- package/src/modules/customers/api/people/[id]/route.ts +16 -11
- package/src/modules/customers/api/people/check-phone/route.ts +75 -10
- package/src/modules/customers/api/todos/route.ts +27 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
- package/src/modules/customers/backend/customers/people/page.tsx +5 -2
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
- package/src/modules/customers/commands/deals.ts +34 -59
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
- package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
- package/src/modules/customers/components/detail/DealForm.tsx +22 -2
- package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +15 -5
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +50 -9
- package/src/modules/customers/events.ts +5 -0
- package/src/modules/customers/i18n/de.json +9 -1
- package/src/modules/customers/i18n/en.json +9 -1
- package/src/modules/customers/i18n/es.json +9 -1
- package/src/modules/customers/i18n/ko.json +9 -1
- package/src/modules/customers/i18n/pl.json +9 -1
- package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
- package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
- package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
- package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
- package/src/modules/customers/lib/closureStage.ts +76 -0
- package/src/modules/customers/lib/dealStatus.ts +42 -0
- package/src/modules/customers/lib/detailReadAccess.ts +35 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
- package/src/modules/customers/lib/personCompanies.ts +136 -1
- package/src/modules/customers/lib/todoCompatibility.ts +19 -1
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +6 -0
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
- package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
- package/src/modules/data_sync/lib/adapter.ts +36 -0
- package/src/modules/data_sync/lib/sync-engine.ts +113 -5
- package/src/modules/data_sync/workers/sync-export.ts +4 -0
- package/src/modules/data_sync/workers/sync-import.ts +4 -0
- package/src/modules/devices/AGENTS.md +20 -1
- package/src/modules/devices/acl.ts +9 -1
- package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
- package/src/modules/devices/api/admin/devices/route.ts +14 -1
- package/src/modules/devices/api/deviceList.ts +135 -11
- package/src/modules/devices/api/deviceSerialization.ts +50 -0
- package/src/modules/devices/api/openapi.ts +9 -1
- package/src/modules/devices/api/route.ts +9 -1
- package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
- package/src/modules/devices/backend/devices/create/page.tsx +17 -1
- package/src/modules/devices/backend/devices/page.tsx +44 -45
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
- package/src/modules/devices/backend/devices/userOptions.ts +99 -0
- package/src/modules/devices/i18n/de.json +3 -2
- package/src/modules/devices/i18n/en.json +3 -2
- package/src/modules/devices/i18n/es.json +3 -2
- package/src/modules/devices/i18n/ko.json +3 -2
- package/src/modules/devices/i18n/pl.json +3 -2
- package/src/modules/devices/setup.ts +6 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
- package/src/modules/directory/di.ts +14 -2
- package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
- package/src/modules/directory/services/organizationScopeService.ts +85 -0
- package/src/modules/directory/utils/organizationScope.ts +4 -15
- package/src/modules/entities/api/records.ts +2 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
- package/src/modules/eudr/api/plots/route.ts +4 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
- package/src/modules/eudr/commands/statements.ts +0 -3
- package/src/modules/eudr/data/validators.ts +16 -1
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/feature_toggles/defaults.json +0 -8
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
- package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
- package/src/modules/integrations/data/validators.ts +12 -2
- package/src/modules/integrations/i18n/de.json +1 -0
- package/src/modules/integrations/i18n/en.json +1 -0
- package/src/modules/integrations/i18n/es.json +1 -0
- package/src/modules/integrations/i18n/ko.json +1 -0
- package/src/modules/integrations/i18n/pl.json +1 -0
- package/src/modules/integrations/lib/credentials-masking.ts +10 -6
- package/src/modules/messages/api/[id]/route.ts +55 -1
- package/src/modules/messages/api/openapi.ts +20 -0
- package/src/modules/messages/api/route.ts +31 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
- package/src/modules/messages/components/inboxFilters.ts +36 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
- package/src/modules/messages/components/message-detail/types.ts +3 -0
- package/src/modules/messages/components/messageListLabels.ts +52 -3
- package/src/modules/messages/data/validators.ts +43 -4
- package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
- package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
- package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +249 -61
- package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
- package/src/modules/query_index/lib/search-tokens.ts +135 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
- package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
- package/src/modules/sales/commands/documents.ts +93 -0
- package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
- package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
- package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
- package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
- package/src/modules/sales/data/entities.ts +6 -0
- package/src/modules/sales/extension-points.ts +1 -0
- package/src/modules/sales/i18n/de.json +8 -0
- package/src/modules/sales/i18n/en.json +8 -0
- package/src/modules/sales/i18n/es.json +8 -0
- package/src/modules/sales/i18n/ko.json +8 -0
- package/src/modules/sales/i18n/pl.json +8 -0
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
- package/src/modules/sales/setup.ts +2 -0
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
- package/src/modules/sales/widgets/injection-table.ts +4 -7
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
- package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
- package/src/modules/warranty_claims/backend/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +159 -10
- package/src/modules/wms/commands/inventory-actions.ts +3 -0
- package/src/modules/wms/commands/shared.ts +17 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/page.tsx +4 -1
- package/src/modules/workflows/backend/events/page.tsx +4 -1
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/lib/activity-executor.ts +9 -0
|
@@ -31,13 +31,22 @@
|
|
|
31
31
|
import type { CommandHandler } from '@open-mercato/shared/lib/commands'
|
|
32
32
|
import { registerCommand } from '@open-mercato/shared/lib/commands'
|
|
33
33
|
import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'
|
|
34
|
+
import {
|
|
35
|
+
emitCrudSideEffects,
|
|
36
|
+
emitCrudUndoSideEffects,
|
|
37
|
+
parseWithCustomFields,
|
|
38
|
+
setCustomFieldsIfAny,
|
|
39
|
+
} from '@open-mercato/shared/lib/commands/helpers'
|
|
40
|
+
import { loadCustomFieldSnapshot, buildCustomFieldResetMap } from '@open-mercato/shared/lib/commands/customFieldSnapshots'
|
|
34
41
|
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
35
42
|
import { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'
|
|
43
|
+
import type { DataEngine } from '@open-mercato/shared/lib/data/engine'
|
|
36
44
|
import { CrudHttpError, isUniqueViolation } from '@open-mercato/shared/lib/crud/errors'
|
|
37
45
|
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
38
46
|
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
39
47
|
import { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'
|
|
40
48
|
import type { JsonValue } from '@open-mercato/shared/lib/json'
|
|
49
|
+
import { E } from '#generated/entities.ids.generated'
|
|
41
50
|
import {
|
|
42
51
|
InventoryLot,
|
|
43
52
|
type InventoryLotStatus,
|
|
@@ -76,6 +85,8 @@ import {
|
|
|
76
85
|
normalizeOptionalString,
|
|
77
86
|
requireId,
|
|
78
87
|
toNumericString,
|
|
88
|
+
warehouseCrudIndexer,
|
|
89
|
+
warehouseZoneCrudIndexer,
|
|
79
90
|
} from './shared'
|
|
80
91
|
import { emitWmsEvent } from '../events'
|
|
81
92
|
|
|
@@ -95,6 +106,22 @@ function toJsonValue(value: Record<string, unknown> | null | undefined): JsonVal
|
|
|
95
106
|
return (value ?? null) as JsonValue | null
|
|
96
107
|
}
|
|
97
108
|
|
|
109
|
+
async function persistWarehouseCustomFields(
|
|
110
|
+
ctx: CommandRuntimeContext,
|
|
111
|
+
warehouse: { id: string; organizationId: string; tenantId: string },
|
|
112
|
+
custom: Record<string, unknown>,
|
|
113
|
+
) {
|
|
114
|
+
if (!custom || Object.keys(custom).length === 0) return
|
|
115
|
+
await setCustomFieldsIfAny({
|
|
116
|
+
dataEngine: ctx.container.resolve('dataEngine'),
|
|
117
|
+
entityId: E.wms.warehouse,
|
|
118
|
+
recordId: warehouse.id,
|
|
119
|
+
organizationId: warehouse.organizationId,
|
|
120
|
+
tenantId: warehouse.tenantId,
|
|
121
|
+
values: custom,
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
98
125
|
async function buildCrudLog(
|
|
99
126
|
ctx: CommandRuntimeContext,
|
|
100
127
|
input: { tenantId?: string | null; organizationId?: string | null; id?: string | null } | undefined,
|
|
@@ -174,6 +201,7 @@ type WarehouseSnapshot = {
|
|
|
174
201
|
metadata: JsonValue | null
|
|
175
202
|
createdAt: string
|
|
176
203
|
updatedAt: string
|
|
204
|
+
custom?: Record<string, unknown> | null
|
|
177
205
|
}
|
|
178
206
|
|
|
179
207
|
type PrimaryDemotionSnapshot = {
|
|
@@ -196,6 +224,7 @@ type WarehouseZoneSnapshot = {
|
|
|
196
224
|
name: string
|
|
197
225
|
priority: number
|
|
198
226
|
metadata: JsonValue | null
|
|
227
|
+
custom?: Record<string, unknown>
|
|
199
228
|
createdAt: string
|
|
200
229
|
updatedAt: string
|
|
201
230
|
}
|
|
@@ -306,7 +335,16 @@ async function loadWarehouseSnapshot(
|
|
|
306
335
|
id: string,
|
|
307
336
|
): Promise<WarehouseSnapshot | null> {
|
|
308
337
|
const record = await findOneWithDecryption(em, Warehouse, { id }, undefined, resolveScope(ctx))
|
|
309
|
-
|
|
338
|
+
if (!record) return null
|
|
339
|
+
const snapshot = snapshotWarehouse(record)
|
|
340
|
+
const custom = await loadCustomFieldSnapshot(em, {
|
|
341
|
+
entityId: E.wms.warehouse,
|
|
342
|
+
recordId: record.id,
|
|
343
|
+
tenantId: record.tenantId,
|
|
344
|
+
organizationId: record.organizationId,
|
|
345
|
+
})
|
|
346
|
+
snapshot.custom = custom && Object.keys(custom).length ? custom : null
|
|
347
|
+
return snapshot
|
|
310
348
|
}
|
|
311
349
|
|
|
312
350
|
function snapshotWarehouseZone(record: WarehouseZone): WarehouseZoneSnapshot {
|
|
@@ -331,7 +369,91 @@ async function loadWarehouseZoneSnapshot(
|
|
|
331
369
|
id: string,
|
|
332
370
|
): Promise<WarehouseZoneSnapshot | null> {
|
|
333
371
|
const record = await findOneWithDecryption(em, WarehouseZone, { id }, undefined, resolveScope(ctx))
|
|
334
|
-
|
|
372
|
+
if (!record) return null
|
|
373
|
+
const snapshot = snapshotWarehouseZone(record)
|
|
374
|
+
// The snapshot always carries custom values because undo has to restore them, and
|
|
375
|
+
// every caller (prepare on update/delete, captureAfter on create/update) feeds undo.
|
|
376
|
+
// For the common tenant that defined no zone custom fields this costs a single
|
|
377
|
+
// `custom_field_values` lookup: `loadCustomFieldValues` returns early on an empty
|
|
378
|
+
// result and never reaches the `custom_field_defs` query.
|
|
379
|
+
snapshot.custom = await loadCustomFieldSnapshot(em, {
|
|
380
|
+
entityId: E.wms.warehouse_zone,
|
|
381
|
+
recordId: record.id,
|
|
382
|
+
tenantId: record.tenantId,
|
|
383
|
+
organizationId: record.organizationId,
|
|
384
|
+
})
|
|
385
|
+
return snapshot
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
async function writeZoneCustomFields(
|
|
389
|
+
ctx: CommandRuntimeContext,
|
|
390
|
+
zone: { id: string; organizationId: string; tenantId: string },
|
|
391
|
+
values: Record<string, unknown>,
|
|
392
|
+
): Promise<void> {
|
|
393
|
+
if (!values || !Object.keys(values).length) return
|
|
394
|
+
await setCustomFieldsIfAny({
|
|
395
|
+
dataEngine: ctx.container.resolve('dataEngine') as DataEngine,
|
|
396
|
+
entityId: E.wms.warehouse_zone,
|
|
397
|
+
recordId: zone.id,
|
|
398
|
+
organizationId: zone.organizationId,
|
|
399
|
+
tenantId: zone.tenantId,
|
|
400
|
+
values,
|
|
401
|
+
})
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Zone reads go through the hybrid query engine, which projects `cf:*` from
|
|
405
|
+
// `entity_indexes`. Emitting the CRUD side effect is therefore what makes a
|
|
406
|
+
// custom field value written above observable through the zones list API — without
|
|
407
|
+
// it the value sits in `custom_field_values` that no read path consults (#5239).
|
|
408
|
+
// `events` is deliberately omitted: the module already emits `wms.zone.*` itself,
|
|
409
|
+
// and adding an events config here would introduce a second, undeclared
|
|
410
|
+
// `wms.warehouse_zone.*` event id for the same write.
|
|
411
|
+
async function emitWarehouseCrudSideEffects(
|
|
412
|
+
ctx: CommandRuntimeContext,
|
|
413
|
+
action: 'created' | 'updated' | 'deleted',
|
|
414
|
+
warehouse: Warehouse,
|
|
415
|
+
origin: 'write' | 'undo' = 'write',
|
|
416
|
+
): Promise<void> {
|
|
417
|
+
const options = {
|
|
418
|
+
dataEngine: ctx.container.resolve('dataEngine') as DataEngine,
|
|
419
|
+
action,
|
|
420
|
+
entity: warehouse,
|
|
421
|
+
identifiers: {
|
|
422
|
+
id: warehouse.id,
|
|
423
|
+
organizationId: warehouse.organizationId,
|
|
424
|
+
tenantId: warehouse.tenantId,
|
|
425
|
+
},
|
|
426
|
+
indexer: warehouseCrudIndexer,
|
|
427
|
+
}
|
|
428
|
+
if (origin === 'undo') {
|
|
429
|
+
await emitCrudUndoSideEffects(options)
|
|
430
|
+
return
|
|
431
|
+
}
|
|
432
|
+
await emitCrudSideEffects(options)
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
async function emitZoneCrudSideEffects(
|
|
436
|
+
ctx: CommandRuntimeContext,
|
|
437
|
+
action: 'created' | 'updated' | 'deleted',
|
|
438
|
+
zone: WarehouseZone,
|
|
439
|
+
origin: 'write' | 'undo' = 'write',
|
|
440
|
+
): Promise<void> {
|
|
441
|
+
const options = {
|
|
442
|
+
dataEngine: ctx.container.resolve('dataEngine') as DataEngine,
|
|
443
|
+
action,
|
|
444
|
+
entity: zone,
|
|
445
|
+
identifiers: {
|
|
446
|
+
id: zone.id,
|
|
447
|
+
organizationId: zone.organizationId,
|
|
448
|
+
tenantId: zone.tenantId,
|
|
449
|
+
},
|
|
450
|
+
indexer: warehouseZoneCrudIndexer,
|
|
451
|
+
}
|
|
452
|
+
if (origin === 'undo') {
|
|
453
|
+
await emitCrudUndoSideEffects(options)
|
|
454
|
+
return
|
|
455
|
+
}
|
|
456
|
+
await emitCrudSideEffects(options)
|
|
335
457
|
}
|
|
336
458
|
|
|
337
459
|
function snapshotWarehouseLocation(record: WarehouseLocation): WarehouseLocationSnapshot {
|
|
@@ -643,11 +765,11 @@ async function resolveParentLocation(
|
|
|
643
765
|
|
|
644
766
|
const createWarehouseCommand: CommandHandler<
|
|
645
767
|
WarehouseCreateInput,
|
|
646
|
-
{ warehouseId: string; demotedPrimariesBefore?: PrimaryDemotionSnapshot[] }
|
|
768
|
+
{ warehouseId: string; updatedAt?: string | null; demotedPrimariesBefore?: PrimaryDemotionSnapshot[] }
|
|
647
769
|
> = {
|
|
648
770
|
id: 'wms.warehouses.create',
|
|
649
771
|
async execute(rawInput, ctx) {
|
|
650
|
-
const parsed = warehouseCreateSchema
|
|
772
|
+
const { parsed, custom } = parseWithCustomFields(warehouseCreateSchema, rawInput ?? {})
|
|
651
773
|
ensureTenantScope(ctx, parsed.tenantId)
|
|
652
774
|
ensureOrganizationScope(ctx, parsed.organizationId)
|
|
653
775
|
const em = resolveEm(ctx)
|
|
@@ -705,6 +827,8 @@ const createWarehouseCommand: CommandHandler<
|
|
|
705
827
|
}
|
|
706
828
|
throw err
|
|
707
829
|
}
|
|
830
|
+
await persistWarehouseCustomFields(ctx, warehouse, custom)
|
|
831
|
+
await emitWarehouseCrudSideEffects(ctx, 'created', warehouse)
|
|
708
832
|
void emitWmsEvent('wms.warehouse.created', {
|
|
709
833
|
id: warehouse.id,
|
|
710
834
|
warehouseId: warehouse.id,
|
|
@@ -713,6 +837,7 @@ const createWarehouseCommand: CommandHandler<
|
|
|
713
837
|
}).catch(() => undefined)
|
|
714
838
|
return {
|
|
715
839
|
warehouseId: warehouse.id,
|
|
840
|
+
updatedAt: isoOrNull(warehouse.updatedAt),
|
|
716
841
|
...(demotedPrimariesBefore.length > 0 ? { demotedPrimariesBefore } : {}),
|
|
717
842
|
}
|
|
718
843
|
},
|
|
@@ -752,6 +877,8 @@ const createWarehouseCommand: CommandHandler<
|
|
|
752
877
|
ensureOrganizationScope(ctx, record.organizationId)
|
|
753
878
|
record.deletedAt = new Date()
|
|
754
879
|
await em.flush()
|
|
880
|
+
await persistWarehouseCustomFields(ctx, after, buildCustomFieldResetMap(undefined, after.custom ?? undefined))
|
|
881
|
+
await emitWarehouseCrudSideEffects(ctx, 'deleted', record, 'undo')
|
|
755
882
|
if (payload.demotedPrimariesBefore?.length) {
|
|
756
883
|
await restoreDemotedPrimaryWarehouses(em, ctx, payload.demotedPrimariesBefore)
|
|
757
884
|
await em.flush()
|
|
@@ -771,7 +898,7 @@ const updateWarehouseCommand: CommandHandler<
|
|
|
771
898
|
return before ? { before } : {}
|
|
772
899
|
},
|
|
773
900
|
async execute(rawInput, ctx) {
|
|
774
|
-
const parsed = warehouseUpdateSchema
|
|
901
|
+
const { parsed, custom } = parseWithCustomFields(warehouseUpdateSchema, rawInput ?? {})
|
|
775
902
|
const em = resolveEm(ctx)
|
|
776
903
|
const warehouse = await loadWarehouse(em, ctx, parsed.id)
|
|
777
904
|
if (parsed.code !== undefined && parsed.code !== warehouse.code) {
|
|
@@ -831,6 +958,8 @@ const updateWarehouseCommand: CommandHandler<
|
|
|
831
958
|
}
|
|
832
959
|
throw err
|
|
833
960
|
}
|
|
961
|
+
await persistWarehouseCustomFields(ctx, warehouse, custom)
|
|
962
|
+
await emitWarehouseCrudSideEffects(ctx, 'updated', warehouse)
|
|
834
963
|
void emitWmsEvent('wms.warehouse.updated', {
|
|
835
964
|
id: warehouse.id,
|
|
836
965
|
warehouseId: warehouse.id,
|
|
@@ -911,6 +1040,12 @@ const updateWarehouseCommand: CommandHandler<
|
|
|
911
1040
|
record.deletedAt = null
|
|
912
1041
|
}
|
|
913
1042
|
await em.flush()
|
|
1043
|
+
await persistWarehouseCustomFields(
|
|
1044
|
+
ctx,
|
|
1045
|
+
before,
|
|
1046
|
+
buildCustomFieldResetMap(before.custom ?? undefined, payload.after?.custom ?? undefined),
|
|
1047
|
+
)
|
|
1048
|
+
await emitWarehouseCrudSideEffects(ctx, 'updated', record, 'undo')
|
|
914
1049
|
if (payload.demotedPrimariesBefore?.length) {
|
|
915
1050
|
await restoreDemotedPrimaryWarehouses(em, ctx, payload.demotedPrimariesBefore)
|
|
916
1051
|
await em.flush()
|
|
@@ -932,6 +1067,7 @@ const deleteWarehouseCommand: CommandHandler<{ id?: string }, { warehouseId: str
|
|
|
932
1067
|
const warehouse = await loadWarehouse(em, ctx, warehouseId)
|
|
933
1068
|
warehouse.deletedAt = new Date()
|
|
934
1069
|
await em.flush()
|
|
1070
|
+
await emitWarehouseCrudSideEffects(ctx, 'deleted', warehouse)
|
|
935
1071
|
return { warehouseId: warehouse.id }
|
|
936
1072
|
},
|
|
937
1073
|
buildLog: async ({ input, result, ctx, snapshots }) => {
|
|
@@ -986,10 +1122,11 @@ const deleteWarehouseCommand: CommandHandler<{ id?: string }, { warehouseId: str
|
|
|
986
1122
|
record.metadata = before.metadata
|
|
987
1123
|
}
|
|
988
1124
|
await em.flush()
|
|
1125
|
+
await emitWarehouseCrudSideEffects(ctx, 'created', record, 'undo')
|
|
989
1126
|
},
|
|
990
1127
|
}
|
|
991
1128
|
|
|
992
|
-
async function restoreZoneFromSnapshot(em: EntityManager, before: WarehouseZoneSnapshot): Promise<
|
|
1129
|
+
async function restoreZoneFromSnapshot(em: EntityManager, before: WarehouseZoneSnapshot): Promise<WarehouseZone> {
|
|
993
1130
|
const scope = { tenantId: before.tenantId, organizationId: before.organizationId }
|
|
994
1131
|
const warehouseRef = await findOneWithDecryption(em, Warehouse, { id: before.warehouseId }, undefined, scope)
|
|
995
1132
|
if (!warehouseRef) {
|
|
@@ -1018,12 +1155,13 @@ async function restoreZoneFromSnapshot(em: EntityManager, before: WarehouseZoneS
|
|
|
1018
1155
|
record.metadata = before.metadata
|
|
1019
1156
|
record.deletedAt = null
|
|
1020
1157
|
}
|
|
1158
|
+
return record
|
|
1021
1159
|
}
|
|
1022
1160
|
|
|
1023
1161
|
const createWarehouseZoneCommand: CommandHandler<WarehouseZoneCreateInput, { zoneId: string }> = {
|
|
1024
1162
|
id: 'wms.zones.create',
|
|
1025
1163
|
async execute(rawInput, ctx) {
|
|
1026
|
-
const parsed = warehouseZoneCreateSchema
|
|
1164
|
+
const { parsed, custom } = parseWithCustomFields(warehouseZoneCreateSchema, rawInput ?? {})
|
|
1027
1165
|
ensureTenantScope(ctx, parsed.tenantId)
|
|
1028
1166
|
ensureOrganizationScope(ctx, parsed.organizationId)
|
|
1029
1167
|
const em = resolveEm(ctx)
|
|
@@ -1039,6 +1177,8 @@ const createWarehouseZoneCommand: CommandHandler<WarehouseZoneCreateInput, { zon
|
|
|
1039
1177
|
metadata: toJsonValue(parsed.metadata),
|
|
1040
1178
|
})
|
|
1041
1179
|
await em.persist(zone).flush()
|
|
1180
|
+
await writeZoneCustomFields(ctx, zone, custom)
|
|
1181
|
+
await emitZoneCrudSideEffects(ctx, 'created', zone)
|
|
1042
1182
|
void emitWmsEvent('wms.zone.created', {
|
|
1043
1183
|
id: zone.id,
|
|
1044
1184
|
zoneId: zone.id,
|
|
@@ -1074,6 +1214,8 @@ const createWarehouseZoneCommand: CommandHandler<WarehouseZoneCreateInput, { zon
|
|
|
1074
1214
|
ensureOrganizationScope(ctx, record.organizationId)
|
|
1075
1215
|
record.deletedAt = new Date()
|
|
1076
1216
|
await em.flush()
|
|
1217
|
+
await writeZoneCustomFields(ctx, record, buildCustomFieldResetMap(undefined, after.custom))
|
|
1218
|
+
await emitZoneCrudSideEffects(ctx, 'deleted', record, 'undo')
|
|
1077
1219
|
},
|
|
1078
1220
|
}
|
|
1079
1221
|
|
|
@@ -1086,7 +1228,7 @@ const updateWarehouseZoneCommand: CommandHandler<WarehouseZoneUpdateInput, { zon
|
|
|
1086
1228
|
return before ? { before } : {}
|
|
1087
1229
|
},
|
|
1088
1230
|
async execute(rawInput, ctx) {
|
|
1089
|
-
const parsed = warehouseZoneUpdateSchema
|
|
1231
|
+
const { parsed, custom } = parseWithCustomFields(warehouseZoneUpdateSchema, rawInput ?? {})
|
|
1090
1232
|
const em = resolveEm(ctx)
|
|
1091
1233
|
const zone = await loadZone(em, ctx, parsed.id)
|
|
1092
1234
|
if (parsed.warehouseId !== undefined) {
|
|
@@ -1102,6 +1244,8 @@ const updateWarehouseZoneCommand: CommandHandler<WarehouseZoneUpdateInput, { zon
|
|
|
1102
1244
|
if (parsed.priority !== undefined) zone.priority = parsed.priority
|
|
1103
1245
|
if (parsed.metadata !== undefined) zone.metadata = toJsonValue(parsed.metadata)
|
|
1104
1246
|
await em.flush()
|
|
1247
|
+
await writeZoneCustomFields(ctx, zone, custom)
|
|
1248
|
+
await emitZoneCrudSideEffects(ctx, 'updated', zone)
|
|
1105
1249
|
void emitWmsEvent('wms.zone.updated', {
|
|
1106
1250
|
id: zone.id,
|
|
1107
1251
|
zoneId: zone.id,
|
|
@@ -1128,8 +1272,10 @@ const updateWarehouseZoneCommand: CommandHandler<WarehouseZoneUpdateInput, { zon
|
|
|
1128
1272
|
const em = resolveEm(ctx)
|
|
1129
1273
|
ensureTenantScope(ctx, before.tenantId)
|
|
1130
1274
|
ensureOrganizationScope(ctx, before.organizationId)
|
|
1131
|
-
await restoreZoneFromSnapshot(em, before)
|
|
1275
|
+
const record = await restoreZoneFromSnapshot(em, before)
|
|
1132
1276
|
await em.flush()
|
|
1277
|
+
await writeZoneCustomFields(ctx, record, buildCustomFieldResetMap(before.custom, payload?.after?.custom))
|
|
1278
|
+
await emitZoneCrudSideEffects(ctx, 'updated', record, 'undo')
|
|
1133
1279
|
},
|
|
1134
1280
|
}
|
|
1135
1281
|
|
|
@@ -1147,6 +1293,7 @@ const deleteWarehouseZoneCommand: CommandHandler<{ id?: string }, { zoneId: stri
|
|
|
1147
1293
|
const zone = await loadZone(em, ctx, zoneId)
|
|
1148
1294
|
zone.deletedAt = new Date()
|
|
1149
1295
|
await em.flush()
|
|
1296
|
+
await emitZoneCrudSideEffects(ctx, 'deleted', zone)
|
|
1150
1297
|
return { zoneId: zone.id }
|
|
1151
1298
|
},
|
|
1152
1299
|
buildLog: async ({ input, result, ctx, snapshots }) => {
|
|
@@ -1161,8 +1308,10 @@ const deleteWarehouseZoneCommand: CommandHandler<{ id?: string }, { zoneId: stri
|
|
|
1161
1308
|
const em = resolveEm(ctx)
|
|
1162
1309
|
ensureTenantScope(ctx, before.tenantId)
|
|
1163
1310
|
ensureOrganizationScope(ctx, before.organizationId)
|
|
1164
|
-
await restoreZoneFromSnapshot(em, before)
|
|
1311
|
+
const record = await restoreZoneFromSnapshot(em, before)
|
|
1165
1312
|
await em.flush()
|
|
1313
|
+
await writeZoneCustomFields(ctx, record, buildCustomFieldResetMap(before.custom, undefined))
|
|
1314
|
+
await emitZoneCrudSideEffects(ctx, 'created', record, 'undo')
|
|
1166
1315
|
},
|
|
1167
1316
|
}
|
|
1168
1317
|
|
|
@@ -1197,6 +1197,9 @@ const allocateInventoryReservationCommand: CommandHandler<InventoryReservationAl
|
|
|
1197
1197
|
const result = await runInTransaction(em, async (trx) => {
|
|
1198
1198
|
const scope = resolveScope(ctx, input)
|
|
1199
1199
|
const reservation = await requireReservation(trx, ctx, input.reservationId, scope, true)
|
|
1200
|
+
if (reservation.status !== 'active') {
|
|
1201
|
+
throw new CrudHttpError(409, { error: 'invalid_reservation_state' })
|
|
1202
|
+
}
|
|
1200
1203
|
const metadata = extractReservationMetadata(reservation)
|
|
1201
1204
|
if (metadata.allocationState === 'allocated') {
|
|
1202
1205
|
return {
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
InventoryBalance,
|
|
8
8
|
InventoryMovement,
|
|
9
9
|
InventoryReservation,
|
|
10
|
+
Warehouse,
|
|
11
|
+
WarehouseZone,
|
|
10
12
|
} from '../data/entities'
|
|
11
13
|
|
|
12
14
|
export function ensureTenantScope(ctx: CommandRuntimeContext, tenantId: string): void {
|
|
@@ -48,6 +50,21 @@ export const inventoryMovementCrudIndexer: CrudIndexerConfig<InventoryMovement>
|
|
|
48
50
|
entityType: E.wms.inventory_movement,
|
|
49
51
|
}
|
|
50
52
|
|
|
53
|
+
// Zones are read through the hybrid query engine, which projects `cf:*` out of
|
|
54
|
+
// `entity_indexes` rather than joining `custom_field_values`. Without this indexer the
|
|
55
|
+
// zone commands write custom field values that no read path can ever see (#5239).
|
|
56
|
+
export const warehouseZoneCrudIndexer: CrudIndexerConfig<WarehouseZone> = {
|
|
57
|
+
entityType: E.wms.warehouse_zone,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Warehouse list/search goes through the hybrid query engine. Writing a custom
|
|
61
|
+
// field upserts `entity_indexes`; delete must tombstone that row. A leftover
|
|
62
|
+
// live index document makes `indexAnyRows` true and hides later warehouses that
|
|
63
|
+
// were never indexed (empty combobox on the same integration shard).
|
|
64
|
+
export const warehouseCrudIndexer: CrudIndexerConfig<Warehouse> = {
|
|
65
|
+
entityType: E.wms.warehouse,
|
|
66
|
+
}
|
|
67
|
+
|
|
51
68
|
export const inventoryBalanceCrudEvents: CrudEventsConfig<InventoryBalance> = {
|
|
52
69
|
module: 'wms',
|
|
53
70
|
entity: 'inventory_balance',
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { CrudForm, type CrudField } from '@open-mercato/ui/backend/CrudForm'
|
|
6
|
+
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
7
|
+
import { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'
|
|
8
|
+
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
9
|
+
import { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'
|
|
10
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'
|
|
11
|
+
import { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'
|
|
12
|
+
import { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'
|
|
13
|
+
import { E } from '#generated/entities.ids.generated'
|
|
14
|
+
import { flashMutationError } from '../../lib/flashMutationError'
|
|
15
|
+
import {
|
|
16
|
+
countryOptionFromStored,
|
|
17
|
+
loadCountryOptions,
|
|
18
|
+
loadTimezoneOptions,
|
|
19
|
+
timezoneOptionFromStored,
|
|
20
|
+
} from './warehouseFormOptions'
|
|
21
|
+
|
|
22
|
+
export type WarehouseDialogRow = {
|
|
23
|
+
id: string
|
|
24
|
+
name?: string | null
|
|
25
|
+
code?: string | null
|
|
26
|
+
city?: string | null
|
|
27
|
+
country?: string | null
|
|
28
|
+
timezone?: string | null
|
|
29
|
+
is_active?: boolean | null
|
|
30
|
+
is_primary?: boolean | null
|
|
31
|
+
updated_at?: string | null
|
|
32
|
+
updatedAt?: string | null
|
|
33
|
+
customValues?: Record<string, unknown> | null
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type WarehouseFormValues = {
|
|
37
|
+
name: string
|
|
38
|
+
code: string
|
|
39
|
+
city?: string
|
|
40
|
+
country?: string
|
|
41
|
+
timezone?: string
|
|
42
|
+
isActive: boolean
|
|
43
|
+
isPrimary: boolean
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const warehouseFormSchema = z.object({
|
|
47
|
+
name: z.string().trim().min(1),
|
|
48
|
+
code: z.string().trim().min(1),
|
|
49
|
+
city: z.string().trim().optional(),
|
|
50
|
+
country: z.string().trim().optional(),
|
|
51
|
+
timezone: z.string().trim().optional(),
|
|
52
|
+
isActive: z.boolean().default(true),
|
|
53
|
+
isPrimary: z.boolean().default(false),
|
|
54
|
+
}).passthrough()
|
|
55
|
+
|
|
56
|
+
type WarehouseEditDialogProps = {
|
|
57
|
+
open: boolean
|
|
58
|
+
onOpenChange: (open: boolean) => void
|
|
59
|
+
mode: 'create' | 'edit'
|
|
60
|
+
row?: WarehouseDialogRow | null
|
|
61
|
+
onSaved?: (info: {
|
|
62
|
+
mode: 'create' | 'edit'
|
|
63
|
+
id?: string
|
|
64
|
+
values: WarehouseFormValues
|
|
65
|
+
updatedAt?: string | null
|
|
66
|
+
}) => void | Promise<void>
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function WarehouseEditDialog({ open, onOpenChange, mode, row, onSaved }: WarehouseEditDialogProps) {
|
|
70
|
+
const t = useT()
|
|
71
|
+
const locale = useLocale()
|
|
72
|
+
const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-warehouses' })
|
|
73
|
+
const [submitting, setSubmitting] = React.useState(false)
|
|
74
|
+
|
|
75
|
+
const countrySeedOptions = React.useMemo(() => {
|
|
76
|
+
if (mode !== 'edit' || !row?.country?.trim()) return undefined
|
|
77
|
+
return [countryOptionFromStored(row.country, locale)]
|
|
78
|
+
}, [locale, mode, row])
|
|
79
|
+
|
|
80
|
+
const timezoneSeedOptions = React.useMemo(() => {
|
|
81
|
+
if (mode !== 'edit' || !row?.timezone?.trim()) return undefined
|
|
82
|
+
return [timezoneOptionFromStored(row.timezone)]
|
|
83
|
+
}, [mode, row])
|
|
84
|
+
|
|
85
|
+
const fields = React.useMemo<CrudField[]>(() => [
|
|
86
|
+
{ id: 'name', type: 'text', label: t('wms.backend.config.warehouses.form.name', 'Name'), required: true },
|
|
87
|
+
{ id: 'code', type: 'text', label: t('wms.backend.config.warehouses.form.code', 'Code'), required: true },
|
|
88
|
+
{ id: 'city', type: 'text', label: t('wms.backend.config.warehouses.form.city', 'City') },
|
|
89
|
+
{
|
|
90
|
+
id: 'country',
|
|
91
|
+
type: 'combobox',
|
|
92
|
+
label: t('wms.backend.config.warehouses.form.country', 'Country'),
|
|
93
|
+
placeholder: t('wms.backend.config.warehouses.form.countryPlaceholder', 'Search country'),
|
|
94
|
+
loadOptions: (query) => loadCountryOptions(query, locale),
|
|
95
|
+
allowCustomValues: false,
|
|
96
|
+
seedOptions: countrySeedOptions,
|
|
97
|
+
resolveLabel: (value) => countryOptionFromStored(value, locale).label,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 'timezone',
|
|
101
|
+
type: 'combobox',
|
|
102
|
+
label: t('wms.backend.config.warehouses.form.timezone', 'Timezone'),
|
|
103
|
+
placeholder: t('wms.backend.config.warehouses.form.timezonePlaceholder', 'Search timezone'),
|
|
104
|
+
loadOptions: loadTimezoneOptions,
|
|
105
|
+
allowCustomValues: false,
|
|
106
|
+
seedOptions: timezoneSeedOptions,
|
|
107
|
+
},
|
|
108
|
+
{ id: 'isPrimary', type: 'checkbox', label: t('wms.backend.config.warehouses.form.primary', 'Primary warehouse') },
|
|
109
|
+
{ id: 'isActive', type: 'checkbox', label: t('wms.backend.config.warehouses.form.active', 'Active') },
|
|
110
|
+
], [countrySeedOptions, locale, t, timezoneSeedOptions])
|
|
111
|
+
|
|
112
|
+
const initialValues = React.useMemo<WarehouseFormValues>(() => {
|
|
113
|
+
if (mode === 'edit' && row) {
|
|
114
|
+
return {
|
|
115
|
+
name: row.name || '',
|
|
116
|
+
code: row.code || '',
|
|
117
|
+
city: row.city || '',
|
|
118
|
+
country: row.country || '',
|
|
119
|
+
timezone: row.timezone || '',
|
|
120
|
+
isActive: row.is_active !== false,
|
|
121
|
+
isPrimary: row.is_primary === true,
|
|
122
|
+
...extractCustomFieldEntries(row as Record<string, unknown>),
|
|
123
|
+
} as WarehouseFormValues
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
name: '',
|
|
127
|
+
code: '',
|
|
128
|
+
city: '',
|
|
129
|
+
country: '',
|
|
130
|
+
timezone: '',
|
|
131
|
+
isActive: true,
|
|
132
|
+
isPrimary: false,
|
|
133
|
+
}
|
|
134
|
+
}, [mode, row])
|
|
135
|
+
|
|
136
|
+
const handleSubmit = React.useCallback(async (values: WarehouseFormValues) => {
|
|
137
|
+
setSubmitting(true)
|
|
138
|
+
try {
|
|
139
|
+
const payload = mode === 'edit' && row ? { id: row.id, ...values } : values
|
|
140
|
+
const call = await runMutation({
|
|
141
|
+
operation: async () => {
|
|
142
|
+
const result = await apiCall<{ id?: string | null; updatedAt?: string | null; updated_at?: string | null }>(
|
|
143
|
+
'/api/wms/warehouses',
|
|
144
|
+
{
|
|
145
|
+
method: mode === 'edit' ? 'PUT' : 'POST',
|
|
146
|
+
headers: { 'x-om-forbidden-redirect': '0' },
|
|
147
|
+
body: JSON.stringify(payload),
|
|
148
|
+
},
|
|
149
|
+
)
|
|
150
|
+
if (!result.ok) {
|
|
151
|
+
await raiseCrudError(result.response, t('wms.backend.config.warehouses.errors.save', 'Failed to save warehouse.'))
|
|
152
|
+
}
|
|
153
|
+
return result
|
|
154
|
+
},
|
|
155
|
+
context: {},
|
|
156
|
+
mutationPayload: payload,
|
|
157
|
+
})
|
|
158
|
+
flash(
|
|
159
|
+
mode === 'edit'
|
|
160
|
+
? t('wms.backend.config.warehouses.flash.updated', 'Warehouse updated')
|
|
161
|
+
: t('wms.backend.config.warehouses.flash.created', 'Warehouse created'),
|
|
162
|
+
'success',
|
|
163
|
+
)
|
|
164
|
+
const resultBody =
|
|
165
|
+
call?.result && typeof call.result === 'object'
|
|
166
|
+
? (call.result as { id?: unknown; updatedAt?: unknown; updated_at?: unknown })
|
|
167
|
+
: null
|
|
168
|
+
const createdId =
|
|
169
|
+
mode === 'create' && typeof resultBody?.id === 'string'
|
|
170
|
+
? resultBody.id.trim()
|
|
171
|
+
: undefined
|
|
172
|
+
const updatedAt =
|
|
173
|
+
(typeof resultBody?.updatedAt === 'string' && resultBody.updatedAt.trim()) ||
|
|
174
|
+
(typeof resultBody?.updated_at === 'string' && resultBody.updated_at.trim()) ||
|
|
175
|
+
undefined
|
|
176
|
+
onOpenChange(false)
|
|
177
|
+
await onSaved?.({
|
|
178
|
+
mode,
|
|
179
|
+
id: createdId || row?.id,
|
|
180
|
+
values,
|
|
181
|
+
updatedAt: updatedAt || null,
|
|
182
|
+
})
|
|
183
|
+
} catch (error) {
|
|
184
|
+
flashMutationError(error, t('wms.backend.config.warehouses.errors.save', 'Failed to save warehouse.'), t)
|
|
185
|
+
} finally {
|
|
186
|
+
setSubmitting(false)
|
|
187
|
+
}
|
|
188
|
+
}, [mode, onOpenChange, onSaved, row, runMutation, t])
|
|
189
|
+
|
|
190
|
+
return (
|
|
191
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
192
|
+
<DialogContent className="max-w-3xl">
|
|
193
|
+
<DialogHeader>
|
|
194
|
+
<DialogTitle>
|
|
195
|
+
{mode === 'edit'
|
|
196
|
+
? t('wms.backend.config.warehouses.dialog.edit', 'Edit warehouse')
|
|
197
|
+
: t('wms.backend.config.warehouses.dialog.create', 'Create warehouse')}
|
|
198
|
+
</DialogTitle>
|
|
199
|
+
</DialogHeader>
|
|
200
|
+
<CrudForm<WarehouseFormValues>
|
|
201
|
+
schema={warehouseFormSchema}
|
|
202
|
+
fields={fields}
|
|
203
|
+
entityId={E.wms.warehouse}
|
|
204
|
+
initialValues={initialValues}
|
|
205
|
+
submitLabel={t('common.save', 'Save')}
|
|
206
|
+
onSubmit={handleSubmit}
|
|
207
|
+
embedded
|
|
208
|
+
disableInitialFocus
|
|
209
|
+
isLoading={submitting}
|
|
210
|
+
twoColumn
|
|
211
|
+
optimisticLockUpdatedAt={mode === 'edit' ? (row?.updatedAt ?? row?.updated_at ?? null) : undefined}
|
|
212
|
+
/>
|
|
213
|
+
</DialogContent>
|
|
214
|
+
</Dialog>
|
|
215
|
+
)
|
|
216
|
+
}
|