@open-mercato/core 0.6.4-develop.4371.1.8f3030407e → 0.6.4
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/AGENTS.md +37 -0
- package/dist/generated/entities/channel_ingest_dead_letter/index.js +25 -0
- package/dist/generated/entities/channel_ingest_dead_letter/index.js.map +7 -0
- package/dist/generated/entities/channel_thread_mapping/index.js +25 -0
- package/dist/generated/entities/channel_thread_mapping/index.js.map +7 -0
- package/dist/generated/entities/channel_thread_token/index.js +17 -0
- package/dist/generated/entities/channel_thread_token/index.js.map +7 -0
- package/dist/generated/entities/communication_channel/index.js +43 -0
- package/dist/generated/entities/communication_channel/index.js.map +7 -0
- package/dist/generated/entities/customer_interaction/index.js +4 -0
- package/dist/generated/entities/customer_interaction/index.js.map +2 -2
- package/dist/generated/entities/customer_settings/index.js +2 -0
- package/dist/generated/entities/customer_settings/index.js.map +2 -2
- package/dist/generated/entities/dictionary/index.js +2 -0
- package/dist/generated/entities/dictionary/index.js.map +2 -2
- package/dist/generated/entities/external_conversation/index.js +25 -0
- package/dist/generated/entities/external_conversation/index.js.map +7 -0
- package/dist/generated/entities/external_message/index.js +25 -0
- package/dist/generated/entities/external_message/index.js.map +7 -0
- package/dist/generated/entities/inbox_settings/index.js +2 -0
- package/dist/generated/entities/inbox_settings/index.js.map +2 -2
- package/dist/generated/entities/integration_credentials/index.js +3 -1
- package/dist/generated/entities/integration_credentials/index.js.map +2 -2
- package/dist/generated/entities/message/index.js +2 -0
- package/dist/generated/entities/message/index.js.map +2 -2
- package/dist/generated/entities/message_channel_link/index.js +33 -0
- package/dist/generated/entities/message_channel_link/index.js.map +7 -0
- package/dist/generated/entities/message_reaction/index.js +25 -0
- package/dist/generated/entities/message_reaction/index.js.map +7 -0
- package/dist/generated/entities/role/index.js +3 -1
- package/dist/generated/entities/role/index.js.map +2 -2
- package/dist/generated/entities/step_instance/index.js +2 -0
- package/dist/generated/entities/step_instance/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/entities/user_task/index.js +2 -0
- package/dist/generated/entities/user_task/index.js.map +2 -2
- package/dist/generated/entities/workflow_branch_instance/index.js +39 -0
- package/dist/generated/entities/workflow_branch_instance/index.js.map +7 -0
- package/dist/generated/entities/workflow_event/index.js +2 -0
- package/dist/generated/entities/workflow_event/index.js.map +2 -2
- package/dist/generated/entities/workflow_instance/index.js +2 -0
- package/dist/generated/entities/workflow_instance/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +12 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +146 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/api.js +14 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/authFixtures.js +2 -1
- package/dist/helpers/integration/authFixtures.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +58 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +7 -0
- package/dist/helpers/integration/crudFormFields.js +33 -0
- package/dist/helpers/integration/crudFormFields.js.map +7 -0
- package/dist/helpers/integration/crudFormPersistence.js +107 -0
- package/dist/helpers/integration/crudFormPersistence.js.map +7 -0
- package/dist/helpers/integration/currenciesFixtures.js +52 -1
- package/dist/helpers/integration/currenciesFixtures.js.map +2 -2
- package/dist/helpers/integration/customerAccountsFixtures.js +124 -0
- package/dist/helpers/integration/customerAccountsFixtures.js.map +7 -0
- package/dist/helpers/integration/dbFixtures.js +9 -1
- package/dist/helpers/integration/dbFixtures.js.map +2 -2
- package/dist/helpers/integration/inboxFixtures.js +11 -0
- package/dist/helpers/integration/inboxFixtures.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/helpers/integration/salesUi.js +17 -9
- package/dist/helpers/integration/salesUi.js.map +2 -2
- package/dist/helpers/integration/standaloneEnv.js +58 -0
- package/dist/helpers/integration/standaloneEnv.js.map +7 -0
- package/dist/helpers/integration/undoHarness.js +177 -0
- package/dist/helpers/integration/undoHarness.js.map +7 -0
- package/dist/helpers/integration/workflowsFixtures.js +161 -0
- package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +18 -5
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/data/validators.js +3 -1
- package/dist/modules/api_keys/data/validators.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/attachments/lib/ocrQueue.js +6 -1
- package/dist/modules/attachments/lib/ocrQueue.js.map +2 -2
- package/dist/modules/attachments/lib/security.js +1 -1
- package/dist/modules/attachments/lib/security.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js +4 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js +3 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js.map +2 -2
- package/dist/modules/audit_logs/data/entities.js.map +1 -1
- package/dist/modules/audit_logs/services/actionLogService.js +16 -0
- package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
- package/dist/modules/auth/api/logout.js +0 -12
- package/dist/modules/auth/api/logout.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 +52 -3
- package/dist/modules/auth/api/roles/route.js.map +2 -2
- package/dist/modules/auth/api/sidebar/preferences/route.js +73 -4
- package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +88 -34
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/consents/route.js +17 -0
- package/dist/modules/auth/api/users/consents/route.js.map +2 -2
- package/dist/modules/auth/api/users/resend-invite/route.js +18 -0
- package/dist/modules/auth/api/users/resend-invite/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +40 -2
- 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 +17 -4
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.js +72 -7
- package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +15 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +19 -21
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/commands/roles.js +78 -1
- package/dist/modules/auth/commands/roles.js.map +2 -2
- package/dist/modules/auth/commands/users.js +106 -6
- package/dist/modules/auth/commands/users.js.map +3 -3
- 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/frontend/reset/[token]/page.js +6 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/consentIntegrity.js +15 -2
- package/dist/modules/auth/lib/consentIntegrity.js.map +2 -2
- package/dist/modules/auth/lib/emailHash.js +6 -2
- package/dist/modules/auth/lib/emailHash.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js +44 -1
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/sessionIntegrity.js +11 -1
- package/dist/modules/auth/lib/sessionIntegrity.js.map +2 -2
- package/dist/modules/auth/services/authService.js +10 -19
- package/dist/modules/auth/services/authService.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 +30 -12
- 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 +29 -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 +138 -75
- 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 +87 -24
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/create/page.js +18 -3
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/create/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +4 -17
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/optionSchemaClient.js.map +2 -2
- package/dist/modules/catalog/commands/categories.js +42 -1
- package/dist/modules/catalog/commands/categories.js.map +2 -2
- package/dist/modules/catalog/commands/offers.js +44 -1
- package/dist/modules/catalog/commands/offers.js.map +2 -2
- package/dist/modules/catalog/commands/optionSchemas.js +6 -1
- package/dist/modules/catalog/commands/optionSchemas.js.map +2 -2
- package/dist/modules/catalog/commands/priceKinds.js +6 -1
- package/dist/modules/catalog/commands/priceKinds.js.map +2 -2
- package/dist/modules/catalog/commands/prices.js +50 -1
- package/dist/modules/catalog/commands/prices.js.map +2 -2
- package/dist/modules/catalog/commands/productUnitConversions.js +25 -1
- package/dist/modules/catalog/commands/productUnitConversions.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +84 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +117 -31
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +14 -6
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +9 -0
- 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 +14 -3
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +38 -11
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/catalog/components/products/productForm.js +21 -0
- 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/catalog/lib/pricing.js +3 -0
- package/dist/modules/catalog/lib/pricing.js.map +2 -2
- package/dist/modules/communication_channels/acl.js +47 -0
- package/dist/modules/communication_channels/acl.js.map +7 -0
- package/dist/modules/communication_channels/api/delete/channels/[id]/route.js +133 -0
- package/dist/modules/communication_channels/api/delete/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js +113 -0
- package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js +138 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js +93 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/route.js +96 -0
- package/dist/modules/communication_channels/api/get/channels/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/me/channels/route.js +82 -0
- package/dist/modules/communication_channels/api/get/me/channels/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js +274 -0
- package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js +168 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js +143 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js +127 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js +99 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +197 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js +124 -0
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js +120 -0
- package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js +157 -0
- package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/send-as-user/route.js +115 -0
- package/dist/modules/communication_channels/api/post/send-as-user/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/test-seed/route.js +238 -0
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +175 -0
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +123 -0
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +7 -0
- package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js +117 -0
- package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js +180 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js +36 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +107 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js +38 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +732 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js +38 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js +154 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/delete-channel.js +137 -0
- package/dist/modules/communication_channels/commands/delete-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js +400 -0
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +7 -0
- package/dist/modules/communication_channels/commands/disconnect-channel.js +163 -0
- package/dist/modules/communication_channels/commands/disconnect-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +413 -0
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +7 -0
- package/dist/modules/communication_channels/commands/interceptors.js +68 -0
- package/dist/modules/communication_channels/commands/interceptors.js.map +7 -0
- package/dist/modules/communication_channels/commands/process-inbound-reaction.js +198 -0
- package/dist/modules/communication_channels/commands/process-inbound-reaction.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-register.js +146 -0
- package/dist/modules/communication_channels/commands/push-register.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-renew.js +23 -0
- package/dist/modules/communication_channels/commands/push-renew.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-unregister.js +108 -0
- package/dist/modules/communication_channels/commands/push-unregister.js.map +7 -0
- package/dist/modules/communication_channels/commands/queue-import-history.js +113 -0
- package/dist/modules/communication_channels/commands/queue-import-history.js.map +7 -0
- package/dist/modules/communication_channels/commands/reassign-conversation.js +193 -0
- package/dist/modules/communication_channels/commands/reassign-conversation.js.map +7 -0
- package/dist/modules/communication_channels/commands/set-primary-channel.js +115 -0
- package/dist/modules/communication_channels/commands/set-primary-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js +260 -0
- package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js.map +7 -0
- package/dist/modules/communication_channels/data/enrichers.js +286 -0
- package/dist/modules/communication_channels/data/enrichers.js.map +7 -0
- package/dist/modules/communication_channels/data/entities.js +447 -0
- package/dist/modules/communication_channels/data/entities.js.map +7 -0
- package/dist/modules/communication_channels/data/extensions.js +67 -0
- package/dist/modules/communication_channels/data/extensions.js.map +7 -0
- package/dist/modules/communication_channels/data/validators.js +123 -0
- package/dist/modules/communication_channels/data/validators.js.map +7 -0
- package/dist/modules/communication_channels/di.js +35 -0
- package/dist/modules/communication_channels/di.js.map +7 -0
- package/dist/modules/communication_channels/encryption.js +12 -0
- package/dist/modules/communication_channels/encryption.js.map +7 -0
- package/dist/modules/communication_channels/events.js +124 -0
- package/dist/modules/communication_channels/events.js.map +7 -0
- package/dist/modules/communication_channels/index.js +20 -0
- package/dist/modules/communication_channels/index.js.map +7 -0
- package/dist/modules/communication_channels/lib/access-control.js +43 -0
- package/dist/modules/communication_channels/lib/access-control.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter-compat.js +36 -0
- package/dist/modules/communication_channels/lib/adapter-compat.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter-registry-singleton.js +22 -0
- package/dist/modules/communication_channels/lib/adapter-registry-singleton.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter.js +1 -0
- package/dist/modules/communication_channels/lib/adapter.js.map +7 -0
- package/dist/modules/communication_channels/lib/connect-channel.js +95 -0
- package/dist/modules/communication_channels/lib/connect-channel.js.map +7 -0
- package/dist/modules/communication_channels/lib/contact-resolver.js +79 -0
- package/dist/modules/communication_channels/lib/contact-resolver.js.map +7 -0
- package/dist/modules/communication_channels/lib/credential-refresh.js +97 -0
- package/dist/modules/communication_channels/lib/credential-refresh.js.map +7 -0
- package/dist/modules/communication_channels/lib/dead-letter.js +62 -0
- package/dist/modules/communication_channels/lib/dead-letter.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-capabilities.js +47 -0
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-contact.js +14 -0
- package/dist/modules/communication_channels/lib/email-contact.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-mime.js +299 -0
- package/dist/modules/communication_channels/lib/email-mime.js.map +7 -0
- package/dist/modules/communication_channels/lib/error-classification.js +101 -0
- package/dist/modules/communication_channels/lib/error-classification.js.map +7 -0
- package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js +185 -0
- package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js.map +7 -0
- package/dist/modules/communication_channels/lib/mutation-guards.js +114 -0
- package/dist/modules/communication_channels/lib/mutation-guards.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-client-config.js +32 -0
- package/dist/modules/communication_channels/lib/oauth-client-config.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-state.js +128 -0
- package/dist/modules/communication_channels/lib/oauth-state.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-token.js +45 -0
- package/dist/modules/communication_channels/lib/oauth-token.js.map +7 -0
- package/dist/modules/communication_channels/lib/pg-errors.js +11 -0
- package/dist/modules/communication_channels/lib/pg-errors.js.map +7 -0
- package/dist/modules/communication_channels/lib/provider-health.js +24 -0
- package/dist/modules/communication_channels/lib/provider-health.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-state.js +19 -0
- package/dist/modules/communication_channels/lib/push-state.js.map +7 -0
- package/dist/modules/communication_channels/lib/queue.js +54 -0
- package/dist/modules/communication_channels/lib/queue.js.map +7 -0
- package/dist/modules/communication_channels/lib/reaction-processor-types.js +5 -0
- package/dist/modules/communication_channels/lib/reaction-processor-types.js.map +7 -0
- package/dist/modules/communication_channels/lib/reaction-semantics.js +11 -0
- package/dist/modules/communication_channels/lib/reaction-semantics.js.map +7 -0
- package/dist/modules/communication_channels/lib/registry.js +67 -0
- package/dist/modules/communication_channels/lib/registry.js.map +7 -0
- package/dist/modules/communication_channels/lib/route-mutation-guard.js +43 -0
- package/dist/modules/communication_channels/lib/route-mutation-guard.js.map +7 -0
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js +96 -0
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js.map +7 -0
- package/dist/modules/communication_channels/lib/send-as-user.js +194 -0
- package/dist/modules/communication_channels/lib/send-as-user.js.map +7 -0
- package/dist/modules/communication_channels/lib/system-user.js +22 -0
- package/dist/modules/communication_channels/lib/system-user.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +68 -0
- package/dist/modules/communication_channels/lib/test-seed.js.map +7 -0
- package/dist/modules/communication_channels/lib/thread-matcher.js +263 -0
- package/dist/modules/communication_channels/lib/thread-matcher.js.map +7 -0
- package/dist/modules/communication_channels/lib/thread-token.js +219 -0
- package/dist/modules/communication_channels/lib/thread-token.js.map +7 -0
- package/dist/modules/communication_channels/lib/use-connect-channel.js +61 -0
- package/dist/modules/communication_channels/lib/use-connect-channel.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js +50 -0
- package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js +19 -0
- package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js +13 -0
- package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js +17 -0
- package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/notifications.client.js +51 -0
- package/dist/modules/communication_channels/notifications.client.js.map +7 -0
- package/dist/modules/communication_channels/notifications.handlers.js +53 -0
- package/dist/modules/communication_channels/notifications.handlers.js.map +7 -0
- package/dist/modules/communication_channels/notifications.js +56 -0
- package/dist/modules/communication_channels/notifications.js.map +7 -0
- package/dist/modules/communication_channels/setup.js +105 -0
- package/dist/modules/communication_channels/setup.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js +71 -0
- package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/outbound-bridge.js +103 -0
- package/dist/modules/communication_channels/subscribers/outbound-bridge.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js +51 -0
- package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js.map +7 -0
- package/dist/modules/communication_channels/widgets/components.js +7 -0
- package/dist/modules/communication_channels/widgets/components.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js +18 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js +30 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js +185 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js +44 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js +23 -0
- package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js +141 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection-table.js +38 -0
- package/dist/modules/communication_channels/widgets/injection-table.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js +25 -0
- package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js +19 -0
- package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/index.js +7 -0
- package/dist/modules/communication_channels/widgets/notifications/index.js.map +7 -0
- package/dist/modules/communication_channels/workers/channel-import-history.js +185 -0
- package/dist/modules/communication_channels/workers/channel-import-history.js.map +7 -0
- package/dist/modules/communication_channels/workers/gmail-history-sync.js +154 -0
- package/dist/modules/communication_channels/workers/gmail-history-sync.js.map +7 -0
- package/dist/modules/communication_channels/workers/gmail-renew-watch.js +95 -0
- package/dist/modules/communication_channels/workers/gmail-renew-watch.js.map +7 -0
- package/dist/modules/communication_channels/workers/inbound-processor.js +56 -0
- package/dist/modules/communication_channels/workers/inbound-processor.js.map +7 -0
- package/dist/modules/communication_channels/workers/outbound-delivery.js +85 -0
- package/dist/modules/communication_channels/workers/outbound-delivery.js.map +7 -0
- package/dist/modules/communication_channels/workers/poll-channel.js +240 -0
- package/dist/modules/communication_channels/workers/poll-channel.js.map +7 -0
- package/dist/modules/communication_channels/workers/poll-tick.js +132 -0
- package/dist/modules/communication_channels/workers/poll-tick.js.map +7 -0
- package/dist/modules/communication_channels/workers/reaction-processor.js +192 -0
- package/dist/modules/communication_channels/workers/reaction-processor.js.map +7 -0
- package/dist/modules/configs/api/openapi.js +11 -2
- package/dist/modules/configs/api/openapi.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 +27 -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 +21 -7
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/commands/currencies.js +37 -16
- package/dist/modules/currencies/commands/currencies.js.map +2 -2
- package/dist/modules/currencies/commands/exchange-rates.js +19 -9
- package/dist/modules/currencies/commands/exchange-rates.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 +39 -5
- package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users-invite.js +17 -1
- package/dist/modules/customer_accounts/api/admin/users-invite.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users.js +60 -23
- package/dist/modules/customer_accounts/api/admin/users.js.map +2 -2
- package/dist/modules/customer_accounts/api/login.js +11 -4
- package/dist/modules/customer_accounts/api/login.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/users-invite.js +17 -1
- package/dist/modules/customer_accounts/api/portal/users-invite.js.map +2 -2
- package/dist/modules/customer_accounts/api/signup.js +3 -1
- package/dist/modules/customer_accounts/api/signup.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 +19 -5
- 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 +27 -11
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/data/validators.js +2 -1
- package/dist/modules/customer_accounts/data/validators.js.map +2 -2
- package/dist/modules/customer_accounts/lib/customerEntityOwnership.js +22 -0
- package/dist/modules/customer_accounts/lib/customerEntityOwnership.js.map +7 -0
- package/dist/modules/customer_accounts/lib/rateLimiter.js +14 -0
- package/dist/modules/customer_accounts/lib/rateLimiter.js.map +2 -2
- package/dist/modules/customer_accounts/lib/resolveTenantContext.js +44 -1
- package/dist/modules/customer_accounts/lib/resolveTenantContext.js.map +3 -3
- package/dist/modules/customer_accounts/services/customerInvitationService.js +28 -1
- package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
- package/dist/modules/customer_accounts/services/customerUserService.js +13 -7
- package/dist/modules/customer_accounts/services/customerUserService.js.map +2 -2
- package/dist/modules/customer_accounts/subscribers/autoLinkCrmReverse.js +3 -3
- package/dist/modules/customer_accounts/subscribers/autoLinkCrmReverse.js.map +2 -2
- package/dist/modules/customers/acl.js +18 -0
- package/dist/modules/customers/acl.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +32 -10
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/addresses/route.js +2 -0
- package/dist/modules/customers/api/addresses/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +22 -9
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/companies/route.js +18 -7
- 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/dictionaries/[kind]/route.js +22 -38
- package/dist/modules/customers/api/dictionaries/[kind]/route.js.map +2 -2
- package/dist/modules/customers/api/dictionaries/cache.js +2 -1
- package/dist/modules/customers/api/dictionaries/cache.js.map +2 -2
- package/dist/modules/customers/api/dictionaries/context.js +1 -0
- package/dist/modules/customers/api/dictionaries/context.js.map +2 -2
- package/dist/modules/customers/api/interactions/[id]/visibility/route.js +151 -0
- package/dist/modules/customers/api/interactions/[id]/visibility/route.js.map +7 -0
- package/dist/modules/customers/api/interactions/counts/route.js +6 -0
- package/dist/modules/customers/api/interactions/counts/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +33 -12
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/email-threads/route.js +82 -0
- package/dist/modules/customers/api/people/[id]/email-threads/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/emails/route.js +157 -0
- package/dist/modules/customers/api/people/[id]/emails/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/route.js +20 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/route.js +16 -7
- package/dist/modules/customers/api/people/route.js.map +2 -2
- package/dist/modules/customers/api/pipeline-stages/route.js +0 -13
- package/dist/modules/customers/api/pipeline-stages/route.js.map +2 -2
- package/dist/modules/customers/api/settings/dictionary-sort-modes/route.js +223 -0
- package/dist/modules/customers/api/settings/dictionary-sort-modes/route.js.map +7 -0
- package/dist/modules/customers/api/todos/route.js +29 -11
- 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 +10 -1
- 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 +26 -7
- 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 +10 -1
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +60 -23
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/commands/activities.js +19 -0
- package/dist/modules/customers/commands/activities.js.map +2 -2
- package/dist/modules/customers/commands/addresses.js +98 -14
- package/dist/modules/customers/commands/addresses.js.map +2 -2
- package/dist/modules/customers/commands/comments.js +30 -1
- package/dist/modules/customers/commands/comments.js.map +2 -2
- package/dist/modules/customers/commands/companies.js +113 -1
- package/dist/modules/customers/commands/companies.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +196 -77
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/dictionaries.js +44 -0
- package/dist/modules/customers/commands/dictionaries.js.map +2 -2
- package/dist/modules/customers/commands/entity-roles.js +47 -0
- package/dist/modules/customers/commands/entity-roles.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +200 -8
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/commands/labels.js +83 -1
- package/dist/modules/customers/commands/labels.js.map +2 -2
- package/dist/modules/customers/commands/people.js +167 -13
- package/dist/modules/customers/commands/people.js.map +2 -2
- package/dist/modules/customers/commands/personCompanyLinks.js +141 -69
- 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/commands/settings.js +31 -0
- package/dist/modules/customers/commands/settings.js.map +2 -2
- package/dist/modules/customers/commands/tags.js +56 -1
- package/dist/modules/customers/commands/tags.js.map +2 -2
- package/dist/modules/customers/commands/todos.js +19 -0
- package/dist/modules/customers/commands/todos.js.map +2 -2
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/CustomersConfigurationSections.js +3 -0
- package/dist/modules/customers/components/CustomersConfigurationSections.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 +214 -0
- package/dist/modules/customers/components/DictionarySortSettings.js.map +7 -0
- 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/ActivityCard.js +32 -0
- package/dist/modules/customers/components/detail/ActivityCard.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityForm.js +1 -0
- package/dist/modules/customers/components/detail/ActivityForm.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/AnnualRevenueField.js +1 -0
- package/dist/modules/customers/components/detail/AnnualRevenueField.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/ComposeEmailDialog.js +242 -0
- package/dist/modules/customers/components/detail/ComposeEmailDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/DealForm.js +3 -1
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +46 -24
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EmailCardActions.js +184 -0
- package/dist/modules/customers/components/detail/EmailCardActions.js.map +7 -0
- package/dist/modules/customers/components/detail/EmailReplyForwardActions.js +52 -0
- package/dist/modules/customers/components/detail/EmailReplyForwardActions.js.map +7 -0
- 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/PersonDetailTabs.js +7 -1
- package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js +366 -0
- package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js.map +7 -0
- 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/create/DealCurrencyField.js +1 -0
- package/dist/modules/customers/components/detail/create/DealCurrencyField.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js +2 -1
- package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.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 +62 -12
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/data/enrichers.js +133 -2
- package/dist/modules/customers/data/enrichers.js.map +2 -2
- package/dist/modules/customers/data/entities.js +21 -0
- package/dist/modules/customers/data/entities.js.map +2 -2
- package/dist/modules/customers/data/extensions.js +16 -0
- package/dist/modules/customers/data/extensions.js.map +7 -0
- package/dist/modules/customers/data/guards.js +66 -0
- package/dist/modules/customers/data/guards.js.map +7 -0
- package/dist/modules/customers/data/validators.js +33 -8
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/di.js +37 -0
- package/dist/modules/customers/di.js.map +2 -2
- package/dist/modules/customers/encryption.js +11 -0
- package/dist/modules/customers/encryption.js.map +2 -2
- package/dist/modules/customers/events.js +4 -1
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/detailTenantScope.js +15 -0
- package/dist/modules/customers/lib/detailTenantScope.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +64 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +7 -0
- package/dist/modules/customers/lib/kysely.js.map +2 -2
- package/dist/modules/customers/lib/link-channel-message-handler.js +303 -0
- package/dist/modules/customers/lib/link-channel-message-handler.js.map +7 -0
- package/dist/modules/customers/lib/personCompanyLinkTable.js +15 -1
- package/dist/modules/customers/lib/personCompanyLinkTable.js.map +2 -2
- package/dist/modules/customers/lib/personEmailThreads.js +205 -0
- package/dist/modules/customers/lib/personEmailThreads.js.map +7 -0
- package/dist/modules/customers/lib/todoCompatibility.js +11 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/customers/lib/visibilityFilter.js +51 -0
- package/dist/modules/customers/lib/visibilityFilter.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260527012240_customers.js +20 -0
- package/dist/modules/customers/migrations/Migration20260527012240_customers.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260602202147_customers.js +13 -0
- package/dist/modules/customers/migrations/Migration20260602202147_customers.js.map +7 -0
- package/dist/modules/customers/search.js +12 -6
- package/dist/modules/customers/search.js.map +2 -2
- package/dist/modules/customers/setup.js +2 -1
- package/dist/modules/customers/setup.js.map +2 -2
- package/dist/modules/customers/subscribers/link-channel-message-received.js +12 -0
- package/dist/modules/customers/subscribers/link-channel-message-received.js.map +7 -0
- package/dist/modules/customers/subscribers/link-channel-message-sent.js +12 -0
- package/dist/modules/customers/subscribers/link-channel-message-sent.js.map +7 -0
- 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]/entries/route.js +12 -5
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/route.js +25 -1
- package/dist/modules/dictionaries/api/[dictionaryId]/route.js.map +2 -2
- package/dist/modules/dictionaries/api/openapi.js +2 -0
- package/dist/modules/dictionaries/api/openapi.js.map +2 -2
- package/dist/modules/dictionaries/api/route.js +7 -0
- package/dist/modules/dictionaries/api/route.js.map +2 -2
- package/dist/modules/dictionaries/commands/entry-operations.js +8 -0
- package/dist/modules/dictionaries/commands/entry-operations.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionariesManager.js +95 -16
- package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +29 -16
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +51 -11
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionarySelectControl.js +9 -1
- package/dist/modules/dictionaries/components/DictionarySelectControl.js.map +2 -2
- package/dist/modules/dictionaries/components/dictionaryAppearance.js +2 -1
- package/dist/modules/dictionaries/components/dictionaryAppearance.js.map +2 -2
- package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js +2 -1
- package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js.map +2 -2
- package/dist/modules/dictionaries/data/entities.js +5 -0
- package/dist/modules/dictionaries/data/entities.js.map +2 -2
- package/dist/modules/dictionaries/data/validators.js +3 -1
- package/dist/modules/dictionaries/data/validators.js.map +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js.map +1 -1
- package/dist/modules/dictionaries/lib/entrySort.js +61 -0
- package/dist/modules/dictionaries/lib/entrySort.js.map +7 -0
- package/dist/modules/dictionaries/migrations/Migration20260602202147_dictionaries.js +13 -0
- package/dist/modules/dictionaries/migrations/Migration20260602202147_dictionaries.js.map +7 -0
- package/dist/modules/directory/api/get/organizations/lookup.js +3 -7
- package/dist/modules/directory/api/get/organizations/lookup.js.map +2 -2
- package/dist/modules/directory/api/organizations/route.js +41 -16
- 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 +18 -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 +17 -4
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/commands/organizations.js +70 -2
- package/dist/modules/directory/commands/organizations.js.map +2 -2
- package/dist/modules/directory/commands/tenants.js +16 -3
- package/dist/modules/directory/commands/tenants.js.map +2 -2
- package/dist/modules/entities/api/records.js +107 -7
- 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/components/UserEntitiesTable.js +9 -0
- package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
- package/dist/modules/entities/lib/entityAcl.js +82 -0
- package/dist/modules/entities/lib/entityAcl.js.map +7 -0
- package/dist/modules/entities/lib/helpers.js +79 -65
- package/dist/modules/entities/lib/helpers.js.map +2 -2
- package/dist/modules/feature_toggles/api/global/[id]/override/route.js +15 -10
- package/dist/modules/feature_toggles/api/global/[id]/override/route.js.map +2 -2
- package/dist/modules/feature_toggles/api/global/[id]/route.js +2 -1
- package/dist/modules/feature_toggles/api/global/[id]/route.js.map +2 -2
- package/dist/modules/feature_toggles/api/overrides/route.js +20 -7
- 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 +21 -16
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js.map +2 -2
- package/dist/modules/feature_toggles/commands/global.js +127 -8
- package/dist/modules/feature_toggles/commands/global.js.map +2 -2
- package/dist/modules/feature_toggles/commands/overrides.js +8 -6
- package/dist/modules/feature_toggles/commands/overrides.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 +15 -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/feature_toggles/lib/queries.js +5 -5
- package/dist/modules/feature_toggles/lib/queries.js.map +2 -2
- package/dist/modules/feature_toggles/lib/utils.js.map +2 -2
- package/dist/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/route.js +8 -1
- package/dist/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/settings/route.js +23 -2
- package/dist/modules/inbox_ops/api/settings/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/webhook/inbound.js +53 -14
- package/dist/modules/inbox_ops/api/webhook/inbound.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/inbox_ops/data/entities.js +3 -0
- package/dist/modules/inbox_ops/data/entities.js.map +2 -2
- package/dist/modules/inbox_ops/data/validators.js +5 -1
- package/dist/modules/inbox_ops/data/validators.js.map +2 -2
- package/dist/modules/inbox_ops/encryption.js +9 -0
- package/dist/modules/inbox_ops/encryption.js.map +2 -2
- package/dist/modules/inbox_ops/lib/executionEngine.js +6 -1
- package/dist/modules/inbox_ops/lib/executionEngine.js.map +2 -2
- package/dist/modules/inbox_ops/lib/executionHelpers.js +2 -7
- package/dist/modules/inbox_ops/lib/executionHelpers.js.map +2 -2
- package/dist/modules/inbox_ops/lib/priceValidator.js +35 -7
- package/dist/modules/inbox_ops/lib/priceValidator.js.map +2 -2
- package/dist/modules/inbox_ops/lib/rateLimiter.js +58 -23
- package/dist/modules/inbox_ops/lib/rateLimiter.js.map +2 -2
- package/dist/modules/inbox_ops/lib/translationProvider.js +33 -5
- package/dist/modules/inbox_ops/lib/translationProvider.js.map +2 -2
- package/dist/modules/inbox_ops/migrations/Migration20260607205834.js +13 -0
- package/dist/modules/inbox_ops/migrations/Migration20260607205834.js.map +7 -0
- package/dist/modules/inbox_ops/subscribers/extractionWorker.js +2 -1
- package/dist/modules/inbox_ops/subscribers/extractionWorker.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +11 -0
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +8 -0
- package/dist/modules/integrations/backend/integrations/[id]/page.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/integrations/data/entities.js +8 -1
- package/dist/modules/integrations/data/entities.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-field-validation.js +32 -0
- package/dist/modules/integrations/lib/credentials-field-validation.js.map +7 -0
- package/dist/modules/integrations/lib/credentials-service.js +29 -14
- package/dist/modules/integrations/lib/credentials-service.js.map +2 -2
- package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js +15 -0
- package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js.map +7 -0
- package/dist/modules/messages/api/route.js +2 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/api/token/[token]/route.js +1 -1
- package/dist/modules/messages/api/token/[token]/route.js.map +2 -2
- package/dist/modules/messages/commands/actions.js +9 -7
- package/dist/modules/messages/commands/actions.js.map +2 -2
- package/dist/modules/messages/commands/messages.js +83 -18
- package/dist/modules/messages/commands/messages.js.map +2 -2
- package/dist/modules/messages/commands/tokens.js +1 -1
- package/dist/modules/messages/commands/tokens.js.map +2 -2
- package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -13
- package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js +39 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +10 -0
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js.map +2 -2
- package/dist/modules/messages/components/message-detail/utils.js +17 -0
- package/dist/modules/messages/components/message-detail/utils.js.map +2 -2
- package/dist/modules/messages/data/entities.js +8 -1
- package/dist/modules/messages/data/entities.js.map +2 -2
- package/dist/modules/messages/data/validators.js +5 -1
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/actions.js +5 -3
- package/dist/modules/messages/lib/actions.js.map +2 -2
- package/dist/modules/messages/migrations/Migration20260531130000.js +15 -0
- package/dist/modules/messages/migrations/Migration20260531130000.js.map +7 -0
- package/dist/modules/messages/widgets/injection-table.js +7 -0
- package/dist/modules/messages/widgets/injection-table.js.map +7 -0
- package/dist/modules/notifications/api/[id]/action/route.js +12 -2
- package/dist/modules/notifications/api/[id]/action/route.js.map +2 -2
- package/dist/modules/notifications/api/route.js +17 -4
- package/dist/modules/notifications/api/route.js.map +2 -2
- package/dist/modules/notifications/lib/notificationService.js +26 -21
- package/dist/modules/notifications/lib/notificationService.js.map +2 -2
- package/dist/modules/notifications/lib/routeHelpers.js +46 -8
- package/dist/modules/notifications/lib/routeHelpers.js.map +2 -2
- package/dist/modules/payment_gateways/api/status/route.js +6 -0
- package/dist/modules/payment_gateways/api/status/route.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/commands/availability-rule-sets.js +20 -1
- package/dist/modules/planner/commands/availability-rule-sets.js.map +2 -2
- package/dist/modules/planner/commands/availability.js +9 -0
- package/dist/modules/planner/commands/availability.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js +3 -1
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +52 -13
- 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/portal/frontend/[orgSlug]/portal/login/page.js +15 -14
- package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +14 -21
- package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js +11 -1
- package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +15 -5
- package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
- package/dist/modules/progress/api/jobs/[id]/route.js +7 -1
- package/dist/modules/progress/api/jobs/[id]/route.js.map +2 -2
- package/dist/modules/query_index/api/openapi.js +2 -1
- package/dist/modules/query_index/api/openapi.js.map +2 -2
- package/dist/modules/query_index/api/reindex.js +4 -0
- package/dist/modules/query_index/api/reindex.js.map +2 -2
- package/dist/modules/query_index/data/entities.js +5 -1
- package/dist/modules/query_index/data/entities.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +48 -15
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +50 -24
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/query_index/lib/jobs.js +28 -0
- package/dist/modules/query_index/lib/jobs.js.map +2 -2
- package/dist/modules/query_index/lib/reindexer.js +24 -15
- package/dist/modules/query_index/lib/reindexer.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +3 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20260606205453_query_index.js +35 -0
- package/dist/modules/query_index/migrations/Migration20260606205453_query_index.js.map +7 -0
- package/dist/modules/query_index/subscribers/delete_one.js +28 -15
- package/dist/modules/query_index/subscribers/delete_one.js.map +2 -2
- package/dist/modules/query_index/subscribers/upsert_one.js +31 -13
- package/dist/modules/query_index/subscribers/upsert_one.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js +18 -2
- 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 +31 -4
- package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +17 -4
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/commands/activities.js +64 -0
- package/dist/modules/resources/commands/activities.js.map +2 -2
- package/dist/modules/resources/commands/comments.js +21 -1
- package/dist/modules/resources/commands/comments.js.map +2 -2
- package/dist/modules/resources/commands/resource-types.js +22 -1
- package/dist/modules/resources/commands/resource-types.js.map +2 -2
- package/dist/modules/resources/commands/resources.js +87 -0
- package/dist/modules/resources/commands/resources.js.map +2 -2
- package/dist/modules/resources/commands/tag-assignments.js +53 -0
- package/dist/modules/resources/commands/tag-assignments.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +90 -50
- package/dist/modules/resources/components/ResourceCrudForm.js.map +2 -2
- package/dist/modules/resources/components/ResourceTypeCrudForm.js +2 -1
- 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/api/shipping-methods/route.js +4 -0
- package/dist/modules/sales/api/shipping-methods/route.js.map +2 -2
- package/dist/modules/sales/api/tax-rates/route.js +4 -0
- package/dist/modules/sales/api/tax-rates/route.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 +70 -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/configuration.js +112 -7
- package/dist/modules/sales/commands/configuration.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 +46 -14
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/commands/notes.js +39 -1
- package/dist/modules/sales/commands/notes.js.map +2 -2
- package/dist/modules/sales/commands/payments.js +121 -14
- package/dist/modules/sales/commands/payments.js.map +2 -2
- package/dist/modules/sales/commands/returns.js +178 -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 +48 -6
- 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 +65 -18
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +11 -4
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +101 -36
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentDialog.js +37 -10
- package/dist/modules/sales/components/documents/AdjustmentDialog.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 +23 -14
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +70 -28
- 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/SalesDocumentForm.js +1 -0
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +11 -6
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +102 -17
- 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/sales/frontend/quote/[token]/page.js +11 -1
- package/dist/modules/sales/frontend/quote/[token]/page.js.map +2 -2
- package/dist/modules/sales/lib/calculations.js +18 -1
- package/dist/modules/sales/lib/calculations.js.map +2 -2
- package/dist/modules/sales/lib/dictionaries.js +2 -2
- package/dist/modules/sales/lib/dictionaries.js.map +2 -2
- package/dist/modules/sales/lib/makeStatusDictionaryRoute.js +2 -0
- package/dist/modules/sales/lib/makeStatusDictionaryRoute.js.map +2 -2
- package/dist/modules/shipping_carriers/api/cancel/route.js +2 -2
- package/dist/modules/shipping_carriers/api/cancel/route.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/status-sync.js +8 -1
- package/dist/modules/shipping_carriers/lib/status-sync.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/leave-requests/page.js +9 -1
- package/dist/modules/staff/backend/staff/leave-requests/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/profile/create/page.js +1 -1
- package/dist/modules/staff/backend/staff/profile/create/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 +17 -27
- 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 +48 -2
- 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 +17 -35
- 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 +24 -14
- 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]/edit/page.js +18 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +35 -5
- 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/activities.js +53 -0
- package/dist/modules/staff/commands/activities.js.map +2 -2
- package/dist/modules/staff/commands/addresses.js +70 -0
- package/dist/modules/staff/commands/addresses.js.map +2 -2
- package/dist/modules/staff/commands/comments.js +21 -1
- package/dist/modules/staff/commands/comments.js.map +2 -2
- package/dist/modules/staff/commands/job-histories.js +88 -3
- package/dist/modules/staff/commands/job-histories.js.map +2 -2
- package/dist/modules/staff/commands/leave-requests.js +39 -1
- package/dist/modules/staff/commands/leave-requests.js.map +2 -2
- package/dist/modules/staff/commands/tag-assignments.js +33 -0
- package/dist/modules/staff/commands/tag-assignments.js.map +2 -2
- package/dist/modules/staff/commands/team-members.js +43 -0
- package/dist/modules/staff/commands/team-members.js.map +2 -2
- package/dist/modules/staff/commands/team-roles.js +23 -0
- package/dist/modules/staff/commands/team-roles.js.map +2 -2
- package/dist/modules/staff/commands/teams.js +23 -0
- package/dist/modules/staff/commands/teams.js.map +2 -2
- package/dist/modules/staff/commands/timesheets-entries.js +31 -1
- package/dist/modules/staff/commands/timesheets-entries.js.map +2 -2
- package/dist/modules/staff/commands/timesheets-projects.js +56 -2
- package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
- package/dist/modules/staff/components/LeaveRequestForm.js +2 -0
- package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
- package/dist/modules/staff/components/TeamForm.js +2 -1
- package/dist/modules/staff/components/TeamForm.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +35 -4
- package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
- package/dist/modules/staff/components/TeamRoleForm.js +4 -3
- 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/api/[entityType]/[entityId]/route.js +9 -1
- package/dist/modules/translations/api/[entityType]/[entityId]/route.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/acl.js +102 -17
- package/dist/modules/workflows/acl.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 +33 -13
- 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/NodeEditDialog.js +3 -1
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +4 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +2 -2
- package/dist/modules/workflows/components/formConfig.js +26 -13
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js +49 -0
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +49 -0
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/index.js +4 -0
- package/dist/modules/workflows/components/nodes/index.js.map +2 -2
- package/dist/modules/workflows/data/entities.js +81 -0
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/validators.js +146 -1
- package/dist/modules/workflows/data/validators.js.map +2 -2
- package/dist/modules/workflows/di.js +12 -0
- package/dist/modules/workflows/di.js.map +2 -2
- package/dist/modules/workflows/events.js +7 -1
- package/dist/modules/workflows/events.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -2
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
- package/dist/modules/workflows/lib/event-logger.js +2 -0
- package/dist/modules/workflows/lib/event-logger.js.map +2 -2
- package/dist/modules/workflows/lib/execution-token.js +98 -0
- package/dist/modules/workflows/lib/execution-token.js.map +7 -0
- package/dist/modules/workflows/lib/node-type-icons.js +14 -5
- package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
- package/dist/modules/workflows/lib/parallel-handler.js +364 -0
- package/dist/modules/workflows/lib/parallel-handler.js.map +7 -0
- package/dist/modules/workflows/lib/signal-handler.js +63 -1
- package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
- package/dist/modules/workflows/lib/step-handler.js +74 -30
- package/dist/modules/workflows/lib/step-handler.js.map +2 -2
- package/dist/modules/workflows/lib/task-handler.js +26 -0
- package/dist/modules/workflows/lib/task-handler.js.map +2 -2
- package/dist/modules/workflows/lib/timer-handler.js +26 -1
- package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +33 -21
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-executor.js +54 -1
- package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
- package/dist/modules/workflows/migrations/Migration20260602120000.js +24 -0
- package/dist/modules/workflows/migrations/Migration20260602120000.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-activities.worker.js +8 -4
- package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
- package/generated/entities/channel_ingest_dead_letter/index.ts +11 -0
- package/generated/entities/channel_thread_mapping/index.ts +11 -0
- package/generated/entities/channel_thread_token/index.ts +7 -0
- package/generated/entities/communication_channel/index.ts +20 -0
- package/generated/entities/customer_interaction/index.ts +2 -0
- package/generated/entities/customer_settings/index.ts +1 -0
- package/generated/entities/dictionary/index.ts +1 -0
- package/generated/entities/external_conversation/index.ts +11 -0
- package/generated/entities/external_message/index.ts +11 -0
- package/generated/entities/inbox_settings/index.ts +1 -0
- package/generated/entities/integration_credentials/index.ts +1 -0
- package/generated/entities/message/index.ts +1 -0
- package/generated/entities/message_channel_link/index.ts +15 -0
- package/generated/entities/message_reaction/index.ts +11 -0
- package/generated/entities/role/index.ts +1 -0
- package/generated/entities/step_instance/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entities/user_task/index.ts +1 -0
- package/generated/entities/workflow_branch_instance/index.ts +18 -0
- package/generated/entities/workflow_event/index.ts +1 -0
- package/generated/entities/workflow_instance/index.ts +1 -0
- package/generated/entities.ids.generated.ts +12 -0
- package/generated/entity-fields-registry.ts +146 -0
- package/jest.config.cjs +4 -0
- package/jest.mocks/entities.ids.generated.js +9 -0
- package/jest.setup.ts +17 -0
- package/package.json +17 -15
- package/src/helpers/integration/api.ts +15 -2
- package/src/helpers/integration/authFixtures.ts +4 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +130 -0
- package/src/helpers/integration/crudFormFields.ts +48 -0
- package/src/helpers/integration/crudFormPersistence.ts +178 -0
- package/src/helpers/integration/currenciesFixtures.ts +60 -0
- package/src/helpers/integration/customerAccountsFixtures.ts +256 -0
- package/src/helpers/integration/dbFixtures.ts +15 -1
- package/src/helpers/integration/inboxFixtures.ts +36 -0
- package/src/helpers/integration/optimisticLockUi.ts +172 -0
- package/src/helpers/integration/salesFixtures.ts +29 -0
- package/src/helpers/integration/salesUi.ts +19 -12
- package/src/helpers/integration/standaloneEnv.ts +62 -0
- package/src/helpers/integration/undoHarness.ts +243 -0
- package/src/helpers/integration/workflowsFixtures.ts +231 -0
- package/src/modules/api_keys/backend/api-keys/page.tsx +18 -5
- package/src/modules/api_keys/data/validators.ts +3 -1
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +19 -9
- package/src/modules/attachments/lib/ocrQueue.ts +9 -1
- package/src/modules/attachments/lib/security.ts +1 -1
- package/src/modules/audit_logs/api/audit-logs/actions/redo/route.ts +3 -1
- package/src/modules/audit_logs/api/audit-logs/actions/undo/route.ts +13 -2
- package/src/modules/audit_logs/data/entities.ts +1 -1
- package/src/modules/audit_logs/services/actionLogService.ts +18 -0
- package/src/modules/auth/api/logout.ts +0 -12
- package/src/modules/auth/api/roles/acl/route.ts +37 -11
- package/src/modules/auth/api/roles/route.ts +56 -2
- package/src/modules/auth/api/sidebar/preferences/route.ts +83 -3
- package/src/modules/auth/api/users/acl/route.ts +94 -33
- package/src/modules/auth/api/users/consents/route.ts +20 -0
- package/src/modules/auth/api/users/resend-invite/route.ts +20 -0
- package/src/modules/auth/api/users/route.ts +42 -1
- package/src/modules/auth/backend/roles/[id]/edit/page.tsx +29 -4
- package/src/modules/auth/backend/roles/page.tsx +17 -4
- package/src/modules/auth/backend/users/[id]/edit/page.tsx +92 -6
- package/src/modules/auth/backend/users/page.tsx +15 -2
- package/src/modules/auth/cli.ts +20 -21
- package/src/modules/auth/commands/roles.ts +81 -1
- package/src/modules/auth/commands/users.ts +117 -6
- package/src/modules/auth/components/AclEditor.tsx +10 -1
- package/src/modules/auth/data/entities.ts +7 -1
- package/src/modules/auth/frontend/reset/[token]/page.tsx +7 -2
- package/src/modules/auth/lib/consentIntegrity.ts +18 -2
- package/src/modules/auth/lib/emailHash.ts +5 -1
- package/src/modules/auth/lib/grantChecks.ts +55 -1
- package/src/modules/auth/lib/sessionIntegrity.ts +18 -1
- package/src/modules/auth/services/authService.ts +10 -19
- 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 +29 -12
- package/src/modules/business_rules/backend/sets/[id]/page.tsx +16 -4
- package/src/modules/business_rules/backend/sets/page.tsx +28 -11
- package/src/modules/catalog/AGENTS.md +10 -0
- 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 +174 -91
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +121 -34
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/create/page.tsx +22 -5
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -28
- package/src/modules/catalog/backend/catalog/products/optionSchemaClient.ts +2 -0
- package/src/modules/catalog/commands/categories.ts +42 -0
- package/src/modules/catalog/commands/offers.ts +44 -0
- package/src/modules/catalog/commands/optionSchemas.ts +10 -0
- package/src/modules/catalog/commands/priceKinds.ts +5 -0
- package/src/modules/catalog/commands/prices.ts +50 -0
- package/src/modules/catalog/commands/productUnitConversions.ts +32 -0
- package/src/modules/catalog/commands/products.ts +87 -0
- package/src/modules/catalog/commands/variants.ts +118 -32
- package/src/modules/catalog/components/PriceKindSettings.tsx +21 -7
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +9 -0
- package/src/modules/catalog/components/products/ProductMediaManager.tsx +2 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +16 -4
- package/src/modules/catalog/components/products/VariantBuilder.tsx +48 -9
- package/src/modules/catalog/components/products/productForm.ts +41 -0
- package/src/modules/catalog/components/products/variantForm.ts +10 -0
- package/src/modules/catalog/lib/pricing.ts +8 -0
- package/src/modules/communication_channels/acl.ts +43 -0
- package/src/modules/communication_channels/api/delete/channels/[id]/route.ts +163 -0
- package/src/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.ts +143 -0
- package/src/modules/communication_channels/api/get/channels/[id]/health/route.ts +173 -0
- package/src/modules/communication_channels/api/get/channels/[id]/route.ts +111 -0
- package/src/modules/communication_channels/api/get/channels/route.ts +109 -0
- package/src/modules/communication_channels/api/get/me/channels/route.ts +100 -0
- package/src/modules/communication_channels/api/get/oauth/[provider]/callback/route.ts +355 -0
- package/src/modules/communication_channels/api/post/channels/[id]/import-history/route.ts +206 -0
- package/src/modules/communication_channels/api/post/channels/[id]/poll-now/route.ts +174 -0
- package/src/modules/communication_channels/api/post/channels/[id]/push/register/route.ts +158 -0
- package/src/modules/communication_channels/api/post/channels/[id]/set-primary/route.ts +114 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +241 -0
- package/src/modules/communication_channels/api/post/channels/connect/credentials/route.ts +134 -0
- package/src/modules/communication_channels/api/post/messages/[messageId]/reactions/route.ts +143 -0
- package/src/modules/communication_channels/api/post/oauth/[provider]/initiate/route.ts +192 -0
- package/src/modules/communication_channels/api/post/send-as-user/route.ts +125 -0
- package/src/modules/communication_channels/api/post/test-seed/route.ts +294 -0
- package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +227 -0
- package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +161 -0
- package/src/modules/communication_channels/api/put/threads/[threadId]/assign/route.ts +132 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.ts +34 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.tsx +250 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.meta.ts +36 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +137 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.meta.ts +36 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +912 -0
- package/src/modules/communication_channels/commands/connect-credential-channel.ts +243 -0
- package/src/modules/communication_channels/commands/delete-channel.ts +193 -0
- package/src/modules/communication_channels/commands/deliver-outbound-message.ts +579 -0
- package/src/modules/communication_channels/commands/disconnect-channel.ts +241 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +602 -0
- package/src/modules/communication_channels/commands/interceptors.ts +104 -0
- package/src/modules/communication_channels/commands/process-inbound-reaction.ts +265 -0
- package/src/modules/communication_channels/commands/push-register.ts +203 -0
- package/src/modules/communication_channels/commands/push-renew.ts +49 -0
- package/src/modules/communication_channels/commands/push-unregister.ts +168 -0
- package/src/modules/communication_channels/commands/queue-import-history.ts +180 -0
- package/src/modules/communication_channels/commands/reassign-conversation.ts +273 -0
- package/src/modules/communication_channels/commands/set-primary-channel.ts +157 -0
- package/src/modules/communication_channels/commands/toggle-outbound-reaction.ts +347 -0
- package/src/modules/communication_channels/data/enrichers.ts +413 -0
- package/src/modules/communication_channels/data/entities.ts +546 -0
- package/src/modules/communication_channels/data/extensions.ts +76 -0
- package/src/modules/communication_channels/data/validators.ts +138 -0
- package/src/modules/communication_channels/di.ts +40 -0
- package/src/modules/communication_channels/encryption.ts +44 -0
- package/src/modules/communication_channels/events.ts +122 -0
- package/src/modules/communication_channels/i18n/de.json +138 -0
- package/src/modules/communication_channels/i18n/en.json +138 -0
- package/src/modules/communication_channels/i18n/es.json +138 -0
- package/src/modules/communication_channels/i18n/pl.json +138 -0
- package/src/modules/communication_channels/index.ts +19 -0
- package/src/modules/communication_channels/lib/access-control.ts +110 -0
- package/src/modules/communication_channels/lib/adapter-compat.ts +57 -0
- package/src/modules/communication_channels/lib/adapter-registry-singleton.ts +35 -0
- package/src/modules/communication_channels/lib/adapter.ts +605 -0
- package/src/modules/communication_channels/lib/connect-channel.ts +163 -0
- package/src/modules/communication_channels/lib/contact-resolver.ts +162 -0
- package/src/modules/communication_channels/lib/credential-refresh.ts +197 -0
- package/src/modules/communication_channels/lib/dead-letter.ts +87 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +60 -0
- package/src/modules/communication_channels/lib/email-contact.ts +17 -0
- package/src/modules/communication_channels/lib/email-mime.ts +501 -0
- package/src/modules/communication_channels/lib/error-classification.ts +144 -0
- package/src/modules/communication_channels/lib/gmail-pubsub-jwt.ts +278 -0
- package/src/modules/communication_channels/lib/mutation-guards.ts +215 -0
- package/src/modules/communication_channels/lib/oauth-client-config.ts +79 -0
- package/src/modules/communication_channels/lib/oauth-state.ts +228 -0
- package/src/modules/communication_channels/lib/oauth-token.ts +81 -0
- package/src/modules/communication_channels/lib/pg-errors.ts +12 -0
- package/src/modules/communication_channels/lib/provider-health.ts +47 -0
- package/src/modules/communication_channels/lib/push-state.ts +38 -0
- package/src/modules/communication_channels/lib/queue.ts +66 -0
- package/src/modules/communication_channels/lib/reaction-processor-types.ts +51 -0
- package/src/modules/communication_channels/lib/reaction-semantics.ts +48 -0
- package/src/modules/communication_channels/lib/registry.ts +99 -0
- package/src/modules/communication_channels/lib/route-mutation-guard.ts +68 -0
- package/src/modules/communication_channels/lib/sanitize-channel-html.ts +129 -0
- package/src/modules/communication_channels/lib/send-as-user.ts +284 -0
- package/src/modules/communication_channels/lib/system-user.ts +74 -0
- package/src/modules/communication_channels/lib/test-seed.ts +140 -0
- package/src/modules/communication_channels/lib/thread-matcher.ts +430 -0
- package/src/modules/communication_channels/lib/thread-token.ts +355 -0
- package/src/modules/communication_channels/lib/use-connect-channel.ts +73 -0
- package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +2142 -0
- package/src/modules/communication_channels/migrations/Migration20260526134719_communication_channels.ts +55 -0
- package/src/modules/communication_channels/migrations/Migration20260527195446_communication_channels.ts +20 -0
- package/src/modules/communication_channels/migrations/Migration20260529231848_communication_channels.ts +13 -0
- package/src/modules/communication_channels/migrations/Migration20260531120000_communication_channels.ts +24 -0
- package/src/modules/communication_channels/notifications.client.ts +50 -0
- package/src/modules/communication_channels/notifications.handlers.ts +86 -0
- package/src/modules/communication_channels/notifications.ts +52 -0
- package/src/modules/communication_channels/setup.ts +158 -0
- package/src/modules/communication_channels/subscribers/channel-requires-reauth-notification.ts +118 -0
- package/src/modules/communication_channels/subscribers/outbound-bridge.ts +175 -0
- package/src/modules/communication_channels/subscribers/user-deleted-cascade.ts +100 -0
- package/src/modules/communication_channels/widgets/components.ts +36 -0
- package/src/modules/communication_channels/widgets/injection/channel-badge/widget.client.tsx +38 -0
- package/src/modules/communication_channels/widgets/injection/channel-badge/widget.ts +51 -0
- package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.tsx +278 -0
- package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.ts +24 -0
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.tsx +63 -0
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.ts +29 -0
- package/src/modules/communication_channels/widgets/injection/profile-channels-menu/widget.ts +34 -0
- package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.client.tsx +177 -0
- package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.ts +26 -0
- package/src/modules/communication_channels/widgets/injection-table.ts +47 -0
- package/src/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.tsx +48 -0
- package/src/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.tsx +45 -0
- package/src/modules/communication_channels/widgets/notifications/index.ts +2 -0
- package/src/modules/communication_channels/workers/channel-import-history.ts +252 -0
- package/src/modules/communication_channels/workers/gmail-history-sync.ts +223 -0
- package/src/modules/communication_channels/workers/gmail-renew-watch.ts +141 -0
- package/src/modules/communication_channels/workers/inbound-processor.ts +114 -0
- package/src/modules/communication_channels/workers/outbound-delivery.ts +155 -0
- package/src/modules/communication_channels/workers/poll-channel.ts +391 -0
- package/src/modules/communication_channels/workers/poll-tick.ts +210 -0
- package/src/modules/communication_channels/workers/reaction-processor.ts +264 -0
- package/src/modules/configs/api/openapi.ts +12 -2
- package/src/modules/currencies/backend/currencies/[id]/page.tsx +13 -6
- package/src/modules/currencies/backend/currencies/page.tsx +26 -11
- package/src/modules/currencies/backend/exchange-rates/[id]/page.tsx +3 -0
- package/src/modules/currencies/backend/exchange-rates/page.tsx +21 -12
- package/src/modules/currencies/commands/currencies.ts +42 -18
- package/src/modules/currencies/commands/exchange-rates.ts +18 -8
- package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +31 -21
- package/src/modules/currencies/i18n/de.json +1 -0
- package/src/modules/currencies/i18n/en.json +1 -0
- package/src/modules/currencies/i18n/es.json +1 -0
- package/src/modules/currencies/i18n/pl.json +1 -0
- 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 +57 -5
- package/src/modules/customer_accounts/api/admin/users-invite.ts +17 -0
- package/src/modules/customer_accounts/api/admin/users.ts +74 -23
- package/src/modules/customer_accounts/api/login.ts +21 -4
- package/src/modules/customer_accounts/api/portal/users-invite.ts +17 -0
- package/src/modules/customer_accounts/api/signup.ts +3 -1
- 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 +20 -6
- 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 +27 -11
- package/src/modules/customer_accounts/data/validators.ts +1 -0
- package/src/modules/customer_accounts/lib/customerEntityOwnership.ts +39 -0
- package/src/modules/customer_accounts/lib/rateLimiter.ts +14 -0
- package/src/modules/customer_accounts/lib/resolveTenantContext.ts +61 -4
- package/src/modules/customer_accounts/services/customerInvitationService.ts +35 -2
- package/src/modules/customer_accounts/services/customerUserService.ts +13 -7
- package/src/modules/customer_accounts/subscribers/autoLinkCrmReverse.ts +3 -3
- package/src/modules/customers/AGENTS.md +8 -2
- package/src/modules/customers/acl.ts +18 -0
- package/src/modules/customers/agentic/standalone-guide.md +1 -1
- package/src/modules/customers/api/activities/route.ts +42 -21
- package/src/modules/customers/api/addresses/route.ts +2 -0
- package/src/modules/customers/api/companies/[id]/route.ts +26 -3
- package/src/modules/customers/api/companies/route.ts +18 -5
- package/src/modules/customers/api/deals/route.ts +3 -0
- package/src/modules/customers/api/dictionaries/[kind]/route.ts +21 -46
- package/src/modules/customers/api/dictionaries/cache.ts +3 -1
- package/src/modules/customers/api/dictionaries/context.ts +1 -1
- package/src/modules/customers/api/interactions/[id]/visibility/route.ts +179 -0
- package/src/modules/customers/api/interactions/counts/route.ts +10 -0
- package/src/modules/customers/api/interactions/route.ts +58 -11
- package/src/modules/customers/api/people/[id]/email-threads/route.ts +92 -0
- package/src/modules/customers/api/people/[id]/emails/route.ts +184 -0
- package/src/modules/customers/api/people/[id]/route.ts +26 -8
- package/src/modules/customers/api/people/route.ts +16 -5
- package/src/modules/customers/api/pipeline-stages/route.ts +0 -14
- package/src/modules/customers/api/settings/dictionary-sort-modes/route.ts +258 -0
- package/src/modules/customers/api/todos/route.ts +29 -11
- 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 +11 -1
- 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 +27 -7
- 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 +11 -1
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +95 -25
- package/src/modules/customers/commands/activities.ts +28 -0
- package/src/modules/customers/commands/addresses.ts +100 -14
- package/src/modules/customers/commands/comments.ts +30 -0
- package/src/modules/customers/commands/companies.ts +121 -1
- package/src/modules/customers/commands/deals.ts +241 -101
- package/src/modules/customers/commands/dictionaries.ts +45 -0
- package/src/modules/customers/commands/entity-roles.ts +49 -0
- package/src/modules/customers/commands/interactions.ts +264 -8
- package/src/modules/customers/commands/labels.ts +85 -0
- package/src/modules/customers/commands/people.ts +208 -13
- package/src/modules/customers/commands/personCompanyLinks.ts +148 -70
- package/src/modules/customers/commands/pipeline-stages.ts +16 -16
- package/src/modules/customers/commands/settings.ts +41 -0
- package/src/modules/customers/commands/tags.ts +59 -0
- package/src/modules/customers/commands/todos.ts +28 -0
- package/src/modules/customers/components/AddressFormatSettings.tsx +1 -0
- package/src/modules/customers/components/CustomersConfigurationSections.tsx +3 -0
- package/src/modules/customers/components/DictionarySettings.tsx +18 -13
- package/src/modules/customers/components/DictionarySortSettings.tsx +268 -0
- package/src/modules/customers/components/PipelineSettings.tsx +42 -21
- package/src/modules/customers/components/detail/ActivityCard.tsx +48 -0
- package/src/modules/customers/components/detail/ActivityForm.tsx +1 -0
- 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/AnnualRevenueField.tsx +1 -0
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +2 -0
- package/src/modules/customers/components/detail/ComposeEmailDialog.tsx +329 -0
- package/src/modules/customers/components/detail/DealForm.tsx +3 -1
- package/src/modules/customers/components/detail/DealsSection.tsx +30 -0
- package/src/modules/customers/components/detail/EmailCardActions.tsx +263 -0
- package/src/modules/customers/components/detail/EmailReplyForwardActions.tsx +53 -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/PersonDetailTabs.tsx +8 -1
- package/src/modules/customers/components/detail/PersonEmailThreadsTab.tsx +448 -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/create/DealCurrencyField.tsx +1 -0
- package/src/modules/customers/components/detail/hooks/useCustomerDictionary.ts +1 -0
- 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 +134 -30
- package/src/modules/customers/data/enrichers.ts +252 -1
- package/src/modules/customers/data/entities.ts +51 -2
- package/src/modules/customers/data/extensions.ts +26 -0
- package/src/modules/customers/data/guards.ts +67 -0
- package/src/modules/customers/data/validators.ts +46 -13
- package/src/modules/customers/di.ts +66 -0
- package/src/modules/customers/encryption.ts +11 -0
- package/src/modules/customers/events.ts +4 -0
- package/src/modules/customers/i18n/de.json +50 -0
- package/src/modules/customers/i18n/en.json +50 -0
- package/src/modules/customers/i18n/es.json +50 -0
- package/src/modules/customers/i18n/pl.json +50 -0
- package/src/modules/customers/lib/detailTenantScope.ts +36 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +107 -0
- package/src/modules/customers/lib/kysely.ts +16 -0
- package/src/modules/customers/lib/link-channel-message-handler.ts +571 -0
- package/src/modules/customers/lib/personCompanyLinkTable.ts +39 -0
- package/src/modules/customers/lib/personEmailThreads.ts +325 -0
- package/src/modules/customers/lib/todoCompatibility.ts +14 -0
- package/src/modules/customers/lib/visibilityFilter.ts +152 -0
- package/src/modules/customers/migrations/.snapshot-open-mercato.json +392 -0
- package/src/modules/customers/migrations/Migration20260527012240_customers.ts +23 -0
- package/src/modules/customers/migrations/Migration20260602202147_customers.ts +13 -0
- package/src/modules/customers/search.ts +6 -0
- package/src/modules/customers/setup.ts +1 -0
- package/src/modules/customers/subscribers/link-channel-message-received.ts +21 -0
- package/src/modules/customers/subscribers/link-channel-message-sent.ts +21 -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/i18n/de.json +1 -0
- package/src/modules/data_sync/i18n/en.json +1 -0
- package/src/modules/data_sync/i18n/es.json +1 -0
- package/src/modules/data_sync/i18n/pl.json +1 -0
- 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]/entries/route.ts +12 -5
- package/src/modules/dictionaries/api/[dictionaryId]/route.ts +31 -0
- package/src/modules/dictionaries/api/openapi.ts +2 -1
- package/src/modules/dictionaries/api/route.ts +7 -0
- package/src/modules/dictionaries/commands/entry-operations.ts +19 -0
- package/src/modules/dictionaries/components/DictionariesManager.tsx +125 -14
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +31 -18
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +56 -9
- package/src/modules/dictionaries/components/DictionarySelectControl.tsx +9 -0
- package/src/modules/dictionaries/components/dictionaryAppearance.tsx +5 -1
- package/src/modules/dictionaries/components/hooks/useDictionaryEntries.ts +1 -0
- package/src/modules/dictionaries/data/entities.ts +6 -0
- package/src/modules/dictionaries/data/validators.ts +2 -0
- package/src/modules/dictionaries/fields/dictionary.tsx +2 -2
- package/src/modules/dictionaries/i18n/de.json +9 -0
- package/src/modules/dictionaries/i18n/en.json +9 -0
- package/src/modules/dictionaries/i18n/es.json +9 -0
- package/src/modules/dictionaries/i18n/pl.json +9 -0
- package/src/modules/dictionaries/lib/entrySort.ts +73 -0
- package/src/modules/dictionaries/migrations/.snapshot-open-mercato.json +44 -0
- package/src/modules/dictionaries/migrations/Migration20260602202147_dictionaries.ts +13 -0
- package/src/modules/directory/api/get/organizations/lookup.ts +0 -8
- package/src/modules/directory/api/organizations/route.ts +40 -16
- package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +8 -0
- package/src/modules/directory/backend/directory/organizations/page.tsx +18 -5
- package/src/modules/directory/backend/directory/tenants/[id]/edit/page.tsx +16 -5
- package/src/modules/directory/backend/directory/tenants/page.tsx +16 -4
- package/src/modules/directory/commands/organizations.ts +74 -4
- package/src/modules/directory/commands/tenants.ts +14 -1
- package/src/modules/entities/api/records.ts +141 -6
- 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/components/UserEntitiesTable.tsx +8 -0
- package/src/modules/entities/lib/entityAcl.ts +108 -0
- package/src/modules/entities/lib/helpers.ts +40 -5
- package/src/modules/feature_toggles/api/global/[id]/override/route.ts +18 -13
- package/src/modules/feature_toggles/api/global/[id]/route.ts +1 -0
- package/src/modules/feature_toggles/api/overrides/route.ts +26 -9
- package/src/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.tsx +42 -15
- package/src/modules/feature_toggles/commands/global.ts +135 -10
- package/src/modules/feature_toggles/commands/overrides.ts +8 -6
- package/src/modules/feature_toggles/components/FeatureToggleOverrideCard.tsx +22 -12
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +15 -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/feature_toggles/lib/queries.ts +5 -5
- package/src/modules/feature_toggles/lib/utils.ts +3 -3
- package/src/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/route.ts +10 -1
- package/src/modules/inbox_ops/api/settings/route.ts +25 -0
- package/src/modules/inbox_ops/api/webhook/inbound.ts +99 -18
- 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/inbox_ops/data/entities.ts +7 -0
- package/src/modules/inbox_ops/data/validators.ts +4 -0
- package/src/modules/inbox_ops/encryption.ts +9 -0
- package/src/modules/inbox_ops/i18n/de.json +2 -0
- package/src/modules/inbox_ops/i18n/en.json +2 -0
- package/src/modules/inbox_ops/i18n/es.json +2 -0
- package/src/modules/inbox_ops/i18n/pl.json +2 -0
- package/src/modules/inbox_ops/lib/executionEngine.ts +6 -1
- package/src/modules/inbox_ops/lib/executionHelpers.ts +8 -7
- package/src/modules/inbox_ops/lib/priceValidator.ts +82 -7
- package/src/modules/inbox_ops/lib/rateLimiter.ts +84 -28
- package/src/modules/inbox_ops/lib/translationProvider.ts +37 -5
- package/src/modules/inbox_ops/migrations/.snapshot-open-mercato.json +16 -0
- package/src/modules/inbox_ops/migrations/.snapshot-openmercato.json +16 -0
- package/src/modules/inbox_ops/migrations/Migration20260607205834.ts +13 -0
- package/src/modules/inbox_ops/subscribers/extractionWorker.ts +5 -2
- package/src/modules/integrations/AGENTS.md +9 -0
- package/src/modules/integrations/api/[id]/credentials/route.ts +12 -0
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +13 -0
- 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/integrations/data/entities.ts +21 -1
- package/src/modules/integrations/i18n/de.json +3 -0
- package/src/modules/integrations/i18n/en.json +3 -0
- package/src/modules/integrations/i18n/es.json +3 -0
- package/src/modules/integrations/i18n/pl.json +3 -0
- package/src/modules/integrations/lib/credentials-field-validation.ts +53 -0
- package/src/modules/integrations/lib/credentials-service.ts +49 -13
- package/src/modules/integrations/migrations/.snapshot-open-mercato.json +26 -1
- package/src/modules/integrations/migrations/Migration20260526154136_integrations.ts +15 -0
- package/src/modules/messages/api/route.ts +2 -2
- package/src/modules/messages/api/token/[token]/route.ts +1 -3
- package/src/modules/messages/commands/actions.ts +8 -6
- package/src/modules/messages/commands/messages.ts +128 -23
- package/src/modules/messages/commands/tokens.ts +1 -3
- package/src/modules/messages/components/ComposeMessagePageClient.tsx +17 -0
- package/src/modules/messages/components/MessageDetailPageClient.tsx +43 -0
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +12 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsActions.ts +6 -2
- package/src/modules/messages/components/message-detail/utils.ts +18 -0
- package/src/modules/messages/data/entities.ts +11 -0
- package/src/modules/messages/data/validators.ts +8 -1
- package/src/modules/messages/lib/actions.ts +9 -3
- package/src/modules/messages/migrations/.snapshot-open-mercato.json +18 -0
- package/src/modules/messages/migrations/Migration20260531130000.ts +15 -0
- package/src/modules/messages/widgets/injection-table.ts +29 -0
- package/src/modules/notifications/api/[id]/action/route.ts +13 -2
- package/src/modules/notifications/api/route.ts +17 -4
- package/src/modules/notifications/lib/notificationService.ts +31 -21
- package/src/modules/notifications/lib/routeHelpers.ts +49 -8
- package/src/modules/payment_gateways/api/status/route.ts +6 -0
- 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/commands/availability-rule-sets.ts +19 -0
- package/src/modules/planner/commands/availability.ts +9 -0
- package/src/modules/planner/components/AvailabilityRuleSetForm.tsx +4 -1
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +74 -17
- package/src/modules/planner/components/AvailabilitySchedule.tsx +22 -7
- package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +15 -16
- package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +11 -31
- package/src/modules/portal/frontend/[orgSlug]/portal/reset-password/page.tsx +8 -3
- package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +12 -9
- package/src/modules/progress/api/jobs/[id]/route.ts +7 -0
- package/src/modules/query_index/api/openapi.ts +2 -1
- package/src/modules/query_index/api/reindex.ts +4 -0
- package/src/modules/query_index/data/entities.ts +10 -0
- package/src/modules/query_index/lib/engine.ts +66 -6
- package/src/modules/query_index/lib/indexer.ts +71 -24
- package/src/modules/query_index/lib/jobs.ts +57 -0
- package/src/modules/query_index/lib/reindexer.ts +41 -15
- package/src/modules/query_index/lib/search-tokens.ts +4 -4
- package/src/modules/query_index/migrations/.snapshot-open-mercato.json +9 -0
- package/src/modules/query_index/migrations/Migration20260606205453_query_index.ts +39 -0
- package/src/modules/query_index/subscribers/delete_one.ts +36 -16
- package/src/modules/query_index/subscribers/upsert_one.ts +44 -15
- package/src/modules/resources/backend/resources/resource-types/[id]/edit/page.tsx +28 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +6 -3
- package/src/modules/resources/backend/resources/resources/[id]/page.tsx +62 -4
- package/src/modules/resources/backend/resources/resources/page.tsx +23 -4
- package/src/modules/resources/commands/activities.ts +67 -0
- package/src/modules/resources/commands/comments.ts +20 -0
- package/src/modules/resources/commands/resource-types.ts +21 -0
- package/src/modules/resources/commands/resources.ts +89 -0
- package/src/modules/resources/commands/tag-assignments.ts +55 -0
- package/src/modules/resources/components/ResourceCrudForm.tsx +103 -56
- package/src/modules/resources/components/ResourceTypeCrudForm.tsx +3 -1
- package/src/modules/resources/i18n/de.json +1 -0
- package/src/modules/resources/i18n/en.json +1 -0
- package/src/modules/resources/i18n/es.json +1 -0
- package/src/modules/resources/i18n/pl.json +1 -0
- package/src/modules/sales/api/documents/factory.ts +13 -1
- package/src/modules/sales/api/shipping-methods/route.ts +4 -0
- package/src/modules/sales/api/tax-rates/route.ts +4 -0
- 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 +75 -20
- package/src/modules/sales/backend/sales/documents/create/page.tsx +2 -0
- package/src/modules/sales/commands/configuration.ts +108 -2
- package/src/modules/sales/commands/documentAddresses.ts +226 -4
- package/src/modules/sales/commands/documents.ts +41 -9
- package/src/modules/sales/commands/notes.ts +39 -0
- package/src/modules/sales/commands/payments.ts +160 -14
- package/src/modules/sales/commands/returns.ts +194 -3
- package/src/modules/sales/commands/shared.ts +36 -0
- package/src/modules/sales/commands/shipments.ts +63 -6
- 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 +85 -20
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +10 -4
- package/src/modules/sales/components/documents/AddressesSection.tsx +116 -48
- package/src/modules/sales/components/documents/AdjustmentDialog.tsx +61 -18
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +50 -25
- package/src/modules/sales/components/documents/ItemsSection.tsx +25 -14
- package/src/modules/sales/components/documents/LineItemDialog.tsx +107 -36
- 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/SalesDocumentForm.tsx +1 -0
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +12 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +132 -22
- 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/frontend/quote/[token]/page.tsx +8 -1
- package/src/modules/sales/i18n/de.json +4 -0
- package/src/modules/sales/i18n/en.json +4 -0
- package/src/modules/sales/i18n/es.json +4 -0
- package/src/modules/sales/i18n/pl.json +4 -0
- package/src/modules/sales/lib/calculations.ts +32 -4
- package/src/modules/sales/lib/dictionaries.ts +3 -2
- package/src/modules/sales/lib/makeStatusDictionaryRoute.ts +2 -0
- package/src/modules/shipping_carriers/api/cancel/route.ts +2 -2
- package/src/modules/shipping_carriers/lib/status-sync.ts +19 -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/leave-requests/page.tsx +8 -1
- package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +2 -0
- package/src/modules/staff/backend/staff/profile/create/page.tsx +1 -1
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +16 -5
- package/src/modules/staff/backend/staff/team-members/page.tsx +18 -25
- package/src/modules/staff/backend/staff/team-roles/[id]/edit/page.tsx +61 -6
- package/src/modules/staff/backend/staff/team-roles/page.tsx +22 -34
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +13 -3
- package/src/modules/staff/backend/staff/teams/page.tsx +24 -15
- package/src/modules/staff/backend/staff/timesheets/page.tsx +10 -1
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +22 -3
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +37 -7
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +9 -3
- package/src/modules/staff/commands/activities.ts +56 -0
- package/src/modules/staff/commands/addresses.ts +72 -0
- package/src/modules/staff/commands/comments.ts +25 -0
- package/src/modules/staff/commands/job-histories.ts +92 -3
- package/src/modules/staff/commands/leave-requests.ts +40 -0
- package/src/modules/staff/commands/tag-assignments.ts +35 -0
- package/src/modules/staff/commands/team-members.ts +45 -0
- package/src/modules/staff/commands/team-roles.ts +24 -0
- package/src/modules/staff/commands/teams.ts +24 -0
- package/src/modules/staff/commands/timesheets-entries.ts +31 -0
- package/src/modules/staff/commands/timesheets-projects.ts +56 -0
- package/src/modules/staff/components/LeaveRequestForm.tsx +3 -0
- package/src/modules/staff/components/TeamForm.tsx +3 -1
- package/src/modules/staff/components/TeamMemberForm.tsx +36 -3
- package/src/modules/staff/components/TeamRoleForm.tsx +5 -3
- 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 +2 -0
- package/src/modules/staff/i18n/en.json +2 -0
- package/src/modules/staff/i18n/es.json +2 -0
- package/src/modules/staff/i18n/pl.json +2 -0
- package/src/modules/staff/lib/leaveRequestHelpers.ts +4 -0
- package/src/modules/translations/api/[entityType]/[entityId]/route.ts +9 -1
- package/src/modules/translations/components/TranslationManager.tsx +13 -8
- package/src/modules/workflows/acl.ts +102 -17
- 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 +34 -15
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +29 -16
- package/src/modules/workflows/components/NodeEditDialog.tsx +2 -0
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +3 -1
- package/src/modules/workflows/components/formConfig.tsx +37 -17
- package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +66 -0
- package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +66 -0
- package/src/modules/workflows/components/nodes/index.ts +6 -0
- package/src/modules/workflows/data/entities.ts +109 -0
- package/src/modules/workflows/data/validators.ts +223 -0
- package/src/modules/workflows/di.ts +20 -0
- package/src/modules/workflows/events.ts +7 -0
- package/src/modules/workflows/i18n/de.json +13 -0
- package/src/modules/workflows/i18n/en.json +13 -0
- package/src/modules/workflows/i18n/es.json +13 -0
- package/src/modules/workflows/i18n/pl.json +13 -0
- package/src/modules/workflows/lib/activity-executor.ts +8 -2
- package/src/modules/workflows/lib/activity-queue-types.ts +3 -0
- package/src/modules/workflows/lib/event-logger.ts +3 -0
- package/src/modules/workflows/lib/execution-token.ts +166 -0
- package/src/modules/workflows/lib/node-type-icons.ts +11 -2
- package/src/modules/workflows/lib/parallel-handler.ts +575 -0
- package/src/modules/workflows/lib/signal-handler.ts +72 -1
- package/src/modules/workflows/lib/step-handler.ts +94 -34
- package/src/modules/workflows/lib/task-handler.ts +32 -0
- package/src/modules/workflows/lib/timer-handler.ts +30 -1
- package/src/modules/workflows/lib/transition-handler.ts +56 -24
- package/src/modules/workflows/lib/workflow-executor.ts +70 -1
- package/src/modules/workflows/migrations/.snapshot-open-mercato.json +263 -0
- package/src/modules/workflows/migrations/Migration20260602120000.ts +25 -0
- package/src/modules/workflows/workers/workflow-activities.worker.ts +9 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/catalog/components/products/productForm.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\nimport { slugify } from \"@open-mercato/shared/lib/slugify\";\nimport { parseObjectLike } from \"@open-mercato/shared/lib/json/parseObjectLike\";\nimport type { ReferenceUnitCode } from \"@open-mercato/shared/lib/units/unitCodes\";\nimport {\n CATALOG_CONFIGURABLE_PRODUCT_TYPES,\n type CatalogProductOptionSchema,\n type CatalogProductType,\n} from \"../../data/types\";\nimport type { ProductMediaItem } from \"./ProductMediaManager\";\n\nexport { slugify };\n\nexport type PriceKindSummary = {\n id: string;\n code: string;\n title: string;\n currencyCode: string | null;\n displayMode: \"including-tax\" | \"excluding-tax\";\n};\n\nexport type PriceKindApiPayload = {\n id?: string | number;\n code?: string;\n title?: string;\n currencyCode?: string | null;\n currency_code?: string | null;\n displayMode?: string | null;\n display_mode?: string | null;\n};\n\nexport type TaxRateSummary = {\n id: string;\n name: string;\n code: string | null;\n rate: number | null;\n isDefault: boolean;\n};\n\nexport type ProductOptionInput = {\n id: string;\n title: string;\n values: Array<{ id: string; label: string }>;\n};\n\nexport type ProductDimensions = {\n width?: number;\n height?: number;\n depth?: number;\n unit?: string | null;\n} | null;\n\nexport type ProductWeight = {\n value?: number;\n unit?: string | null;\n} | null;\n\nexport type VariantPriceValue = {\n amount: string;\n};\n\nexport type ProductUnitRoundingMode = \"half_up\" | \"down\" | \"up\";\nexport type ProductUnitPriceReferenceUnit = ReferenceUnitCode;\n\nexport type ProductUnitConversionDraft = {\n id: string | null;\n unitCode: string;\n toBaseFactor: string;\n sortOrder: string;\n isActive: boolean;\n};\n\nexport type VariantDraft = {\n id: string;\n title: string;\n sku: string;\n isDefault: boolean;\n taxRateId: string | null;\n manageInventory: boolean;\n allowBackorder: boolean;\n hasInventoryKit: boolean;\n optionValues: Record<string, string>;\n prices: Record<string, VariantPriceValue>;\n};\n\nexport type ProductFormValues = {\n title: string;\n subtitle: string;\n handle: string;\n sku: string;\n productType: CatalogProductType;\n description: string;\n useMarkdown: boolean;\n taxRateId: string | null;\n mediaDraftId: string;\n mediaItems: ProductMediaItem[];\n defaultMediaId: string | null;\n defaultMediaUrl: string;\n hasVariants: boolean;\n options: ProductOptionInput[];\n variants: VariantDraft[];\n metadata?: Record<string, unknown> | null;\n dimensions?: ProductDimensions;\n weight?: ProductWeight;\n defaultUnit: string | null;\n defaultSalesUnit: string | null;\n defaultSalesUnitQuantity: string;\n uomRoundingScale: string;\n uomRoundingMode: ProductUnitRoundingMode;\n unitPriceEnabled: boolean;\n unitPriceReferenceUnit: string | null;\n unitPriceBaseQuantity: string;\n unitConversions: ProductUnitConversionDraft[];\n customFieldsetCode?: string | null;\n categoryIds: string[];\n channelIds: string[];\n tags: string[];\n optionSchemaId?: string | null;\n};\n\nconst optionalPositiveNumberInput = z.preprocess((value) => {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\" && value.trim().length === 0) return undefined;\n return value;\n}, z.coerce.number().positive().optional());\n\nconst optionalBoundedIntegerInput = (min: number, max: number) =>\n z.preprocess((value) => {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\" && value.trim().length === 0)\n return undefined;\n return value;\n }, z.coerce.number().int().min(min).max(max).optional());\n\nexport const productFormSchema = z\n .object({\n title: z.string().trim().min(1, \"catalog.products.validation.titleRequired\"),\n subtitle: z.string().optional(),\n handle: z\n .string()\n .trim()\n .regex(\n /^[a-z0-9\\-_]*$/,\n \"catalog.products.validation.handleFormat\",\n )\n .max(150)\n .optional(),\n sku: z\n .string()\n .trim()\n .regex(\n /^[A-Za-z0-9\\-_\\.]*$/,\n \"catalog.products.validation.skuFormat\",\n )\n .max(191)\n .optional(),\n productType: z.string().optional(),\n description: z.string().optional(),\n useMarkdown: z.boolean().optional(),\n taxRateId: z.string().uuid().nullable().optional(),\n hasVariants: z.boolean().optional(),\n mediaDraftId: z.string().optional(),\n mediaItems: z.any().optional(),\n defaultMediaId: z.string().uuid().nullable().optional(),\n defaultMediaUrl: z.string().trim().max(500).nullable().optional(),\n options: z.any().optional(),\n variants: z.any().optional(),\n // Use a permissive schema to avoid zod classic `_zod` runtime crashes on records in edge builds.\n metadata: z\n .custom<Record<string, unknown>>(() => true)\n .nullable()\n .optional(),\n dimensions: z\n .object({\n width: z.coerce.number().min(0).optional(),\n height: z.coerce.number().min(0).optional(),\n depth: z.coerce.number().min(0).optional(),\n unit: z.string().trim().max(25).optional(),\n })\n .nullable()\n .optional(),\n weight: z\n .object({\n value: z.coerce.number().min(0).optional(),\n unit: z.string().trim().max(25).optional(),\n })\n .nullable()\n .optional(),\n defaultUnit: z.string().trim().max(50).nullable().optional(),\n defaultSalesUnit: z.string().trim().max(50).nullable().optional(),\n defaultSalesUnitQuantity: optionalPositiveNumberInput,\n uomRoundingScale: optionalBoundedIntegerInput(0, 6),\n uomRoundingMode: z.enum([\"half_up\", \"down\", \"up\"]).optional(),\n unitPriceEnabled: z.boolean().optional(),\n unitPriceReferenceUnit: z.string().trim().max(50).nullable().optional(),\n unitPriceBaseQuantity: optionalPositiveNumberInput,\n unitConversions: z\n .array(\n z.object({\n id: z.string().nullable().optional(),\n unitCode: z.string().trim().max(50),\n toBaseFactor: z.coerce.number().positive(),\n sortOrder: z.coerce.number().int().min(0).max(100000).optional(),\n isActive: z.boolean().optional(),\n }),\n )\n .optional(),\n customFieldsetCode: z.string().optional().nullable(),\n categoryIds: z.array(z.string().uuid()).optional(),\n channelIds: z.array(z.string().uuid()).optional(),\n tags: z.array(z.string().trim().min(1).max(100)).optional(),\n optionSchemaId: z.string().uuid().nullable().optional(),\n })\n .passthrough()\n .refine(\n (data) => !data.unitPriceEnabled || (data.unitPriceReferenceUnit != null && data.unitPriceReferenceUnit.length > 0),\n { message: 'catalog.products.validation.referenceUnitRequired', path: ['unitPriceReferenceUnit'] }\n )\n .refine(\n (data) => !data.defaultSalesUnit || (data.defaultUnit != null && data.defaultUnit.length > 0),\n { message: 'catalog.products.validation.baseUnitRequired', path: ['defaultUnit'] }\n );\n\nexport const PRODUCT_FORM_STEPS = [\n \"general\",\n \"organize\",\n \"uom\",\n \"variants\",\n] as const;\n\nexport const BASE_INITIAL_VALUES: ProductFormValues = {\n title: \"\",\n subtitle: \"\",\n handle: \"\",\n sku: \"\",\n productType: \"simple\",\n description: \"\",\n useMarkdown: false,\n mediaDraftId: \"\",\n mediaItems: [],\n defaultMediaId: null,\n defaultMediaUrl: \"\",\n taxRateId: null,\n hasVariants: false,\n options: [],\n variants: [],\n metadata: {},\n dimensions: null,\n weight: null,\n defaultUnit: null,\n defaultSalesUnit: null,\n defaultSalesUnitQuantity: \"1\",\n uomRoundingScale: \"4\",\n uomRoundingMode: \"half_up\",\n unitPriceEnabled: false,\n unitPriceReferenceUnit: null,\n unitPriceBaseQuantity: \"\",\n unitConversions: [],\n customFieldsetCode: null,\n categoryIds: [],\n channelIds: [],\n tags: [],\n optionSchemaId: null,\n};\n\nexport const isConfigurableProductType = (type: string): boolean =>\n (CATALOG_CONFIGURABLE_PRODUCT_TYPES as readonly string[]).includes(type);\n\nexport const createInitialProductFormValues = (): ProductFormValues => ({\n ...BASE_INITIAL_VALUES,\n mediaDraftId: createLocalId(),\n variants: [createVariantDraft(null, { isDefault: true })],\n});\n\nexport const createVariantDraft = (\n productTaxRateId: string | null,\n overrides: Partial<VariantDraft> = {},\n): VariantDraft => ({\n id: createLocalId(),\n title: \"Default variant\",\n sku: \"\",\n isDefault: false,\n taxRateId: productTaxRateId ?? null,\n manageInventory: false,\n allowBackorder: false,\n hasInventoryKit: false,\n optionValues: {},\n prices: {},\n ...overrides,\n});\n\nexport const createProductUnitConversionDraft = (\n overrides: Partial<ProductUnitConversionDraft> = {},\n): ProductUnitConversionDraft => ({\n id: null,\n unitCode: \"\",\n toBaseFactor: \"\",\n sortOrder: \"\",\n isActive: true,\n ...overrides,\n});\n\nexport const buildOptionValuesKey = (\n optionValues?: Record<string, string>,\n): string => {\n if (!optionValues) return \"\";\n return Object.keys(optionValues)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => `${key}:${optionValues[key] ?? \"\"}`)\n .join(\"|\");\n};\n\nexport const haveSameOptionValues = (\n current: Record<string, string> | undefined,\n next: Record<string, string>,\n): boolean => {\n const a = current ?? {};\n const keys = new Set([...Object.keys(a), ...Object.keys(next)]);\n for (const key of keys) {\n if ((a[key] ?? \"\") !== (next[key] ?? \"\")) return false;\n }\n return true;\n};\n\nconst parseNumeric = (input: unknown): number | null => {\n const numeric = typeof input === \"number\" ? input : Number(input);\n if (!Number.isFinite(numeric) || numeric < 0) return null;\n return numeric;\n};\n\nexport const normalizeProductDimensions = (raw: unknown): ProductDimensions => {\n const source = parseObjectLike(raw);\n if (!source) return null;\n const width = parseNumeric(source.width);\n const height = parseNumeric(source.height);\n const depth = parseNumeric(source.depth);\n const unit =\n typeof source.unit === \"string\" && source.unit.trim().length\n ? source.unit.trim()\n : null;\n const clean: Record<string, unknown> = {};\n if (width !== null) clean.width = width;\n if (height !== null) clean.height = height;\n if (depth !== null) clean.depth = depth;\n if (unit) clean.unit = unit;\n return Object.keys(clean).length ? (clean as ProductDimensions) : null;\n};\n\nexport const normalizeProductWeight = (raw: unknown): ProductWeight => {\n const source = parseObjectLike(raw);\n if (!source) return null;\n const value = parseNumeric(source.value);\n const unit =\n typeof source.unit === \"string\" && source.unit.trim().length\n ? source.unit.trim()\n : null;\n if (value === null && !unit) return null;\n const clean: Record<string, unknown> = {};\n if (value !== null) clean.value = value;\n if (unit) clean.unit = unit;\n return clean as ProductWeight;\n};\n\nexport const sanitizeProductDimensions = (\n raw: ProductDimensions,\n): ProductDimensions => {\n return normalizeProductDimensions(raw ?? null);\n};\n\nexport const sanitizeProductWeight = (raw: ProductWeight): ProductWeight => {\n return normalizeProductWeight(raw ?? null);\n};\n\nexport const updateDimensionValue = (\n current: ProductDimensions,\n field: \"width\" | \"height\" | \"depth\" | \"unit\",\n raw: string,\n): ProductDimensions => {\n const base = normalizeProductDimensions(current) ?? {};\n if (field === \"unit\") {\n base.unit = raw;\n } else {\n const numeric = parseNumeric(raw);\n if (numeric === null) {\n delete base[field];\n } else {\n base[field] = numeric;\n }\n }\n return sanitizeProductDimensions(base);\n};\n\nexport const updateWeightValue = (\n current: ProductWeight,\n field: \"value\" | \"unit\",\n raw: string,\n): ProductWeight => {\n const base = normalizeProductWeight(current) ?? {};\n if (field === \"unit\") {\n base.unit = raw;\n } else {\n const numeric = parseNumeric(raw);\n if (numeric === null) {\n delete (base as Record<string, unknown>).value;\n } else {\n base.value = numeric;\n }\n }\n return sanitizeProductWeight(base);\n};\n\nexport const normalizePriceKindSummary = (\n input: PriceKindApiPayload | undefined | null,\n): PriceKindSummary | null => {\n if (!input) return null;\n const getString = (value: unknown): string | null => {\n if (typeof value === \"string\" && value.trim().length) return value.trim();\n if (typeof value === \"number\" || typeof value === \"bigint\")\n return String(value);\n return null;\n };\n const id = getString(input.id);\n const code = getString(input.code);\n const title = getString(input.title);\n if (!id || !code || !title) return null;\n const currency =\n getString(input.currencyCode) ?? getString(input.currency_code);\n const displayRaw =\n getString(input.displayMode) ?? getString(input.display_mode);\n const displayMode: PriceKindSummary[\"displayMode\"] =\n displayRaw === \"including-tax\" ? \"including-tax\" : \"excluding-tax\";\n return {\n id,\n code,\n title,\n currencyCode: currency,\n displayMode,\n };\n};\n\nexport const formatTaxRateLabel = (rate: TaxRateSummary): string => {\n const extras: string[] = [];\n if (typeof rate.rate === \"number\" && Number.isFinite(rate.rate)) {\n extras.push(`${rate.rate}%`);\n }\n if (rate.code) {\n extras.push(rate.code.toUpperCase());\n }\n if (!extras.length) return rate.name;\n return `${rate.name} \u2022 ${extras.join(\" \u00B7 \")}`;\n};\n\nexport function createLocalId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport function buildOptionSchemaDefinition(\n options: ProductOptionInput[] | undefined,\n name: string,\n): CatalogProductOptionSchema | null {\n const list = Array.isArray(options) ? options : [];\n if (!list.length) return null;\n const normalizedName =\n name && name.trim().length ? name.trim() : \"Product options\";\n const schemaOptions = list\n .map((option) => {\n const title = option.title?.trim() || \"\";\n const code = resolveOptionCode(option);\n const values = Array.isArray(option.values) ? option.values : [];\n return {\n code: code || slugify(createLocalId()),\n label: title || code || \"Option\",\n inputType: \"select\" as const,\n choices: values\n .map((value) => {\n const label = value.label?.trim() || \"\";\n const valueCode = slugify(label || value.id || createLocalId());\n if (!label && !valueCode) return null;\n return {\n code: valueCode || slugify(createLocalId()),\n label: label || valueCode || \"Choice\",\n };\n })\n .filter((entry): entry is { code: string; label: string } => !!entry),\n };\n })\n .filter((entry) => entry.label.trim().length);\n if (!schemaOptions.length) return null;\n return {\n version: 1,\n name: normalizedName,\n options: schemaOptions,\n };\n}\n\nexport function convertSchemaToProductOptions(\n schema: CatalogProductOptionSchema | null | undefined,\n): ProductOptionInput[] {\n if (!schema || !Array.isArray(schema.options)) return [];\n return schema.options.map((option) => ({\n id: createLocalId(),\n title: option.label ?? option.code ?? \"Option\",\n values: Array.isArray(option.choices)\n ? option.choices.map((choice) => ({\n id: createLocalId(),\n label: choice.label ?? choice.code ?? \"\",\n }))\n : [],\n }));\n}\n\nfunction resolveOptionCode(option: ProductOptionInput): string {\n const base = option.title?.trim() || option.id?.trim() || \"\";\n const slugged = slugify(base);\n if (slugged.length) return slugged;\n if (base.length) return base;\n return createLocalId();\n}\n\nexport function buildVariantCombinations(\n options: ProductOptionInput[],\n): Record<string, string>[] {\n if (!options.length) return [];\n const [first, ...rest] = options;\n if (!first || !Array.isArray(first.values) || !first.values.length) return [];\n const firstKey = resolveOptionCode(first);\n const initial = first.values.map((value) => ({ [firstKey]: value.label }));\n return rest.reduce<Record<string, string>[]>((acc, option) => {\n if (!Array.isArray(option.values) || !option.values.length) return [];\n const optionKey = resolveOptionCode(option);\n const combos: Record<string, string>[] = [];\n acc.forEach((partial) => {\n option.values.forEach((value) => {\n combos.push({ ...partial, [optionKey]: value.label });\n });\n });\n return combos;\n }, initial);\n}\n\nexport type VariantMediaFallbackInput = {\n isDefault: boolean;\n defaultMediaId: string | null;\n name: string;\n};\n\nexport type VariantMediaFallbackResult = {\n defaultMediaId: string;\n variantName: string;\n} | null;\n\nexport function resolveVariantMediaFallback(\n variants: VariantMediaFallbackInput[],\n): VariantMediaFallbackResult {\n const defaultVariant = variants.find(\n (v) => v.isDefault && v.defaultMediaId,\n );\n const fallback = defaultVariant ?? variants.find((v) => v.defaultMediaId);\n if (fallback?.defaultMediaId) {\n return { defaultMediaId: fallback.defaultMediaId, variantName: fallback.name };\n }\n return null;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { slugify } from \"@open-mercato/shared/lib/slugify\";\nimport { parseObjectLike } from \"@open-mercato/shared/lib/json/parseObjectLike\";\nimport type { ReferenceUnitCode } from \"@open-mercato/shared/lib/units/unitCodes\";\nimport {\n CATALOG_CONFIGURABLE_PRODUCT_TYPES,\n type CatalogProductOptionSchema,\n type CatalogProductType,\n} from \"../../data/types\";\nimport type { ProductMediaItem } from \"./ProductMediaManager\";\n\nexport { slugify };\n\nexport type PriceKindSummary = {\n id: string;\n code: string;\n title: string;\n currencyCode: string | null;\n displayMode: \"including-tax\" | \"excluding-tax\";\n};\n\nexport type PriceKindApiPayload = {\n id?: string | number;\n code?: string;\n title?: string;\n currencyCode?: string | null;\n currency_code?: string | null;\n displayMode?: string | null;\n display_mode?: string | null;\n};\n\nexport type TaxRateSummary = {\n id: string;\n name: string;\n code: string | null;\n rate: number | null;\n isDefault: boolean;\n};\n\nexport function normalizeTaxRateSummary(\n item: Record<string, unknown>,\n fallbackName: string,\n): TaxRateSummary | null {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const rawRate =\n typeof item.rate === \"number\" ? item.rate : Number(item.rate ?? Number.NaN);\n return {\n id,\n name:\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name\n : fallbackName,\n code:\n typeof item.code === \"string\" && item.code.trim().length\n ? item.code\n : null,\n rate: Number.isFinite(rawRate) ? rawRate : null,\n isDefault: Boolean(\n typeof item.isDefault === \"boolean\"\n ? item.isDefault\n : typeof item.is_default === \"boolean\"\n ? item.is_default\n : false,\n ),\n };\n}\n\nexport function mergeTaxRateSummaries(\n options: TaxRateSummary[],\n selected: TaxRateSummary | null,\n): TaxRateSummary[] {\n if (!selected) return options;\n if (options.some((option) => option.id === selected.id)) return options;\n return [selected, ...options];\n}\n\nexport type ProductOptionInput = {\n id: string;\n title: string;\n values: Array<{ id: string; label: string }>;\n};\n\nexport type ProductDimensions = {\n width?: number;\n height?: number;\n depth?: number;\n unit?: string | null;\n} | null;\n\nexport type ProductWeight = {\n value?: number;\n unit?: string | null;\n} | null;\n\nexport type VariantPriceValue = {\n amount: string;\n};\n\nexport type ProductUnitRoundingMode = \"half_up\" | \"down\" | \"up\";\nexport type ProductUnitPriceReferenceUnit = ReferenceUnitCode;\n\nexport type ProductUnitConversionDraft = {\n id: string | null;\n unitCode: string;\n toBaseFactor: string;\n sortOrder: string;\n isActive: boolean;\n /** The conversion row's version, for the per-row optimistic-lock header (#2055). Optional \u2014 only loaded rows carry it. */\n updatedAt?: string | null;\n};\n\nexport type VariantDraft = {\n id: string;\n title: string;\n sku: string;\n isDefault: boolean;\n taxRateId: string | null;\n manageInventory: boolean;\n allowBackorder: boolean;\n hasInventoryKit: boolean;\n optionValues: Record<string, string>;\n prices: Record<string, VariantPriceValue>;\n};\n\nexport type ProductFormValues = {\n title: string;\n subtitle: string;\n handle: string;\n sku: string;\n productType: CatalogProductType;\n description: string;\n useMarkdown: boolean;\n taxRateId: string | null;\n mediaDraftId: string;\n mediaItems: ProductMediaItem[];\n defaultMediaId: string | null;\n defaultMediaUrl: string;\n hasVariants: boolean;\n options: ProductOptionInput[];\n variants: VariantDraft[];\n metadata?: Record<string, unknown> | null;\n dimensions?: ProductDimensions;\n weight?: ProductWeight;\n defaultUnit: string | null;\n defaultSalesUnit: string | null;\n defaultSalesUnitQuantity: string;\n uomRoundingScale: string;\n uomRoundingMode: ProductUnitRoundingMode;\n unitPriceEnabled: boolean;\n unitPriceReferenceUnit: string | null;\n unitPriceBaseQuantity: string;\n unitConversions: ProductUnitConversionDraft[];\n customFieldsetCode?: string | null;\n categoryIds: string[];\n channelIds: string[];\n tags: string[];\n optionSchemaId?: string | null;\n updatedAt?: string | null;\n};\n\nconst optionalPositiveNumberInput = z.preprocess((value) => {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\" && value.trim().length === 0) return undefined;\n return value;\n}, z.coerce.number().positive().optional());\n\nconst optionalBoundedIntegerInput = (min: number, max: number) =>\n z.preprocess((value) => {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\" && value.trim().length === 0)\n return undefined;\n return value;\n }, z.coerce.number().int().min(min).max(max).optional());\n\nexport const productFormSchema = z\n .object({\n title: z.string().trim().min(1, \"catalog.products.validation.titleRequired\"),\n subtitle: z.string().optional(),\n handle: z\n .string()\n .trim()\n .regex(\n /^[a-z0-9\\-_]*$/,\n \"catalog.products.validation.handleFormat\",\n )\n .max(150)\n .optional(),\n sku: z\n .string()\n .trim()\n .regex(\n /^[A-Za-z0-9\\-_\\.]*$/,\n \"catalog.products.validation.skuFormat\",\n )\n .max(191)\n .optional(),\n productType: z.string().optional(),\n description: z.string().optional(),\n useMarkdown: z.boolean().optional(),\n taxRateId: z.string().uuid().nullable().optional(),\n hasVariants: z.boolean().optional(),\n mediaDraftId: z.string().optional(),\n mediaItems: z.any().optional(),\n defaultMediaId: z.string().uuid().nullable().optional(),\n defaultMediaUrl: z.string().trim().max(500).nullable().optional(),\n options: z.any().optional(),\n variants: z.any().optional(),\n // Use a permissive schema to avoid zod classic `_zod` runtime crashes on records in edge builds.\n metadata: z\n .custom<Record<string, unknown>>(() => true)\n .nullable()\n .optional(),\n dimensions: z\n .object({\n width: z.coerce.number().min(0).optional(),\n height: z.coerce.number().min(0).optional(),\n depth: z.coerce.number().min(0).optional(),\n unit: z.string().trim().max(25).optional(),\n })\n .nullable()\n .optional(),\n weight: z\n .object({\n value: z.coerce.number().min(0).optional(),\n unit: z.string().trim().max(25).optional(),\n })\n .nullable()\n .optional(),\n defaultUnit: z.string().trim().max(50).nullable().optional(),\n defaultSalesUnit: z.string().trim().max(50).nullable().optional(),\n defaultSalesUnitQuantity: optionalPositiveNumberInput,\n uomRoundingScale: optionalBoundedIntegerInput(0, 6),\n uomRoundingMode: z.enum([\"half_up\", \"down\", \"up\"]).optional(),\n unitPriceEnabled: z.boolean().optional(),\n unitPriceReferenceUnit: z.string().trim().max(50).nullable().optional(),\n unitPriceBaseQuantity: optionalPositiveNumberInput,\n unitConversions: z\n .array(\n z.object({\n id: z.string().nullable().optional(),\n unitCode: z.string().trim().max(50),\n toBaseFactor: z.coerce.number().positive(),\n sortOrder: z.coerce.number().int().min(0).max(100000).optional(),\n isActive: z.boolean().optional(),\n }),\n )\n .optional(),\n customFieldsetCode: z.string().optional().nullable(),\n categoryIds: z.array(z.string().uuid()).optional(),\n channelIds: z.array(z.string().uuid()).optional(),\n tags: z.array(z.string().trim().min(1).max(100)).optional(),\n optionSchemaId: z.string().uuid().nullable().optional(),\n })\n .passthrough()\n .refine(\n (data) => !data.unitPriceEnabled || (data.unitPriceReferenceUnit != null && data.unitPriceReferenceUnit.length > 0),\n { message: 'catalog.products.validation.referenceUnitRequired', path: ['unitPriceReferenceUnit'] }\n )\n .refine(\n (data) => !data.defaultSalesUnit || (data.defaultUnit != null && data.defaultUnit.length > 0),\n { message: 'catalog.products.validation.baseUnitRequired', path: ['defaultUnit'] }\n );\n\nexport const PRODUCT_FORM_STEPS = [\n \"general\",\n \"organize\",\n \"uom\",\n \"variants\",\n] as const;\n\nexport const BASE_INITIAL_VALUES: ProductFormValues = {\n title: \"\",\n subtitle: \"\",\n handle: \"\",\n sku: \"\",\n productType: \"simple\",\n description: \"\",\n useMarkdown: false,\n mediaDraftId: \"\",\n mediaItems: [],\n defaultMediaId: null,\n defaultMediaUrl: \"\",\n taxRateId: null,\n hasVariants: false,\n options: [],\n variants: [],\n metadata: {},\n dimensions: null,\n weight: null,\n defaultUnit: null,\n defaultSalesUnit: null,\n defaultSalesUnitQuantity: \"1\",\n uomRoundingScale: \"4\",\n uomRoundingMode: \"half_up\",\n unitPriceEnabled: false,\n unitPriceReferenceUnit: null,\n unitPriceBaseQuantity: \"\",\n unitConversions: [],\n customFieldsetCode: null,\n categoryIds: [],\n channelIds: [],\n tags: [],\n optionSchemaId: null,\n};\n\nexport const isConfigurableProductType = (type: string): boolean =>\n (CATALOG_CONFIGURABLE_PRODUCT_TYPES as readonly string[]).includes(type);\n\nexport const createInitialProductFormValues = (): ProductFormValues => ({\n ...BASE_INITIAL_VALUES,\n mediaDraftId: createLocalId(),\n variants: [createVariantDraft(null, { isDefault: true })],\n});\n\nexport const createVariantDraft = (\n productTaxRateId: string | null,\n overrides: Partial<VariantDraft> = {},\n): VariantDraft => ({\n id: createLocalId(),\n title: \"Default variant\",\n sku: \"\",\n isDefault: false,\n taxRateId: productTaxRateId ?? null,\n manageInventory: false,\n allowBackorder: false,\n hasInventoryKit: false,\n optionValues: {},\n prices: {},\n ...overrides,\n});\n\nexport const createProductUnitConversionDraft = (\n overrides: Partial<ProductUnitConversionDraft> = {},\n): ProductUnitConversionDraft => ({\n id: null,\n unitCode: \"\",\n toBaseFactor: \"\",\n sortOrder: \"\",\n isActive: true,\n ...overrides,\n});\n\nexport const buildOptionValuesKey = (\n optionValues?: Record<string, string>,\n): string => {\n if (!optionValues) return \"\";\n return Object.keys(optionValues)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => `${key}:${optionValues[key] ?? \"\"}`)\n .join(\"|\");\n};\n\nexport const haveSameOptionValues = (\n current: Record<string, string> | undefined,\n next: Record<string, string>,\n): boolean => {\n const a = current ?? {};\n const keys = new Set([...Object.keys(a), ...Object.keys(next)]);\n for (const key of keys) {\n if ((a[key] ?? \"\") !== (next[key] ?? \"\")) return false;\n }\n return true;\n};\n\nconst parseNumeric = (input: unknown): number | null => {\n const numeric = typeof input === \"number\" ? input : Number(input);\n if (!Number.isFinite(numeric) || numeric < 0) return null;\n return numeric;\n};\n\nexport const normalizeProductDimensions = (raw: unknown): ProductDimensions => {\n const source = parseObjectLike(raw);\n if (!source) return null;\n const width = parseNumeric(source.width);\n const height = parseNumeric(source.height);\n const depth = parseNumeric(source.depth);\n const unit =\n typeof source.unit === \"string\" && source.unit.trim().length\n ? source.unit.trim()\n : null;\n const clean: Record<string, unknown> = {};\n if (width !== null) clean.width = width;\n if (height !== null) clean.height = height;\n if (depth !== null) clean.depth = depth;\n if (unit) clean.unit = unit;\n return Object.keys(clean).length ? (clean as ProductDimensions) : null;\n};\n\nexport const normalizeProductWeight = (raw: unknown): ProductWeight => {\n const source = parseObjectLike(raw);\n if (!source) return null;\n const value = parseNumeric(source.value);\n const unit =\n typeof source.unit === \"string\" && source.unit.trim().length\n ? source.unit.trim()\n : null;\n if (value === null && !unit) return null;\n const clean: Record<string, unknown> = {};\n if (value !== null) clean.value = value;\n if (unit) clean.unit = unit;\n return clean as ProductWeight;\n};\n\nexport const sanitizeProductDimensions = (\n raw: ProductDimensions,\n): ProductDimensions => {\n return normalizeProductDimensions(raw ?? null);\n};\n\nexport const sanitizeProductWeight = (raw: ProductWeight): ProductWeight => {\n return normalizeProductWeight(raw ?? null);\n};\n\nexport const updateDimensionValue = (\n current: ProductDimensions,\n field: \"width\" | \"height\" | \"depth\" | \"unit\",\n raw: string,\n): ProductDimensions => {\n const base = normalizeProductDimensions(current) ?? {};\n if (field === \"unit\") {\n base.unit = raw;\n } else {\n const numeric = parseNumeric(raw);\n if (numeric === null) {\n delete base[field];\n } else {\n base[field] = numeric;\n }\n }\n return sanitizeProductDimensions(base);\n};\n\nexport const updateWeightValue = (\n current: ProductWeight,\n field: \"value\" | \"unit\",\n raw: string,\n): ProductWeight => {\n const base = normalizeProductWeight(current) ?? {};\n if (field === \"unit\") {\n base.unit = raw;\n } else {\n const numeric = parseNumeric(raw);\n if (numeric === null) {\n delete (base as Record<string, unknown>).value;\n } else {\n base.value = numeric;\n }\n }\n return sanitizeProductWeight(base);\n};\n\nexport const normalizePriceKindSummary = (\n input: PriceKindApiPayload | undefined | null,\n): PriceKindSummary | null => {\n if (!input) return null;\n const getString = (value: unknown): string | null => {\n if (typeof value === \"string\" && value.trim().length) return value.trim();\n if (typeof value === \"number\" || typeof value === \"bigint\")\n return String(value);\n return null;\n };\n const id = getString(input.id);\n const code = getString(input.code);\n const title = getString(input.title);\n if (!id || !code || !title) return null;\n const currency =\n getString(input.currencyCode) ?? getString(input.currency_code);\n const displayRaw =\n getString(input.displayMode) ?? getString(input.display_mode);\n const displayMode: PriceKindSummary[\"displayMode\"] =\n displayRaw === \"including-tax\" ? \"including-tax\" : \"excluding-tax\";\n return {\n id,\n code,\n title,\n currencyCode: currency,\n displayMode,\n };\n};\n\nexport const formatTaxRateLabel = (rate: TaxRateSummary): string => {\n const extras: string[] = [];\n if (typeof rate.rate === \"number\" && Number.isFinite(rate.rate)) {\n extras.push(`${rate.rate}%`);\n }\n if (rate.code) {\n extras.push(rate.code.toUpperCase());\n }\n if (!extras.length) return rate.name;\n return `${rate.name} \u2022 ${extras.join(\" \u00B7 \")}`;\n};\n\nexport function createLocalId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport function buildOptionSchemaDefinition(\n options: ProductOptionInput[] | undefined,\n name: string,\n): CatalogProductOptionSchema | null {\n const list = Array.isArray(options) ? options : [];\n if (!list.length) return null;\n const normalizedName =\n name && name.trim().length ? name.trim() : \"Product options\";\n const schemaOptions = list\n .map((option) => {\n const title = option.title?.trim() || \"\";\n const code = resolveOptionCode(option);\n const values = Array.isArray(option.values) ? option.values : [];\n return {\n code: code || slugify(createLocalId()),\n label: title || code || \"Option\",\n inputType: \"select\" as const,\n choices: values\n .map((value) => {\n const label = value.label?.trim() || \"\";\n const valueCode = slugify(label || value.id || createLocalId());\n if (!label && !valueCode) return null;\n return {\n code: valueCode || slugify(createLocalId()),\n label: label || valueCode || \"Choice\",\n };\n })\n .filter((entry): entry is { code: string; label: string } => !!entry),\n };\n })\n .filter((entry) => entry.label.trim().length);\n if (!schemaOptions.length) return null;\n return {\n version: 1,\n name: normalizedName,\n options: schemaOptions,\n };\n}\n\nexport function convertSchemaToProductOptions(\n schema: CatalogProductOptionSchema | null | undefined,\n): ProductOptionInput[] {\n if (!schema || !Array.isArray(schema.options)) return [];\n return schema.options.map((option) => ({\n id: createLocalId(),\n title: option.label ?? option.code ?? \"Option\",\n values: Array.isArray(option.choices)\n ? option.choices.map((choice) => ({\n id: createLocalId(),\n label: choice.label ?? choice.code ?? \"\",\n }))\n : [],\n }));\n}\n\nfunction resolveOptionCode(option: ProductOptionInput): string {\n const base = option.title?.trim() || option.id?.trim() || \"\";\n const slugged = slugify(base);\n if (slugged.length) return slugged;\n if (base.length) return base;\n return createLocalId();\n}\n\nexport function buildVariantCombinations(\n options: ProductOptionInput[],\n): Record<string, string>[] {\n if (!options.length) return [];\n const [first, ...rest] = options;\n if (!first || !Array.isArray(first.values) || !first.values.length) return [];\n const firstKey = resolveOptionCode(first);\n const initial = first.values.map((value) => ({ [firstKey]: value.label }));\n return rest.reduce<Record<string, string>[]>((acc, option) => {\n if (!Array.isArray(option.values) || !option.values.length) return [];\n const optionKey = resolveOptionCode(option);\n const combos: Record<string, string>[] = [];\n acc.forEach((partial) => {\n option.values.forEach((value) => {\n combos.push({ ...partial, [optionKey]: value.label });\n });\n });\n return combos;\n }, initial);\n}\n\nexport type VariantMediaFallbackInput = {\n isDefault: boolean;\n defaultMediaId: string | null;\n name: string;\n};\n\nexport type VariantMediaFallbackResult = {\n defaultMediaId: string;\n variantName: string;\n} | null;\n\nexport function resolveVariantMediaFallback(\n variants: VariantMediaFallbackInput[],\n): VariantMediaFallbackResult {\n const defaultVariant = variants.find(\n (v) => v.isDefault && v.defaultMediaId,\n );\n const fallback = defaultVariant ?? variants.find((v) => v.defaultMediaId);\n if (fallback?.defaultMediaId) {\n return { defaultMediaId: fallback.defaultMediaId, variantName: fallback.name };\n }\n return null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -71,7 +71,8 @@ function mapPriceItemToDraft(item, kindDisplayModes) {
|
|
|
71
71
|
priceId: typeof item.id === "string" ? item.id : void 0,
|
|
72
72
|
amount: kindMode === "including-tax" ? unitGross ?? unitNet ?? "" : unitNet ?? unitGross ?? "",
|
|
73
73
|
currencyCode: typeof item.currency_code === "string" ? item.currency_code : typeof item.currencyCode === "string" ? item.currencyCode : null,
|
|
74
|
-
displayMode: kindMode
|
|
74
|
+
displayMode: kindMode,
|
|
75
|
+
updatedAt: typeof item.updatedAt === "string" ? item.updatedAt : typeof item.updated_at === "string" ? item.updated_at : null
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/catalog/components/products/variantForm.ts"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport type { ProductMediaItem } from './ProductMediaManager'\nimport { createLocalId, type PriceKindSummary } from './productForm'\nimport { isCatalogPriceAmountInputValid } from '../../lib/priceValidation'\n\nexport type OptionDefinition = {\n id: string\n code: string\n label: string\n values: Array<{ id: string; label: string }>\n}\n\nexport type VariantPriceDraft = {\n priceKindId: string\n priceId?: string\n amount: string\n currencyCode?: string | null\n displayMode: 'including-tax' | 'excluding-tax'\n}\n\nexport type VariantFormValues = {\n name: string\n sku: string\n barcode: string\n isDefault: boolean\n isActive: boolean\n optionValues: Record<string, string>\n metadata?: Record<string, unknown> | null\n mediaDraftId: string\n mediaItems: ProductMediaItem[]\n defaultMediaId: string | null\n defaultMediaUrl: string\n prices: Record<string, VariantPriceDraft>\n taxRateId: string | null\n customFieldsetCode?: string | null\n}\n\nexport const VARIANT_BASE_VALUES: VariantFormValues = {\n name: '',\n sku: '',\n barcode: '',\n isDefault: false,\n isActive: true,\n optionValues: {},\n metadata: {},\n mediaDraftId: '',\n mediaItems: [],\n defaultMediaId: null,\n defaultMediaUrl: '',\n prices: {},\n taxRateId: null,\n customFieldsetCode: null,\n}\n\nexport const createVariantInitialValues = (): VariantFormValues => ({\n ...VARIANT_BASE_VALUES,\n mediaDraftId: createLocalId(),\n})\n\nexport function normalizeOptionSchema(raw: unknown): OptionDefinition[] {\n if (!Array.isArray(raw)) return []\n return raw\n .map((entry) => normalizeOptionDefinition(entry))\n .filter((entry): entry is OptionDefinition => !!entry)\n}\n\nfunction normalizeOptionDefinition(entry: unknown): OptionDefinition | null {\n if (!entry || typeof entry !== 'object') return null\n const code = extractString((entry as any).code) || createLocalId()\n const label = extractString((entry as any).label) || code\n const values = Array.isArray((entry as any).values)\n ? (entry as any).values\n .map((value: any) => {\n const id = extractString(value?.id) || createLocalId()\n const valueLabel = extractString(value?.label) || id\n return { id, label: valueLabel }\n })\n .filter(\n (value: { id: string; label: string }): value is { id: string; label: string } =>\n value.label.length > 0,\n )\n : []\n return {\n id: extractString((entry as any).id) || createLocalId(),\n code,\n label,\n values,\n }\n}\n\nfunction extractString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nexport function buildVariantMetadata(values: VariantFormValues): Record<string, unknown> {\n const metadata = typeof values.metadata === 'object' && values.metadata ? { ...values.metadata } : {}\n return metadata\n}\n\nexport function findInvalidVariantPriceKinds(\n priceKinds: PriceKindSummary[],\n priceDrafts: Record<string, VariantPriceDraft> | undefined,\n): string[] {\n const invalid: string[] = []\n for (const kind of priceKinds) {\n const draft = priceDrafts?.[kind.id]\n const amount = typeof draft?.amount === 'string' ? draft.amount.trim() : ''\n if (!amount) continue\n if (!isCatalogPriceAmountInputValid(amount)) invalid.push(kind.id)\n }\n return invalid\n}\n\nexport function mapPriceItemToDraft(\n item: Record<string, unknown>,\n kindDisplayModes: Map<string, 'including-tax' | 'excluding-tax'>,\n): VariantPriceDraft | null {\n const kindId =\n typeof item.price_kind_id === 'string'\n ? item.price_kind_id\n : typeof item.priceKindId === 'string'\n ? item.priceKindId\n : null\n if (!kindId) return null\n const unitNet =\n typeof item.unit_price_net === 'string'\n ? item.unit_price_net\n : typeof item.unitPriceNet === 'string'\n ? item.unitPriceNet\n : null\n const unitGross =\n typeof item.unit_price_gross === 'string'\n ? item.unit_price_gross\n : typeof item.unitPriceGross === 'string'\n ? item.unitPriceGross\n : null\n const kindMode = kindDisplayModes.get(kindId) ?? (unitGross ? 'including-tax' : 'excluding-tax')\n return {\n priceKindId: kindId,\n priceId: typeof item.id === 'string' ? item.id : undefined,\n amount: kindMode === 'including-tax' ? (unitGross ?? unitNet ?? '') : (unitNet ?? unitGross ?? ''),\n currencyCode:\n typeof item.currency_code === 'string'\n ? item.currency_code\n : typeof item.currencyCode === 'string'\n ? item.currencyCode\n : null,\n displayMode: kindMode,\n }\n}\n"],
|
|
5
|
-
"mappings": ";AAGA,SAAS,qBAA4C;AACrD,SAAS,sCAAsC;
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport type { ProductMediaItem } from './ProductMediaManager'\nimport { createLocalId, type PriceKindSummary } from './productForm'\nimport { isCatalogPriceAmountInputValid } from '../../lib/priceValidation'\n\nexport type OptionDefinition = {\n id: string\n code: string\n label: string\n values: Array<{ id: string; label: string }>\n}\n\nexport type VariantPriceDraft = {\n priceKindId: string\n priceId?: string\n amount: string\n currencyCode?: string | null\n displayMode: 'including-tax' | 'excluding-tax'\n /** The price row's version, for the per-price optimistic-lock header (#2055). */\n updatedAt?: string | null\n}\n\nexport type VariantFormValues = {\n id?: string\n name: string\n sku: string\n barcode: string\n isDefault: boolean\n isActive: boolean\n optionValues: Record<string, string>\n metadata?: Record<string, unknown> | null\n mediaDraftId: string\n mediaItems: ProductMediaItem[]\n defaultMediaId: string | null\n defaultMediaUrl: string\n prices: Record<string, VariantPriceDraft>\n taxRateId: string | null\n customFieldsetCode?: string | null\n updatedAt?: string | null\n}\n\nexport const VARIANT_BASE_VALUES: VariantFormValues = {\n name: '',\n sku: '',\n barcode: '',\n isDefault: false,\n isActive: true,\n optionValues: {},\n metadata: {},\n mediaDraftId: '',\n mediaItems: [],\n defaultMediaId: null,\n defaultMediaUrl: '',\n prices: {},\n taxRateId: null,\n customFieldsetCode: null,\n}\n\nexport const createVariantInitialValues = (): VariantFormValues => ({\n ...VARIANT_BASE_VALUES,\n mediaDraftId: createLocalId(),\n})\n\nexport function normalizeOptionSchema(raw: unknown): OptionDefinition[] {\n if (!Array.isArray(raw)) return []\n return raw\n .map((entry) => normalizeOptionDefinition(entry))\n .filter((entry): entry is OptionDefinition => !!entry)\n}\n\nfunction normalizeOptionDefinition(entry: unknown): OptionDefinition | null {\n if (!entry || typeof entry !== 'object') return null\n const code = extractString((entry as any).code) || createLocalId()\n const label = extractString((entry as any).label) || code\n const values = Array.isArray((entry as any).values)\n ? (entry as any).values\n .map((value: any) => {\n const id = extractString(value?.id) || createLocalId()\n const valueLabel = extractString(value?.label) || id\n return { id, label: valueLabel }\n })\n .filter(\n (value: { id: string; label: string }): value is { id: string; label: string } =>\n value.label.length > 0,\n )\n : []\n return {\n id: extractString((entry as any).id) || createLocalId(),\n code,\n label,\n values,\n }\n}\n\nfunction extractString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nexport function buildVariantMetadata(values: VariantFormValues): Record<string, unknown> {\n const metadata = typeof values.metadata === 'object' && values.metadata ? { ...values.metadata } : {}\n return metadata\n}\n\nexport function findInvalidVariantPriceKinds(\n priceKinds: PriceKindSummary[],\n priceDrafts: Record<string, VariantPriceDraft> | undefined,\n): string[] {\n const invalid: string[] = []\n for (const kind of priceKinds) {\n const draft = priceDrafts?.[kind.id]\n const amount = typeof draft?.amount === 'string' ? draft.amount.trim() : ''\n if (!amount) continue\n if (!isCatalogPriceAmountInputValid(amount)) invalid.push(kind.id)\n }\n return invalid\n}\n\nexport function mapPriceItemToDraft(\n item: Record<string, unknown>,\n kindDisplayModes: Map<string, 'including-tax' | 'excluding-tax'>,\n): VariantPriceDraft | null {\n const kindId =\n typeof item.price_kind_id === 'string'\n ? item.price_kind_id\n : typeof item.priceKindId === 'string'\n ? item.priceKindId\n : null\n if (!kindId) return null\n const unitNet =\n typeof item.unit_price_net === 'string'\n ? item.unit_price_net\n : typeof item.unitPriceNet === 'string'\n ? item.unitPriceNet\n : null\n const unitGross =\n typeof item.unit_price_gross === 'string'\n ? item.unit_price_gross\n : typeof item.unitPriceGross === 'string'\n ? item.unitPriceGross\n : null\n const kindMode = kindDisplayModes.get(kindId) ?? (unitGross ? 'including-tax' : 'excluding-tax')\n return {\n priceKindId: kindId,\n priceId: typeof item.id === 'string' ? item.id : undefined,\n amount: kindMode === 'including-tax' ? (unitGross ?? unitNet ?? '') : (unitNet ?? unitGross ?? ''),\n currencyCode:\n typeof item.currency_code === 'string'\n ? item.currency_code\n : typeof item.currencyCode === 'string'\n ? item.currencyCode\n : null,\n displayMode: kindMode,\n updatedAt:\n typeof item.updatedAt === 'string'\n ? item.updatedAt\n : typeof item.updated_at === 'string'\n ? item.updated_at\n : null,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -62,6 +62,9 @@ function selectBestPrice(rows, ctx) {
|
|
|
62
62
|
const startA = a.startsAt ? a.startsAt.getTime() : 0;
|
|
63
63
|
const startB = b.startsAt ? b.startsAt.getTime() : 0;
|
|
64
64
|
if (startA !== startB) return startB - startA;
|
|
65
|
+
if (resolvePriceKindCode(a) === resolvePriceKindCode(b)) {
|
|
66
|
+
return (b.minQuantity ?? 1) - (a.minQuantity ?? 1);
|
|
67
|
+
}
|
|
65
68
|
return (a.minQuantity ?? 1) - (b.minQuantity ?? 1);
|
|
66
69
|
});
|
|
67
70
|
return candidates[0];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/catalog/lib/pricing.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EventBus } from '@open-mercato/events'\nimport type {\n CatalogOffer,\n CatalogPriceKind,\n CatalogProduct,\n CatalogProductPrice,\n CatalogProductVariant,\n} from '../data/entities'\n\nexport type PricingContext = {\n channelId?: string | null\n offerId?: string | null\n userId?: string | null\n userGroupId?: string | null\n customerId?: string | null\n customerGroupId?: string | null\n quantity: number\n date: Date\n}\n\nexport type PriceRow = CatalogProductPrice & {\n product?: CatalogProduct | string | null\n variant?: CatalogProductVariant | string | null\n offer?: CatalogOffer | string | null\n priceKind?: CatalogPriceKind | string | null\n}\n\nexport function resolvePriceVariantId(row: PriceRow): string | null {\n if (!row.variant) return null\n return typeof row.variant === 'string' ? row.variant : row.variant.id\n}\n\nexport function resolvePriceOfferId(row: PriceRow): string | null {\n if (!row.offer) return null\n return typeof row.offer === 'string' ? row.offer : row.offer.id\n}\n\nexport function resolvePriceChannelId(row: PriceRow): string | null {\n if (!row.offer) return row.channelId ?? null\n if (typeof row.offer === 'string') return row.channelId ?? null\n return row.channelId ?? row.offer.channelId ?? null\n}\n\nexport function resolvePriceKindCode(row: PriceRow): string {\n if (row.priceKind) {\n if (typeof row.priceKind === 'string') return row.priceKind\n return row.priceKind.code ?? row.kind ?? ''\n }\n return row.kind ?? ''\n}\n\nfunction matchesContext(row: PriceRow, ctx: PricingContext): boolean {\n const { quantity, date } = ctx\n if (row.minQuantity && quantity < row.minQuantity) return false\n if (row.maxQuantity && quantity > row.maxQuantity) return false\n if (row.startsAt && date < row.startsAt) return false\n if (row.endsAt && date > row.endsAt) return false\n if (row.channelId || (row.offer && resolvePriceChannelId(row))) {\n const channel = resolvePriceChannelId(row)\n if (channel && ctx.channelId && channel !== ctx.channelId) return false\n if (channel && !ctx.channelId) return false\n }\n if (row.userId && ctx.userId !== row.userId) return false\n if (row.userGroupId && ctx.userGroupId !== row.userGroupId) return false\n if (row.customerId && ctx.customerId !== row.customerId) return false\n if (row.customerGroupId && ctx.customerGroupId !== row.customerGroupId) return false\n if (ctx.offerId && resolvePriceOfferId(row) && resolvePriceOfferId(row) !== ctx.offerId) return false\n return true\n}\n\nfunction scorePrice(row: PriceRow): number {\n const resolvedKind = resolvePriceKindCode(row)\n let score = 0\n if (resolvedKind === 'custom') score += 5\n else if (resolvedKind === 'tier') score += 3\n else if (resolvedKind === 'promotion' || row.priceKind?.isPromotion) score += 4\n else score += 2\n if (row.variant) score += 8\n if (row.offer) score += 6\n if (row.channelId) score += 5\n if (row.userId) score += 5\n if (row.userGroupId) score += 4\n if (row.customerId) score += 4\n if (row.customerGroupId) score += 3\n if (row.minQuantity && row.minQuantity > 1) score += 1\n return score\n}\n\nexport function selectBestPrice(rows: PriceRow[], ctx: PricingContext): PriceRow | null {\n const candidates = rows.filter((row) => matchesContext(row, ctx))\n if (!candidates.length) return null\n candidates.sort((a, b) => {\n const scoreDiff = scorePrice(b) - scorePrice(a)\n if (scoreDiff !== 0) return scoreDiff\n const startA = a.startsAt ? a.startsAt.getTime() : 0\n const startB = b.startsAt ? b.startsAt.getTime() : 0\n if (startA !== startB) return startB - startA\n return (a.minQuantity ?? 1) - (b.minQuantity ?? 1)\n })\n return candidates[0]\n}\n\nexport type CatalogPricingResolver = (\n rows: PriceRow[],\n ctx: PricingContext\n) => PriceRow | null | undefined | Promise<PriceRow | null | undefined>\n\ntype RegisteredResolver = {\n resolver: CatalogPricingResolver\n priority: number\n}\n\nconst pricingResolvers: RegisteredResolver[] = []\n\nfunction sortResolvers(): void {\n pricingResolvers.sort((a, b) => b.priority - a.priority)\n}\n\nexport function registerCatalogPricingResolver(\n resolver: CatalogPricingResolver,\n options?: { priority?: number }\n): void {\n pricingResolvers.push({ resolver, priority: options?.priority ?? 0 })\n sortResolvers()\n}\n\nexport function resetCatalogPricingResolvers(): void {\n pricingResolvers.splice(0, pricingResolvers.length)\n}\n\nexport async function resolveCatalogPrice(\n rows: PriceRow[],\n ctx: PricingContext,\n options?: { eventBus?: EventBus | null }\n): Promise<PriceRow | null> {\n let workingRows = rows\n let workingContext = ctx\n const eventBus = options?.eventBus ?? null\n let resolved: PriceRow | null | undefined\n\n if (eventBus) {\n await eventBus.emitEvent('catalog.pricing.resolve.before', {\n rows: workingRows,\n context: workingContext,\n setRows(next: PriceRow[]) {\n if (Array.isArray(next)) workingRows = next\n },\n setContext(next: PricingContext) {\n if (next) workingContext = next\n },\n setResult(next: PriceRow | null) {\n resolved = next\n },\n })\n if (resolved !== undefined) return resolved\n }\n\n for (const { resolver } of pricingResolvers) {\n const result = await resolver(workingRows, workingContext)\n if (result !== undefined) {\n resolved = result ?? null\n break\n }\n }\n\n if (resolved === undefined) {\n resolved = selectBestPrice(workingRows, workingContext)\n }\n\n if (eventBus) {\n await eventBus.emitEvent('catalog.pricing.resolve.after', {\n rows: workingRows,\n context: workingContext,\n result: resolved ?? null,\n setResult(next: PriceRow | null) {\n resolved = next\n },\n })\n }\n\n return resolved ?? null\n}\n\nexport async function resolveCatalogPriceBatch(\n entries: Array<{ rows: PriceRow[]; context: PricingContext }>,\n options?: { eventBus?: EventBus | null }\n): Promise<Array<PriceRow | null>> {\n return Promise.all(\n entries.map(({ rows, context }) => resolveCatalogPrice(rows, context, options))\n )\n}\n"],
|
|
5
|
-
"mappings": "AA2BO,SAAS,sBAAsB,KAA8B;AAClE,MAAI,CAAC,IAAI,QAAS,QAAO;AACzB,SAAO,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,IAAI,QAAQ;AACrE;AAEO,SAAS,oBAAoB,KAA8B;AAChE,MAAI,CAAC,IAAI,MAAO,QAAO;AACvB,SAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ,IAAI,MAAM;AAC/D;AAEO,SAAS,sBAAsB,KAA8B;AAClE,MAAI,CAAC,IAAI,MAAO,QAAO,IAAI,aAAa;AACxC,MAAI,OAAO,IAAI,UAAU,SAAU,QAAO,IAAI,aAAa;AAC3D,SAAO,IAAI,aAAa,IAAI,MAAM,aAAa;AACjD;AAEO,SAAS,qBAAqB,KAAuB;AAC1D,MAAI,IAAI,WAAW;AACjB,QAAI,OAAO,IAAI,cAAc,SAAU,QAAO,IAAI;AAClD,WAAO,IAAI,UAAU,QAAQ,IAAI,QAAQ;AAAA,EAC3C;AACA,SAAO,IAAI,QAAQ;AACrB;AAEA,SAAS,eAAe,KAAe,KAA8B;AACnE,QAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,MAAI,IAAI,eAAe,WAAW,IAAI,YAAa,QAAO;AAC1D,MAAI,IAAI,eAAe,WAAW,IAAI,YAAa,QAAO;AAC1D,MAAI,IAAI,YAAY,OAAO,IAAI,SAAU,QAAO;AAChD,MAAI,IAAI,UAAU,OAAO,IAAI,OAAQ,QAAO;AAC5C,MAAI,IAAI,aAAc,IAAI,SAAS,sBAAsB,GAAG,GAAI;AAC9D,UAAM,UAAU,sBAAsB,GAAG;AACzC,QAAI,WAAW,IAAI,aAAa,YAAY,IAAI,UAAW,QAAO;AAClE,QAAI,WAAW,CAAC,IAAI,UAAW,QAAO;AAAA,EACxC;AACA,MAAI,IAAI,UAAU,IAAI,WAAW,IAAI,OAAQ,QAAO;AACpD,MAAI,IAAI,eAAe,IAAI,gBAAgB,IAAI,YAAa,QAAO;AACnE,MAAI,IAAI,cAAc,IAAI,eAAe,IAAI,WAAY,QAAO;AAChE,MAAI,IAAI,mBAAmB,IAAI,oBAAoB,IAAI,gBAAiB,QAAO;AAC/E,MAAI,IAAI,WAAW,oBAAoB,GAAG,KAAK,oBAAoB,GAAG,MAAM,IAAI,QAAS,QAAO;AAChG,SAAO;AACT;AAEA,SAAS,WAAW,KAAuB;AACzC,QAAM,eAAe,qBAAqB,GAAG;AAC7C,MAAI,QAAQ;AACZ,MAAI,iBAAiB,SAAU,UAAS;AAAA,WAC/B,iBAAiB,OAAQ,UAAS;AAAA,WAClC,iBAAiB,eAAe,IAAI,WAAW,YAAa,UAAS;AAAA,MACzE,UAAS;AACd,MAAI,IAAI,QAAS,UAAS;AAC1B,MAAI,IAAI,MAAO,UAAS;AACxB,MAAI,IAAI,UAAW,UAAS;AAC5B,MAAI,IAAI,OAAQ,UAAS;AACzB,MAAI,IAAI,YAAa,UAAS;AAC9B,MAAI,IAAI,WAAY,UAAS;AAC7B,MAAI,IAAI,gBAAiB,UAAS;AAClC,MAAI,IAAI,eAAe,IAAI,cAAc,EAAG,UAAS;AACrD,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAkB,KAAsC;AACtF,QAAM,aAAa,KAAK,OAAO,CAAC,QAAQ,eAAe,KAAK,GAAG,CAAC;AAChE,MAAI,CAAC,WAAW,OAAQ,QAAO;AAC/B,aAAW,KAAK,CAAC,GAAG,MAAM;AACxB,UAAM,YAAY,WAAW,CAAC,IAAI,WAAW,CAAC;AAC9C,QAAI,cAAc,EAAG,QAAO;AAC5B,UAAM,SAAS,EAAE,WAAW,EAAE,SAAS,QAAQ,IAAI;AACnD,UAAM,SAAS,EAAE,WAAW,EAAE,SAAS,QAAQ,IAAI;AACnD,QAAI,WAAW,OAAQ,QAAO,SAAS;
|
|
4
|
+
"sourcesContent": ["import type { EventBus } from '@open-mercato/events'\nimport type {\n CatalogOffer,\n CatalogPriceKind,\n CatalogProduct,\n CatalogProductPrice,\n CatalogProductVariant,\n} from '../data/entities'\n\nexport type PricingContext = {\n channelId?: string | null\n offerId?: string | null\n userId?: string | null\n userGroupId?: string | null\n customerId?: string | null\n customerGroupId?: string | null\n quantity: number\n date: Date\n}\n\nexport type PriceRow = CatalogProductPrice & {\n product?: CatalogProduct | string | null\n variant?: CatalogProductVariant | string | null\n offer?: CatalogOffer | string | null\n priceKind?: CatalogPriceKind | string | null\n}\n\nexport function resolvePriceVariantId(row: PriceRow): string | null {\n if (!row.variant) return null\n return typeof row.variant === 'string' ? row.variant : row.variant.id\n}\n\nexport function resolvePriceOfferId(row: PriceRow): string | null {\n if (!row.offer) return null\n return typeof row.offer === 'string' ? row.offer : row.offer.id\n}\n\nexport function resolvePriceChannelId(row: PriceRow): string | null {\n if (!row.offer) return row.channelId ?? null\n if (typeof row.offer === 'string') return row.channelId ?? null\n return row.channelId ?? row.offer.channelId ?? null\n}\n\nexport function resolvePriceKindCode(row: PriceRow): string {\n if (row.priceKind) {\n if (typeof row.priceKind === 'string') return row.priceKind\n return row.priceKind.code ?? row.kind ?? ''\n }\n return row.kind ?? ''\n}\n\nfunction matchesContext(row: PriceRow, ctx: PricingContext): boolean {\n const { quantity, date } = ctx\n if (row.minQuantity && quantity < row.minQuantity) return false\n if (row.maxQuantity && quantity > row.maxQuantity) return false\n if (row.startsAt && date < row.startsAt) return false\n if (row.endsAt && date > row.endsAt) return false\n if (row.channelId || (row.offer && resolvePriceChannelId(row))) {\n const channel = resolvePriceChannelId(row)\n if (channel && ctx.channelId && channel !== ctx.channelId) return false\n if (channel && !ctx.channelId) return false\n }\n if (row.userId && ctx.userId !== row.userId) return false\n if (row.userGroupId && ctx.userGroupId !== row.userGroupId) return false\n if (row.customerId && ctx.customerId !== row.customerId) return false\n if (row.customerGroupId && ctx.customerGroupId !== row.customerGroupId) return false\n if (ctx.offerId && resolvePriceOfferId(row) && resolvePriceOfferId(row) !== ctx.offerId) return false\n return true\n}\n\nfunction scorePrice(row: PriceRow): number {\n const resolvedKind = resolvePriceKindCode(row)\n let score = 0\n if (resolvedKind === 'custom') score += 5\n else if (resolvedKind === 'tier') score += 3\n else if (resolvedKind === 'promotion' || row.priceKind?.isPromotion) score += 4\n else score += 2\n if (row.variant) score += 8\n if (row.offer) score += 6\n if (row.channelId) score += 5\n if (row.userId) score += 5\n if (row.userGroupId) score += 4\n if (row.customerId) score += 4\n if (row.customerGroupId) score += 3\n if (row.minQuantity && row.minQuantity > 1) score += 1\n return score\n}\n\nexport function selectBestPrice(rows: PriceRow[], ctx: PricingContext): PriceRow | null {\n const candidates = rows.filter((row) => matchesContext(row, ctx))\n if (!candidates.length) return null\n candidates.sort((a, b) => {\n const scoreDiff = scorePrice(b) - scorePrice(a)\n if (scoreDiff !== 0) return scoreDiff\n const startA = a.startsAt ? a.startsAt.getTime() : 0\n const startB = b.startsAt ? b.startsAt.getTime() : 0\n if (startA !== startB) return startB - startA\n // minQuantity tie-break is direction-dependent on the resolved kind.\n // Within the same kind we pick the more specific tier (higher minQuantity wins \u2014 issue #1706).\n // Across kinds we keep the pre-#1706 ascending order so a row whose kind has a higher\n // scoreBase still wins when scorePrice's \"+1 for minQuantity > 1\" bonus produces a\n // cross-kind collision (e.g. promotion[minQty=1]=4 vs tier[minQty=3]=4).\n if (resolvePriceKindCode(a) === resolvePriceKindCode(b)) {\n return (b.minQuantity ?? 1) - (a.minQuantity ?? 1)\n }\n return (a.minQuantity ?? 1) - (b.minQuantity ?? 1)\n })\n return candidates[0]\n}\n\nexport type CatalogPricingResolver = (\n rows: PriceRow[],\n ctx: PricingContext\n) => PriceRow | null | undefined | Promise<PriceRow | null | undefined>\n\ntype RegisteredResolver = {\n resolver: CatalogPricingResolver\n priority: number\n}\n\nconst pricingResolvers: RegisteredResolver[] = []\n\nfunction sortResolvers(): void {\n pricingResolvers.sort((a, b) => b.priority - a.priority)\n}\n\nexport function registerCatalogPricingResolver(\n resolver: CatalogPricingResolver,\n options?: { priority?: number }\n): void {\n pricingResolvers.push({ resolver, priority: options?.priority ?? 0 })\n sortResolvers()\n}\n\nexport function resetCatalogPricingResolvers(): void {\n pricingResolvers.splice(0, pricingResolvers.length)\n}\n\nexport async function resolveCatalogPrice(\n rows: PriceRow[],\n ctx: PricingContext,\n options?: { eventBus?: EventBus | null }\n): Promise<PriceRow | null> {\n let workingRows = rows\n let workingContext = ctx\n const eventBus = options?.eventBus ?? null\n let resolved: PriceRow | null | undefined\n\n if (eventBus) {\n await eventBus.emitEvent('catalog.pricing.resolve.before', {\n rows: workingRows,\n context: workingContext,\n setRows(next: PriceRow[]) {\n if (Array.isArray(next)) workingRows = next\n },\n setContext(next: PricingContext) {\n if (next) workingContext = next\n },\n setResult(next: PriceRow | null) {\n resolved = next\n },\n })\n if (resolved !== undefined) return resolved\n }\n\n for (const { resolver } of pricingResolvers) {\n const result = await resolver(workingRows, workingContext)\n if (result !== undefined) {\n resolved = result ?? null\n break\n }\n }\n\n if (resolved === undefined) {\n resolved = selectBestPrice(workingRows, workingContext)\n }\n\n if (eventBus) {\n await eventBus.emitEvent('catalog.pricing.resolve.after', {\n rows: workingRows,\n context: workingContext,\n result: resolved ?? null,\n setResult(next: PriceRow | null) {\n resolved = next\n },\n })\n }\n\n return resolved ?? null\n}\n\nexport async function resolveCatalogPriceBatch(\n entries: Array<{ rows: PriceRow[]; context: PricingContext }>,\n options?: { eventBus?: EventBus | null }\n): Promise<Array<PriceRow | null>> {\n return Promise.all(\n entries.map(({ rows, context }) => resolveCatalogPrice(rows, context, options))\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const features = [
|
|
2
|
+
{ id: "communication_channels.view", title: "View communication channels", module: "communication_channels" },
|
|
3
|
+
{ id: "communication_channels.manage", title: "Manage communication channels", module: "communication_channels" },
|
|
4
|
+
{ id: "communication_channels.react", title: "React to channel messages", module: "communication_channels" },
|
|
5
|
+
{ id: "communication_channels.assign", title: "Assign channel conversations", module: "communication_channels" },
|
|
6
|
+
/**
|
|
7
|
+
* Per-user channel ownership (added by the email integration spec).
|
|
8
|
+
*
|
|
9
|
+
* Gates the "Connect my mailbox" flow on the per-user profile page. Split from
|
|
10
|
+
* `communication_channels.manage` so policy can disable new linking while
|
|
11
|
+
* preserving existing accounts (e.g. during a security incident response).
|
|
12
|
+
* Default-granted to all roles in `setup.ts`.
|
|
13
|
+
*/
|
|
14
|
+
{ id: "communication_channels.connect_user_channel", title: "Connect own communication channel", module: "communication_channels" },
|
|
15
|
+
/**
|
|
16
|
+
* Reserved for a future v2 team-oversight capability. NOT consulted in v1:
|
|
17
|
+
* personal mailboxes (`CommunicationChannel.user_id` set) follow the strict
|
|
18
|
+
* owner-only privacy model, so this feature grants NO cross-user channel view.
|
|
19
|
+
* The admin channels list (`GET /api/communication_channels/channels`) returns
|
|
20
|
+
* `user_id IS NULL` rows only; personal mailboxes surface exclusively on the
|
|
21
|
+
* owner's profile page and are never exposed to admins/superadmins in v1.
|
|
22
|
+
* Granted to `superadmin` + `admin` only so the inert grant is in place ahead
|
|
23
|
+
* of the audited v2 oversight feature that will re-activate it.
|
|
24
|
+
*/
|
|
25
|
+
{ id: "communication_channels.admin", title: "Administer all communication channels (tenant-wide)", module: "communication_channels" },
|
|
26
|
+
/**
|
|
27
|
+
* Trigger the "Import history" job for a channel — fetch older messages
|
|
28
|
+
* the channel never saw at bootstrap (Spec B § Phase B6). Separate from
|
|
29
|
+
* `manage` so policy can gate bulk historical imports during quiet hours
|
|
30
|
+
* or cost-controlled rollouts while leaving normal channel CRUD open.
|
|
31
|
+
*/
|
|
32
|
+
{ id: "communication_channels.channel.import_history", title: "Import channel history", module: "communication_channels" },
|
|
33
|
+
/**
|
|
34
|
+
* Manage provider push delivery (Spec C — Gmail Pub/Sub push
|
|
35
|
+
* subscriptions). Gates the "Re-register push" operator button and any
|
|
36
|
+
* future push-status manipulation. Granted to admin + superadmin only —
|
|
37
|
+
* regular users don't need to think about whether mail arrives via
|
|
38
|
+
* push or polling, the system handles it.
|
|
39
|
+
*/
|
|
40
|
+
{ id: "communication_channels.channel.push.manage", title: "Manage push delivery", module: "communication_channels" }
|
|
41
|
+
];
|
|
42
|
+
var acl_default = features;
|
|
43
|
+
export {
|
|
44
|
+
acl_default as default,
|
|
45
|
+
features
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=acl.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/modules/communication_channels/acl.ts"],
|
|
4
|
+
"sourcesContent": ["export const features = [\n { id: 'communication_channels.view', title: 'View communication channels', module: 'communication_channels' },\n { id: 'communication_channels.manage', title: 'Manage communication channels', module: 'communication_channels' },\n { id: 'communication_channels.react', title: 'React to channel messages', module: 'communication_channels' },\n { id: 'communication_channels.assign', title: 'Assign channel conversations', module: 'communication_channels' },\n /**\n * Per-user channel ownership (added by the email integration spec).\n *\n * Gates the \"Connect my mailbox\" flow on the per-user profile page. Split from\n * `communication_channels.manage` so policy can disable new linking while\n * preserving existing accounts (e.g. during a security incident response).\n * Default-granted to all roles in `setup.ts`.\n */\n { id: 'communication_channels.connect_user_channel', title: 'Connect own communication channel', module: 'communication_channels' },\n /**\n * Reserved for a future v2 team-oversight capability. NOT consulted in v1:\n * personal mailboxes (`CommunicationChannel.user_id` set) follow the strict\n * owner-only privacy model, so this feature grants NO cross-user channel view.\n * The admin channels list (`GET /api/communication_channels/channels`) returns\n * `user_id IS NULL` rows only; personal mailboxes surface exclusively on the\n * owner's profile page and are never exposed to admins/superadmins in v1.\n * Granted to `superadmin` + `admin` only so the inert grant is in place ahead\n * of the audited v2 oversight feature that will re-activate it.\n */\n { id: 'communication_channels.admin', title: 'Administer all communication channels (tenant-wide)', module: 'communication_channels' },\n /**\n * Trigger the \"Import history\" job for a channel \u2014 fetch older messages\n * the channel never saw at bootstrap (Spec B \u00A7 Phase B6). Separate from\n * `manage` so policy can gate bulk historical imports during quiet hours\n * or cost-controlled rollouts while leaving normal channel CRUD open.\n */\n { id: 'communication_channels.channel.import_history', title: 'Import channel history', module: 'communication_channels' },\n /**\n * Manage provider push delivery (Spec C \u2014 Gmail Pub/Sub push\n * subscriptions). Gates the \"Re-register push\" operator button and any\n * future push-status manipulation. Granted to admin + superadmin only \u2014\n * regular users don't need to think about whether mail arrives via\n * push or polling, the system handles it.\n */\n { id: 'communication_channels.channel.push.manage', title: 'Manage push delivery', module: 'communication_channels' },\n] as const\n\nexport default features\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,EAAE,IAAI,+BAA+B,OAAO,+BAA+B,QAAQ,yBAAyB;AAAA,EAC5G,EAAE,IAAI,iCAAiC,OAAO,iCAAiC,QAAQ,yBAAyB;AAAA,EAChH,EAAE,IAAI,gCAAgC,OAAO,6BAA6B,QAAQ,yBAAyB;AAAA,EAC3G,EAAE,IAAI,iCAAiC,OAAO,gCAAgC,QAAQ,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/G,EAAE,IAAI,+CAA+C,OAAO,qCAAqC,QAAQ,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlI,EAAE,IAAI,gCAAgC,OAAO,uDAAuD,QAAQ,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrI,EAAE,IAAI,iDAAiD,OAAO,0BAA0B,QAAQ,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzH,EAAE,IAAI,8CAA8C,OAAO,wBAAwB,QAAQ,yBAAyB;AACtH;AAEA,IAAO,cAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
|
|
4
|
+
import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
|
|
5
|
+
import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
6
|
+
import { CommunicationChannel } from "../../../../data/entities.js";
|
|
7
|
+
import { ChannelAccessDeniedError, assertCanManageChannel } from "../../../../lib/access-control.js";
|
|
8
|
+
import {
|
|
9
|
+
COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID
|
|
10
|
+
} from "../../../../commands/delete-channel.js";
|
|
11
|
+
import { validateRouteMutationGuard } from "../../../../lib/route-mutation-guard.js";
|
|
12
|
+
const metadata = {
|
|
13
|
+
path: "/communication_channels/channels/[id]",
|
|
14
|
+
DELETE: {
|
|
15
|
+
// Owner self-service: a user may disconnect their OWN personal mailbox
|
|
16
|
+
// (gated by `connect_user_channel`). Deleting a shared/tenant-wide channel
|
|
17
|
+
// still requires `manage` — enforced per channel type by
|
|
18
|
+
// `assertCanManageChannel` in the handler.
|
|
19
|
+
requireAuth: true,
|
|
20
|
+
requireFeatures: ["communication_channels.connect_user_channel"]
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
async function DELETE(req, context) {
|
|
24
|
+
const { id } = await context.params;
|
|
25
|
+
if (!z.string().uuid().safeParse(id).success) {
|
|
26
|
+
return NextResponse.json({ error: "Invalid channel id" }, { status: 400 });
|
|
27
|
+
}
|
|
28
|
+
const auth = await getAuthFromRequest(req);
|
|
29
|
+
if (!auth?.sub || !auth?.tenantId) {
|
|
30
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
31
|
+
}
|
|
32
|
+
const container = await createRequestContainer();
|
|
33
|
+
const em = container.resolve("em").fork();
|
|
34
|
+
const organizationId = auth.orgId ?? null;
|
|
35
|
+
const dscope = { tenantId: auth.tenantId, organizationId };
|
|
36
|
+
const channel = await findOneWithDecryption(
|
|
37
|
+
em,
|
|
38
|
+
CommunicationChannel,
|
|
39
|
+
{
|
|
40
|
+
id,
|
|
41
|
+
tenantId: auth.tenantId,
|
|
42
|
+
organizationId,
|
|
43
|
+
deletedAt: null
|
|
44
|
+
},
|
|
45
|
+
void 0,
|
|
46
|
+
dscope
|
|
47
|
+
);
|
|
48
|
+
if (!channel) {
|
|
49
|
+
return NextResponse.json({ error: "Channel not found" }, { status: 404 });
|
|
50
|
+
}
|
|
51
|
+
let userFeatures = [];
|
|
52
|
+
try {
|
|
53
|
+
const rbac = container.resolve("rbacService");
|
|
54
|
+
const acl = await rbac.loadAcl(auth.sub, {
|
|
55
|
+
tenantId: auth.tenantId,
|
|
56
|
+
organizationId
|
|
57
|
+
});
|
|
58
|
+
userFeatures = acl?.isSuperAdmin ? ["*"] : Array.isArray(acl?.features) ? acl.features : [];
|
|
59
|
+
} catch {
|
|
60
|
+
userFeatures = [];
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
assertCanManageChannel(
|
|
64
|
+
{ userId: channel.userId },
|
|
65
|
+
auth.sub,
|
|
66
|
+
userFeatures,
|
|
67
|
+
"communication_channels.manage"
|
|
68
|
+
);
|
|
69
|
+
} catch (err) {
|
|
70
|
+
if (err instanceof ChannelAccessDeniedError) {
|
|
71
|
+
return NextResponse.json({ error: "Channel not found" }, { status: 404 });
|
|
72
|
+
}
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
const guard = await validateRouteMutationGuard({
|
|
76
|
+
container,
|
|
77
|
+
req,
|
|
78
|
+
auth,
|
|
79
|
+
input: {
|
|
80
|
+
resourceKind: "communication_channels.channel",
|
|
81
|
+
resourceId: id,
|
|
82
|
+
operation: "delete"
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
if ("response" in guard) return guard.response;
|
|
86
|
+
const commandBus = container.resolve("commandBus");
|
|
87
|
+
const input = {
|
|
88
|
+
channelId: id,
|
|
89
|
+
userId: auth.sub,
|
|
90
|
+
scope: { tenantId: auth.tenantId, organizationId }
|
|
91
|
+
};
|
|
92
|
+
const { result } = await commandBus.execute(
|
|
93
|
+
COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,
|
|
94
|
+
{
|
|
95
|
+
input,
|
|
96
|
+
ctx: {
|
|
97
|
+
container,
|
|
98
|
+
auth,
|
|
99
|
+
organizationScope: null,
|
|
100
|
+
selectedOrganizationId: organizationId,
|
|
101
|
+
organizationIds: organizationId ? [organizationId] : null
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
if (result.status !== "deleted") {
|
|
106
|
+
return NextResponse.json({ error: "Channel not found" }, { status: 404 });
|
|
107
|
+
}
|
|
108
|
+
await guard.afterSuccess();
|
|
109
|
+
return new NextResponse(null, { status: 204 });
|
|
110
|
+
}
|
|
111
|
+
const openApi = {
|
|
112
|
+
tags: ["CommunicationChannels"],
|
|
113
|
+
methods: {
|
|
114
|
+
DELETE: {
|
|
115
|
+
summary: "Delete (soft-delete) a communication channel",
|
|
116
|
+
tags: ["CommunicationChannels"],
|
|
117
|
+
responses: [
|
|
118
|
+
{ status: 204, description: "Channel deleted" },
|
|
119
|
+
{ status: 400, description: "Invalid channel id" },
|
|
120
|
+
{ status: 401, description: "Unauthorized" },
|
|
121
|
+
{ status: 404, description: "Channel not found or not owned by current user" }
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
var route_default = DELETE;
|
|
127
|
+
export {
|
|
128
|
+
DELETE,
|
|
129
|
+
route_default as default,
|
|
130
|
+
metadata,
|
|
131
|
+
openApi
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/communication_channels/api/delete/channels/%5Bid%5D/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { CommandBus } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { CommunicationChannel } from '../../../../data/entities'\nimport { ChannelAccessDeniedError, assertCanManageChannel } from '../../../../lib/access-control'\nimport {\n COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,\n type DeleteChannelInput,\n type DeleteChannelResult,\n} from '../../../../commands/delete-channel'\nimport { validateRouteMutationGuard } from '../../../../lib/route-mutation-guard'\n\ntype RbacServiceLike = {\n loadAcl: (\n userId: string,\n scope: { tenantId: string | null; organizationId: string | null },\n ) => Promise<{ isSuperAdmin: boolean; features: string[]; organizations: string[] | null }>\n}\n\n/**\n * Soft-delete (remove) a communication channel.\n *\n * Per-user access guard: only the channel owner \u2014 or an admin holding\n * `communication_channels.admin` \u2014 may delete a channel. Non-owners get a 404\n * (existence masking), consistent with the other channel routes. The declarative\n * `communication_channels.manage` feature gates the route itself; deletion is a\n * management operation alongside disconnect/set-primary.\n */\nexport const metadata = {\n path: '/communication_channels/channels/[id]',\n DELETE: {\n // Owner self-service: a user may disconnect their OWN personal mailbox\n // (gated by `connect_user_channel`). Deleting a shared/tenant-wide channel\n // still requires `manage` \u2014 enforced per channel type by\n // `assertCanManageChannel` in the handler.\n requireAuth: true,\n requireFeatures: ['communication_channels.connect_user_channel'],\n },\n}\n\ntype RouteContext = {\n params: Promise<{ id: string }> | { id: string }\n}\n\nexport async function DELETE(req: Request, context: RouteContext): Promise<Response> {\n const { id } = await context.params\n if (!z.string().uuid().safeParse(id).success) {\n return NextResponse.json({ error: 'Invalid channel id' }, { status: 400 })\n }\n\n const auth = await getAuthFromRequest(req)\n if (!auth?.sub || !auth?.tenantId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager).fork()\n const organizationId = (auth as { orgId?: string | null }).orgId ?? null\n const dscope = { tenantId: auth.tenantId as string, organizationId }\n\n const channel = await findOneWithDecryption(\n em,\n CommunicationChannel,\n {\n id,\n tenantId: auth.tenantId as string,\n organizationId,\n deletedAt: null,\n },\n undefined,\n dscope,\n )\n if (!channel) {\n return NextResponse.json({ error: 'Channel not found' }, { status: 404 })\n }\n\n let userFeatures: string[] = []\n try {\n const rbac = container.resolve('rbacService') as RbacServiceLike\n const acl = await rbac.loadAcl(auth.sub as string, {\n tenantId: auth.tenantId as string,\n organizationId,\n })\n userFeatures = acl?.isSuperAdmin ? ['*'] : Array.isArray(acl?.features) ? acl.features : []\n } catch {\n userFeatures = []\n }\n try {\n assertCanManageChannel(\n { userId: (channel as { userId?: string | null }).userId },\n auth.sub as string,\n userFeatures,\n 'communication_channels.manage',\n )\n } catch (err) {\n if (err instanceof ChannelAccessDeniedError) {\n return NextResponse.json({ error: 'Channel not found' }, { status: 404 })\n }\n throw err\n }\n\n const guard = await validateRouteMutationGuard({\n container,\n req,\n auth,\n input: {\n resourceKind: 'communication_channels.channel',\n resourceId: id,\n operation: 'delete',\n },\n })\n if ('response' in guard) return guard.response\n\n const commandBus = container.resolve('commandBus') as CommandBus\n const input: DeleteChannelInput = {\n channelId: id,\n userId: auth.sub as string,\n scope: { tenantId: auth.tenantId as string, organizationId },\n }\n const { result } = await commandBus.execute<DeleteChannelInput, DeleteChannelResult>(\n COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,\n {\n input,\n ctx: {\n container,\n auth: auth as never,\n organizationScope: null,\n selectedOrganizationId: organizationId,\n organizationIds: organizationId ? [organizationId] : null,\n },\n },\n )\n\n // 'noop' (channel vanished between the load and the command) and 'not_owner'\n // both map to 404 to avoid leaking ownership/existence.\n if (result.status !== 'deleted') {\n return NextResponse.json({ error: 'Channel not found' }, { status: 404 })\n }\n await guard.afterSuccess()\n return new NextResponse(null, { status: 204 })\n}\n\nexport const openApi = {\n tags: ['CommunicationChannels'],\n methods: {\n DELETE: {\n summary: 'Delete (soft-delete) a communication channel',\n tags: ['CommunicationChannels'],\n responses: [\n { status: 204, description: 'Channel deleted' },\n { status: 400, description: 'Invalid channel id' },\n { status: 401, description: 'Unauthorized' },\n { status: 404, description: 'Channel not found or not owned by current user' },\n ],\n },\n },\n}\n\nexport default DELETE\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
|
|
4
|
+
import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
5
|
+
import {
|
|
6
|
+
COMMUNICATION_CHANNELS_TOGGLE_OUTBOUND_REACTION_COMMAND_ID
|
|
7
|
+
} from "../../../../../../commands/toggle-outbound-reaction.js";
|
|
8
|
+
import { MessageReaction } from "../../../../../../data/entities.js";
|
|
9
|
+
import { validateRouteMutationGuard } from "../../../../../../lib/route-mutation-guard.js";
|
|
10
|
+
const metadata = {
|
|
11
|
+
path: "/communication_channels/messages/[messageId]/reactions/[reactionId]",
|
|
12
|
+
DELETE: {
|
|
13
|
+
requireAuth: true,
|
|
14
|
+
requireFeatures: ["communication_channels.react"]
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
async function DELETE(_req, context) {
|
|
18
|
+
const { messageId, reactionId } = await context.params;
|
|
19
|
+
if (!messageId || !reactionId || !z.string().uuid().safeParse(messageId).success || !z.string().uuid().safeParse(reactionId).success) {
|
|
20
|
+
return NextResponse.json({ error: "Invalid params" }, { status: 400 });
|
|
21
|
+
}
|
|
22
|
+
const auth = context.auth;
|
|
23
|
+
if (!auth?.sub || !auth?.tenantId) {
|
|
24
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
25
|
+
}
|
|
26
|
+
const container = await createRequestContainer();
|
|
27
|
+
const em = container.resolve("em").fork();
|
|
28
|
+
const reaction = await findOneWithDecryption(
|
|
29
|
+
em,
|
|
30
|
+
MessageReaction,
|
|
31
|
+
{
|
|
32
|
+
id: reactionId,
|
|
33
|
+
messageId,
|
|
34
|
+
tenantId: auth.tenantId,
|
|
35
|
+
organizationId: auth.orgId ?? null
|
|
36
|
+
},
|
|
37
|
+
void 0,
|
|
38
|
+
{ tenantId: auth.tenantId, organizationId: auth.orgId ?? null }
|
|
39
|
+
);
|
|
40
|
+
if (!reaction) {
|
|
41
|
+
return NextResponse.json({ error: "Reaction not found" }, { status: 404 });
|
|
42
|
+
}
|
|
43
|
+
const guard = await validateRouteMutationGuard({
|
|
44
|
+
container,
|
|
45
|
+
req: _req,
|
|
46
|
+
auth,
|
|
47
|
+
input: {
|
|
48
|
+
resourceKind: "communication_channels.message",
|
|
49
|
+
resourceId: messageId,
|
|
50
|
+
operation: "custom",
|
|
51
|
+
mutationPayload: { reactionId, emoji: reaction.emoji, action: "remove" }
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
if ("response" in guard) return guard.response;
|
|
55
|
+
const commandBus = container.resolve("commandBus");
|
|
56
|
+
const input = {
|
|
57
|
+
messageId,
|
|
58
|
+
emoji: reaction.emoji,
|
|
59
|
+
action: "remove",
|
|
60
|
+
reactionId,
|
|
61
|
+
reactedByUserId: auth.sub,
|
|
62
|
+
scope: {
|
|
63
|
+
tenantId: auth.tenantId,
|
|
64
|
+
organizationId: auth.orgId ?? null
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const { result } = await commandBus.execute(COMMUNICATION_CHANNELS_TOGGLE_OUTBOUND_REACTION_COMMAND_ID, {
|
|
68
|
+
input,
|
|
69
|
+
ctx: {
|
|
70
|
+
container,
|
|
71
|
+
auth,
|
|
72
|
+
organizationScope: null,
|
|
73
|
+
selectedOrganizationId: auth.orgId ?? null,
|
|
74
|
+
organizationIds: auth.orgId ? [auth.orgId] : null
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
if (result.status === "noop") {
|
|
78
|
+
return NextResponse.json({ error: result.reason }, { status: 404 });
|
|
79
|
+
}
|
|
80
|
+
if (result.status === "not_owner") {
|
|
81
|
+
return NextResponse.json({ error: result.reason }, { status: 403 });
|
|
82
|
+
}
|
|
83
|
+
if (result.status === "no_channel_link") {
|
|
84
|
+
return NextResponse.json({ error: result.reason }, { status: 409 });
|
|
85
|
+
}
|
|
86
|
+
await guard.afterSuccess();
|
|
87
|
+
return new NextResponse(null, { status: 204 });
|
|
88
|
+
}
|
|
89
|
+
const openApi = {
|
|
90
|
+
tags: ["CommunicationChannels"],
|
|
91
|
+
methods: {
|
|
92
|
+
DELETE: {
|
|
93
|
+
summary: "Remove a reaction from a channel-linked message",
|
|
94
|
+
tags: ["CommunicationChannels"],
|
|
95
|
+
responses: [
|
|
96
|
+
{ status: 204, description: "Reaction removed" },
|
|
97
|
+
{ status: 400, description: "Invalid params" },
|
|
98
|
+
{ status: 401, description: "Unauthorized" },
|
|
99
|
+
{ status: 403, description: "Channel is owned by another user" },
|
|
100
|
+
{ status: 404, description: "Reaction not found or not owned by current user" },
|
|
101
|
+
{ status: 409, description: "Message not channel-linked" }
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
var route_default = DELETE;
|
|
107
|
+
export {
|
|
108
|
+
DELETE,
|
|
109
|
+
route_default as default,
|
|
110
|
+
metadata,
|
|
111
|
+
openApi
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../../src/modules/communication_channels/api/delete/messages/%5BmessageId%5D/reactions/%5BreactionId%5D/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { CommandBus } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport {\n COMMUNICATION_CHANNELS_TOGGLE_OUTBOUND_REACTION_COMMAND_ID,\n type ToggleOutboundReactionInput,\n type ToggleOutboundReactionResult,\n} from '../../../../../../commands/toggle-outbound-reaction'\nimport { MessageReaction } from '../../../../../../data/entities'\nimport { validateRouteMutationGuard } from '../../../../../../lib/route-mutation-guard'\n\nexport const metadata = {\n path: '/communication_channels/messages/[messageId]/reactions/[reactionId]',\n DELETE: {\n requireAuth: true,\n requireFeatures: ['communication_channels.react'],\n },\n}\n\ntype RouteContext = {\n params: Promise<{ messageId: string; reactionId: string }> | { messageId: string; reactionId: string }\n auth?: {\n sub?: string\n tenantId?: string\n /**\n * AuthContext (`packages/shared/src/lib/auth/server.ts`) exposes the\n * selected organization as `orgId`, not `organizationId`. Round-2 F3 fix.\n */\n orgId?: string | null\n } | null\n}\n\nexport async function DELETE(_req: Request, context: RouteContext): Promise<Response> {\n const { messageId, reactionId } = await context.params\n if (\n !messageId ||\n !reactionId ||\n !z.string().uuid().safeParse(messageId).success ||\n !z.string().uuid().safeParse(reactionId).success\n ) {\n return NextResponse.json({ error: 'Invalid params' }, { status: 400 })\n }\n\n const auth = context.auth\n if (!auth?.sub || !auth?.tenantId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager).fork()\n const reaction = await findOneWithDecryption(\n em,\n MessageReaction,\n {\n id: reactionId,\n messageId,\n tenantId: auth.tenantId,\n organizationId: auth.orgId ?? null,\n },\n undefined,\n { tenantId: auth.tenantId, organizationId: auth.orgId ?? null },\n )\n if (!reaction) {\n return NextResponse.json({ error: 'Reaction not found' }, { status: 404 })\n }\n\n const guard = await validateRouteMutationGuard({\n container,\n req: _req,\n auth,\n input: {\n resourceKind: 'communication_channels.message',\n resourceId: messageId,\n operation: 'custom',\n mutationPayload: { reactionId, emoji: reaction.emoji, action: 'remove' },\n },\n })\n if ('response' in guard) return guard.response\n\n const commandBus = container.resolve('commandBus') as CommandBus\n const input: ToggleOutboundReactionInput = {\n messageId,\n emoji: reaction.emoji,\n action: 'remove',\n reactionId,\n reactedByUserId: auth.sub,\n scope: {\n tenantId: auth.tenantId,\n organizationId: auth.orgId ?? null,\n },\n }\n\n const { result } = await commandBus.execute<\n ToggleOutboundReactionInput,\n ToggleOutboundReactionResult\n >(COMMUNICATION_CHANNELS_TOGGLE_OUTBOUND_REACTION_COMMAND_ID, {\n input,\n ctx: {\n container,\n auth: auth as never,\n organizationScope: null,\n selectedOrganizationId: auth.orgId ?? null,\n organizationIds: auth.orgId ? [auth.orgId] : null,\n },\n })\n\n if (result.status === 'noop') {\n return NextResponse.json({ error: result.reason }, { status: 404 })\n }\n if (result.status === 'not_owner') {\n // The command's ownership gate runs before the remove branch too \u2014 surface it\n // as 403 (matching the POST reactions route) rather than a false 204 success.\n return NextResponse.json({ error: result.reason }, { status: 403 })\n }\n if (result.status === 'no_channel_link') {\n return NextResponse.json({ error: result.reason }, { status: 409 })\n }\n // 'removed'\n await guard.afterSuccess()\n return new NextResponse(null, { status: 204 })\n}\n\nexport const openApi = {\n tags: ['CommunicationChannels'],\n methods: {\n DELETE: {\n summary: 'Remove a reaction from a channel-linked message',\n tags: ['CommunicationChannels'],\n responses: [\n { status: 204, description: 'Reaction removed' },\n { status: 400, description: 'Invalid params' },\n { status: 401, description: 'Unauthorized' },\n { status: 403, description: 'Channel is owned by another user' },\n { status: 404, description: 'Reaction not found or not owned by current user' },\n { status: 409, description: 'Message not channel-linked' },\n ],\n },\n },\n}\nexport default DELETE\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|