@open-mercato/core 0.6.5-develop.4534.1.b459babe6d → 0.6.5-develop.4544.1.71c003c861
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/AGENTS.md +5 -0
- package/dist/generated/entities/role/index.js +3 -1
- package/dist/generated/entities/role/index.js.map +2 -2
- package/dist/generated/entities/user/index.js +3 -1
- package/dist/generated/entities/user/index.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/optimisticLockUi.js +104 -0
- package/dist/helpers/integration/optimisticLockUi.js.map +7 -0
- package/dist/helpers/integration/salesFixtures.js +17 -0
- package/dist/helpers/integration/salesFixtures.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +9 -5
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +17 -9
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/auth/api/roles/acl/route.js +32 -13
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/roles/route.js +3 -1
- package/dist/modules/auth/api/roles/route.js.map +2 -2
- package/dist/modules/auth/api/sidebar/preferences/route.js +71 -3
- package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +42 -19
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +3 -1
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.js +24 -4
- package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +8 -4
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.js +27 -5
- package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +6 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/components/AclEditor.js +3 -1
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js +6 -0
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/services/sidebarPreferencesService.js +32 -4
- package/dist/modules/auth/services/sidebarPreferencesService.js.map +2 -2
- package/dist/modules/business_rules/api/rules/route.js +28 -0
- package/dist/modules/business_rules/api/rules/route.js.map +2 -2
- package/dist/modules/business_rules/api/sets/route.js +28 -0
- package/dist/modules/business_rules/api/sets/route.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.js +11 -4
- package/dist/modules/business_rules/backend/rules/[id]/page.js.map +3 -3
- package/dist/modules/business_rules/backend/rules/page.js +20 -11
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.js +11 -4
- package/dist/modules/business_rules/backend/sets/[id]/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +20 -11
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/catalog/api/categories/route.js +2 -0
- package/dist/modules/catalog/api/categories/route.js.map +2 -2
- package/dist/modules/catalog/api/products/route.js +2 -1
- package/dist/modules/catalog/api/products/route.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js +2 -0
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +94 -40
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +37 -8
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/optionSchemaClient.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +32 -31
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +12 -5
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +5 -3
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/productForm.js.map +2 -2
- package/dist/modules/catalog/components/products/variantForm.js +2 -1
- package/dist/modules/catalog/components/products/variantForm.js.map +2 -2
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +5 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/[id]/page.js +6 -3
- package/dist/modules/currencies/backend/currencies/[id]/page.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +18 -11
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js +1 -0
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +10 -6
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/commands/currencies.js +7 -5
- package/dist/modules/currencies/commands/currencies.js.map +2 -2
- package/dist/modules/currencies/components/CurrencyFetchingConfig.js +26 -19
- package/dist/modules/currencies/components/CurrencyFetchingConfig.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/roles/[id].js +28 -5
- package/dist/modules/customer_accounts/api/admin/roles/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/roles.js +4 -2
- package/dist/modules/customer_accounts/api/admin/roles.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users/[id].js +28 -5
- package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users.js +2 -0
- package/dist/modules/customer_accounts/api/admin/users.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +16 -8
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +8 -4
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/page.js +8 -4
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +29 -18
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +18 -11
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customers/api/companies/route.js +13 -2
- package/dist/modules/customers/api/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +2 -0
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/people/route.js +11 -2
- package/dist/modules/customers/api/people/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +1 -0
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +34 -21
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/[id]/page.js +45 -27
- package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +22 -5
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js +30 -8
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +1 -0
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +16 -6
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +62 -39
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/[id]/page.js +41 -26
- package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +50 -23
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/commands/addresses.js +16 -14
- package/dist/modules/customers/commands/addresses.js.map +2 -2
- package/dist/modules/customers/commands/companies.js +1 -1
- package/dist/modules/customers/commands/companies.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +41 -4
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/commands/people.js +1 -1
- package/dist/modules/customers/commands/people.js.map +2 -2
- package/dist/modules/customers/commands/personCompanyLinks.js +8 -5
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/commands/pipeline-stages.js +13 -11
- package/dist/modules/customers/commands/pipeline-stages.js.map +3 -3
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/DictionarySettings.js +20 -13
- package/dist/modules/customers/components/DictionarySettings.js.map +2 -2
- package/dist/modules/customers/components/DictionarySortSettings.js +4 -0
- package/dist/modules/customers/components/DictionarySortSettings.js.map +2 -2
- package/dist/modules/customers/components/PipelineSettings.js +38 -23
- package/dist/modules/customers/components/PipelineSettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityTimeline.js +1 -1
- package/dist/modules/customers/components/detail/ActivityTimeline.js.map +2 -2
- package/dist/modules/customers/components/detail/AddressesSection.js +4 -0
- package/dist/modules/customers/components/detail/AddressesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +28 -22
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +36 -24
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EmailCardActions.js +5 -0
- package/dist/modules/customers/components/detail/EmailCardActions.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +7 -0
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/ManageTagsDialog.js +34 -22
- package/dist/modules/customers/components/detail/ManageTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +41 -29
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/RoleAssignmentRow.js +14 -8
- package/dist/modules/customers/components/detail/RoleAssignmentRow.js.map +2 -2
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +14 -6
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js +29 -13
- package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/useInteractions.js +77 -35
- package/dist/modules/customers/components/detail/hooks/useInteractions.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +25 -17
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/data/guards.js +66 -0
- package/dist/modules/customers/data/guards.js.map +7 -0
- package/dist/modules/customers/di.js +37 -0
- package/dist/modules/customers/di.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +11 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
- package/dist/modules/data_sync/api/options.js +4 -4
- package/dist/modules/data_sync/api/options.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/route.js +9 -1
- package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +17 -8
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +43 -22
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-schedule-service.js +9 -0
- package/dist/modules/data_sync/lib/sync-schedule-service.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js +8 -1
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/route.js +17 -1
- package/dist/modules/dictionaries/api/[dictionaryId]/route.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionariesManager.js +31 -10
- package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +28 -15
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/directory/api/organizations/route.js +3 -0
- package/dist/modules/directory/api/organizations/route.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +2 -0
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +9 -5
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js +7 -3
- package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +8 -4
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/commands/organizations.js +7 -2
- package/dist/modules/directory/commands/organizations.js.map +2 -2
- package/dist/modules/entities/api/records.js +66 -0
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +8 -4
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/lib/helpers.js +17 -0
- package/dist/modules/entities/lib/helpers.js.map +2 -2
- package/dist/modules/feature_toggles/api/global/[id]/override/route.js +2 -1
- package/dist/modules/feature_toggles/api/global/[id]/override/route.js.map +2 -2
- package/dist/modules/feature_toggles/api/overrides/route.js +15 -0
- package/dist/modules/feature_toggles/api/overrides/route.js.map +2 -2
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js +15 -14
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js +20 -12
- package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +6 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/formConfig.js +2 -1
- package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
- package/dist/modules/feature_toggles/components/overrideFormConfig.js +5 -1
- package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
- package/dist/modules/feature_toggles/data/validators.js +7 -4
- package/dist/modules/feature_toggles/data/validators.js.map +2 -2
- package/dist/modules/inbox_ops/api/settings/route.js +17 -2
- package/dist/modules/inbox_ops/api/settings/route.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +13 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +9 -4
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +18 -11
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/page.js +12 -8
- package/dist/modules/integrations/backend/integrations/page.js.map +2 -2
- package/dist/modules/messages/commands/messages.js +13 -10
- package/dist/modules/messages/commands/messages.js.map +2 -2
- package/dist/modules/perspectives/api/[tableId]/route.js +39 -30
- package/dist/modules/perspectives/api/[tableId]/route.js.map +2 -2
- package/dist/modules/perspectives/services/perspectiveService.js +7 -0
- package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js +6 -14
- package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js.map +3 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +4 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js +2 -0
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +36 -11
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/planner/components/AvailabilitySchedule.js +9 -5
- package/dist/modules/planner/components/AvailabilitySchedule.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +19 -0
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js +1 -0
- package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +4 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/[id]/page.js +14 -3
- package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +8 -4
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +2 -0
- package/dist/modules/resources/components/ResourceCrudForm.js.map +2 -2
- package/dist/modules/resources/components/ResourceTypeCrudForm.js +1 -0
- package/dist/modules/resources/components/ResourceTypeCrudForm.js.map +2 -2
- package/dist/modules/sales/api/documents/factory.js +7 -2
- package/dist/modules/sales/api/documents/factory.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +3 -1
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +13 -4
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +16 -4
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +68 -22
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/create/page.js.map +2 -2
- package/dist/modules/sales/commands/documentAddresses.js +181 -2
- package/dist/modules/sales/commands/documentAddresses.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +29 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/commands/returns.js +12 -2
- package/dist/modules/sales/commands/returns.js.map +2 -2
- package/dist/modules/sales/commands/shared.js +15 -0
- package/dist/modules/sales/commands/shared.js.map +2 -2
- package/dist/modules/sales/commands/shipments.js +4 -1
- package/dist/modules/sales/commands/shipments.js.map +2 -2
- package/dist/modules/sales/components/AdjustmentKindSettings.js +19 -11
- package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
- package/dist/modules/sales/components/DocumentNumberSettings.js.map +2 -2
- package/dist/modules/sales/components/OrderEditingSettings.js.map +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js +12 -4
- package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +12 -4
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/StatusSettings.js +18 -11
- package/dist/modules/sales/components/StatusSettings.js.map +2 -2
- package/dist/modules/sales/components/TaxRatesSettings.js +12 -4
- package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +47 -16
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +8 -4
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +44 -25
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +43 -23
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +22 -13
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +23 -10
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentDialog.js +29 -14
- package/dist/modules/sales/components/documents/PaymentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +20 -10
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnDialog.js +26 -17
- package/dist/modules/sales/components/documents/ReturnDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +3 -1
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +10 -5
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +21 -7
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +19 -10
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/optimisticLock.js +27 -0
- package/dist/modules/sales/components/documents/optimisticLock.js.map +7 -0
- package/dist/modules/sales/di.js +18 -0
- package/dist/modules/sales/di.js.map +2 -2
- package/dist/modules/staff/api/job-histories.js +11 -2
- package/dist/modules/staff/api/job-histories.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/route.js +11 -4
- package/dist/modules/staff/api/timesheets/time-entries/route.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +13 -8
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +2 -1
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js +7 -4
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +4 -2
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js +1 -0
- package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +4 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +5 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +12 -3
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +4 -1
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +12 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/staff/commands/job-histories.js +40 -3
- package/dist/modules/staff/commands/job-histories.js.map +2 -2
- package/dist/modules/staff/components/LeaveRequestForm.js +1 -0
- package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
- package/dist/modules/staff/components/TeamForm.js +1 -0
- package/dist/modules/staff/components/TeamForm.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +1 -0
- package/dist/modules/staff/components/TeamMemberForm.js.map +2 -2
- package/dist/modules/staff/components/TeamRoleForm.js +1 -0
- package/dist/modules/staff/components/TeamRoleForm.js.map +2 -2
- package/dist/modules/staff/components/detail/JobHistorySection.js +20 -7
- package/dist/modules/staff/components/detail/JobHistorySection.js.map +2 -2
- package/dist/modules/staff/data/validators.js +7 -1
- package/dist/modules/staff/data/validators.js.map +2 -2
- package/dist/modules/staff/lib/leaveRequestHelpers.js +2 -1
- package/dist/modules/staff/lib/leaveRequestHelpers.js.map +2 -2
- package/dist/modules/translations/components/TranslationManager.js +12 -8
- package/dist/modules/translations/components/TranslationManager.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +106 -0
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.js +11 -3
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +19 -8
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +29 -16
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/components/formConfig.js +4 -1
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/di.js +12 -0
- package/dist/modules/workflows/di.js.map +2 -2
- package/generated/entities/role/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entity-fields-registry.ts +2 -0
- package/jest.setup.ts +17 -0
- package/package.json +8 -7
- package/src/helpers/integration/optimisticLockUi.ts +172 -0
- package/src/helpers/integration/salesFixtures.ts +29 -0
- package/src/modules/api_keys/backend/api-keys/page.tsx +10 -5
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +19 -9
- package/src/modules/auth/api/roles/acl/route.ts +37 -11
- package/src/modules/auth/api/roles/route.ts +2 -0
- package/src/modules/auth/api/sidebar/preferences/route.ts +73 -0
- package/src/modules/auth/api/users/acl/route.ts +46 -18
- package/src/modules/auth/api/users/route.ts +2 -0
- package/src/modules/auth/backend/roles/[id]/edit/page.tsx +29 -4
- package/src/modules/auth/backend/roles/page.tsx +9 -4
- package/src/modules/auth/backend/users/[id]/edit/page.tsx +37 -4
- package/src/modules/auth/backend/users/page.tsx +7 -2
- package/src/modules/auth/components/AclEditor.tsx +10 -1
- package/src/modules/auth/data/entities.ts +7 -1
- package/src/modules/auth/services/sidebarPreferencesService.ts +38 -4
- package/src/modules/business_rules/api/rules/route.ts +30 -0
- package/src/modules/business_rules/api/sets/route.ts +30 -0
- package/src/modules/business_rules/backend/rules/[id]/page.tsx +16 -4
- package/src/modules/business_rules/backend/rules/page.tsx +20 -11
- package/src/modules/business_rules/backend/sets/[id]/page.tsx +16 -4
- package/src/modules/business_rules/backend/sets/page.tsx +20 -11
- package/src/modules/catalog/api/categories/route.ts +3 -0
- package/src/modules/catalog/api/products/route.ts +4 -0
- package/src/modules/catalog/backend/catalog/categories/[id]/edit/page.tsx +5 -0
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +112 -35
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +56 -7
- package/src/modules/catalog/backend/catalog/products/optionSchemaClient.ts +2 -0
- package/src/modules/catalog/commands/variants.ts +32 -32
- package/src/modules/catalog/components/PriceKindSettings.tsx +20 -7
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +1 -0
- package/src/modules/catalog/components/products/ProductMediaManager.tsx +2 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +8 -4
- package/src/modules/catalog/components/products/productForm.ts +3 -0
- package/src/modules/catalog/components/products/variantForm.ts +9 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +5 -0
- package/src/modules/currencies/backend/currencies/[id]/page.tsx +13 -6
- package/src/modules/currencies/backend/currencies/page.tsx +18 -11
- package/src/modules/currencies/backend/exchange-rates/[id]/page.tsx +3 -0
- package/src/modules/currencies/backend/exchange-rates/page.tsx +10 -6
- package/src/modules/currencies/commands/currencies.ts +10 -5
- package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +31 -21
- package/src/modules/customer_accounts/api/admin/roles/[id].ts +35 -5
- package/src/modules/customer_accounts/api/admin/roles.ts +2 -0
- package/src/modules/customer_accounts/api/admin/users/[id].ts +38 -5
- package/src/modules/customer_accounts/api/admin/users.ts +2 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +34 -20
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +9 -4
- package/src/modules/customer_accounts/backend/customer_accounts/settings/domain/page.tsx +11 -4
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +28 -17
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +19 -11
- package/src/modules/customers/AGENTS.md +2 -2
- package/src/modules/customers/api/companies/route.ts +14 -1
- package/src/modules/customers/api/deals/route.ts +3 -0
- package/src/modules/customers/api/people/route.ts +12 -1
- package/src/modules/customers/api/todos/route.ts +1 -0
- package/src/modules/customers/backend/config/customers/deals/page.tsx +1 -0
- package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +36 -21
- package/src/modules/customers/backend/customers/companies/[id]/page.tsx +52 -27
- package/src/modules/customers/backend/customers/companies/page.tsx +2 -0
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +27 -5
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.ts +39 -7
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +1 -0
- package/src/modules/customers/backend/customers/deals/page.tsx +18 -6
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +64 -39
- package/src/modules/customers/backend/customers/people/[id]/page.tsx +46 -26
- package/src/modules/customers/backend/customers/people/page.tsx +2 -0
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +84 -24
- package/src/modules/customers/commands/addresses.ts +16 -14
- package/src/modules/customers/commands/companies.ts +3 -1
- package/src/modules/customers/commands/interactions.ts +50 -4
- package/src/modules/customers/commands/people.ts +2 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +8 -5
- package/src/modules/customers/commands/pipeline-stages.ts +16 -16
- package/src/modules/customers/components/AddressFormatSettings.tsx +1 -0
- package/src/modules/customers/components/DictionarySettings.tsx +18 -13
- package/src/modules/customers/components/DictionarySortSettings.tsx +4 -0
- package/src/modules/customers/components/PipelineSettings.tsx +42 -21
- package/src/modules/customers/components/detail/ActivityTimeline.tsx +3 -3
- package/src/modules/customers/components/detail/AddressesSection.tsx +4 -0
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +2 -0
- package/src/modules/customers/components/detail/DealsSection.tsx +4 -0
- package/src/modules/customers/components/detail/EmailCardActions.tsx +5 -0
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +7 -0
- package/src/modules/customers/components/detail/ManageTagsDialog.tsx +4 -0
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +4 -0
- package/src/modules/customers/components/detail/RoleAssignmentRow.tsx +2 -0
- package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +23 -7
- package/src/modules/customers/components/detail/hooks/useInteractionMutations.ts +25 -15
- package/src/modules/customers/components/detail/hooks/useInteractions.ts +76 -35
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +30 -17
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +2 -0
- package/src/modules/customers/components/detail/types.ts +1 -0
- package/src/modules/customers/components/formConfig.tsx +2 -0
- package/src/modules/customers/data/guards.ts +67 -0
- package/src/modules/customers/di.ts +66 -0
- package/src/modules/customers/i18n/de.json +2 -0
- package/src/modules/customers/i18n/en.json +2 -0
- package/src/modules/customers/i18n/es.json +2 -0
- package/src/modules/customers/i18n/pl.json +2 -0
- package/src/modules/customers/lib/todoCompatibility.ts +14 -0
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +2 -0
- package/src/modules/data_sync/api/options.ts +7 -4
- package/src/modules/data_sync/api/schedules/route.ts +9 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +18 -5
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +46 -19
- package/src/modules/data_sync/lib/sync-schedule-service.ts +11 -0
- package/src/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.ts +8 -1
- package/src/modules/dictionaries/api/[dictionaryId]/route.ts +23 -0
- package/src/modules/dictionaries/components/DictionariesManager.tsx +32 -9
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +30 -14
- package/src/modules/dictionaries/i18n/de.json +1 -0
- package/src/modules/dictionaries/i18n/en.json +1 -0
- package/src/modules/dictionaries/i18n/es.json +1 -0
- package/src/modules/dictionaries/i18n/pl.json +1 -0
- package/src/modules/directory/api/organizations/route.ts +3 -0
- package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +8 -0
- package/src/modules/directory/backend/directory/organizations/page.tsx +10 -5
- package/src/modules/directory/backend/directory/tenants/[id]/edit/page.tsx +16 -5
- package/src/modules/directory/backend/directory/tenants/page.tsx +8 -4
- package/src/modules/directory/commands/organizations.ts +7 -4
- package/src/modules/entities/api/records.ts +99 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.tsx +7 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +8 -4
- package/src/modules/entities/lib/helpers.ts +17 -0
- package/src/modules/feature_toggles/api/global/[id]/override/route.ts +1 -0
- package/src/modules/feature_toggles/api/overrides/route.ts +19 -0
- package/src/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.tsx +19 -13
- package/src/modules/feature_toggles/components/FeatureToggleOverrideCard.tsx +22 -12
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +7 -2
- package/src/modules/feature_toggles/components/formConfig.tsx +2 -1
- package/src/modules/feature_toggles/components/overrideFormConfig.tsx +10 -1
- package/src/modules/feature_toggles/data/validators.ts +11 -3
- package/src/modules/inbox_ops/api/settings/route.ts +18 -0
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +15 -10
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +9 -4
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +20 -11
- package/src/modules/integrations/backend/integrations/page.tsx +13 -8
- package/src/modules/messages/commands/messages.ts +27 -15
- package/src/modules/perspectives/api/[tableId]/route.ts +11 -2
- package/src/modules/perspectives/services/perspectiveService.ts +13 -1
- package/src/modules/planner/backend/planner/availability-rulesets/[id]/page.tsx +16 -14
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +6 -3
- package/src/modules/planner/components/AvailabilityRuleSetForm.tsx +3 -0
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +58 -15
- package/src/modules/planner/components/AvailabilitySchedule.tsx +22 -7
- package/src/modules/query_index/lib/engine.ts +34 -0
- package/src/modules/resources/backend/resources/resource-types/[id]/edit/page.tsx +7 -1
- package/src/modules/resources/backend/resources/resource-types/page.tsx +6 -3
- package/src/modules/resources/backend/resources/resources/[id]/page.tsx +23 -3
- package/src/modules/resources/backend/resources/resources/page.tsx +15 -4
- package/src/modules/resources/components/ResourceCrudForm.tsx +3 -0
- package/src/modules/resources/components/ResourceTypeCrudForm.tsx +2 -0
- package/src/modules/sales/api/documents/factory.ts +13 -1
- package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +6 -0
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +10 -4
- package/src/modules/sales/backend/sales/channels/page.tsx +19 -4
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +73 -20
- package/src/modules/sales/backend/sales/documents/create/page.tsx +2 -0
- package/src/modules/sales/commands/documentAddresses.ts +226 -4
- package/src/modules/sales/commands/documents.ts +28 -0
- package/src/modules/sales/commands/returns.ts +12 -3
- package/src/modules/sales/commands/shared.ts +36 -0
- package/src/modules/sales/commands/shipments.ts +17 -1
- package/src/modules/sales/components/AdjustmentKindSettings.tsx +20 -11
- package/src/modules/sales/components/DocumentNumberSettings.tsx +1 -0
- package/src/modules/sales/components/OrderEditingSettings.tsx +1 -0
- package/src/modules/sales/components/PaymentMethodsSettings.tsx +12 -4
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +12 -4
- package/src/modules/sales/components/StatusSettings.tsx +20 -11
- package/src/modules/sales/components/TaxRatesSettings.tsx +12 -5
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +67 -14
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +7 -4
- package/src/modules/sales/components/documents/AddressesSection.tsx +35 -25
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +50 -25
- package/src/modules/sales/components/documents/ItemsSection.tsx +24 -13
- package/src/modules/sales/components/documents/LineItemDialog.tsx +26 -9
- package/src/modules/sales/components/documents/PaymentDialog.tsx +33 -14
- package/src/modules/sales/components/documents/PaymentsSection.tsx +22 -10
- package/src/modules/sales/components/documents/ReturnDialog.tsx +28 -17
- package/src/modules/sales/components/documents/ReturnsSection.tsx +4 -1
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +11 -4
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +23 -8
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +20 -10
- package/src/modules/sales/components/documents/optimisticLock.ts +34 -0
- package/src/modules/sales/components/documents/shipmentTypes.ts +1 -0
- package/src/modules/sales/di.ts +35 -0
- package/src/modules/sales/i18n/de.json +3 -0
- package/src/modules/sales/i18n/en.json +3 -0
- package/src/modules/sales/i18n/es.json +3 -0
- package/src/modules/sales/i18n/pl.json +3 -0
- package/src/modules/staff/api/job-histories.ts +12 -2
- package/src/modules/staff/api/timesheets/time-entries/route.ts +16 -4
- package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +12 -7
- package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +2 -0
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +16 -5
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -2
- package/src/modules/staff/backend/staff/team-roles/[id]/edit/page.tsx +8 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +6 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +13 -3
- package/src/modules/staff/backend/staff/teams/page.tsx +9 -3
- package/src/modules/staff/backend/staff/timesheets/page.tsx +10 -1
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +9 -3
- package/src/modules/staff/commands/job-histories.ts +42 -3
- package/src/modules/staff/components/LeaveRequestForm.tsx +2 -0
- package/src/modules/staff/components/TeamForm.tsx +2 -0
- package/src/modules/staff/components/TeamMemberForm.tsx +2 -0
- package/src/modules/staff/components/TeamRoleForm.tsx +2 -0
- package/src/modules/staff/components/detail/JobHistorySection.tsx +28 -6
- package/src/modules/staff/data/validators.ts +6 -0
- package/src/modules/staff/i18n/de.json +1 -0
- package/src/modules/staff/i18n/en.json +1 -0
- package/src/modules/staff/i18n/es.json +1 -0
- package/src/modules/staff/i18n/pl.json +1 -0
- package/src/modules/staff/lib/leaveRequestHelpers.ts +4 -0
- package/src/modules/translations/components/TranslationManager.tsx +13 -8
- package/src/modules/workflows/api/definitions/[id]/route.ts +112 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +20 -4
- package/src/modules/workflows/backend/definitions/page.tsx +20 -9
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +29 -16
- package/src/modules/workflows/components/formConfig.tsx +5 -0
- package/src/modules/workflows/di.ts +20 -0
- package/src/modules/workflows/i18n/de.json +1 -0
- package/src/modules/workflows/i18n/en.json +1 -0
- package/src/modules/workflows/i18n/es.json +1 -0
- package/src/modules/workflows/i18n/pl.json +1 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/sales/backend/sales/documents/create/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { SalesDocumentForm } from '../../../../components/documents/SalesDocumentForm'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ninterface InboxDraft {\n actionId: string\n proposalId: string\n payload: Record<string, unknown>\n}\n\nfunction readInboxDraft(): InboxDraft | null {\n try {\n const raw = sessionStorage.getItem('inbox_ops.orderDraft')\n if (!raw) return null\n const parsed = JSON.parse(raw) as InboxDraft\n if (!parsed.actionId || !parsed.proposalId || !parsed.payload) return null\n return parsed\n } catch {\n return null\n }\n}\n\nexport default function CreateSalesDocumentPage() {\n const router = useRouter()\n const searchParams = useSearchParams()\n const t = useT()\n const requestedKind = searchParams.get('kind')\n const fromInboxAction = searchParams.get('fromInboxAction')\n const initialKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : undefined\n\n const inboxDraft = React.useMemo<InboxDraft | null>(() => {\n if (!fromInboxAction) return null\n return readInboxDraft()\n }, [fromInboxAction])\n\n const inboxPreFill = React.useMemo(() => {\n if (!inboxDraft) return undefined\n const p = inboxDraft.payload\n return {\n customerEntityId: typeof p.customerEntityId === 'string' ? p.customerEntityId : undefined,\n currencyCode: typeof p.currencyCode === 'string' ? p.currencyCode : undefined,\n channelId: typeof p.channelId === 'string' ? p.channelId : undefined,\n comments: typeof p.notes === 'string' ? p.notes : undefined,\n lineItems: Array.isArray(p.lineItems) ? (p.lineItems as Record<string, unknown>[]) : undefined,\n }\n }, [inboxDraft])\n\n const handleCreated = React.useCallback(async ({ id, kind }: { id: string; kind: 'order' | 'quote' }) => {\n if (inboxDraft) {\n try {\n sessionStorage.removeItem('inbox_ops.orderDraft')\n } catch { /* ignore */ }\n\n // Auto-add line items from the inbox draft\n const lineItems = Array.isArray(inboxDraft.payload.lineItems)\n ? (inboxDraft.payload.lineItems as Record<string, unknown>[])\n : []\n const lineEndpoint = kind === 'order' ? '/api/sales/order-lines' : '/api/sales/quote-lines'\n const currencyCode = typeof inboxDraft.payload.currencyCode === 'string'\n ? inboxDraft.payload.currencyCode.trim().toUpperCase()\n : 'USD'\n\n for (const [index, item] of lineItems.entries()) {\n try {\n const linePayload: Record<string, unknown> = {\n [kind === 'order' ? 'orderId' : 'quoteId']: id,\n quantity: typeof item.quantity === 'number' ? String(item.quantity) : (item.quantity || '1'),\n currencyCode,\n name: item.productName || item.name || `Line ${index + 1}`,\n kind: item.kind || (item.productId ? 'product' : 'service'),\n }\n if (item.productId) linePayload.productId = item.productId\n if (item.unitPrice) linePayload.unitPriceNet = item.unitPrice\n if (item.sku || item.catalogPrice) {\n linePayload.catalogSnapshot = {\n sku: item.sku ?? null,\n catalogPrice: item.catalogPrice ?? null,\n }\n }\n await apiCall(lineEndpoint, {\n method: 'POST',\n body: JSON.stringify(linePayload),\n })\n } catch {\n // Best-effort line creation; user can add remaining lines manually\n }\n }\n\n try {\n await apiCall(\n `/api/inbox_ops/proposals/${inboxDraft.proposalId}/actions/${inboxDraft.actionId}/complete`,\n {\n method: 'PATCH',\n body: JSON.stringify({\n createdEntityId: id,\n createdEntityType: kind === 'order' ? 'sales_order' : 'sales_quote',\n }),\n },\n )\n } catch {\n flash(t('inbox_ops.flash.complete_failed', 'Order created but failed to update inbox action status.'), 'warning')\n }\n }\n\n const target = `/backend/sales/documents/${encodeURIComponent(id)}?kind=${kind}`\n router.push(target)\n }, [inboxDraft, router, t])\n\n return (\n <Page>\n <PageBody>\n <SalesDocumentForm\n onCreated={handleCreated}\n isSubmitting={false}\n initialKind={initialKind}\n inboxPreFill={inboxPreFill}\n />\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </p>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { SalesDocumentForm } from '../../../../components/documents/SalesDocumentForm'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ninterface InboxDraft {\n actionId: string\n proposalId: string\n payload: Record<string, unknown>\n}\n\nfunction readInboxDraft(): InboxDraft | null {\n try {\n const raw = sessionStorage.getItem('inbox_ops.orderDraft')\n if (!raw) return null\n const parsed = JSON.parse(raw) as InboxDraft\n if (!parsed.actionId || !parsed.proposalId || !parsed.payload) return null\n return parsed\n } catch {\n return null\n }\n}\n\nexport default function CreateSalesDocumentPage() {\n const router = useRouter()\n const searchParams = useSearchParams()\n const t = useT()\n const requestedKind = searchParams.get('kind')\n const fromInboxAction = searchParams.get('fromInboxAction')\n const initialKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : undefined\n\n const inboxDraft = React.useMemo<InboxDraft | null>(() => {\n if (!fromInboxAction) return null\n return readInboxDraft()\n }, [fromInboxAction])\n\n const inboxPreFill = React.useMemo(() => {\n if (!inboxDraft) return undefined\n const p = inboxDraft.payload\n return {\n customerEntityId: typeof p.customerEntityId === 'string' ? p.customerEntityId : undefined,\n currencyCode: typeof p.currencyCode === 'string' ? p.currencyCode : undefined,\n channelId: typeof p.channelId === 'string' ? p.channelId : undefined,\n comments: typeof p.notes === 'string' ? p.notes : undefined,\n lineItems: Array.isArray(p.lineItems) ? (p.lineItems as Record<string, unknown>[]) : undefined,\n }\n }, [inboxDraft])\n\n const handleCreated = React.useCallback(async ({ id, kind }: { id: string; kind: 'order' | 'quote' }) => {\n if (inboxDraft) {\n try {\n sessionStorage.removeItem('inbox_ops.orderDraft')\n } catch { /* ignore */ }\n\n // Auto-add line items from the inbox draft\n const lineItems = Array.isArray(inboxDraft.payload.lineItems)\n ? (inboxDraft.payload.lineItems as Record<string, unknown>[])\n : []\n const lineEndpoint = kind === 'order' ? '/api/sales/order-lines' : '/api/sales/quote-lines'\n const currencyCode = typeof inboxDraft.payload.currencyCode === 'string'\n ? inboxDraft.payload.currencyCode.trim().toUpperCase()\n : 'USD'\n\n for (const [index, item] of lineItems.entries()) {\n try {\n const linePayload: Record<string, unknown> = {\n [kind === 'order' ? 'orderId' : 'quoteId']: id,\n quantity: typeof item.quantity === 'number' ? String(item.quantity) : (item.quantity || '1'),\n currencyCode,\n name: item.productName || item.name || `Line ${index + 1}`,\n kind: item.kind || (item.productId ? 'product' : 'service'),\n }\n if (item.productId) linePayload.productId = item.productId\n if (item.unitPrice) linePayload.unitPriceNet = item.unitPrice\n if (item.sku || item.catalogPrice) {\n linePayload.catalogSnapshot = {\n sku: item.sku ?? null,\n catalogPrice: item.catalogPrice ?? null,\n }\n }\n // optimistic-lock-exempt: create-only line item on newly created document, no prior version\n await apiCall(lineEndpoint, {\n method: 'POST',\n body: JSON.stringify(linePayload),\n })\n } catch {\n // Best-effort line creation; user can add remaining lines manually\n }\n }\n\n try {\n // optimistic-lock-exempt: one-time inbox action completion transition, create-only flow\n await apiCall(\n `/api/inbox_ops/proposals/${inboxDraft.proposalId}/actions/${inboxDraft.actionId}/complete`,\n {\n method: 'PATCH',\n body: JSON.stringify({\n createdEntityId: id,\n createdEntityType: kind === 'order' ? 'sales_order' : 'sales_quote',\n }),\n },\n )\n } catch {\n flash(t('inbox_ops.flash.complete_failed', 'Order created but failed to update inbox action status.'), 'warning')\n }\n }\n\n const target = `/backend/sales/documents/${encodeURIComponent(id)}?kind=${kind}`\n router.push(target)\n }, [inboxDraft, router, t])\n\n return (\n <Page>\n <PageBody>\n <SalesDocumentForm\n onCreated={handleCreated}\n isSubmitting={false}\n initialKind={initialKind}\n inboxPreFill={inboxPreFill}\n />\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </p>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { registerCommand } from "@open-mercato/shared/lib/commands";
|
|
2
|
+
import { emitCrudSideEffects } from "@open-mercato/shared/lib/commands/helpers";
|
|
2
3
|
import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
|
|
3
4
|
import {
|
|
4
5
|
documentAddressCreateSchema,
|
|
@@ -6,9 +7,80 @@ import {
|
|
|
6
7
|
documentAddressUpdateSchema
|
|
7
8
|
} from "../data/validators.js";
|
|
8
9
|
import { SalesDocumentAddress, SalesOrder, SalesQuote } from "../data/entities.js";
|
|
9
|
-
import { ensureOrganizationScope, ensureSameScope, ensureTenantScope, assertFound } from "./shared.js";
|
|
10
|
+
import { ensureOrganizationScope, ensureSameScope, ensureTenantScope, assertFound, extractUndoPayload } from "./shared.js";
|
|
10
11
|
import { loadSalesSettings } from "./settings.js";
|
|
11
12
|
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
13
|
+
import { E } from "../../../generated/entities.ids.generated.js";
|
|
14
|
+
const DOCUMENT_ADDRESS_ENTITY_TYPE = E.sales.sales_document_address;
|
|
15
|
+
function snapshotDocumentAddress(entity) {
|
|
16
|
+
return {
|
|
17
|
+
id: entity.id,
|
|
18
|
+
organizationId: entity.organizationId,
|
|
19
|
+
tenantId: entity.tenantId,
|
|
20
|
+
documentId: entity.documentId,
|
|
21
|
+
documentKind: entity.documentKind,
|
|
22
|
+
customerAddressId: entity.customerAddressId ?? null,
|
|
23
|
+
name: entity.name ?? null,
|
|
24
|
+
purpose: entity.purpose ?? null,
|
|
25
|
+
companyName: entity.companyName ?? null,
|
|
26
|
+
addressLine1: entity.addressLine1,
|
|
27
|
+
addressLine2: entity.addressLine2 ?? null,
|
|
28
|
+
buildingNumber: entity.buildingNumber ?? null,
|
|
29
|
+
flatNumber: entity.flatNumber ?? null,
|
|
30
|
+
city: entity.city ?? null,
|
|
31
|
+
region: entity.region ?? null,
|
|
32
|
+
postalCode: entity.postalCode ?? null,
|
|
33
|
+
country: entity.country ?? null,
|
|
34
|
+
latitude: entity.latitude ?? null,
|
|
35
|
+
longitude: entity.longitude ?? null
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function loadDocumentAddressSnapshot(em, id) {
|
|
39
|
+
const entity = await em.findOne(SalesDocumentAddress, { id });
|
|
40
|
+
return entity ? snapshotDocumentAddress(entity) : null;
|
|
41
|
+
}
|
|
42
|
+
function applyDocumentAddressSnapshot(em, entity, snapshot) {
|
|
43
|
+
entity.organizationId = snapshot.organizationId;
|
|
44
|
+
entity.tenantId = snapshot.tenantId;
|
|
45
|
+
entity.documentId = snapshot.documentId;
|
|
46
|
+
entity.documentKind = snapshot.documentKind;
|
|
47
|
+
entity.customerAddressId = snapshot.customerAddressId;
|
|
48
|
+
entity.name = snapshot.name;
|
|
49
|
+
entity.purpose = snapshot.purpose;
|
|
50
|
+
entity.companyName = snapshot.companyName;
|
|
51
|
+
entity.addressLine1 = snapshot.addressLine1;
|
|
52
|
+
entity.addressLine2 = snapshot.addressLine2;
|
|
53
|
+
entity.buildingNumber = snapshot.buildingNumber;
|
|
54
|
+
entity.flatNumber = snapshot.flatNumber;
|
|
55
|
+
entity.city = snapshot.city;
|
|
56
|
+
entity.region = snapshot.region;
|
|
57
|
+
entity.postalCode = snapshot.postalCode;
|
|
58
|
+
entity.country = snapshot.country;
|
|
59
|
+
entity.latitude = snapshot.latitude;
|
|
60
|
+
entity.longitude = snapshot.longitude;
|
|
61
|
+
entity.order = snapshot.documentKind === "order" ? em.getReference(SalesOrder, snapshot.documentId) : null;
|
|
62
|
+
entity.quote = snapshot.documentKind === "quote" ? em.getReference(SalesQuote, snapshot.documentId) : null;
|
|
63
|
+
}
|
|
64
|
+
async function emitDocumentAddressIndexSideEffects(ctx, action, snapshot) {
|
|
65
|
+
let dataEngine = null;
|
|
66
|
+
try {
|
|
67
|
+
dataEngine = ctx.container.resolve("dataEngine");
|
|
68
|
+
} catch {
|
|
69
|
+
dataEngine = null;
|
|
70
|
+
}
|
|
71
|
+
if (!dataEngine) return;
|
|
72
|
+
await emitCrudSideEffects({
|
|
73
|
+
dataEngine,
|
|
74
|
+
action,
|
|
75
|
+
entity: snapshot,
|
|
76
|
+
identifiers: {
|
|
77
|
+
id: snapshot.id,
|
|
78
|
+
organizationId: snapshot.organizationId,
|
|
79
|
+
tenantId: snapshot.tenantId
|
|
80
|
+
},
|
|
81
|
+
indexer: { entityType: DOCUMENT_ADDRESS_ENTITY_TYPE }
|
|
82
|
+
});
|
|
83
|
+
}
|
|
12
84
|
async function requireDocument(em, kind, id, organizationId, tenantId) {
|
|
13
85
|
const repo = kind === "order" ? SalesOrder : SalesQuote;
|
|
14
86
|
const doc = await em.findOne(repo, { id, organizationId, tenantId });
|
|
@@ -71,10 +143,48 @@ const createDocumentAddress = {
|
|
|
71
143
|
});
|
|
72
144
|
await em.persist(entity).flush();
|
|
73
145
|
return { id: entity.id };
|
|
146
|
+
},
|
|
147
|
+
captureAfter: async (_input, result, ctx) => {
|
|
148
|
+
const em = ctx.container.resolve("em").fork();
|
|
149
|
+
return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null;
|
|
150
|
+
},
|
|
151
|
+
buildLog: async ({ result, snapshots }) => {
|
|
152
|
+
const after = snapshots.after;
|
|
153
|
+
if (!after) return null;
|
|
154
|
+
const { translate } = await resolveTranslations();
|
|
155
|
+
return {
|
|
156
|
+
actionLabel: translate("sales.audit.document_addresses.create", "Add document address"),
|
|
157
|
+
resourceKind: "sales.document_address",
|
|
158
|
+
resourceId: result.id,
|
|
159
|
+
parentResourceKind: after.documentKind === "order" ? "sales.order" : "sales.quote",
|
|
160
|
+
parentResourceId: after.documentId,
|
|
161
|
+
tenantId: after.tenantId,
|
|
162
|
+
organizationId: after.organizationId,
|
|
163
|
+
snapshotAfter: after,
|
|
164
|
+
payload: { undo: { after } }
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
undo: async ({ logEntry, ctx }) => {
|
|
168
|
+
const payload = extractUndoPayload(logEntry);
|
|
169
|
+
const after = payload?.after;
|
|
170
|
+
if (!after) return;
|
|
171
|
+
ensureTenantScope(ctx, after.tenantId);
|
|
172
|
+
ensureOrganizationScope(ctx, after.organizationId);
|
|
173
|
+
const em = ctx.container.resolve("em").fork();
|
|
174
|
+
const entity = await em.findOne(SalesDocumentAddress, { id: after.id });
|
|
175
|
+
if (!entity) return;
|
|
176
|
+
await em.remove(entity).flush();
|
|
177
|
+
await emitDocumentAddressIndexSideEffects(ctx, "deleted", after);
|
|
74
178
|
}
|
|
75
179
|
};
|
|
76
180
|
const updateDocumentAddress = {
|
|
77
181
|
id: "sales.document-addresses.update",
|
|
182
|
+
async prepare(rawInput, ctx) {
|
|
183
|
+
const parsed = documentAddressUpdateSchema.parse(rawInput);
|
|
184
|
+
const em = ctx.container.resolve("em");
|
|
185
|
+
const snapshot = await loadDocumentAddressSnapshot(em, parsed.id);
|
|
186
|
+
return snapshot ? { before: snapshot } : {};
|
|
187
|
+
},
|
|
78
188
|
async execute(rawInput, ctx) {
|
|
79
189
|
const input = documentAddressUpdateSchema.parse(rawInput);
|
|
80
190
|
ensureTenantScope(ctx, input.tenantId);
|
|
@@ -111,10 +221,50 @@ const updateDocumentAddress = {
|
|
|
111
221
|
entity.longitude = input.longitude ?? null;
|
|
112
222
|
await em.flush();
|
|
113
223
|
return { id: entity.id };
|
|
224
|
+
},
|
|
225
|
+
captureAfter: async (_input, result, ctx) => {
|
|
226
|
+
const em = ctx.container.resolve("em").fork();
|
|
227
|
+
return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null;
|
|
228
|
+
},
|
|
229
|
+
buildLog: async ({ result, snapshots }) => {
|
|
230
|
+
const before = snapshots.before;
|
|
231
|
+
const after = snapshots.after;
|
|
232
|
+
if (!after) return null;
|
|
233
|
+
const { translate } = await resolveTranslations();
|
|
234
|
+
return {
|
|
235
|
+
actionLabel: translate("sales.audit.document_addresses.update", "Update document address"),
|
|
236
|
+
resourceKind: "sales.document_address",
|
|
237
|
+
resourceId: result.id,
|
|
238
|
+
parentResourceKind: after.documentKind === "order" ? "sales.order" : "sales.quote",
|
|
239
|
+
parentResourceId: after.documentId,
|
|
240
|
+
tenantId: after.tenantId,
|
|
241
|
+
organizationId: after.organizationId,
|
|
242
|
+
snapshotBefore: before ?? null,
|
|
243
|
+
snapshotAfter: after,
|
|
244
|
+
payload: { undo: { before: before ?? null, after } }
|
|
245
|
+
};
|
|
246
|
+
},
|
|
247
|
+
undo: async ({ logEntry, ctx }) => {
|
|
248
|
+
const payload = extractUndoPayload(logEntry);
|
|
249
|
+
const before = payload?.before;
|
|
250
|
+
if (!before) return;
|
|
251
|
+
ensureTenantScope(ctx, before.tenantId);
|
|
252
|
+
ensureOrganizationScope(ctx, before.organizationId);
|
|
253
|
+
const em = ctx.container.resolve("em").fork();
|
|
254
|
+
const entity = await em.findOne(SalesDocumentAddress, { id: before.id }) ?? em.create(SalesDocumentAddress, { id: before.id });
|
|
255
|
+
applyDocumentAddressSnapshot(em, entity, before);
|
|
256
|
+
await em.persist(entity).flush();
|
|
257
|
+
await emitDocumentAddressIndexSideEffects(ctx, "updated", before);
|
|
114
258
|
}
|
|
115
259
|
};
|
|
116
260
|
const deleteDocumentAddress = {
|
|
117
261
|
id: "sales.document-addresses.delete",
|
|
262
|
+
async prepare(rawInput, ctx) {
|
|
263
|
+
const parsed = documentAddressDeleteSchema.parse(rawInput);
|
|
264
|
+
const em = ctx.container.resolve("em");
|
|
265
|
+
const snapshot = await loadDocumentAddressSnapshot(em, parsed.id);
|
|
266
|
+
return snapshot ? { before: snapshot } : {};
|
|
267
|
+
},
|
|
118
268
|
async execute(rawInput, ctx) {
|
|
119
269
|
const input = documentAddressDeleteSchema.parse(rawInput);
|
|
120
270
|
ensureTenantScope(ctx, input.tenantId);
|
|
@@ -134,7 +284,36 @@ const deleteDocumentAddress = {
|
|
|
134
284
|
});
|
|
135
285
|
}
|
|
136
286
|
await em.remove(entity).flush();
|
|
137
|
-
return { ok: true };
|
|
287
|
+
return { ok: true, id: input.id };
|
|
288
|
+
},
|
|
289
|
+
buildLog: async ({ result, snapshots }) => {
|
|
290
|
+
const before = snapshots.before;
|
|
291
|
+
if (!before) return null;
|
|
292
|
+
const { translate } = await resolveTranslations();
|
|
293
|
+
return {
|
|
294
|
+
actionLabel: translate("sales.audit.document_addresses.delete", "Remove document address"),
|
|
295
|
+
resourceKind: "sales.document_address",
|
|
296
|
+
resourceId: result.id,
|
|
297
|
+
parentResourceKind: before.documentKind === "order" ? "sales.order" : "sales.quote",
|
|
298
|
+
parentResourceId: before.documentId,
|
|
299
|
+
tenantId: before.tenantId,
|
|
300
|
+
organizationId: before.organizationId,
|
|
301
|
+
snapshotBefore: before,
|
|
302
|
+
payload: { undo: { before } }
|
|
303
|
+
};
|
|
304
|
+
},
|
|
305
|
+
undo: async ({ logEntry, ctx }) => {
|
|
306
|
+
const payload = extractUndoPayload(logEntry);
|
|
307
|
+
const before = payload?.before;
|
|
308
|
+
if (!before) return;
|
|
309
|
+
ensureTenantScope(ctx, before.tenantId);
|
|
310
|
+
ensureOrganizationScope(ctx, before.organizationId);
|
|
311
|
+
const em = ctx.container.resolve("em").fork();
|
|
312
|
+
const existing = await em.findOne(SalesDocumentAddress, { id: before.id });
|
|
313
|
+
const entity = existing ?? em.create(SalesDocumentAddress, { id: before.id });
|
|
314
|
+
applyDocumentAddressSnapshot(em, entity, before);
|
|
315
|
+
await em.persist(entity).flush();
|
|
316
|
+
await emitDocumentAddressIndexSideEffects(ctx, "created", before);
|
|
138
317
|
}
|
|
139
318
|
};
|
|
140
319
|
const documentAddressCommands = [createDocumentAddress, updateDocumentAddress, deleteDocumentAddress];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/sales/commands/documentAddresses.ts"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\n\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport {\n documentAddressCreateSchema,\n documentAddressDeleteSchema,\n documentAddressUpdateSchema,\n type DocumentAddressCreateInput,\n type DocumentAddressUpdateInput,\n} from '../data/validators'\nimport { SalesDocumentAddress, SalesOrder, SalesQuote } from '../data/entities'\nimport { ensureOrganizationScope, ensureSameScope, ensureTenantScope, assertFound } from './shared'\nimport { loadSalesSettings } from './settings'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\n\nasync function requireDocument(\n em: EntityManager,\n kind: 'order' | 'quote',\n id: string,\n organizationId: string,\n tenantId: string\n): Promise<SalesOrder | SalesQuote> {\n const repo = kind === 'order' ? SalesOrder : SalesQuote\n const doc = await em.findOne(repo, { id, organizationId, tenantId })\n if (!doc) {\n throw new CrudHttpError(404, { error: 'sales.document.not_found' })\n }\n return doc\n}\n\nasync function assertAddressEditable(\n em: EntityManager,\n params: { organizationId: string; tenantId: string; status: string | null }\n): Promise<void> {\n const settings = await loadSalesSettings(em, {\n tenantId: params.tenantId,\n organizationId: params.organizationId,\n })\n const allowed = settings?.orderAddressEditableStatuses ?? null\n if (!Array.isArray(allowed)) return\n const { translate } = await resolveTranslations()\n if (allowed.length === 0) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n if (!params.status || !allowed.includes(params.status)) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n}\n\nconst createDocumentAddress: CommandHandler<DocumentAddressCreateInput, { id: string }> = {\n id: 'sales.document-addresses.create',\n async execute(rawInput, ctx) {\n const input = documentAddressCreateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n const entity = em.create(SalesDocumentAddress, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n documentId: input.documentId,\n documentKind: input.documentKind,\n customerAddressId: input.customerAddressId ?? null,\n name: input.name ?? null,\n purpose: input.purpose ?? null,\n companyName: input.companyName ?? null,\n addressLine1: input.addressLine1,\n addressLine2: input.addressLine2 ?? null,\n buildingNumber: input.buildingNumber ?? null,\n flatNumber: input.flatNumber ?? null,\n city: input.city ?? null,\n region: input.region ?? null,\n postalCode: input.postalCode ?? null,\n country: input.country ?? null,\n latitude: input.latitude ?? null,\n longitude: input.longitude ?? null,\n order: input.documentKind === 'order' ? (document as SalesOrder) : null,\n quote: input.documentKind === 'quote' ? (document as SalesQuote) : null,\n })\n await em.persist(entity).flush()\n return { id: entity.id }\n },\n}\n\nconst updateDocumentAddress: CommandHandler<DocumentAddressUpdateInput, { id: string }> = {\n id: 'sales.document-addresses.update',\n async execute(rawInput, ctx) {\n const input = documentAddressUpdateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await em.findOne(SalesDocumentAddress, { id: input.id }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n entity.documentId = input.documentId\n entity.documentKind = input.documentKind\n entity.customerAddressId = input.customerAddressId ?? null\n entity.name = input.name ?? null\n entity.purpose = input.purpose ?? null\n entity.companyName = input.companyName ?? null\n entity.addressLine1 = input.addressLine1\n entity.addressLine2 = input.addressLine2 ?? null\n entity.buildingNumber = input.buildingNumber ?? null\n entity.flatNumber = input.flatNumber ?? null\n entity.city = input.city ?? null\n entity.region = input.region ?? null\n entity.postalCode = input.postalCode ?? null\n entity.country = input.country ?? null\n entity.latitude = input.latitude ?? null\n entity.longitude = input.longitude ?? null\n\n await em.flush()\n return { id: entity.id }\n },\n}\n\nconst deleteDocumentAddress: CommandHandler<\n { id: string; documentId: string; documentKind: 'order' | 'quote'; organizationId: string; tenantId: string },\n { ok: true }\n> = {\n id: 'sales.document-addresses.delete',\n async execute(rawInput, ctx) {\n const input = documentAddressDeleteSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await em.findOne(SalesDocumentAddress, { id: input.id }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n await em.remove(entity).flush()\n return { ok: true }\n },\n}\n\nexport const documentAddressCommands = [createDocumentAddress, updateDocumentAddress, deleteDocumentAddress]\n\nregisterCommand(createDocumentAddress)\nregisterCommand(updateDocumentAddress)\nregisterCommand(deleteDocumentAddress)\n"],
|
|
5
|
-
"mappings": "AAEA,SAAS,uBAA4C;
|
|
4
|
+
"sourcesContent": ["// @ts-nocheck\n\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport {\n documentAddressCreateSchema,\n documentAddressDeleteSchema,\n documentAddressUpdateSchema,\n type DocumentAddressCreateInput,\n type DocumentAddressDeleteInput,\n type DocumentAddressUpdateInput,\n} from '../data/validators'\nimport { SalesDocumentAddress, SalesOrder, SalesQuote } from '../data/entities'\nimport { ensureOrganizationScope, ensureSameScope, ensureTenantScope, assertFound, extractUndoPayload } from './shared'\nimport { loadSalesSettings } from './settings'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { E } from '#generated/entities.ids.generated'\n\nconst DOCUMENT_ADDRESS_ENTITY_TYPE = E.sales.sales_document_address\n\ntype DocumentAddressSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n documentId: string\n documentKind: 'order' | 'quote'\n customerAddressId: string | null\n name: string | null\n purpose: string | null\n companyName: string | null\n addressLine1: string\n addressLine2: string | null\n buildingNumber: string | null\n flatNumber: string | null\n city: string | null\n region: string | null\n postalCode: string | null\n country: string | null\n latitude: number | null\n longitude: number | null\n}\n\ntype DocumentAddressUndoPayload = {\n before?: DocumentAddressSnapshot | null\n after?: DocumentAddressSnapshot | null\n}\n\nfunction snapshotDocumentAddress(entity: SalesDocumentAddress): DocumentAddressSnapshot {\n return {\n id: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n documentId: entity.documentId,\n documentKind: entity.documentKind as 'order' | 'quote',\n customerAddressId: entity.customerAddressId ?? null,\n name: entity.name ?? null,\n purpose: entity.purpose ?? null,\n companyName: entity.companyName ?? null,\n addressLine1: entity.addressLine1,\n addressLine2: entity.addressLine2 ?? null,\n buildingNumber: entity.buildingNumber ?? null,\n flatNumber: entity.flatNumber ?? null,\n city: entity.city ?? null,\n region: entity.region ?? null,\n postalCode: entity.postalCode ?? null,\n country: entity.country ?? null,\n latitude: entity.latitude ?? null,\n longitude: entity.longitude ?? null,\n }\n}\n\nasync function loadDocumentAddressSnapshot(\n em: EntityManager,\n id: string\n): Promise<DocumentAddressSnapshot | null> {\n const entity = await em.findOne(SalesDocumentAddress, { id })\n return entity ? snapshotDocumentAddress(entity) : null\n}\n\nfunction applyDocumentAddressSnapshot(em: EntityManager, entity: SalesDocumentAddress, snapshot: DocumentAddressSnapshot): void {\n entity.organizationId = snapshot.organizationId\n entity.tenantId = snapshot.tenantId\n entity.documentId = snapshot.documentId\n entity.documentKind = snapshot.documentKind\n entity.customerAddressId = snapshot.customerAddressId\n entity.name = snapshot.name\n entity.purpose = snapshot.purpose\n entity.companyName = snapshot.companyName\n entity.addressLine1 = snapshot.addressLine1\n entity.addressLine2 = snapshot.addressLine2\n entity.buildingNumber = snapshot.buildingNumber\n entity.flatNumber = snapshot.flatNumber\n entity.city = snapshot.city\n entity.region = snapshot.region\n entity.postalCode = snapshot.postalCode\n entity.country = snapshot.country\n entity.latitude = snapshot.latitude\n entity.longitude = snapshot.longitude\n entity.order = snapshot.documentKind === 'order' ? em.getReference(SalesOrder, snapshot.documentId) : null\n entity.quote = snapshot.documentKind === 'quote' ? em.getReference(SalesQuote, snapshot.documentId) : null\n}\n\nasync function emitDocumentAddressIndexSideEffects(\n ctx: { container: { resolve: (name: string) => unknown } },\n action: 'created' | 'updated' | 'deleted',\n snapshot: DocumentAddressSnapshot\n): Promise<void> {\n let dataEngine: DataEngine | null = null\n try {\n dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n } catch {\n dataEngine = null\n }\n if (!dataEngine) return\n await emitCrudSideEffects({\n dataEngine,\n action,\n entity: snapshot,\n identifiers: {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n },\n indexer: { entityType: DOCUMENT_ADDRESS_ENTITY_TYPE },\n })\n}\n\nasync function requireDocument(\n em: EntityManager,\n kind: 'order' | 'quote',\n id: string,\n organizationId: string,\n tenantId: string\n): Promise<SalesOrder | SalesQuote> {\n const repo = kind === 'order' ? SalesOrder : SalesQuote\n const doc = await em.findOne(repo, { id, organizationId, tenantId })\n if (!doc) {\n throw new CrudHttpError(404, { error: 'sales.document.not_found' })\n }\n return doc\n}\n\nasync function assertAddressEditable(\n em: EntityManager,\n params: { organizationId: string; tenantId: string; status: string | null }\n): Promise<void> {\n const settings = await loadSalesSettings(em, {\n tenantId: params.tenantId,\n organizationId: params.organizationId,\n })\n const allowed = settings?.orderAddressEditableStatuses ?? null\n if (!Array.isArray(allowed)) return\n const { translate } = await resolveTranslations()\n if (allowed.length === 0) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n if (!params.status || !allowed.includes(params.status)) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n}\n\nconst createDocumentAddress: CommandHandler<DocumentAddressCreateInput, { id: string }> = {\n id: 'sales.document-addresses.create',\n async execute(rawInput, ctx) {\n const input = documentAddressCreateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n const entity = em.create(SalesDocumentAddress, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n documentId: input.documentId,\n documentKind: input.documentKind,\n customerAddressId: input.customerAddressId ?? null,\n name: input.name ?? null,\n purpose: input.purpose ?? null,\n companyName: input.companyName ?? null,\n addressLine1: input.addressLine1,\n addressLine2: input.addressLine2 ?? null,\n buildingNumber: input.buildingNumber ?? null,\n flatNumber: input.flatNumber ?? null,\n city: input.city ?? null,\n region: input.region ?? null,\n postalCode: input.postalCode ?? null,\n country: input.country ?? null,\n latitude: input.latitude ?? null,\n longitude: input.longitude ?? null,\n order: input.documentKind === 'order' ? (document as SalesOrder) : null,\n quote: input.documentKind === 'quote' ? (document as SalesQuote) : null,\n })\n await em.persist(entity).flush()\n return { id: entity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as DocumentAddressSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.create', 'Add document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: after.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: after.documentId,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: { undo: { after } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n ensureTenantScope(ctx, after.tenantId)\n ensureOrganizationScope(ctx, after.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = await em.findOne(SalesDocumentAddress, { id: after.id })\n if (!entity) return\n await em.remove(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'deleted', after)\n },\n}\n\nconst updateDocumentAddress: CommandHandler<DocumentAddressUpdateInput, { id: string }> = {\n id: 'sales.document-addresses.update',\n async prepare(rawInput, ctx) {\n const parsed = documentAddressUpdateSchema.parse(rawInput)\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadDocumentAddressSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = documentAddressUpdateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await em.findOne(SalesDocumentAddress, { id: input.id }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n entity.documentId = input.documentId\n entity.documentKind = input.documentKind\n entity.customerAddressId = input.customerAddressId ?? null\n entity.name = input.name ?? null\n entity.purpose = input.purpose ?? null\n entity.companyName = input.companyName ?? null\n entity.addressLine1 = input.addressLine1\n entity.addressLine2 = input.addressLine2 ?? null\n entity.buildingNumber = input.buildingNumber ?? null\n entity.flatNumber = input.flatNumber ?? null\n entity.city = input.city ?? null\n entity.region = input.region ?? null\n entity.postalCode = input.postalCode ?? null\n entity.country = input.country ?? null\n entity.latitude = input.latitude ?? null\n entity.longitude = input.longitude ?? null\n\n await em.flush()\n return { id: entity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as DocumentAddressSnapshot | undefined\n const after = snapshots.after as DocumentAddressSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.update', 'Update document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: after.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: after.documentId,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: { undo: { before: before ?? null, after } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity =\n (await em.findOne(SalesDocumentAddress, { id: before.id })) ??\n em.create(SalesDocumentAddress, { id: before.id } as Partial<SalesDocumentAddress>)\n applyDocumentAddressSnapshot(em, entity, before)\n await em.persist(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'updated', before)\n },\n}\n\nconst deleteDocumentAddress: CommandHandler<\n DocumentAddressDeleteInput,\n { ok: true; id: string }\n> = {\n id: 'sales.document-addresses.delete',\n async prepare(rawInput, ctx) {\n const parsed = documentAddressDeleteSchema.parse(rawInput)\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadDocumentAddressSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = documentAddressDeleteSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await em.findOne(SalesDocumentAddress, { id: input.id }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n await em.remove(entity).flush()\n return { ok: true, id: input.id }\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as DocumentAddressSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.delete', 'Remove document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: before.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: before.documentId,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: { undo: { before } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await em.findOne(SalesDocumentAddress, { id: before.id })\n const entity = existing ?? em.create(SalesDocumentAddress, { id: before.id } as Partial<SalesDocumentAddress>)\n applyDocumentAddressSnapshot(em, entity, before)\n await em.persist(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'created', before)\n },\n}\n\nexport const documentAddressCommands = [createDocumentAddress, updateDocumentAddress, deleteDocumentAddress]\n\nregisterCommand(createDocumentAddress)\nregisterCommand(updateDocumentAddress)\nregisterCommand(deleteDocumentAddress)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -77,7 +77,10 @@ import {
|
|
|
77
77
|
ensureOrganizationScope,
|
|
78
78
|
ensureTenantScope,
|
|
79
79
|
extractUndoPayload,
|
|
80
|
-
toNumericString
|
|
80
|
+
toNumericString,
|
|
81
|
+
enforceSalesDocumentOptimisticLock,
|
|
82
|
+
SALES_RESOURCE_KIND_ORDER,
|
|
83
|
+
SALES_RESOURCE_KIND_QUOTE
|
|
81
84
|
} from "./shared.js";
|
|
82
85
|
import {
|
|
83
86
|
loadShipmentSnapshot,
|
|
@@ -3499,6 +3502,7 @@ const updateQuoteCommand = {
|
|
|
3499
3502
|
if (!quote)
|
|
3500
3503
|
throw new CrudHttpError(404, { error: "Sales quote not found" });
|
|
3501
3504
|
ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);
|
|
3505
|
+
enforceSalesDocumentOptimisticLock(ctx, quote, SALES_RESOURCE_KIND_QUOTE);
|
|
3502
3506
|
const shouldInvalidateSentToken = (quote.status ?? null) === "sent";
|
|
3503
3507
|
if (shouldInvalidateSentToken) {
|
|
3504
3508
|
quote.acceptanceToken = null;
|
|
@@ -3523,6 +3527,13 @@ const updateQuoteCommand = {
|
|
|
3523
3527
|
value: "draft"
|
|
3524
3528
|
});
|
|
3525
3529
|
}
|
|
3530
|
+
},
|
|
3531
|
+
// Scalar mutations above are persisted by withAtomicFlush's per-phase
|
|
3532
|
+
// flush boundary before the recalc reads below run any query on the same
|
|
3533
|
+
// EntityManager. MikroORM v7 would otherwise silently discard pending
|
|
3534
|
+
// scalar changes on `quote` when the `em.find` line/adjustment lookups
|
|
3535
|
+
// reset the changeset (see SPEC-018).
|
|
3536
|
+
async () => {
|
|
3526
3537
|
if (shouldRecalculateTotals) {
|
|
3527
3538
|
const [existingLines, adjustments] = await Promise.all([
|
|
3528
3539
|
em.find(
|
|
@@ -3716,6 +3727,14 @@ const updateOrderCommand = {
|
|
|
3716
3727
|
input: parsed,
|
|
3717
3728
|
em
|
|
3718
3729
|
});
|
|
3730
|
+
},
|
|
3731
|
+
// Scalar mutations above are persisted by withAtomicFlush's per-phase
|
|
3732
|
+
// flush boundary before the recalc reads and the status-change-note
|
|
3733
|
+
// lookup below run any query on the same EntityManager. MikroORM v7 would
|
|
3734
|
+
// otherwise silently discard pending scalar changes on `order` when the
|
|
3735
|
+
// `em.find` lines/adjustments or appendOrderStatusChangeNote queries
|
|
3736
|
+
// reset the changeset (see SPEC-018).
|
|
3737
|
+
async () => {
|
|
3719
3738
|
if (shouldRecalculateTotals) {
|
|
3720
3739
|
const [existingLines, adjustments] = await Promise.all([
|
|
3721
3740
|
em.find(
|
|
@@ -4413,6 +4432,7 @@ const convertQuoteToOrderCommand = {
|
|
|
4413
4432
|
)
|
|
4414
4433
|
});
|
|
4415
4434
|
ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);
|
|
4435
|
+
enforceSalesDocumentOptimisticLock(ctx, quote, SALES_RESOURCE_KIND_QUOTE);
|
|
4416
4436
|
const snapshot = await loadQuoteSnapshot(em, payload.quoteId);
|
|
4417
4437
|
if (!snapshot)
|
|
4418
4438
|
throw new CrudHttpError(404, {
|
|
@@ -4808,6 +4828,7 @@ const orderLineUpsertCommand = {
|
|
|
4808
4828
|
if (!order)
|
|
4809
4829
|
throw new CrudHttpError(404, { error: "Sales order not found" });
|
|
4810
4830
|
ensureOrderScope(ctx, order.organizationId, order.tenantId);
|
|
4831
|
+
enforceSalesDocumentOptimisticLock(ctx, order, SALES_RESOURCE_KIND_ORDER);
|
|
4811
4832
|
const [existingLines, adjustments] = await Promise.all([
|
|
4812
4833
|
em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: "asc" } }),
|
|
4813
4834
|
em.find(
|
|
@@ -5064,6 +5085,7 @@ const orderLineDeleteCommand = {
|
|
|
5064
5085
|
)
|
|
5065
5086
|
});
|
|
5066
5087
|
ensureOrderScope(ctx, order.organizationId, order.tenantId);
|
|
5088
|
+
enforceSalesDocumentOptimisticLock(ctx, order, SALES_RESOURCE_KIND_ORDER);
|
|
5067
5089
|
const shipmentCount = await em.count(SalesShipmentItem, {
|
|
5068
5090
|
orderLine: parsed.id,
|
|
5069
5091
|
shipment: { deletedAt: null }
|
|
@@ -5223,6 +5245,7 @@ const quoteLineUpsertCommand = {
|
|
|
5223
5245
|
if (!quote)
|
|
5224
5246
|
throw new CrudHttpError(404, { error: "Sales quote not found" });
|
|
5225
5247
|
ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);
|
|
5248
|
+
enforceSalesDocumentOptimisticLock(ctx, quote, SALES_RESOURCE_KIND_QUOTE);
|
|
5226
5249
|
const [existingLines, adjustments] = await Promise.all([
|
|
5227
5250
|
em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: "asc" } }),
|
|
5228
5251
|
em.find(
|
|
@@ -5472,6 +5495,7 @@ const quoteLineDeleteCommand = {
|
|
|
5472
5495
|
if (!quote)
|
|
5473
5496
|
throw new CrudHttpError(404, { error: "Sales quote not found" });
|
|
5474
5497
|
ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);
|
|
5498
|
+
enforceSalesDocumentOptimisticLock(ctx, quote, SALES_RESOURCE_KIND_QUOTE);
|
|
5475
5499
|
const existingLines = await em.find(
|
|
5476
5500
|
SalesQuoteLine,
|
|
5477
5501
|
{ quote },
|
|
@@ -5614,6 +5638,7 @@ const orderAdjustmentUpsertCommand = {
|
|
|
5614
5638
|
if (!order)
|
|
5615
5639
|
throw new CrudHttpError(404, { error: "Sales order not found" });
|
|
5616
5640
|
ensureOrderScope(ctx, order.organizationId, order.tenantId);
|
|
5641
|
+
enforceSalesDocumentOptimisticLock(ctx, order, SALES_RESOURCE_KIND_ORDER);
|
|
5617
5642
|
if (parsed.scope === "line") {
|
|
5618
5643
|
throw new CrudHttpError(400, {
|
|
5619
5644
|
error: "Line-scoped adjustments are not supported yet."
|
|
@@ -5866,6 +5891,7 @@ const orderAdjustmentDeleteCommand = {
|
|
|
5866
5891
|
if (!order)
|
|
5867
5892
|
throw new CrudHttpError(404, { error: "Sales order not found" });
|
|
5868
5893
|
ensureOrderScope(ctx, order.organizationId, order.tenantId);
|
|
5894
|
+
enforceSalesDocumentOptimisticLock(ctx, order, SALES_RESOURCE_KIND_ORDER);
|
|
5869
5895
|
const [existingLines, adjustments] = await Promise.all([
|
|
5870
5896
|
em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: "asc" } }),
|
|
5871
5897
|
em.find(
|
|
@@ -6022,6 +6048,7 @@ const quoteAdjustmentUpsertCommand = {
|
|
|
6022
6048
|
if (!quote)
|
|
6023
6049
|
throw new CrudHttpError(404, { error: "Sales quote not found" });
|
|
6024
6050
|
ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);
|
|
6051
|
+
enforceSalesDocumentOptimisticLock(ctx, quote, SALES_RESOURCE_KIND_QUOTE);
|
|
6025
6052
|
if (parsed.scope === "line") {
|
|
6026
6053
|
throw new CrudHttpError(400, {
|
|
6027
6054
|
error: "Line-scoped adjustments are not supported yet."
|
|
@@ -6272,6 +6299,7 @@ const quoteAdjustmentDeleteCommand = {
|
|
|
6272
6299
|
if (!quote)
|
|
6273
6300
|
throw new CrudHttpError(404, { error: "Sales quote not found" });
|
|
6274
6301
|
ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);
|
|
6302
|
+
enforceSalesDocumentOptimisticLock(ctx, quote, SALES_RESOURCE_KIND_QUOTE);
|
|
6275
6303
|
const [existingLines, adjustments] = await Promise.all([
|
|
6276
6304
|
em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: "asc" } }),
|
|
6277
6305
|
em.find(
|