@open-mercato/core 0.9.1-develop.7473.1.de5b22888f → 0.9.1-develop.7475.1.28ca93ed97
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 +2 -2
- package/dist/generated/entities/catalog_price_history_entry/index.js +53 -0
- package/dist/generated/entities/catalog_price_history_entry/index.js.map +7 -0
- package/dist/generated/entities/customer_group_terms/index.js +2 -0
- package/dist/generated/entities/customer_group_terms/index.js.map +2 -2
- package/dist/generated/entities/ecommerce_store/index.js +33 -0
- package/dist/generated/entities/ecommerce_store/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js +29 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js +23 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +8 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +72 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/customerGroupsFixtures.js.map +2 -2
- package/dist/modules/catalog/acl.js +8 -1
- package/dist/modules/catalog/acl.js.map +2 -2
- package/dist/modules/catalog/api/config/omnibus/route.js +184 -0
- package/dist/modules/catalog/api/config/omnibus/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/history/route.js +131 -0
- package/dist/modules/catalog/api/prices/history/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js +184 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js.map +7 -0
- package/dist/modules/catalog/api/products/route.js +54 -245
- package/dist/modules/catalog/api/products/route.js.map +3 -3
- package/dist/modules/catalog/api/tags/route.js +6 -0
- package/dist/modules/catalog/api/tags/route.js.map +2 -2
- package/dist/modules/catalog/backend/config/catalog/page.js +3 -1
- package/dist/modules/catalog/backend/config/catalog/page.js.map +2 -2
- package/dist/modules/catalog/cli.js +80 -2
- package/dist/modules/catalog/cli.js.map +2 -2
- package/dist/modules/catalog/commands/categories.js +51 -2
- package/dist/modules/catalog/commands/categories.js.map +2 -2
- package/dist/modules/catalog/commands/prices.js +43 -1
- package/dist/modules/catalog/commands/prices.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +71 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +7 -0
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/OmnibusSettings.js +703 -0
- package/dist/modules/catalog/components/OmnibusSettings.js.map +7 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js +152 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js.map +7 -0
- package/dist/modules/catalog/components/lookupSources.js +31 -0
- package/dist/modules/catalog/components/lookupSources.js.map +7 -0
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js +8 -2
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +11 -1
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/catalog/data/entities.js +122 -1
- package/dist/modules/catalog/data/entities.js.map +2 -2
- package/dist/modules/catalog/data/validators.js +78 -0
- package/dist/modules/catalog/data/validators.js.map +2 -2
- package/dist/modules/catalog/di.js +18 -0
- package/dist/modules/catalog/di.js.map +2 -2
- package/dist/modules/catalog/lib/omnibus.js +285 -0
- package/dist/modules/catalog/lib/omnibus.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js +146 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusCache.js +89 -0
- package/dist/modules/catalog/lib/omnibusCache.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusConfig.js +64 -0
- package/dist/modules/catalog/lib/omnibusConfig.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js +191 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js +73 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js +94 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusTypes.js +115 -0
- package/dist/modules/catalog/lib/omnibusTypes.js.map +7 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js +55 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js.map +7 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js +103 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js.map +7 -0
- package/dist/modules/catalog/lib/pricing.js +26 -2
- package/dist/modules/catalog/lib/pricing.js.map +2 -2
- package/dist/modules/catalog/lib/productFilters.js +273 -0
- package/dist/modules/catalog/lib/productFilters.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeKeys.js +105 -0
- package/dist/modules/catalog/lib/productScopeKeys.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeReindex.js +73 -0
- package/dist/modules/catalog/lib/productScopeReindex.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js.map +7 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js +480 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js.map +7 -0
- package/dist/modules/catalog/setup.js +3 -1
- package/dist/modules/catalog/setup.js.map +2 -2
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js +16 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js.map +7 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js +17 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js.map +7 -0
- package/dist/modules/catalog/translations.js +10 -0
- package/dist/modules/catalog/translations.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +28 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js +5 -0
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js.map +2 -2
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js +111 -3
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js.map +2 -2
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js +43 -0
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js.map +7 -0
- package/dist/modules/customer_groups/data/entities.js +3 -0
- package/dist/modules/customer_groups/data/entities.js.map +2 -2
- package/dist/modules/customer_groups/data/validators.js +9 -0
- package/dist/modules/customer_groups/data/validators.js.map +2 -2
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js +17 -0
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js.map +7 -0
- package/dist/modules/customer_groups/services/customerGroupsService.js +62 -15
- package/dist/modules/customer_groups/services/customerGroupsService.js.map +2 -2
- package/dist/modules/ecommerce/acl.js +13 -0
- package/dist/modules/ecommerce/acl.js.map +7 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js +72 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/openapi.js +27 -0
- package/dist/modules/ecommerce/api/openapi.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js +109 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js +265 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js +67 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js +296 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js +73 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js +50 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js +163 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js +177 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js +78 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js +25 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js +58 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js +183 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js +92 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/crud.js +401 -0
- package/dist/modules/ecommerce/api/stores/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/route.js +64 -0
- package/dist/modules/ecommerce/api/stores/route.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/commands/stores.js +110 -0
- package/dist/modules/ecommerce/commands/stores.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js +90 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js +33 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js +11 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js.map +7 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js +24 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js +190 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js +67 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js +69 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js +218 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js +270 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js +313 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js +164 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js +162 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js +357 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js +155 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js +167 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreListPage.js +290 -0
- package/dist/modules/ecommerce/components/StoreListPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js +132 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js +20 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js.map +7 -0
- package/dist/modules/ecommerce/components/channelLookups.js +28 -0
- package/dist/modules/ecommerce/components/channelLookups.js.map +7 -0
- package/dist/modules/ecommerce/components/storeAdmin.js +41 -0
- package/dist/modules/ecommerce/components/storeAdmin.js.map +7 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js +197 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js.map +7 -0
- package/dist/modules/ecommerce/components/storeChannels.js +140 -0
- package/dist/modules/ecommerce/components/storeChannels.js.map +7 -0
- package/dist/modules/ecommerce/components/storeDomains.js +167 -0
- package/dist/modules/ecommerce/components/storeDomains.js.map +7 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js +62 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js.map +7 -0
- package/dist/modules/ecommerce/components/storeGeneral.js +95 -0
- package/dist/modules/ecommerce/components/storeGeneral.js.map +7 -0
- package/dist/modules/ecommerce/components/storeSeo.js +69 -0
- package/dist/modules/ecommerce/components/storeSeo.js.map +7 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js +45 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js +28 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js.map +7 -0
- package/dist/modules/ecommerce/data/enrichers.js +157 -0
- package/dist/modules/ecommerce/data/enrichers.js.map +7 -0
- package/dist/modules/ecommerce/data/entities.js +197 -0
- package/dist/modules/ecommerce/data/entities.js.map +7 -0
- package/dist/modules/ecommerce/data/validators.js +406 -0
- package/dist/modules/ecommerce/data/validators.js.map +7 -0
- package/dist/modules/ecommerce/di.js +11 -0
- package/dist/modules/ecommerce/di.js.map +7 -0
- package/dist/modules/ecommerce/events.js +27 -0
- package/dist/modules/ecommerce/events.js.map +7 -0
- package/dist/modules/ecommerce/index.js +16 -0
- package/dist/modules/ecommerce/index.js.map +7 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js +112 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js +184 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js.map +7 -0
- package/dist/modules/ecommerce/lib/buyerContext.js +284 -0
- package/dist/modules/ecommerce/lib/buyerContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js +186 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js +236 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js.map +7 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js +29 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudEvents.js +94 -0
- package/dist/modules/ecommerce/lib/crudEvents.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudSupport.js +64 -0
- package/dist/modules/ecommerce/lib/crudSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js +99 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js +39 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js.map +7 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js +57 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js.map +7 -0
- package/dist/modules/ecommerce/lib/references.js +70 -0
- package/dist/modules/ecommerce/lib/references.js.map +7 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js +99 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js +109 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBranding.js +40 -0
- package/dist/modules/ecommerce/lib/storeBranding.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js +76 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContext.js +393 -0
- package/dist/modules/ecommerce/lib/storeContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContextService.js +43 -0
- package/dist/modules/ecommerce/lib/storeContextService.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeLocale.js +60 -0
- package/dist/modules/ecommerce/lib/storeLocale.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js +41 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js +248 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js +241 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js +71 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js +447 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js +441 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js +15 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js +393 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js +90 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js +107 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js +670 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js +156 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js +99 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js +303 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js +35 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js +33 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/types.js +1 -0
- package/dist/modules/ecommerce/lib/types.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js +32 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js +17 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/notifications.client.js +47 -0
- package/dist/modules/ecommerce/notifications.client.js.map +7 -0
- package/dist/modules/ecommerce/notifications.js +48 -0
- package/dist/modules/ecommerce/notifications.js.map +7 -0
- package/dist/modules/ecommerce/search.js +83 -0
- package/dist/modules/ecommerce/search.js.map +7 -0
- package/dist/modules/ecommerce/setup.js +17 -0
- package/dist/modules/ecommerce/setup.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js +16 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js.map +7 -0
- package/dist/modules/query_index/lib/batch.js +23 -9
- package/dist/modules/query_index/lib/batch.js.map +2 -2
- package/dist/modules/query_index/lib/doc-enrichers.js +212 -0
- package/dist/modules/query_index/lib/doc-enrichers.js.map +7 -0
- package/dist/modules/query_index/lib/document.js +2 -0
- package/dist/modules/query_index/lib/document.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +68 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +7 -0
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +2 -0
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js +17 -0
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js.map +7 -0
- package/dist/modules/translations/components/TranslationManager.js +3 -3
- package/dist/modules/translations/components/TranslationManager.js.map +2 -2
- package/dist/modules/translations/data/validators.js +1 -1
- package/dist/modules/translations/data/validators.js.map +1 -1
- package/dist/modules/translations/lib/batch.js +21 -1
- package/dist/modules/translations/lib/batch.js.map +2 -2
- package/dist/modules/translations/lib/helpers.js +3 -0
- package/dist/modules/translations/lib/helpers.js.map +2 -2
- package/dist/modules/translations/lib/resolve-field-list.js +14 -2
- package/dist/modules/translations/lib/resolve-field-list.js.map +2 -2
- package/generated/entities/catalog_price_history_entry/index.ts +25 -0
- package/generated/entities/customer_group_terms/index.ts +1 -0
- package/generated/entities/ecommerce_store/index.ts +15 -0
- package/generated/entities/ecommerce_store_channel_binding/index.ts +13 -0
- package/generated/entities/ecommerce_store_domain_binding/index.ts +10 -0
- package/generated/entities.ids.generated.ts +8 -1
- package/generated/entity-fields-registry.ts +72 -0
- package/package.json +7 -7
- package/src/helpers/integration/customerGroupsFixtures.ts +2 -0
- package/src/modules/auth/i18n/de.json +8 -0
- package/src/modules/auth/i18n/en.json +8 -0
- package/src/modules/auth/i18n/es.json +8 -0
- package/src/modules/auth/i18n/ko.json +8 -0
- package/src/modules/auth/i18n/pl.json +8 -0
- package/src/modules/catalog/AGENTS.md +5 -2
- package/src/modules/catalog/acl.ts +7 -0
- package/src/modules/catalog/api/config/omnibus/route.ts +204 -0
- package/src/modules/catalog/api/prices/history/route.ts +139 -0
- package/src/modules/catalog/api/prices/omnibus-preview/route.ts +202 -0
- package/src/modules/catalog/api/products/route.ts +53 -308
- package/src/modules/catalog/api/tags/route.ts +6 -0
- package/src/modules/catalog/backend/config/catalog/page.tsx +2 -0
- package/src/modules/catalog/cli.ts +84 -1
- package/src/modules/catalog/commands/categories.ts +54 -2
- package/src/modules/catalog/commands/prices.ts +43 -1
- package/src/modules/catalog/commands/products.ts +84 -1
- package/src/modules/catalog/commands/variants.ts +7 -0
- package/src/modules/catalog/components/OmnibusSettings.tsx +832 -0
- package/src/modules/catalog/components/PriceEditorOmnibusRow.tsx +219 -0
- package/src/modules/catalog/components/lookupSources.ts +29 -0
- package/src/modules/catalog/components/prices/PriceScopeSelectors.tsx +9 -0
- package/src/modules/catalog/components/products/VariantBuilder.tsx +9 -0
- package/src/modules/catalog/data/entities.ts +123 -1
- package/src/modules/catalog/data/validators.ts +118 -0
- package/src/modules/catalog/di.ts +23 -0
- package/src/modules/catalog/i18n/de.json +77 -0
- package/src/modules/catalog/i18n/en.json +77 -0
- package/src/modules/catalog/i18n/es.json +77 -0
- package/src/modules/catalog/i18n/ko.json +77 -0
- package/src/modules/catalog/i18n/pl.json +77 -0
- package/src/modules/catalog/lib/omnibus.ts +406 -0
- package/src/modules/catalog/lib/omnibusBackfill.ts +198 -0
- package/src/modules/catalog/lib/omnibusCache.ts +111 -0
- package/src/modules/catalog/lib/omnibusConfig.ts +73 -0
- package/src/modules/catalog/lib/omnibusHistoryQueries.ts +248 -0
- package/src/modules/catalog/lib/omnibusPresentedEntry.ts +76 -0
- package/src/modules/catalog/lib/omnibusProductListEnrichment.ts +125 -0
- package/src/modules/catalog/lib/omnibusTypes.ts +202 -0
- package/src/modules/catalog/lib/optionSchemaTranslations.ts +55 -0
- package/src/modules/catalog/lib/priceHistoryQuery.ts +155 -0
- package/src/modules/catalog/lib/pricing.ts +42 -4
- package/src/modules/catalog/lib/productFilters.ts +349 -0
- package/src/modules/catalog/lib/productScopeKeys.ts +162 -0
- package/src/modules/catalog/lib/productScopeReindex.ts +139 -0
- package/src/modules/catalog/migrations/.snapshot-open-mercato.json +572 -0
- package/src/modules/catalog/migrations/Migration20261005105352_catalog.ts +39 -0
- package/src/modules/catalog/migrations/Migration20261005150824_catalog.ts +39 -0
- package/src/modules/catalog/services/catalogOmnibusService.ts +642 -0
- package/src/modules/catalog/setup.ts +2 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-deleted.ts +18 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-updated.ts +19 -0
- package/src/modules/catalog/translations.ts +12 -0
- package/src/modules/configs/i18n/de.json +5 -1
- package/src/modules/configs/i18n/en.json +5 -1
- package/src/modules/configs/i18n/es.json +5 -1
- package/src/modules/configs/i18n/ko.json +5 -1
- package/src/modules/configs/i18n/pl.json +5 -1
- package/src/modules/configs/lib/upgrade-actions.ts +35 -0
- package/src/modules/customer_groups/api/customer-groups/[id]/terms/route.ts +7 -0
- package/src/modules/customer_groups/components/CustomerGroupTermsSection.tsx +124 -2
- package/src/modules/customer_groups/components/customerGroupAssortmentScope.ts +46 -0
- package/src/modules/customer_groups/data/entities.ts +4 -0
- package/src/modules/customer_groups/data/validators.ts +14 -0
- package/src/modules/customer_groups/i18n/de.json +12 -0
- package/src/modules/customer_groups/i18n/en.json +12 -0
- package/src/modules/customer_groups/i18n/es.json +12 -0
- package/src/modules/customer_groups/i18n/ko.json +12 -0
- package/src/modules/customer_groups/i18n/pl.json +12 -0
- package/src/modules/customer_groups/migrations/.snapshot-open-mercato.json +17 -0
- package/src/modules/customer_groups/migrations/Migration20261005110250_customer_groups.ts +15 -0
- package/src/modules/customer_groups/services/customerGroupsService.ts +74 -23
- package/src/modules/ecommerce/acl.ts +9 -0
- package/src/modules/ecommerce/api/domain-mappings/route.ts +76 -0
- package/src/modules/ecommerce/api/openapi.ts +28 -0
- package/src/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.ts +141 -0
- package/src/modules/ecommerce/api/store-channel-bindings/crud.ts +283 -0
- package/src/modules/ecommerce/api/store-channel-bindings/route.ts +67 -0
- package/src/modules/ecommerce/api/store-domain-bindings/crud.ts +324 -0
- package/src/modules/ecommerce/api/store-domain-bindings/route.ts +73 -0
- package/src/modules/ecommerce/api/storefront/categories/[slug]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/categories/openapiSchemas.ts +63 -0
- package/src/modules/ecommerce/api/storefront/categories/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/context/route.ts +203 -0
- package/src/modules/ecommerce/api/storefront/products/[idOrHandle]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/products/openapiSchemas.ts +193 -0
- package/src/modules/ecommerce/api/storefront/products/route.ts +81 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.ts +25 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/storefrontRouteSupport.ts +68 -0
- package/src/modules/ecommerce/api/stores/[id]/branding/route.ts +205 -0
- package/src/modules/ecommerce/api/stores/[id]/preview-branding/route.ts +99 -0
- package/src/modules/ecommerce/api/stores/crud.ts +457 -0
- package/src/modules/ecommerce/api/stores/route.ts +66 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.tsx +5 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.tsx +5 -0
- package/src/modules/ecommerce/commands/stores.ts +154 -0
- package/src/modules/ecommerce/components/ChannelAssortmentCount.tsx +138 -0
- package/src/modules/ecommerce/components/ChannelBindingFormSections.tsx +40 -0
- package/src/modules/ecommerce/components/ChannelLookupPicker.tsx +5 -0
- package/src/modules/ecommerce/components/DomainStatusWarning.tsx +32 -0
- package/src/modules/ecommerce/components/StoreAvailabilityDefaultsSection.tsx +219 -0
- package/src/modules/ecommerce/components/StoreBrandingControls.tsx +73 -0
- package/src/modules/ecommerce/components/StoreBrandingPreview.tsx +77 -0
- package/src/modules/ecommerce/components/StoreBrandingTab.tsx +242 -0
- package/src/modules/ecommerce/components/StoreChannelBindingDialog.tsx +306 -0
- package/src/modules/ecommerce/components/StoreChannelsTab.tsx +375 -0
- package/src/modules/ecommerce/components/StoreCreateDialog.tsx +204 -0
- package/src/modules/ecommerce/components/StoreDomainBindingDialog.tsx +198 -0
- package/src/modules/ecommerce/components/StoreDomainsTab.tsx +426 -0
- package/src/modules/ecommerce/components/StoreEditPage.tsx +193 -0
- package/src/modules/ecommerce/components/StoreGeneralTab.tsx +189 -0
- package/src/modules/ecommerce/components/StoreListPage.tsx +326 -0
- package/src/modules/ecommerce/components/StoreSeoTab.tsx +152 -0
- package/src/modules/ecommerce/components/StoreStatusBadge.tsx +22 -0
- package/src/modules/ecommerce/components/channelLookups.ts +24 -0
- package/src/modules/ecommerce/components/storeAdmin.ts +56 -0
- package/src/modules/ecommerce/components/storeBrandingForm.ts +230 -0
- package/src/modules/ecommerce/components/storeChannels.ts +210 -0
- package/src/modules/ecommerce/components/storeDomains.ts +221 -0
- package/src/modules/ecommerce/components/storeEditTabs.tsx +76 -0
- package/src/modules/ecommerce/components/storeGeneral.ts +155 -0
- package/src/modules/ecommerce/components/storeSeo.ts +78 -0
- package/src/modules/ecommerce/components/useChannelAssortmentCount.ts +67 -0
- package/src/modules/ecommerce/components/useStoreAccess.ts +36 -0
- package/src/modules/ecommerce/data/enrichers.ts +213 -0
- package/src/modules/ecommerce/data/entities.ts +168 -0
- package/src/modules/ecommerce/data/validators.ts +587 -0
- package/src/modules/ecommerce/di.ts +9 -0
- package/src/modules/ecommerce/events.ts +27 -0
- package/src/modules/ecommerce/i18n/de.json +341 -0
- package/src/modules/ecommerce/i18n/en.json +341 -0
- package/src/modules/ecommerce/i18n/es.json +341 -0
- package/src/modules/ecommerce/i18n/ko.json +341 -0
- package/src/modules/ecommerce/i18n/pl.json +341 -0
- package/src/modules/ecommerce/index.ts +14 -0
- package/src/modules/ecommerce/lib/assortmentCount.ts +175 -0
- package/src/modules/ecommerce/lib/brandingStyles.ts +215 -0
- package/src/modules/ecommerce/lib/buyerContext.ts +401 -0
- package/src/modules/ecommerce/lib/cacheInvalidation.ts +302 -0
- package/src/modules/ecommerce/lib/cacheKeys.ts +340 -0
- package/src/modules/ecommerce/lib/createConflictRecheck.ts +31 -0
- package/src/modules/ecommerce/lib/crudEvents.ts +128 -0
- package/src/modules/ecommerce/lib/crudSupport.ts +85 -0
- package/src/modules/ecommerce/lib/domainBindingRebind.ts +138 -0
- package/src/modules/ecommerce/lib/domainMappingSummaries.ts +71 -0
- package/src/modules/ecommerce/lib/exclusiveFlag.ts +90 -0
- package/src/modules/ecommerce/lib/references.ts +93 -0
- package/src/modules/ecommerce/lib/seedDraftStore.ts +125 -0
- package/src/modules/ecommerce/lib/storeBindingCascade.ts +138 -0
- package/src/modules/ecommerce/lib/storeBranding.ts +48 -0
- package/src/modules/ecommerce/lib/storeBrandingRoute.ts +91 -0
- package/src/modules/ecommerce/lib/storeContext.ts +669 -0
- package/src/modules/ecommerce/lib/storeContextService.ts +71 -0
- package/src/modules/ecommerce/lib/storeLocale.ts +88 -0
- package/src/modules/ecommerce/lib/storeNotifications.ts +55 -0
- package/src/modules/ecommerce/lib/storefrontCatalogSupport.ts +427 -0
- package/src/modules/ecommerce/lib/storefrontCategories.ts +419 -0
- package/src/modules/ecommerce/lib/storefrontCategoryCache.ts +113 -0
- package/src/modules/ecommerce/lib/storefrontDetail.ts +654 -0
- package/src/modules/ecommerce/lib/storefrontFacets.ts +697 -0
- package/src/modules/ecommerce/lib/storefrontOptionFilter.ts +44 -0
- package/src/modules/ecommerce/lib/storefrontPricing.ts +583 -0
- package/src/modules/ecommerce/lib/storefrontProductCache.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontProductScope.ts +181 -0
- package/src/modules/ecommerce/lib/storefrontProducts.ts +963 -0
- package/src/modules/ecommerce/lib/storefrontQuery.ts +215 -0
- package/src/modules/ecommerce/lib/storefrontRateLimit.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontSearch.ts +454 -0
- package/src/modules/ecommerce/lib/storefrontSearchCache.ts +49 -0
- package/src/modules/ecommerce/lib/subscriberSupport.ts +41 -0
- package/src/modules/ecommerce/lib/types.ts +69 -0
- package/src/modules/ecommerce/migrations/.snapshot-open-mercato.json +829 -0
- package/src/modules/ecommerce/migrations/Migration20261005113233_ecommerce.ts +32 -0
- package/src/modules/ecommerce/migrations/Migration20261006112733_ecommerce.ts +15 -0
- package/src/modules/ecommerce/notifications.client.ts +46 -0
- package/src/modules/ecommerce/notifications.ts +46 -0
- package/src/modules/ecommerce/search.ts +93 -0
- package/src/modules/ecommerce/setup.ts +15 -0
- package/src/modules/ecommerce/subscribers/assortment-empty-notifications.ts +12 -0
- package/src/modules/ecommerce/subscribers/availability-policy-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-category-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-price-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-product-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/domain-binding-rebind.ts +14 -0
- package/src/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-notifications.ts +12 -0
- package/src/modules/query_index/lib/batch.ts +25 -9
- package/src/modules/query_index/lib/doc-enrichers.ts +306 -0
- package/src/modules/query_index/lib/document.ts +2 -0
- package/src/modules/query_index/lib/engine.ts +58 -1
- package/src/modules/query_index/lib/indexer.ts +8 -0
- package/src/modules/query_index/lib/search-tokens.ts +2 -0
- package/src/modules/query_index/migrations/Migration20261005201500_query_index.ts +42 -0
- package/src/modules/translations/components/TranslationManager.tsx +3 -3
- package/src/modules/translations/data/validators.ts +1 -1
- package/src/modules/translations/lib/batch.ts +47 -0
- package/src/modules/translations/lib/helpers.ts +4 -0
- package/src/modules/translations/lib/resolve-field-list.ts +16 -2
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerTranslatableEntityListPath,
|
|
3
|
+
registerTranslatableFieldExpander,
|
|
4
|
+
} from '@open-mercato/shared/lib/localization/translatable-fields'
|
|
5
|
+
import {
|
|
6
|
+
OPTION_SCHEMA_TEMPLATE_ENTITY_TYPE,
|
|
7
|
+
expandOptionSchemaTranslationFields,
|
|
8
|
+
} from './lib/optionSchemaTranslations'
|
|
9
|
+
|
|
1
10
|
export const translatableFields: Record<string, string[]> = {
|
|
2
11
|
'catalog:catalog_product': ['title', 'subtitle', 'description', 'seoTitle', 'seoDescription'],
|
|
3
12
|
'catalog:catalog_product_variant': ['name'],
|
|
@@ -7,4 +16,7 @@ export const translatableFields: Record<string, string[]> = {
|
|
|
7
16
|
'catalog:catalog_product_tag': ['label'],
|
|
8
17
|
}
|
|
9
18
|
|
|
19
|
+
registerTranslatableFieldExpander(OPTION_SCHEMA_TEMPLATE_ENTITY_TYPE, expandOptionSchemaTranslationFields)
|
|
20
|
+
registerTranslatableEntityListPath(OPTION_SCHEMA_TEMPLATE_ENTITY_TYPE, '/api/catalog/option-schemas')
|
|
21
|
+
|
|
10
22
|
export default translatableFields
|
|
@@ -201,5 +201,9 @@
|
|
|
201
201
|
"configs.upgrades.devicesPushTokenEncryption.cta": "Push-Tokens von Geräten verschlüsseln",
|
|
202
202
|
"configs.upgrades.devicesPushTokenEncryption.loading": "Verschlüsselungszuordnung für Push-Tokens wird angelegt…",
|
|
203
203
|
"configs.upgrades.devicesPushTokenEncryption.message": "Version {{version}} fügt mobile Push-Benachrichtigungen hinzu und verschlüsselt Geräte-Push-Tokens im Ruhezustand. Bestehende Mandanten haben keine Verschlüsselungszuordnung für die neue Geräte-Entität, sodass nach dem Upgrade registrierte Tokens unverschlüsselt gespeichert würden. Führen Sie dies aus, um die Zuordnung anzulegen, damit Push-Tokens verschlüsselt werden.",
|
|
204
|
-
"configs.upgrades.devicesPushTokenEncryption.success": "Verschlüsselungszuordnung für Push-Tokens angelegt."
|
|
204
|
+
"configs.upgrades.devicesPushTokenEncryption.success": "Verschlüsselungszuordnung für Push-Tokens angelegt.",
|
|
205
|
+
"configs.upgrades.ecommerceDraftStore.cta": "Standard-Shop erstellen",
|
|
206
|
+
"configs.upgrades.ecommerceDraftStore.loading": "Standard-Shop wird erstellt…",
|
|
207
|
+
"configs.upgrades.ecommerceDraftStore.message": "Version {{version}} fügt das Shop-Modul hinzu. Arbeitsbereiche, die schon vorher existierten, haben noch keinen Shop. Führen Sie dies aus, um aus dem Namen Ihrer Organisation einen Entwurfs-Shop zu erstellen, den Sie dann konfigurieren können. Existiert bereits ein Shop, passiert nichts.",
|
|
208
|
+
"configs.upgrades.ecommerceDraftStore.success": "Standard-Shop erstellt."
|
|
205
209
|
}
|
|
@@ -201,5 +201,9 @@
|
|
|
201
201
|
"configs.upgrades.devicesPushTokenEncryption.cta": "Encrypt device push tokens",
|
|
202
202
|
"configs.upgrades.devicesPushTokenEncryption.loading": "Seeding push-token encryption map…",
|
|
203
203
|
"configs.upgrades.devicesPushTokenEncryption.message": "Version {{version}} adds mobile push and encrypts device push tokens at rest. Existing tenants have no encryption map for the new device entity, so tokens registered after the upgrade would be stored unencrypted. Run this to seed the map so push tokens are encrypted.",
|
|
204
|
-
"configs.upgrades.devicesPushTokenEncryption.success": "Push-token encryption map seeded."
|
|
204
|
+
"configs.upgrades.devicesPushTokenEncryption.success": "Push-token encryption map seeded.",
|
|
205
|
+
"configs.upgrades.ecommerceDraftStore.cta": "Create the default store",
|
|
206
|
+
"configs.upgrades.ecommerceDraftStore.loading": "Creating the default store…",
|
|
207
|
+
"configs.upgrades.ecommerceDraftStore.message": "Version {{version}} adds the Stores module. Workspaces that existed before it have no store yet. Run this to create one draft store from your organization's name so you have something to configure. It does nothing if a store already exists.",
|
|
208
|
+
"configs.upgrades.ecommerceDraftStore.success": "Default store created."
|
|
205
209
|
}
|
|
@@ -201,5 +201,9 @@
|
|
|
201
201
|
"configs.upgrades.devicesPushTokenEncryption.cta": "Cifrar tokens push de dispositivos",
|
|
202
202
|
"configs.upgrades.devicesPushTokenEncryption.loading": "Creando el mapa de cifrado de tokens push…",
|
|
203
203
|
"configs.upgrades.devicesPushTokenEncryption.message": "La versión {{version}} añade notificaciones push móviles y cifra los tokens push de los dispositivos en reposo. Los inquilinos existentes no tienen un mapa de cifrado para la nueva entidad de dispositivo, por lo que los tokens registrados tras la actualización se guardarían sin cifrar. Ejecuta esto para crear el mapa y que los tokens push queden cifrados.",
|
|
204
|
-
"configs.upgrades.devicesPushTokenEncryption.success": "Mapa de cifrado de tokens push creado."
|
|
204
|
+
"configs.upgrades.devicesPushTokenEncryption.success": "Mapa de cifrado de tokens push creado.",
|
|
205
|
+
"configs.upgrades.ecommerceDraftStore.cta": "Crear la tienda predeterminada",
|
|
206
|
+
"configs.upgrades.ecommerceDraftStore.loading": "Creando la tienda predeterminada…",
|
|
207
|
+
"configs.upgrades.ecommerceDraftStore.message": "La versión {{version}} añade el módulo de tiendas. Los espacios de trabajo anteriores aún no tienen ninguna tienda. Ejecuta esto para crear una tienda en borrador a partir del nombre de tu organización y tener algo que configurar. No hace nada si ya existe una tienda.",
|
|
208
|
+
"configs.upgrades.ecommerceDraftStore.success": "Tienda predeterminada creada."
|
|
205
209
|
}
|
|
@@ -201,5 +201,9 @@
|
|
|
201
201
|
"configs.upgrades.devicesPushTokenEncryption.cta": "기기 푸시 토큰 암호화",
|
|
202
202
|
"configs.upgrades.devicesPushTokenEncryption.loading": "푸시 토큰 암호화 맵을 생성하는 중…",
|
|
203
203
|
"configs.upgrades.devicesPushTokenEncryption.message": "{{version}} 버전에서 모바일 푸시가 추가되며 기기 푸시 토큰이 저장 시 암호화됩니다. 기존 테넌트에는 새 기기 엔티티에 대한 암호화 맵이 없어, 업그레이드 이후 등록되는 토큰이 암호화되지 않은 상태로 저장됩니다. 이 작업을 실행해 맵을 생성하면 푸시 토큰이 암호화됩니다.",
|
|
204
|
-
"configs.upgrades.devicesPushTokenEncryption.success": "푸시 토큰 암호화 맵이 생성되었습니다."
|
|
204
|
+
"configs.upgrades.devicesPushTokenEncryption.success": "푸시 토큰 암호화 맵이 생성되었습니다.",
|
|
205
|
+
"configs.upgrades.ecommerceDraftStore.cta": "기본 스토어 만들기",
|
|
206
|
+
"configs.upgrades.ecommerceDraftStore.loading": "기본 스토어를 만드는 중…",
|
|
207
|
+
"configs.upgrades.ecommerceDraftStore.message": "{{version}} 버전에서 스토어 모듈이 추가됩니다. 이전부터 있던 워크스페이스에는 아직 스토어가 없습니다. 이 작업을 실행하면 조직 이름으로 초안 스토어가 하나 생성되어 바로 설정을 시작할 수 있습니다. 이미 스토어가 있으면 아무 작업도 하지 않습니다.",
|
|
208
|
+
"configs.upgrades.ecommerceDraftStore.success": "기본 스토어가 생성되었습니다."
|
|
205
209
|
}
|
|
@@ -201,5 +201,9 @@
|
|
|
201
201
|
"configs.upgrades.devicesPushTokenEncryption.cta": "Szyfruj tokeny push urządzeń",
|
|
202
202
|
"configs.upgrades.devicesPushTokenEncryption.loading": "Tworzenie mapy szyfrowania tokenów push…",
|
|
203
203
|
"configs.upgrades.devicesPushTokenEncryption.message": "Wersja {{version}} dodaje mobilne powiadomienia push i szyfruje tokeny push urządzeń w spoczynku. Istniejący najemcy nie mają mapy szyfrowania dla nowej encji urządzenia, więc tokeny zarejestrowane po aktualizacji byłyby przechowywane bez szyfrowania. Uruchom to, aby utworzyć mapę i zaszyfrować tokeny push.",
|
|
204
|
-
"configs.upgrades.devicesPushTokenEncryption.success": "Utworzono mapę szyfrowania tokenów push."
|
|
204
|
+
"configs.upgrades.devicesPushTokenEncryption.success": "Utworzono mapę szyfrowania tokenów push.",
|
|
205
|
+
"configs.upgrades.ecommerceDraftStore.cta": "Utwórz domyślny sklep",
|
|
206
|
+
"configs.upgrades.ecommerceDraftStore.loading": "Tworzenie domyślnego sklepu…",
|
|
207
|
+
"configs.upgrades.ecommerceDraftStore.message": "Wersja {{version}} dodaje moduł sklepów. Przestrzenie robocze istniejące wcześniej nie mają jeszcze żadnego sklepu. Uruchom to, aby utworzyć jeden sklep w wersji szkicu na podstawie nazwy organizacji, który możesz skonfigurować. Jeśli sklep już istnieje, nic się nie dzieje.",
|
|
208
|
+
"configs.upgrades.ecommerceDraftStore.success": "Utworzono domyślny sklep."
|
|
205
209
|
}
|
|
@@ -7,6 +7,13 @@ import { reconcileAttachmentOrganizations } from '@open-mercato/core/modules/att
|
|
|
7
7
|
|
|
8
8
|
const logger = createLogger('configs').child({ component: 'upgrade-actions' })
|
|
9
9
|
|
|
10
|
+
type BaseCurrencyResolver = {
|
|
11
|
+
resolveBaseCurrency(scope: {
|
|
12
|
+
tenantId: string
|
|
13
|
+
organizationIds: string[]
|
|
14
|
+
}): Promise<{ status: 'resolved'; code: string } | { status: 'missing' | 'ambiguous' | 'unavailable' }>
|
|
15
|
+
}
|
|
16
|
+
|
|
10
17
|
export type UpgradeActionContext = {
|
|
11
18
|
tenantId: string
|
|
12
19
|
organizationId: string
|
|
@@ -176,6 +183,34 @@ export const upgradeActions: UpgradeActionDefinition[] = [
|
|
|
176
183
|
else await invalidate()
|
|
177
184
|
},
|
|
178
185
|
},
|
|
186
|
+
{
|
|
187
|
+
id: 'ecommerce.seed-draft-store',
|
|
188
|
+
version: '0.9.1',
|
|
189
|
+
messageKey: 'configs.upgrades.ecommerceDraftStore.message',
|
|
190
|
+
ctaKey: 'configs.upgrades.ecommerceDraftStore.cta',
|
|
191
|
+
successKey: 'configs.upgrades.ecommerceDraftStore.success',
|
|
192
|
+
loadingKey: 'configs.upgrades.ecommerceDraftStore.loading',
|
|
193
|
+
requiredModules: ['ecommerce'],
|
|
194
|
+
run: async ({ container, em, tenantId, organizationId }) => {
|
|
195
|
+
const { seedDraftStore } = await import('@open-mercato/core/modules/ecommerce/lib/seedDraftStore')
|
|
196
|
+
const result = await seedDraftStore(
|
|
197
|
+
em,
|
|
198
|
+
{ tenantId, organizationId },
|
|
199
|
+
{
|
|
200
|
+
resolveCurrencyCode: async () => {
|
|
201
|
+
try {
|
|
202
|
+
const resolver = container.resolve<BaseCurrencyResolver>('baseCurrencyService')
|
|
203
|
+
const resolution = await resolver.resolveBaseCurrency({ tenantId, organizationIds: [organizationId] })
|
|
204
|
+
return resolution.status === 'resolved' ? resolution.code : null
|
|
205
|
+
} catch {
|
|
206
|
+
return null
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
)
|
|
211
|
+
logger.info('ecommerce draft store seed completed', { tenantId, organizationId, status: result.status })
|
|
212
|
+
},
|
|
213
|
+
},
|
|
179
214
|
]
|
|
180
215
|
|
|
181
216
|
export function actionsUpToVersion(version: string): UpgradeActionDefinition[] {
|
|
@@ -9,12 +9,14 @@ import { CrudHttpError, badRequest, conflict, isCrudHttpError, isUniqueViolation
|
|
|
9
9
|
import { enforceCommandOptimisticLock } from '@open-mercato/shared/lib/crud/optimistic-lock-command'
|
|
10
10
|
import { runRouteMutationGuards } from '@open-mercato/shared/lib/crud/route-mutation-guard'
|
|
11
11
|
import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
12
|
+
import type { AssortmentScope } from '@open-mercato/shared/lib/catalog-visibility'
|
|
12
13
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
13
14
|
import { getTelemetryRuntime } from '@open-mercato/shared/lib/telemetry/runtime'
|
|
14
15
|
import { CustomerGroup, CustomerGroupTerms } from '../../../../data/entities'
|
|
15
16
|
import { isPriceKindInTenant } from '../../../../lib/priceKindScope'
|
|
16
17
|
import { announceCustomerGroupTermsUpdated } from '../../../../lib/groupEvents'
|
|
17
18
|
import {
|
|
19
|
+
assortmentScopeSchema,
|
|
18
20
|
customerGroupTermsCreateSchema,
|
|
19
21
|
customerGroupTermsUpdateSchema,
|
|
20
22
|
type CustomerGroupTermsCreateInput,
|
|
@@ -113,6 +115,7 @@ function serializeTerms(terms: CustomerGroupTerms) {
|
|
|
113
115
|
creditCurrencyCode: terms.creditCurrencyCode ?? null,
|
|
114
116
|
approvalRequiredAbove: toNumberOrNull(terms.approvalRequiredAbove),
|
|
115
117
|
minOrderValue: toNumberOrNull(terms.minOrderValue),
|
|
118
|
+
assortmentScope: terms.assortmentScope ?? null,
|
|
116
119
|
metadata: terms.metadata ?? null,
|
|
117
120
|
createdAt: terms.createdAt.toISOString(),
|
|
118
121
|
updatedAt: terms.updatedAt.toISOString(),
|
|
@@ -159,6 +162,7 @@ type CustomerGroupTermsEntityData = {
|
|
|
159
162
|
creditCurrencyCode: string | null
|
|
160
163
|
approvalRequiredAbove: string | null
|
|
161
164
|
minOrderValue: string | null
|
|
165
|
+
assortmentScope: AssortmentScope | null
|
|
162
166
|
metadata: Record<string, unknown> | null
|
|
163
167
|
}
|
|
164
168
|
|
|
@@ -174,6 +178,7 @@ function toEntityData(input: CustomerGroupTermsCreateInput): CustomerGroupTermsE
|
|
|
174
178
|
creditCurrencyCode: input.creditCurrencyCode ?? null,
|
|
175
179
|
approvalRequiredAbove: toNumericString(input.approvalRequiredAbove),
|
|
176
180
|
minOrderValue: toNumericString(input.minOrderValue),
|
|
181
|
+
assortmentScope: input.assortmentScope ?? null,
|
|
177
182
|
metadata: input.metadata ?? null,
|
|
178
183
|
}
|
|
179
184
|
}
|
|
@@ -193,6 +198,7 @@ function applyTermsUpdate(entity: CustomerGroupTerms, input: CustomerGroupTermsU
|
|
|
193
198
|
if (hasOwn(input, 'creditCurrencyCode')) entity.creditCurrencyCode = input.creditCurrencyCode ?? null
|
|
194
199
|
if (hasOwn(input, 'approvalRequiredAbove')) entity.approvalRequiredAbove = toNumericString(input.approvalRequiredAbove)
|
|
195
200
|
if (hasOwn(input, 'minOrderValue')) entity.minOrderValue = toNumericString(input.minOrderValue)
|
|
201
|
+
if (hasOwn(input, 'assortmentScope')) entity.assortmentScope = input.assortmentScope ?? null
|
|
196
202
|
if (hasOwn(input, 'metadata')) entity.metadata = input.metadata ?? null
|
|
197
203
|
}
|
|
198
204
|
|
|
@@ -314,6 +320,7 @@ const termsItemSchema = z.object({
|
|
|
314
320
|
creditCurrencyCode: z.string().nullable(),
|
|
315
321
|
approvalRequiredAbove: z.number().nullable(),
|
|
316
322
|
minOrderValue: z.number().nullable(),
|
|
323
|
+
assortmentScope: assortmentScopeSchema,
|
|
317
324
|
metadata: z.record(z.string(), z.unknown()).nullable(),
|
|
318
325
|
createdAt: z.string(),
|
|
319
326
|
updatedAt: z.string(),
|
|
@@ -3,15 +3,29 @@
|
|
|
3
3
|
import * as React from 'react'
|
|
4
4
|
import { z } from 'zod'
|
|
5
5
|
import { FileText } from 'lucide-react'
|
|
6
|
-
import { CrudForm, type CrudField } from '@open-mercato/ui/backend/CrudForm'
|
|
6
|
+
import { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'
|
|
7
7
|
import { updateCrud } from '@open-mercato/ui/backend/utils/crud'
|
|
8
8
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
9
9
|
import { ErrorMessage, LoadingMessage } from '@open-mercato/ui/backend/detail'
|
|
10
10
|
import { SectionHeader } from '@open-mercato/ui/backend/SectionHeader'
|
|
11
11
|
import { EmptyState } from '@open-mercato/ui/primitives/empty-state'
|
|
12
12
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
13
|
+
import { LookupMultiPicker } from '@open-mercato/ui/backend/inputs/LookupPickers'
|
|
14
|
+
import type { LookupSource } from '@open-mercato/ui/backend/inputs/lookupSources'
|
|
15
|
+
import {
|
|
16
|
+
categoryLookupSource,
|
|
17
|
+
productLookupSource,
|
|
18
|
+
tagLookupSource,
|
|
19
|
+
} from '@open-mercato/core/modules/catalog/components/lookupSources'
|
|
13
20
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
14
21
|
import { CustomerGroupTermsPriceKindField } from './CustomerGroupTermsPriceKindField'
|
|
22
|
+
import {
|
|
23
|
+
buildAssortmentScopePayload,
|
|
24
|
+
mapAssortmentScopeToFormValues,
|
|
25
|
+
type AssortmentScopeField,
|
|
26
|
+
type AssortmentScopeFormValues,
|
|
27
|
+
type GroupAssortmentScope,
|
|
28
|
+
} from './customerGroupAssortmentScope'
|
|
15
29
|
|
|
16
30
|
export type CustomerGroupTermsDTO = {
|
|
17
31
|
id: string
|
|
@@ -25,6 +39,7 @@ export type CustomerGroupTermsDTO = {
|
|
|
25
39
|
creditCurrencyCode: string | null
|
|
26
40
|
approvalRequiredAbove: number | null
|
|
27
41
|
minOrderValue: number | null
|
|
42
|
+
assortmentScope?: GroupAssortmentScope | null
|
|
28
43
|
metadata: Record<string, unknown> | null
|
|
29
44
|
createdAt: string
|
|
30
45
|
updatedAt: string
|
|
@@ -52,7 +67,7 @@ function fromPurchaseOnAccountValue(value: string | undefined): boolean | null {
|
|
|
52
67
|
return null
|
|
53
68
|
}
|
|
54
69
|
|
|
55
|
-
type CustomerGroupTermsFormValues = {
|
|
70
|
+
type CustomerGroupTermsFormValues = AssortmentScopeFormValues & {
|
|
56
71
|
priceKindId: string
|
|
57
72
|
paymentTermsDays?: number
|
|
58
73
|
allowPurchaseOnAccount: PurchaseOnAccountValue
|
|
@@ -71,6 +86,45 @@ function mapTermsToFormValues(terms: CustomerGroupTermsDTO | null): CustomerGrou
|
|
|
71
86
|
creditCurrencyCode: terms?.creditCurrencyCode ?? '',
|
|
72
87
|
approvalRequiredAbove: terms?.approvalRequiredAbove ?? undefined,
|
|
73
88
|
minOrderValue: terms?.minOrderValue ?? undefined,
|
|
89
|
+
...mapAssortmentScopeToFormValues(terms?.assortmentScope),
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const TERMS_FIELD_IDS = [
|
|
94
|
+
'priceKindId',
|
|
95
|
+
'paymentTermsDays',
|
|
96
|
+
'allowPurchaseOnAccount',
|
|
97
|
+
'defaultCreditLimit',
|
|
98
|
+
'creditCurrencyCode',
|
|
99
|
+
'approvalRequiredAbove',
|
|
100
|
+
'minOrderValue',
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
function toIdList(value: unknown): string[] {
|
|
104
|
+
return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function scopePickerField(
|
|
108
|
+
id: AssortmentScopeField,
|
|
109
|
+
label: string,
|
|
110
|
+
placeholder: string,
|
|
111
|
+
source: LookupSource,
|
|
112
|
+
readOnly: boolean,
|
|
113
|
+
): CrudField {
|
|
114
|
+
return {
|
|
115
|
+
id,
|
|
116
|
+
type: 'custom',
|
|
117
|
+
label,
|
|
118
|
+
disabled: readOnly,
|
|
119
|
+
component: ({ value, setValue, disabled }) => (
|
|
120
|
+
<LookupMultiPicker
|
|
121
|
+
source={source}
|
|
122
|
+
value={toIdList(value)}
|
|
123
|
+
onChange={(next) => setValue(next)}
|
|
124
|
+
placeholder={placeholder}
|
|
125
|
+
disabled={disabled || readOnly}
|
|
126
|
+
/>
|
|
127
|
+
),
|
|
74
128
|
}
|
|
75
129
|
}
|
|
76
130
|
|
|
@@ -118,6 +172,11 @@ export function CustomerGroupTermsSection({
|
|
|
118
172
|
.max(4, t('customer_groups.groups.form.terms.errors.currencyLength', 'Use up to 4 characters.')),
|
|
119
173
|
approvalRequiredAbove: z.coerce.number().min(0, negativeMessage).optional(),
|
|
120
174
|
minOrderValue: z.coerce.number().min(0, negativeMessage).optional(),
|
|
175
|
+
categoryIds: z.array(z.string()).default([]),
|
|
176
|
+
tagIds: z.array(z.string()).default([]),
|
|
177
|
+
excludeProductIds: z.array(z.string()).default([]),
|
|
178
|
+
excludeCategoryIds: z.array(z.string()).default([]),
|
|
179
|
+
excludeTagIds: z.array(z.string()).default([]),
|
|
121
180
|
}),
|
|
122
181
|
[negativeMessage, t],
|
|
123
182
|
)
|
|
@@ -189,6 +248,66 @@ export function CustomerGroupTermsSection({
|
|
|
189
248
|
type: 'number',
|
|
190
249
|
layout: 'half',
|
|
191
250
|
},
|
|
251
|
+
scopePickerField(
|
|
252
|
+
'categoryIds',
|
|
253
|
+
t('customer_groups.groups.form.terms.assortment.field.categoryIds', 'Categories'),
|
|
254
|
+
t('customer_groups.groups.form.terms.assortment.placeholder.category', 'Search categories'),
|
|
255
|
+
categoryLookupSource,
|
|
256
|
+
!canManage,
|
|
257
|
+
),
|
|
258
|
+
scopePickerField(
|
|
259
|
+
'tagIds',
|
|
260
|
+
t('customer_groups.groups.form.terms.assortment.field.tagIds', 'Tags'),
|
|
261
|
+
t('customer_groups.groups.form.terms.assortment.placeholder.tag', 'Search tags'),
|
|
262
|
+
tagLookupSource,
|
|
263
|
+
!canManage,
|
|
264
|
+
),
|
|
265
|
+
scopePickerField(
|
|
266
|
+
'excludeProductIds',
|
|
267
|
+
t('customer_groups.groups.form.terms.assortment.field.excludeProductIds', 'Products'),
|
|
268
|
+
t('customer_groups.groups.form.terms.assortment.placeholder.product', 'Search products'),
|
|
269
|
+
productLookupSource,
|
|
270
|
+
!canManage,
|
|
271
|
+
),
|
|
272
|
+
scopePickerField(
|
|
273
|
+
'excludeCategoryIds',
|
|
274
|
+
t('customer_groups.groups.form.terms.assortment.field.excludeCategoryIds', 'Categories'),
|
|
275
|
+
t('customer_groups.groups.form.terms.assortment.placeholder.category', 'Search categories'),
|
|
276
|
+
categoryLookupSource,
|
|
277
|
+
!canManage,
|
|
278
|
+
),
|
|
279
|
+
scopePickerField(
|
|
280
|
+
'excludeTagIds',
|
|
281
|
+
t('customer_groups.groups.form.terms.assortment.field.excludeTagIds', 'Tags'),
|
|
282
|
+
t('customer_groups.groups.form.terms.assortment.placeholder.tag', 'Search tags'),
|
|
283
|
+
tagLookupSource,
|
|
284
|
+
!canManage,
|
|
285
|
+
),
|
|
286
|
+
],
|
|
287
|
+
[canManage, t],
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
const groups = React.useMemo<CrudFormGroup[]>(
|
|
291
|
+
() => [
|
|
292
|
+
{ id: 'terms', fields: TERMS_FIELD_IDS },
|
|
293
|
+
{
|
|
294
|
+
id: 'assortmentInclude',
|
|
295
|
+
title: t('customer_groups.groups.form.terms.assortment.includeTitle', 'Assortment scope: show only products in'),
|
|
296
|
+
description: t(
|
|
297
|
+
'customer_groups.groups.form.terms.assortment.includeHint',
|
|
298
|
+
"A product is visible to this group when it is in any of the chosen categories and carries any of the chosen tags. An empty picker does not filter, so leave both empty for no restriction; clearing a picker never hides everything. The storefront assortment a buyer sees is the channel's scope narrowed by this group's scope, and a buyer in several groups sees the union of their scopes.",
|
|
299
|
+
),
|
|
300
|
+
fields: ['categoryIds', 'tagIds'],
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: 'assortmentExclude',
|
|
304
|
+
title: t('customer_groups.groups.form.terms.assortment.excludeTitle', 'Always hide from this group'),
|
|
305
|
+
description: t(
|
|
306
|
+
'customer_groups.groups.form.terms.assortment.excludeHint',
|
|
307
|
+
'Hidden products, categories and tags win over the selection above.',
|
|
308
|
+
),
|
|
309
|
+
fields: ['excludeProductIds', 'excludeCategoryIds', 'excludeTagIds'],
|
|
310
|
+
},
|
|
192
311
|
],
|
|
193
312
|
[t],
|
|
194
313
|
)
|
|
@@ -209,6 +328,7 @@ export function CustomerGroupTermsSection({
|
|
|
209
328
|
approvalRequiredAbove:
|
|
210
329
|
typeof values.approvalRequiredAbove === 'number' ? values.approvalRequiredAbove : null,
|
|
211
330
|
minOrderValue: typeof values.minOrderValue === 'number' ? values.minOrderValue : null,
|
|
331
|
+
assortmentScope: buildAssortmentScopePayload(values),
|
|
212
332
|
}
|
|
213
333
|
// `updateCrud` PUTs to `/api/customer_groups/customer-groups/{groupId}/terms`, matching the
|
|
214
334
|
// upsert route (Step 2.4). `optimisticLockUpdatedAt` below is
|
|
@@ -253,8 +373,10 @@ export function CustomerGroupTermsSection({
|
|
|
253
373
|
<CrudForm<CustomerGroupTermsFormValues>
|
|
254
374
|
key={terms?.updatedAt ?? 'new'}
|
|
255
375
|
embedded
|
|
376
|
+
disableInitialFocus
|
|
256
377
|
schema={schema}
|
|
257
378
|
fields={fields}
|
|
379
|
+
groups={groups}
|
|
258
380
|
initialValues={initialValues}
|
|
259
381
|
optimisticLockUpdatedAt={terms?.updatedAt ?? TERMS_NOT_YET_CREATED_LOCK_TOKEN}
|
|
260
382
|
readOnly={!canManage}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const ASSORTMENT_SCOPE_FIELDS = [
|
|
2
|
+
'categoryIds',
|
|
3
|
+
'tagIds',
|
|
4
|
+
'excludeProductIds',
|
|
5
|
+
'excludeCategoryIds',
|
|
6
|
+
'excludeTagIds',
|
|
7
|
+
] as const
|
|
8
|
+
|
|
9
|
+
export type AssortmentScopeField = (typeof ASSORTMENT_SCOPE_FIELDS)[number]
|
|
10
|
+
|
|
11
|
+
export type GroupAssortmentScope = Partial<Record<AssortmentScopeField, string[]>>
|
|
12
|
+
|
|
13
|
+
export type AssortmentScopeFormValues = Record<AssortmentScopeField, string[]>
|
|
14
|
+
|
|
15
|
+
function normalizeIds(value: unknown): string[] {
|
|
16
|
+
if (!Array.isArray(value)) return []
|
|
17
|
+
const seen = new Set<string>()
|
|
18
|
+
const ids: string[] = []
|
|
19
|
+
for (const entry of value) {
|
|
20
|
+
if (typeof entry !== 'string') continue
|
|
21
|
+
const trimmed = entry.trim()
|
|
22
|
+
if (!trimmed || seen.has(trimmed)) continue
|
|
23
|
+
seen.add(trimmed)
|
|
24
|
+
ids.push(trimmed)
|
|
25
|
+
}
|
|
26
|
+
return ids
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function mapAssortmentScopeToFormValues(scope: GroupAssortmentScope | null | undefined): AssortmentScopeFormValues {
|
|
30
|
+
return {
|
|
31
|
+
categoryIds: normalizeIds(scope?.categoryIds),
|
|
32
|
+
tagIds: normalizeIds(scope?.tagIds),
|
|
33
|
+
excludeProductIds: normalizeIds(scope?.excludeProductIds),
|
|
34
|
+
excludeCategoryIds: normalizeIds(scope?.excludeCategoryIds),
|
|
35
|
+
excludeTagIds: normalizeIds(scope?.excludeTagIds),
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function buildAssortmentScopePayload(values: Partial<Record<AssortmentScopeField, unknown>>): GroupAssortmentScope | null {
|
|
40
|
+
const scope: GroupAssortmentScope = {}
|
|
41
|
+
for (const field of ASSORTMENT_SCOPE_FIELDS) {
|
|
42
|
+
const ids = normalizeIds(values[field])
|
|
43
|
+
if (ids.length > 0) scope[field] = ids
|
|
44
|
+
}
|
|
45
|
+
return Object.keys(scope).length > 0 ? scope : null
|
|
46
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { OptionalProps } from '@mikro-orm/core'
|
|
2
2
|
import { Entity, Index, PrimaryKey, Property } from '@mikro-orm/decorators/legacy'
|
|
3
|
+
import type { AssortmentScope } from '@open-mercato/shared/lib/catalog-visibility'
|
|
3
4
|
|
|
4
5
|
export type CustomerGroupKind = 'b2c' | 'b2b' | 'internal' | 'partner'
|
|
5
6
|
export type CustomerGroupMembershipSource = 'manual' | 'import' | 'rule' | 'onboarding'
|
|
@@ -230,6 +231,9 @@ export class CustomerGroupTerms {
|
|
|
230
231
|
@Property({ name: 'min_order_value', type: 'numeric', precision: 16, scale: 2, nullable: true })
|
|
231
232
|
minOrderValue?: string | null
|
|
232
233
|
|
|
234
|
+
@Property({ name: 'assortment_scope', type: 'jsonb', nullable: true })
|
|
235
|
+
assortmentScope?: AssortmentScope | null
|
|
236
|
+
|
|
233
237
|
@Property({ type: 'jsonb', nullable: true })
|
|
234
238
|
metadata?: Record<string, unknown> | null
|
|
235
239
|
|
|
@@ -198,6 +198,19 @@ const clearableNonNegativeNumberSchema = z.preprocess(
|
|
|
198
198
|
|
|
199
199
|
const currencyCodeSchema = clearableStringSchema(4)
|
|
200
200
|
|
|
201
|
+
export const assortmentScopeSchema = z
|
|
202
|
+
.object({
|
|
203
|
+
categoryIds: z.array(uuid()).optional(),
|
|
204
|
+
tagIds: z.array(uuid()).optional(),
|
|
205
|
+
excludeProductIds: z.array(uuid()).optional(),
|
|
206
|
+
excludeCategoryIds: z.array(uuid()).optional(),
|
|
207
|
+
excludeTagIds: z.array(uuid()).optional(),
|
|
208
|
+
})
|
|
209
|
+
.strict()
|
|
210
|
+
.nullable()
|
|
211
|
+
|
|
212
|
+
export type AssortmentScopeInput = z.infer<typeof assortmentScopeSchema>
|
|
213
|
+
|
|
201
214
|
// Default-free, for the same reason as `customerGroupBaseShape` above.
|
|
202
215
|
const customerGroupTermsBaseShape = {
|
|
203
216
|
organizationId: uuid().nullable().optional(),
|
|
@@ -210,6 +223,7 @@ const customerGroupTermsBaseShape = {
|
|
|
210
223
|
creditCurrencyCode: currencyCodeSchema,
|
|
211
224
|
approvalRequiredAbove: clearableNonNegativeNumberSchema,
|
|
212
225
|
minOrderValue: clearableNonNegativeNumberSchema,
|
|
226
|
+
assortmentScope: assortmentScopeSchema.optional(),
|
|
213
227
|
metadata: clearableMetadataSchema,
|
|
214
228
|
}
|
|
215
229
|
|
|
@@ -71,6 +71,18 @@
|
|
|
71
71
|
"customer_groups.groups.form.loading": "Kundengruppe wird geladen …",
|
|
72
72
|
"customer_groups.groups.form.readOnly": "Diese Gruppe ist schreibgeschützt. Sie haben keine Berechtigung, sie zu ändern.",
|
|
73
73
|
"customer_groups.groups.form.terms.action.save": "Konditionen speichern",
|
|
74
|
+
"customer_groups.groups.form.terms.assortment.excludeHint": "Ausgeblendete Produkte, Kategorien und Tags haben Vorrang vor der Auswahl oben.",
|
|
75
|
+
"customer_groups.groups.form.terms.assortment.excludeTitle": "Für diese Gruppe immer ausblenden",
|
|
76
|
+
"customer_groups.groups.form.terms.assortment.field.categoryIds": "Kategorien",
|
|
77
|
+
"customer_groups.groups.form.terms.assortment.field.excludeCategoryIds": "Kategorien",
|
|
78
|
+
"customer_groups.groups.form.terms.assortment.field.excludeProductIds": "Produkte",
|
|
79
|
+
"customer_groups.groups.form.terms.assortment.field.excludeTagIds": "Tags",
|
|
80
|
+
"customer_groups.groups.form.terms.assortment.field.tagIds": "Tags",
|
|
81
|
+
"customer_groups.groups.form.terms.assortment.includeHint": "Ein Produkt ist für diese Gruppe sichtbar, wenn es in einer der gewählten Kategorien liegt und einen der gewählten Tags trägt. Ein leeres Feld filtert nicht; lassen Sie beide leer für keine Einschränkung. Ein geleertes Feld blendet nie alles aus. Das Shop-Sortiment eines Käufers ist der Bereich des Kanals, eingeschränkt durch den Bereich dieser Gruppe; ein Käufer in mehreren Gruppen sieht die Vereinigung ihrer Bereiche.",
|
|
82
|
+
"customer_groups.groups.form.terms.assortment.includeTitle": "Sortimentsbereich: nur Produkte zeigen aus",
|
|
83
|
+
"customer_groups.groups.form.terms.assortment.placeholder.category": "Kategorien suchen",
|
|
84
|
+
"customer_groups.groups.form.terms.assortment.placeholder.product": "Produkte suchen",
|
|
85
|
+
"customer_groups.groups.form.terms.assortment.placeholder.tag": "Tags suchen",
|
|
74
86
|
"customer_groups.groups.form.terms.empty.action": "Konditionen für diese Gruppe festlegen",
|
|
75
87
|
"customer_groups.groups.form.terms.empty.description": "Diese Gruppe verwendet derzeit die von der übergeordneten Gruppe oder den Mandanten-Standardwerten geerbten Handelskonditionen. Legen Sie explizite Konditionen fest, um sie für diese Gruppe zu überschreiben.",
|
|
76
88
|
"customer_groups.groups.form.terms.empty.title": "Keine Konditionen festgelegt — geerbt von übergeordneter Gruppe / Mandanten-Standardwerten",
|
|
@@ -71,6 +71,18 @@
|
|
|
71
71
|
"customer_groups.groups.form.loading": "Loading customer group...",
|
|
72
72
|
"customer_groups.groups.form.readOnly": "This group is view-only. You do not have permission to change it.",
|
|
73
73
|
"customer_groups.groups.form.terms.action.save": "Save terms",
|
|
74
|
+
"customer_groups.groups.form.terms.assortment.excludeHint": "Hidden products, categories and tags win over the selection above.",
|
|
75
|
+
"customer_groups.groups.form.terms.assortment.excludeTitle": "Always hide from this group",
|
|
76
|
+
"customer_groups.groups.form.terms.assortment.field.categoryIds": "Categories",
|
|
77
|
+
"customer_groups.groups.form.terms.assortment.field.excludeCategoryIds": "Categories",
|
|
78
|
+
"customer_groups.groups.form.terms.assortment.field.excludeProductIds": "Products",
|
|
79
|
+
"customer_groups.groups.form.terms.assortment.field.excludeTagIds": "Tags",
|
|
80
|
+
"customer_groups.groups.form.terms.assortment.field.tagIds": "Tags",
|
|
81
|
+
"customer_groups.groups.form.terms.assortment.includeHint": "A product is visible to this group when it is in any of the chosen categories and carries any of the chosen tags. An empty picker does not filter, so leave both empty for no restriction; clearing a picker never hides everything. The storefront assortment a buyer sees is the channel's scope narrowed by this group's scope, and a buyer in several groups sees the union of their scopes.",
|
|
82
|
+
"customer_groups.groups.form.terms.assortment.includeTitle": "Assortment scope: show only products in",
|
|
83
|
+
"customer_groups.groups.form.terms.assortment.placeholder.category": "Search categories",
|
|
84
|
+
"customer_groups.groups.form.terms.assortment.placeholder.product": "Search products",
|
|
85
|
+
"customer_groups.groups.form.terms.assortment.placeholder.tag": "Search tags",
|
|
74
86
|
"customer_groups.groups.form.terms.empty.action": "Set terms for this group",
|
|
75
87
|
"customer_groups.groups.form.terms.empty.description": "This group currently uses commercial terms inherited from its parent group or the tenant defaults. Set explicit terms to override them for this group.",
|
|
76
88
|
"customer_groups.groups.form.terms.empty.title": "No terms set — inheriting from parent / tenant defaults",
|
|
@@ -71,6 +71,18 @@
|
|
|
71
71
|
"customer_groups.groups.form.loading": "Cargando grupo de clientes…",
|
|
72
72
|
"customer_groups.groups.form.readOnly": "Este grupo es de solo lectura. No tienes permiso para modificarlo.",
|
|
73
73
|
"customer_groups.groups.form.terms.action.save": "Guardar condiciones",
|
|
74
|
+
"customer_groups.groups.form.terms.assortment.excludeHint": "Los productos, categorías y etiquetas ocultos prevalecen sobre la selección anterior.",
|
|
75
|
+
"customer_groups.groups.form.terms.assortment.excludeTitle": "Ocultar siempre a este grupo",
|
|
76
|
+
"customer_groups.groups.form.terms.assortment.field.categoryIds": "Categorías",
|
|
77
|
+
"customer_groups.groups.form.terms.assortment.field.excludeCategoryIds": "Categorías",
|
|
78
|
+
"customer_groups.groups.form.terms.assortment.field.excludeProductIds": "Productos",
|
|
79
|
+
"customer_groups.groups.form.terms.assortment.field.excludeTagIds": "Etiquetas",
|
|
80
|
+
"customer_groups.groups.form.terms.assortment.field.tagIds": "Etiquetas",
|
|
81
|
+
"customer_groups.groups.form.terms.assortment.includeHint": "Un producto es visible para este grupo cuando está en alguna de las categorías elegidas y tiene alguna de las etiquetas elegidas. Un selector vacío no filtra, así que deja ambos vacíos para no aplicar ninguna restricción; vaciar un selector nunca oculta todo. El surtido de la tienda que ve un comprador es el alcance del canal acotado por el alcance de este grupo, y un comprador en varios grupos ve la unión de sus alcances.",
|
|
82
|
+
"customer_groups.groups.form.terms.assortment.includeTitle": "Alcance del surtido: mostrar solo productos de",
|
|
83
|
+
"customer_groups.groups.form.terms.assortment.placeholder.category": "Buscar categorías",
|
|
84
|
+
"customer_groups.groups.form.terms.assortment.placeholder.product": "Buscar productos",
|
|
85
|
+
"customer_groups.groups.form.terms.assortment.placeholder.tag": "Buscar etiquetas",
|
|
74
86
|
"customer_groups.groups.form.terms.empty.action": "Establecer condiciones para este grupo",
|
|
75
87
|
"customer_groups.groups.form.terms.empty.description": "Este grupo utiliza actualmente las condiciones comerciales heredadas de su grupo principal o de los valores predeterminados del inquilino. Establezca condiciones explícitas para anularlas en este grupo.",
|
|
76
88
|
"customer_groups.groups.form.terms.empty.title": "No se han establecido condiciones — se heredan del grupo principal o de los valores predeterminados del inquilino",
|
|
@@ -71,6 +71,18 @@
|
|
|
71
71
|
"customer_groups.groups.form.loading": "고객 그룹을 불러오는 중…",
|
|
72
72
|
"customer_groups.groups.form.readOnly": "이 그룹은 보기 전용입니다. 변경할 권한이 없습니다.",
|
|
73
73
|
"customer_groups.groups.form.terms.action.save": "조건 저장",
|
|
74
|
+
"customer_groups.groups.form.terms.assortment.excludeHint": "숨긴 상품, 카테고리, 태그가 위의 선택보다 우선합니다.",
|
|
75
|
+
"customer_groups.groups.form.terms.assortment.excludeTitle": "이 그룹에는 항상 숨기기",
|
|
76
|
+
"customer_groups.groups.form.terms.assortment.field.categoryIds": "카테고리",
|
|
77
|
+
"customer_groups.groups.form.terms.assortment.field.excludeCategoryIds": "카테고리",
|
|
78
|
+
"customer_groups.groups.form.terms.assortment.field.excludeProductIds": "상품",
|
|
79
|
+
"customer_groups.groups.form.terms.assortment.field.excludeTagIds": "태그",
|
|
80
|
+
"customer_groups.groups.form.terms.assortment.field.tagIds": "태그",
|
|
81
|
+
"customer_groups.groups.form.terms.assortment.includeHint": "상품은 선택한 카테고리 중 하나에 속하고 선택한 태그 중 하나를 가질 때 이 그룹에 표시됩니다. 비어 있는 선택기는 필터링하지 않으므로 제한이 없으려면 둘 다 비워 두세요. 선택기를 비워도 모든 상품이 숨겨지지는 않습니다. 구매자가 보는 스토어프런트 상품은 채널 범위를 이 그룹의 범위로 좁힌 것이며, 여러 그룹에 속한 구매자는 각 범위의 합집합을 봅니다.",
|
|
82
|
+
"customer_groups.groups.form.terms.assortment.includeTitle": "상품 범위: 다음 상품만 표시",
|
|
83
|
+
"customer_groups.groups.form.terms.assortment.placeholder.category": "카테고리 검색",
|
|
84
|
+
"customer_groups.groups.form.terms.assortment.placeholder.product": "상품 검색",
|
|
85
|
+
"customer_groups.groups.form.terms.assortment.placeholder.tag": "태그 검색",
|
|
74
86
|
"customer_groups.groups.form.terms.empty.action": "이 그룹의 조건 설정",
|
|
75
87
|
"customer_groups.groups.form.terms.empty.description": "이 그룹은 현재 상위 그룹 또는 테넌트 기본값에서 상속된 상거래 조건을 사용합니다. 이 그룹에 대해 재정의하려면 명시적인 조건을 설정하세요.",
|
|
76
88
|
"customer_groups.groups.form.terms.empty.title": "설정된 조건 없음 — 상위 그룹/테넌트 기본값을 상속함",
|
|
@@ -71,6 +71,18 @@
|
|
|
71
71
|
"customer_groups.groups.form.loading": "Wczytywanie grupy klientów…",
|
|
72
72
|
"customer_groups.groups.form.readOnly": "Ta grupa jest tylko do odczytu. Nie masz uprawnień do jej zmiany.",
|
|
73
73
|
"customer_groups.groups.form.terms.action.save": "Zapisz warunki",
|
|
74
|
+
"customer_groups.groups.form.terms.assortment.excludeHint": "Ukryte produkty, kategorie i tagi mają pierwszeństwo przed powyższym wyborem.",
|
|
75
|
+
"customer_groups.groups.form.terms.assortment.excludeTitle": "Zawsze ukrywaj dla tej grupy",
|
|
76
|
+
"customer_groups.groups.form.terms.assortment.field.categoryIds": "Kategorie",
|
|
77
|
+
"customer_groups.groups.form.terms.assortment.field.excludeCategoryIds": "Kategorie",
|
|
78
|
+
"customer_groups.groups.form.terms.assortment.field.excludeProductIds": "Produkty",
|
|
79
|
+
"customer_groups.groups.form.terms.assortment.field.excludeTagIds": "Tagi",
|
|
80
|
+
"customer_groups.groups.form.terms.assortment.field.tagIds": "Tagi",
|
|
81
|
+
"customer_groups.groups.form.terms.assortment.includeHint": "Produkt jest widoczny dla tej grupy, gdy należy do dowolnej z wybranych kategorii i ma dowolny z wybranych tagów. Puste pole nie filtruje, więc pozostaw oba puste, aby nie ograniczać; wyczyszczenie pola nigdy nie ukrywa wszystkiego. Asortyment sklepu widoczny dla kupującego to zakres kanału zawężony zakresem tej grupy, a kupujący w kilku grupach widzi sumę ich zakresów.",
|
|
82
|
+
"customer_groups.groups.form.terms.assortment.includeTitle": "Zakres asortymentu: pokazuj tylko produkty z",
|
|
83
|
+
"customer_groups.groups.form.terms.assortment.placeholder.category": "Szukaj kategorii",
|
|
84
|
+
"customer_groups.groups.form.terms.assortment.placeholder.product": "Szukaj produktów",
|
|
85
|
+
"customer_groups.groups.form.terms.assortment.placeholder.tag": "Szukaj tagów",
|
|
74
86
|
"customer_groups.groups.form.terms.empty.action": "Ustaw warunki dla tej grupy",
|
|
75
87
|
"customer_groups.groups.form.terms.empty.description": "Ta grupa korzysta obecnie z warunków handlowych odziedziczonych po grupie nadrzędnej lub z domyślnych ustawień dzierżawcy. Ustaw jawne warunki, aby je zastąpić dla tej grupy.",
|
|
76
88
|
"customer_groups.groups.form.terms.empty.title": "Nie ustawiono warunków — dziedziczone z grupy nadrzędnej / ustawień domyślnych dzierżawcy",
|
|
@@ -317,6 +317,23 @@
|
|
|
317
317
|
"enumItems": [],
|
|
318
318
|
"mappedType": "decimal"
|
|
319
319
|
},
|
|
320
|
+
"assortment_scope": {
|
|
321
|
+
"name": "assortment_scope",
|
|
322
|
+
"type": "jsonb",
|
|
323
|
+
"unsigned": false,
|
|
324
|
+
"autoincrement": false,
|
|
325
|
+
"primary": false,
|
|
326
|
+
"nullable": true,
|
|
327
|
+
"unique": false,
|
|
328
|
+
"length": null,
|
|
329
|
+
"precision": null,
|
|
330
|
+
"scale": null,
|
|
331
|
+
"default": null,
|
|
332
|
+
"comment": null,
|
|
333
|
+
"collation": null,
|
|
334
|
+
"enumItems": [],
|
|
335
|
+
"mappedType": "json"
|
|
336
|
+
},
|
|
320
337
|
"created_at": {
|
|
321
338
|
"name": "created_at",
|
|
322
339
|
"type": "timestamptz(6)",
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
|
|
3
|
+
export class Migration20261005110250_customer_groups extends Migration {
|
|
4
|
+
|
|
5
|
+
override name = 'Migration20261005110250';
|
|
6
|
+
|
|
7
|
+
override up(): void | Promise<void> {
|
|
8
|
+
this.addSql(`alter table "customer_group_terms" add "assortment_scope" jsonb null;`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
override down(): void | Promise<void> {
|
|
12
|
+
this.addSql(`alter table "customer_group_terms" drop column "assortment_scope";`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
}
|