@open-mercato/core 0.6.4-develop.4382.1.6b4f656b77 → 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/sales/components/documents/ReturnsSection.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Undo2, Plus } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { ErrorMessage, LoadingMessage, TabEmptyState } from '@open-mercato/ui/backend/detail'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n emitSalesDocumentTotalsRefresh,\n subscribeSalesDocumentTotalsRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport { formatMoney, normalizeNumber } from './lineItemUtils'\nimport { ReturnDialog, type ReturnOrderLine } from './ReturnDialog'\n\ntype ReturnRow = {\n id: string\n returnNumber: string\n status: string | null\n returnedAt: string | null\n totalNetAmount: number | null\n totalGrossAmount: number | null\n}\n\ntype SalesReturnsSectionProps = {\n orderId: string\n currencyCode?: string | null\n}\n\nfunction formatDisplayDate(value: string | null | undefined): string | null {\n if (!value) return null\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return null\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(date)\n}\n\nexport function SalesReturnsSection({ orderId, currencyCode }: SalesReturnsSectionProps) {\n const t = useT()\n const [returns, setReturns] = React.useState<ReturnRow[]>([])\n const [lines, setLines] = React.useState<ReturnOrderLine[]>([])\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n\n const loadLines = React.useCallback(async () => {\n const params = new URLSearchParams({ page: '1', pageSize: '100', orderId })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-lines?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result?.items ?? [] : []\n const mapped: ReturnOrderLine[] = items\n .map((item) => {\n const map = item as Record<string, unknown>\n const id = typeof map.id === 'string' ? map.id : null\n if (!id) return null\n const snapshot = map['catalog_snapshot']\n const snapshotName =\n snapshot && typeof snapshot === 'object' && !Array.isArray(snapshot)\n ? (snapshot as Record<string, unknown>)['name']\n : null\n const name =\n typeof map.name === 'string'\n ? map.name\n : typeof snapshotName === 'string'\n ? snapshotName\n : null\n const lineNumber =\n typeof map['line_number'] === 'number'\n ? (map['line_number'] as number)\n : typeof map.lineNumber === 'number'\n ? (map.lineNumber as number)\n : null\n const quantity =\n typeof map.quantity === 'number'\n ? (map.quantity as number)\n : typeof map.quantity === 'string'\n ? Number(map.quantity)\n : 0\n const returnedQuantity =\n typeof map['returned_quantity'] === 'number'\n ? (map['returned_quantity'] as number)\n : typeof map.returnedQuantity === 'number'\n ? (map.returnedQuantity as number)\n : typeof map['returned_quantity'] === 'string'\n ? Number(map['returned_quantity'])\n : typeof map.returnedQuantity === 'string'\n ? Number(map.returnedQuantity)\n : 0\n return {\n id,\n title: name ?? id,\n lineNumber,\n quantity: Number.isFinite(quantity) ? quantity : 0,\n returnedQuantity: Number.isFinite(returnedQuantity) ? returnedQuantity : 0,\n }\n })\n .filter((entry): entry is ReturnOrderLine => Boolean(entry?.id))\n setLines(mapped)\n }, [orderId])\n\n const loadReturns = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', orderId })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/returns?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result?.items ?? [] : []\n const mapped: ReturnRow[] = items\n .map((item) => {\n const map = item as Record<string, unknown>\n const id = typeof map.id === 'string' ? map.id : null\n if (!id) return null\n const returnNumber =\n typeof map['return_number'] === 'string'\n ? (map['return_number'] as string)\n : typeof map.returnNumber === 'string'\n ? (map.returnNumber as string)\n : id\n const returnedAt =\n typeof map['returned_at'] === 'string'\n ? (map['returned_at'] as string)\n : typeof map.returnedAt === 'string'\n ? (map.returnedAt as string)\n : null\n const totalNetAmount =\n typeof map['total_net_amount'] === 'number'\n ? (map['total_net_amount'] as number)\n : typeof map.totalNetAmount === 'number'\n ? (map.totalNetAmount as number)\n : null\n const totalGrossAmount =\n typeof map['total_gross_amount'] === 'number'\n ? (map['total_gross_amount'] as number)\n : typeof map.totalGrossAmount === 'number'\n ? (map.totalGrossAmount as number)\n : null\n return {\n id,\n returnNumber,\n status: typeof map.status === 'string' ? (map.status as string) : null,\n returnedAt,\n totalNetAmount,\n totalGrossAmount,\n }\n })\n .filter((entry): entry is ReturnRow => Boolean(entry?.id))\n setReturns(mapped)\n await loadLines()\n } catch {\n setError(t('sales.returns.errors.load', 'Failed to load returns.'))\n } finally {\n setLoading(false)\n }\n }, [loadLines, orderId, t])\n\n React.useEffect(() => {\n loadReturns()\n }, [loadReturns])\n\n React.useEffect(() => {\n return subscribeSalesDocumentTotalsRefresh((detail) => {\n if (detail.documentId !== orderId) return\n loadReturns()\n })\n }, [loadReturns, orderId])\n\n const emptyState = React.useMemo(\n () => ({\n title: t('sales.returns.empty.title', 'No returns yet.'),\n description: t('sales.returns.empty.description', 'Create a return to generate credit adjustments for returned items.'),\n }),\n [t],\n )\n\n const rows = React.useMemo(() => {\n return returns.map((ret) => {\n const total = normalizeNumber(ret.totalGrossAmount ?? ret.totalNetAmount ?? 0, 0)\n return {\n ...ret,\n total,\n }\n })\n }, [returns])\n\n if (loading) return <LoadingMessage label={t('sales.returns.loading', 'Loading returns\u2026')} />\n if (error) return <ErrorMessage label={error} />\n\n if (!rows.length) {\n return (\n <div className=\"space-y-4\">\n <TabEmptyState\n title={emptyState.title}\n description={emptyState.description}\n action={{\n label: t('sales.returns.create', 'Create return'),\n icon: <Plus className=\"mr-2 h-4 w-4\" aria-hidden />,\n onClick: () => setDialogOpen(true),\n }}\n />\n <ReturnDialog\n open={dialogOpen}\n orderId={orderId}\n lines={lines}\n onClose={() => setDialogOpen(false)}\n onSaved={async () => {\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n await loadReturns()\n }}\n />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-end\">\n <Button type=\"button\" onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {t('sales.returns.create', 'Create return')}\n </Button>\n </div>\n\n <div className=\"overflow-hidden rounded-md border\">\n <div className=\"grid grid-cols-[1fr_auto_auto] gap-3 border-b bg-muted/30 px-4 py-2 text-xs font-medium text-muted-foreground\">\n <div>{t('sales.returns.returnNumber', 'Return')}</div>\n <div className=\"text-right\">{t('sales.returns.returnedAt', 'Returned at')}</div>\n <div className=\"text-right\">{t('sales.returns.total', 'Total')}</div>\n </div>\n <div className=\"divide-y\">\n {rows.map((ret) => (\n <div key={ret.id} className=\"grid grid-cols-[1fr_auto_auto] items-center gap-3 px-4 py-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <Undo2 className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\n <div className=\"truncate text-sm font-medium\">{ret.returnNumber}</div>\n {ret.status ? <Badge variant=\"secondary\">{ret.status}</Badge> : null}\n </div>\n </div>\n <div className=\"whitespace-nowrap text-right text-sm text-muted-foreground\">\n {formatDisplayDate(ret.returnedAt) ?? t('sales.returns.notSet', 'Not set')}\n </div>\n <div className=\"whitespace-nowrap text-right text-sm font-medium\">\n {formatMoney(ret.total, currencyCode ?? null)}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <ReturnDialog\n open={dialogOpen}\n orderId={orderId}\n lines={lines}\n onClose={() => setDialogOpen(false)}\n onSaved={async () => {\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n await loadReturns()\n }}\n />\n </div>\n )\n}\n\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Undo2, Plus } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { ErrorMessage, LoadingMessage, TabEmptyState } from '@open-mercato/ui/backend/detail'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n emitSalesDocumentTotalsRefresh,\n subscribeSalesDocumentTotalsRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport { formatMoney, normalizeNumber } from './lineItemUtils'\nimport { ReturnDialog, type ReturnOrderLine } from './ReturnDialog'\n\ntype ReturnRow = {\n id: string\n returnNumber: string\n status: string | null\n returnedAt: string | null\n totalNetAmount: number | null\n totalGrossAmount: number | null\n}\n\ntype SalesReturnsSectionProps = {\n orderId: string\n currencyCode?: string | null\n documentUpdatedAt?: string | null\n}\n\nfunction formatDisplayDate(value: string | null | undefined): string | null {\n if (!value) return null\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return null\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(date)\n}\n\nexport function SalesReturnsSection({ orderId, currencyCode, documentUpdatedAt }: SalesReturnsSectionProps) {\n const t = useT()\n const [returns, setReturns] = React.useState<ReturnRow[]>([])\n const [lines, setLines] = React.useState<ReturnOrderLine[]>([])\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n\n const loadLines = React.useCallback(async () => {\n const params = new URLSearchParams({ page: '1', pageSize: '100', orderId })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-lines?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result?.items ?? [] : []\n const mapped: ReturnOrderLine[] = items\n .map((item) => {\n const map = item as Record<string, unknown>\n const id = typeof map.id === 'string' ? map.id : null\n if (!id) return null\n const snapshot = map['catalog_snapshot']\n const snapshotName =\n snapshot && typeof snapshot === 'object' && !Array.isArray(snapshot)\n ? (snapshot as Record<string, unknown>)['name']\n : null\n const name =\n typeof map.name === 'string'\n ? map.name\n : typeof snapshotName === 'string'\n ? snapshotName\n : null\n const lineNumber =\n typeof map['line_number'] === 'number'\n ? (map['line_number'] as number)\n : typeof map.lineNumber === 'number'\n ? (map.lineNumber as number)\n : null\n const quantity =\n typeof map.quantity === 'number'\n ? (map.quantity as number)\n : typeof map.quantity === 'string'\n ? Number(map.quantity)\n : 0\n const returnedQuantity =\n typeof map['returned_quantity'] === 'number'\n ? (map['returned_quantity'] as number)\n : typeof map.returnedQuantity === 'number'\n ? (map.returnedQuantity as number)\n : typeof map['returned_quantity'] === 'string'\n ? Number(map['returned_quantity'])\n : typeof map.returnedQuantity === 'string'\n ? Number(map.returnedQuantity)\n : 0\n return {\n id,\n title: name ?? id,\n lineNumber,\n quantity: Number.isFinite(quantity) ? quantity : 0,\n returnedQuantity: Number.isFinite(returnedQuantity) ? returnedQuantity : 0,\n }\n })\n .filter((entry): entry is ReturnOrderLine => Boolean(entry?.id))\n setLines(mapped)\n }, [orderId])\n\n const loadReturns = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', orderId })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/returns?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result?.items ?? [] : []\n const mapped: ReturnRow[] = items\n .map((item) => {\n const map = item as Record<string, unknown>\n const id = typeof map.id === 'string' ? map.id : null\n if (!id) return null\n const returnNumber =\n typeof map['return_number'] === 'string'\n ? (map['return_number'] as string)\n : typeof map.returnNumber === 'string'\n ? (map.returnNumber as string)\n : id\n const returnedAt =\n typeof map['returned_at'] === 'string'\n ? (map['returned_at'] as string)\n : typeof map.returnedAt === 'string'\n ? (map.returnedAt as string)\n : null\n const totalNetAmount =\n typeof map['total_net_amount'] === 'number'\n ? (map['total_net_amount'] as number)\n : typeof map.totalNetAmount === 'number'\n ? (map.totalNetAmount as number)\n : null\n const totalGrossAmount =\n typeof map['total_gross_amount'] === 'number'\n ? (map['total_gross_amount'] as number)\n : typeof map.totalGrossAmount === 'number'\n ? (map.totalGrossAmount as number)\n : null\n return {\n id,\n returnNumber,\n status: typeof map.status === 'string' ? (map.status as string) : null,\n returnedAt,\n totalNetAmount,\n totalGrossAmount,\n }\n })\n .filter((entry): entry is ReturnRow => Boolean(entry?.id))\n setReturns(mapped)\n await loadLines()\n } catch {\n setError(t('sales.returns.errors.load', 'Failed to load returns.'))\n } finally {\n setLoading(false)\n }\n }, [loadLines, orderId, t])\n\n React.useEffect(() => {\n loadReturns()\n }, [loadReturns])\n\n React.useEffect(() => {\n return subscribeSalesDocumentTotalsRefresh((detail) => {\n if (detail.documentId !== orderId) return\n loadReturns()\n })\n }, [loadReturns, orderId])\n\n const emptyState = React.useMemo(\n () => ({\n title: t('sales.returns.empty.title', 'No returns yet.'),\n description: t('sales.returns.empty.description', 'Create a return to generate credit adjustments for returned items.'),\n }),\n [t],\n )\n\n const rows = React.useMemo(() => {\n return returns.map((ret) => {\n const total = normalizeNumber(ret.totalGrossAmount ?? ret.totalNetAmount ?? 0, 0)\n return {\n ...ret,\n total,\n }\n })\n }, [returns])\n\n if (loading) return <LoadingMessage label={t('sales.returns.loading', 'Loading returns\u2026')} />\n if (error) return <ErrorMessage label={error} />\n\n if (!rows.length) {\n return (\n <div className=\"space-y-4\">\n <TabEmptyState\n title={emptyState.title}\n description={emptyState.description}\n action={{\n label: t('sales.returns.create', 'Create return'),\n icon: <Plus className=\"mr-2 h-4 w-4\" aria-hidden />,\n onClick: () => setDialogOpen(true),\n }}\n />\n <ReturnDialog\n open={dialogOpen}\n orderId={orderId}\n lines={lines}\n documentUpdatedAt={documentUpdatedAt}\n onClose={() => setDialogOpen(false)}\n onSaved={async () => {\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n await loadReturns()\n }}\n />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-end\">\n <Button type=\"button\" onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {t('sales.returns.create', 'Create return')}\n </Button>\n </div>\n\n <div className=\"overflow-hidden rounded-md border\">\n <div className=\"grid grid-cols-[1fr_auto_auto] gap-3 border-b bg-muted/30 px-4 py-2 text-xs font-medium text-muted-foreground\">\n <div>{t('sales.returns.returnNumber', 'Return')}</div>\n <div className=\"text-right\">{t('sales.returns.returnedAt', 'Returned at')}</div>\n <div className=\"text-right\">{t('sales.returns.total', 'Total')}</div>\n </div>\n <div className=\"divide-y\">\n {rows.map((ret) => (\n <div key={ret.id} className=\"grid grid-cols-[1fr_auto_auto] items-center gap-3 px-4 py-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <Undo2 className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\n <div className=\"truncate text-sm font-medium\">{ret.returnNumber}</div>\n {ret.status ? <Badge variant=\"secondary\">{ret.status}</Badge> : null}\n </div>\n </div>\n <div className=\"whitespace-nowrap text-right text-sm text-muted-foreground\">\n {formatDisplayDate(ret.returnedAt) ?? t('sales.returns.notSet', 'Not set')}\n </div>\n <div className=\"whitespace-nowrap text-right text-sm font-medium\">\n {formatMoney(ret.total, currencyCode ?? null)}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <ReturnDialog\n open={dialogOpen}\n orderId={orderId}\n lines={lines}\n documentUpdatedAt={documentUpdatedAt}\n onClose={() => setDialogOpen(false)}\n onSaved={async () => {\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n await loadReturns()\n }}\n />\n </div>\n )\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -704,6 +704,7 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
|
|
|
704
704
|
allowInlineCreate: false,
|
|
705
705
|
manageHref: "/backend/config/dictionaries?key=currency",
|
|
706
706
|
selectClassName: "w-full",
|
|
707
|
+
sortOptions: "none",
|
|
707
708
|
labels: currencyLabels
|
|
708
709
|
}
|
|
709
710
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/components/documents/SalesDocumentForm.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { EmailInput } from '@open-mercato/ui/primitives/email-input'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { SwitchField } from '@open-mercato/ui/primitives/switch-field'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport { createCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryEntrySelect,\n type DictionaryOption,\n type DictionarySelectLabels,\n} from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { Building2, Mail, Plus, Store, UserRound } from 'lucide-react'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport {\n buildCompanyPayload,\n buildPersonPayload,\n createCompanyFormFields,\n createCompanyFormGroups,\n createCompanyFormSchema,\n createPersonFormFields,\n createPersonFormGroups,\n createPersonFormSchema,\n type CompanyFormValues,\n type PersonFormValues,\n} from '@open-mercato/core/modules/customers/components/formConfig'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n formatAddressString,\n type AddressFormatStrategy,\n type AddressValue,\n} from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'\n\ntype DocumentKind = 'quote' | 'order'\n\ntype AddressDraft = AddressEditorDraft\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = { id: string; label: string }\n\ntype AddressOption = {\n id: string\n label: string\n summary: string\n name?: string | null\n isPrimary: boolean\n value: AddressValue\n}\n\nexport type SalesDocumentFormValues = {\n documentKind: DocumentKind\n documentNumber?: string\n currencyCode: string\n channelId?: string | null\n customerEntityId?: string | null\n customerEmail?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n useCustomShipping?: boolean\n useCustomBilling?: boolean\n sameAsShipping?: boolean\n saveShippingAddress?: boolean\n saveBillingAddress?: boolean\n shippingAddressDraft?: AddressDraft\n billingAddressDraft?: AddressDraft\n comments?: string | null\n} & Record<string, unknown>\n\ntype InboxPreFill = {\n customerEntityId?: string\n currencyCode?: string\n channelId?: string\n comments?: string\n lineItems?: Record<string, unknown>[]\n}\n\ntype SalesDocumentFormProps = {\n onCreated: (params: { id: string; kind: DocumentKind }) => void\n isSubmitting?: boolean\n initialKind?: DocumentKind\n inboxPreFill?: InboxPreFill\n}\n\ntype Translator = (key: string, fallback?: string, params?: Record<string, string | number>) => string\n\ntype QuickCreatePayload = {\n id: string\n kind: 'person' | 'company'\n email?: string | null\n label: string\n subtitle?: string | null\n}\n\ntype CustomerQuickCreateProps = {\n t: Translator\n onCreated: (payload: QuickCreatePayload) => void\n}\n\nfunction CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [dialog, setDialog] = React.useState<'person' | 'company' | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n const { organizationId } = useOrganizationScopeDetail()\n const personSchema = React.useMemo(() => createPersonFormSchema(), [])\n const personFields = React.useMemo(() => createPersonFormFields(t), [t])\n const personGroups = React.useMemo(() => createPersonFormGroups(t), [t])\n const companySchema = React.useMemo(() => createCompanyFormSchema(), [])\n const companyFields = React.useMemo(() => createCompanyFormFields(t), [t])\n const companyGroups = React.useMemo(() => createCompanyFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!menuOpen) return\n const handleClick = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setMenuOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setFormError(null)\n setSaving(false)\n }, [])\n\n const handlePersonCreate = React.useCallback(\n async (values: PersonFormValues) => {\n setSaving(true)\n try {\n const payload = buildPersonPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.people.form.displayName.placeholder', 'New person')\n flash(t('sales.documents.form.customer.quick.personSuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'person',\n email: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n label: displayName,\n subtitle: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.person', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const handleCompanyCreate = React.useCallback(\n async (values: CompanyFormValues) => {\n setSaving(true)\n try {\n const payload = buildCompanyPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/companies', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.companies.form.displayName.placeholder', 'New company')\n const email = typeof values.primaryEmail === 'string' ? values.primaryEmail : null\n const domain =\n typeof values.domain === 'string' && values.domain.trim().length ? values.domain.trim() : null\n flash(t('sales.documents.form.customer.quick.companySuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'company',\n email,\n label: displayName,\n subtitle: domain || email || null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.company', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const renderMenu = () => (\n <div className=\"absolute right-0 z-dropdown mt-2 w-48 rounded border bg-popover p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('person')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <UserRound className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addPerson', 'Create person')}\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('company')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addCompany', 'Create company')}\n </button>\n </div>\n )\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"gap-2\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-expanded={menuOpen}\n >\n <Plus className=\"h-4 w-4\" />\n {t('sales.documents.form.customer.create', 'Create customer')}\n </Button>\n {menuOpen ? renderMenu() : null}\n\n <Dialog open={dialog === 'person'} onOpenChange={(open) => (open ? setDialog('person') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addPerson', 'Create person')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a person without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<PersonFormValues>\n embedded\n fields={personFields}\n groups={personGroups}\n schema={personSchema}\n initialValues={{ addresses: [] as PersonFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handlePersonCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog === 'company'} onOpenChange={(open) => (open ? setDialog('company') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addCompany', 'Create company')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a company without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<CompanyFormValues>\n embedded\n fields={companyFields}\n groups={companyGroups}\n schema={companySchema}\n initialValues={{ addresses: [] as CompanyFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handleCompanyCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction normalizeAddressDraft(draft?: AddressDraft | null): Record<string, unknown> | null {\n if (!draft) return null\n const normalized: Record<string, unknown> = {}\n const assign = (key: keyof AddressDraft, target: string) => {\n const value = draft[key]\n if (typeof value === 'string' && value.trim().length) normalized[target] = value.trim()\n if (typeof value === 'boolean') normalized[target] = value\n }\n assign('name', 'name')\n assign('purpose', 'purpose')\n assign('companyName', 'companyName')\n assign('addressLine1', 'addressLine1')\n assign('addressLine2', 'addressLine2')\n assign('buildingNumber', 'buildingNumber')\n assign('flatNumber', 'flatNumber')\n assign('city', 'city')\n assign('region', 'region')\n assign('postalCode', 'postalCode')\n assign('country', 'country')\n assign('isPrimary', 'isPrimary')\n return Object.keys(normalized).length ? normalized : null\n}\n\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const [customers, setCustomers] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [channels, setChannels] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<AddressOption[]>([])\n const [addressesLoading, setAddressesLoading] = React.useState(false)\n const [addressesError, setAddressesError] = React.useState<string | null>(null)\n const [addressFormat, setAddressFormat] = React.useState<AddressFormatStrategy>('line_first')\n const [defaultCurrency, setDefaultCurrency] = React.useState<string>('USD')\n const addressRequestRef = React.useRef(0)\n const addressAbortRef = React.useRef<AbortController | null>(null)\n const addressTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n const currencyLabels = React.useMemo<DictionarySelectLabels>(() => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n addPrompt: t('sales.documents.form.currency.prompt', 'Currency code'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }), [t])\n const { data: currencyDictionary, refetch: refetchCurrencyDictionary } = useCurrencyDictionary()\n\n const fetchCurrencyOptions = React.useCallback(async (): Promise<DictionaryOption[]> => {\n try {\n const source = currencyDictionary ?? (await refetchCurrencyDictionary())\n if (source && Array.isArray(source.entries)) {\n return source.entries.map((entry) => ({\n value: entry.value,\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }\n return []\n } catch (err) {\n console.error('sales.documents.currency', err)\n return []\n }\n }, [currencyDictionary, refetchCurrencyDictionary])\n\n const loadCustomers = React.useCallback(async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomers(merged)\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n }, [t])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customers.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomers((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customers],\n )\n\n const loadChannels = React.useCallback(async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) setChannels(options)\n return options\n } else {\n setChannels([])\n return []\n }\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n setChannels([])\n return []\n } finally {\n setChannelLoading(false)\n }\n }, [])\n\n const loadDefaultCurrency = React.useCallback(async () => {\n try {\n const call = await apiCall<{ items?: Array<{ currency_code?: string | null }> }>(\n '/api/catalog/price-kinds?isPromotion=false&isActive=true&pageSize=1'\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const code = call.result.items[0]?.currency_code\n if (typeof code === 'string' && code.trim().length) {\n setDefaultCurrency(code.trim().toUpperCase())\n }\n }\n } catch (err) {\n console.error('sales.documents.loadDefaultCurrency', err)\n }\n }, [])\n\n const loadAddresses = React.useCallback(async (customerId?: string | null): Promise<AddressOption[]> => {\n addressRequestRef.current += 1\n const requestId = addressRequestRef.current\n\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n\n if (!customerId) {\n setAddressesError(null)\n setAddressOptions([])\n setAddressesLoading(false)\n return []\n }\n setAddressesLoading(true)\n setAddressesError(null)\n setAddressOptions([])\n const controller = new AbortController()\n addressAbortRef.current = controller\n addressTimeoutRef.current = setTimeout(() => controller.abort(), 12_000)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50', entityId: customerId })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/customers/addresses?${params.toString()}`,\n { signal: controller.signal },\n { fallback: { items: [] } }\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items.reduce<AddressOption[]>((acc, item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return acc\n const value: AddressValue = {\n addressLine1: typeof item.address_line1 === 'string' ? item.address_line1 : null,\n addressLine2: typeof item.address_line2 === 'string' ? item.address_line2 : null,\n buildingNumber: typeof item.building_number === 'string' ? item.building_number : null,\n flatNumber: typeof item.flat_number === 'string' ? item.flat_number : null,\n city: typeof item.city === 'string' ? item.city : null,\n region: typeof item.region === 'string' ? item.region : null,\n postalCode: typeof item.postal_code === 'string' ? item.postal_code : null,\n country: typeof item.country === 'string' ? item.country : null,\n companyName: typeof item.company_name === 'string' ? item.company_name : null,\n }\n const name = typeof item.name === 'string' ? item.name.trim() : ''\n const summary = formatAddressString(value, addressFormat)\n const label = name || summary || id\n const isPrimary = item.is_primary === true\n acc.push({ id, label, summary, value, name: name || null, isPrimary })\n return acc\n }, [])\n if (addressRequestRef.current === requestId) {\n setAddressOptions(options)\n }\n return options\n } else {\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } catch (err) {\n if ((err as DOMException)?.name !== 'AbortError') {\n console.error('sales.documents.loadAddresses', err)\n }\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n if ((err as DOMException)?.name !== 'AbortError') {\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } finally {\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current === controller) {\n addressAbortRef.current = null\n }\n if (addressRequestRef.current === requestId) {\n setAddressesLoading(false)\n }\n }\n return []\n }, [addressFormat, t])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n loadChannels().catch(() => {})\n loadDefaultCurrency().catch(() => {})\n }, [loadChannels, loadCustomers, loadDefaultCurrency])\n\n React.useEffect(\n () => () => {\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n },\n [],\n )\n\n React.useEffect(() => {\n setAddressOptions((prev) =>\n prev.map((entry) => {\n const summary = formatAddressString(entry.value, addressFormat)\n const label = (entry.name && entry.name.trim().length ? entry.name : '') || summary || entry.id\n return { ...entry, summary, label }\n }),\n )\n }, [addressFormat])\n\n React.useEffect(() => {\n let cancelled = false\n async function fetchAddressFormat() {\n try {\n const call = await apiCall<{ addressFormat?: string }>('/api/customers/settings/address-format')\n const format = typeof call.result?.addressFormat === 'string' ? call.result.addressFormat : null\n if (!cancelled && (format === 'street_first' || format === 'line_first')) {\n setAddressFormat(format)\n }\n } catch (err) {\n console.error('sales.documents.addressFormat', err)\n } finally {\n }\n }\n fetchAddressFormat().catch(() => {})\n return () => {\n cancelled = true\n }\n }, [])\n\n const resetAddressFormState = React.useCallback(\n (updateValue: (key: string, value: unknown) => void) => {\n updateValue('shippingAddressId', null)\n updateValue('billingAddressId', null)\n updateValue('shippingAddressDraft', undefined)\n updateValue('billingAddressDraft', undefined)\n updateValue('useCustomShipping', false)\n updateValue('useCustomBilling', false)\n updateValue('saveShippingAddress', false)\n updateValue('saveBillingAddress', false)\n updateValue('sameAsShipping', true)\n },\n [],\n )\n\n function DocumentNumberField({ value, setValue, values }: CrudCustomFieldRenderProps) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const kind: DocumentKind = formValues.documentKind === 'order' ? 'order' : 'quote'\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const autoValueRef = React.useRef<string | null>(null)\n const lastKindRef = React.useRef<DocumentKind | null>(null)\n\n const requestNumber = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const call = await apiCall<{ number?: string; error?: string }>('/api/sales/document-numbers', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n const nextNumber = typeof call.result?.number === 'string' ? call.result.number : null\n if (call.ok && nextNumber) {\n autoValueRef.current = nextNumber\n lastKindRef.current = kind\n setValue(nextNumber)\n } else {\n setError(call.result?.error || t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n }\n } catch (err) {\n console.error('sales.documents.generateNumber', err)\n setError(t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n } finally {\n setLoading(false)\n }\n }, [kind, setValue, t])\n\n React.useEffect(() => {\n const current = typeof value === 'string' ? value.trim() : ''\n if (!current.length && !lastKindRef.current) {\n void requestNumber()\n } else {\n lastKindRef.current = kind\n }\n }, [kind, requestNumber, value])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex w-full flex-col gap-2 md:flex-row md:items-center md:gap-3\">\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n disabled={loading}\n spellCheck={false}\n className=\"w-full md:flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" onClick={requestNumber} disabled={loading}>\n {loading\n ? t('sales.documents.form.numberLoading', 'Generating\u2026')\n : t('sales.documents.form.numberRefresh', 'Generate')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.form.numberHintOrder', 'Format applies to orders and uses the configured counter.')\n : t('sales.documents.form.numberHintQuote', 'Format applies to quotes and uses the configured counter.')}\n </p>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n }\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'documentKind',\n label: '',\n type: 'custom',\n required: false,\n component: ({ value, setValue }) => {\n const current = value === 'order' ? 'order' : 'quote'\n const label = t('sales.documents.form.kind', 'Document type')\n return (\n <div className=\"space-y-2 pt-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">{label}</div>\n <div className=\"inline-flex rounded-lg border bg-background p-1 shadow-sm\">\n {(['quote', 'order'] as DocumentKind[]).map((kind) => (\n <Button\n key={kind}\n type=\"button\"\n variant={current === kind ? 'default' : 'ghost'}\n onClick={() => setValue(kind)}\n >\n {t(`sales.documents.form.kind.${kind}`, kind.charAt(0).toUpperCase() + kind.slice(1))}\n </Button>\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'sales.documents.form.kind.hint',\n \"Please select which kind of sales document you want to create. When creating Quotes - it's kind of Shopping cart or Request for negotiation and could be converted to regular order later\",\n )}\n </p>\n </div>\n )\n },\n },\n {\n id: 'documentNumber',\n label: t('sales.documents.form.number', 'Document number'),\n type: 'custom',\n required: true,\n component: DocumentNumberField,\n },\n {\n id: 'currencyCode',\n label: t('sales.documents.form.currency', 'Currency'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? '')}\n fetchOptions={fetchCurrencyOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={currencyLabels}\n />\n ),\n },\n {\n id: 'channelId',\n label: t('sales.documents.form.channel', 'Sales channel'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n fetchItems={async (query) => {\n const options = await loadChannels(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'shippingAddressSection',\n label: '',\n type: 'custom',\n component: ({ values, setFormValue }) => {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomShipping === true\n const selectedId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : ''\n const draft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const customerId = typeof formValues.customerEntityId === 'string' ? formValues.customerEntityId : null\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.shipping.title', 'Shipping address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {customerRequired\n ? t('sales.documents.form.address.customerRequired', 'Select customer first or define custom address')\n : t('sales.documents.form.shipping.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <SwitchField\n label={t('sales.documents.form.shipping.custom', 'Define new address')}\n flip\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomShipping', checked)}\n />\n </div>\n {!useCustom ? (\n <Select\n value={selectedId || undefined}\n onValueChange={(value) => updateValue('shippingAddressId', value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')\n }\n />\n </SelectTrigger>\n <SelectContent>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <SelectItem key={addr.id} value={addr.id}>{optionLabel}</SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : null}\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('shippingAddressDraft', next)}\n hidePrimaryToggle\n />\n <SwitchField\n containerClassName=\"col-span-2\"\n label={t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n flip\n checked={formValues.saveShippingAddress === true}\n onCheckedChange={(checked) => updateValue('saveShippingAddress', checked)}\n />\n </div>\n ) : null}\n {addressesError && customerId ? (\n <div className=\"flex items-start justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n <span className=\"flex-1\">{addressesError}</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => loadAddresses(customerId)}\n disabled={addressesLoading}\n className=\"shrink-0\"\n >\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n </div>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'billingAddressSection',\n label: '',\n type: 'custom',\n component: function BillingAddressSectionField({ values, setFormValue }) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomBilling === true\n const selectedId = typeof formValues.billingAddressId === 'string' ? formValues.billingAddressId : ''\n const draft = (formValues.billingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const sameAsShipping = formValues.sameAsShipping !== false\n const shippingId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : null\n const shippingDraft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const shippingDraftKey = JSON.stringify(shippingDraft)\n const billingDraftKey = JSON.stringify(draft)\n const useCustomShipping = formValues.useCustomShipping === true\n\n React.useEffect(() => {\n if (!sameAsShipping) return\n if ((formValues.billingAddressId ?? null) !== shippingId) {\n updateValue('billingAddressId', shippingId)\n }\n if (useCustomShipping !== (formValues.useCustomBilling === true)) {\n updateValue('useCustomBilling', useCustomShipping)\n }\n if (useCustomShipping && shippingDraftKey !== billingDraftKey) {\n updateValue('billingAddressDraft', shippingDraft)\n }\n }, [\n billingDraftKey,\n sameAsShipping,\n updateValue,\n shippingDraft,\n shippingDraftKey,\n shippingId,\n useCustomShipping,\n formValues.billingAddressId,\n formValues.useCustomBilling,\n ])\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.billing.title', 'Billing address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {sameAsShipping\n ? t('sales.documents.form.address.sameAsShippingHint', 'Billing will mirror the shipping address. Uncheck to edit.')\n : t('sales.documents.form.billing.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <SwitchField\n label={t('sales.documents.form.address.sameAsShipping', 'Same as shipping')}\n flip\n checked={sameAsShipping}\n onCheckedChange={(checked) => {\n updateValue('sameAsShipping', checked)\n if (checked) {\n updateValue('useCustomBilling', useCustomShipping)\n updateValue('billingAddressId', shippingId)\n updateValue('billingAddressDraft', shippingDraft)\n }\n }}\n />\n </div>\n\n {!sameAsShipping ? (\n <>\n {!useCustom ? (\n <Select\n value={selectedId || undefined}\n onValueChange={(value) => updateValue('billingAddressId', value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')\n }\n />\n </SelectTrigger>\n <SelectContent>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <SelectItem key={addr.id} value={addr.id}>{optionLabel}</SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : null}\n\n <SwitchField\n label={t('sales.documents.form.shipping.custom', 'Define new address')}\n flip\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomBilling', checked)}\n disabled={false}\n />\n\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('billingAddressDraft', next)}\n hidePrimaryToggle\n />\n <SwitchField\n containerClassName=\"col-span-2\"\n label={t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n flip\n checked={formValues.saveBillingAddress === true}\n onCheckedChange={(checked) => updateValue('saveBillingAddress', checked)}\n />\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'infoNote',\n label: '',\n type: 'custom',\n component: () => (\n <div className=\"rounded-lg border bg-muted/50 p-3 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </div>\n ),\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n currencyLabels,\n fetchCurrencyOptions,\n loadAddresses,\n loadChannels,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'docType', title: '', column: 1, fields: ['documentKind', 'documentNumber'] },\n {\n id: 'customer',\n title: '',\n column: 1,\n fields: [],\n component: function CustomerGroupComponent({ values, setValue }) {\n const emailValue = typeof values.customerEmail === 'string' ? values.customerEmail : ''\n const { duplicate, checking } = useEmailDuplicateCheck(emailValue, {\n disabled: false,\n debounceMs: 400,\n matchMode: 'prefix',\n })\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-3\">\n <LookupSelect\n value={typeof values.customerEntityId === 'string' ? values.customerEntityId : null}\n onChange={(next) => {\n if (next !== values.customerEntityId) {\n resetAddressFormState(setValue)\n }\n setValue('customerEntityId', next)\n loadAddresses(next).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (next) {\n const match = customers.find((entry) => entry.id === next)\n const possibleEmail =\n typeof match?.primaryEmail === 'string' && match.primaryEmail.length\n ? match.primaryEmail\n : null\n if (possibleEmail) {\n setValue('customerEmail', possibleEmail)\n } else {\n fetchCustomerEmail(next, match?.kind)\n .then((email) => {\n if (email) setValue('customerEmail', email)\n })\n .catch(() => {})\n }\n }\n }}\n fetchItems={async (query) => {\n const options = await loadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n actionSlot={\n <CustomerQuickCreate\n t={t}\n onCreated={({ id, email, label, kind, subtitle }) => {\n // Seed the search box with the new customer's display name so it renders immediately\n customerQuerySetter.current?.(label)\n setCustomers((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: subtitle ?? undefined,\n kind,\n primaryEmail: email ?? null,\n }\n return [next, ...prev]\n })\n setValue('customerEntityId', id)\n resetAddressFormState(setValue)\n loadAddresses(id).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (email && !values.customerEmail) {\n setValue('customerEmail', email)\n }\n }}\n />\n }\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) => t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })}\n />\n </div>\n <div className=\"space-y-2\">\n <EmailInput\n value={emailValue}\n onChange={(event) => setValue('customerEmail', event.target.value)}\n placeholder={t('sales.documents.form.email.placeholder', 'Email used for the document')}\n spellCheck={false}\n />\n {duplicate ? (\n <div className=\"flex items-center justify-between rounded border bg-muted px-3 py-2 text-xs text-muted-foreground\">\n <span>\n {t('customers.people.form.emailDuplicateNotice', undefined, { name: duplicate.displayName })}\n </span>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className=\"px-4\"\n type=\"button\"\n disabled={values.customerEntityId === duplicate.id}\n aria-disabled={values.customerEntityId === duplicate.id}\n onClick={() => {\n setValue('customerEntityId', duplicate.id)\n resetAddressFormState(setValue)\n loadAddresses(duplicate.id)\n }}\n >\n {values.customerEntityId === duplicate.id\n ? t('sales.documents.form.email.alreadySelected', 'Selected customer')\n : t('sales.documents.form.email.selectCustomer', 'Select customer')}\n </Button>\n </div>\n ) : null}\n {!duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.form.emailChecking')}</p>\n ) : null}\n </div>\n </div>\n )\n },\n },\n { id: 'channels-comments', title: '', column: 1, fields: ['channelId', 'comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'shipping', title: '', column: 2, fields: ['shippingAddressSection'] },\n { id: 'billing', title: '', column: 2, fields: ['billingAddressSection'] },\n { id: 'custom', title: t('sales.documents.form.customFields', 'Custom fields'), column: 2, kind: 'customFields' },\n ], [\n customers,\n fetchCustomerEmail,\n loadAddresses,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const initialValues = React.useMemo<Partial<SalesDocumentFormValues>>(\n () => ({\n documentKind: initialKind === 'order' ? 'order' : 'quote',\n documentNumber: '',\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n channelId: inboxPreFill?.channelId || undefined,\n customerEntityId: inboxPreFill?.customerEntityId || undefined,\n comments: inboxPreFill?.comments || undefined,\n useCustomShipping: false,\n useCustomBilling: false,\n sameAsShipping: true,\n }),\n [initialKind, inboxPreFill, defaultCurrency]\n )\n\n // When inboxPreFill provides a customer, load their addresses on mount\n React.useEffect(() => {\n if (inboxPreFill?.customerEntityId) {\n loadAddresses(inboxPreFill.customerEntityId)\n }\n }, [inboxPreFill?.customerEntityId, loadAddresses])\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const safeValues = values ?? {}\n const customFields = collectCustomFieldValues(safeValues)\n const base = Object.fromEntries(\n Object.entries(safeValues).filter(([key]) => !key.startsWith('cf_') && !key.startsWith('cf:'))\n ) as SalesDocumentFormValues\n const documentKind: DocumentKind = base.documentKind === 'order' ? 'order' : 'quote'\n const payload: Record<string, unknown> = {\n currencyCode: typeof base.currencyCode === 'string' && base.currencyCode.trim().length\n ? base.currencyCode.trim().toUpperCase()\n : undefined,\n customerEntityId: base.customerEntityId || undefined,\n comments: base.comments ?? undefined,\n metadata: base.customerEmail ? { customerEmail: base.customerEmail } : undefined,\n }\n payload.channelId = base.channelId || undefined\n const documentNumber = typeof base.documentNumber === 'string' ? base.documentNumber.trim() : ''\n if (!documentNumber) {\n throw createCrudFormError(t('sales.documents.form.errors.numberRequired', 'Document number is required.'))\n }\n if (documentKind === 'order') {\n payload.orderNumber = documentNumber\n } else {\n payload.quoteNumber = documentNumber\n }\n const shippingSnapshot = base.useCustomShipping ? normalizeAddressDraft(base.shippingAddressDraft) : null\n let billingSnapshot = base.useCustomBilling ? normalizeAddressDraft(base.billingAddressDraft) : null\n const sameAsShipping = base.sameAsShipping !== false\n if (sameAsShipping) {\n if (shippingSnapshot) {\n billingSnapshot = shippingSnapshot\n } else if (!base.useCustomShipping) {\n payload.billingAddressId = base.shippingAddressId || undefined\n }\n }\n if (shippingSnapshot) {\n payload.shippingAddressSnapshot = shippingSnapshot\n payload.shippingAddressId = undefined\n }\n if (billingSnapshot) {\n payload.billingAddressSnapshot = billingSnapshot\n payload.billingAddressId = undefined\n }\n if (!base.useCustomShipping) payload.shippingAddressId = base.shippingAddressId || undefined\n if (!base.useCustomBilling && !sameAsShipping) payload.billingAddressId = base.billingAddressId || undefined\n\n try {\n let shippingId = payload.shippingAddressId as string | undefined\n let billingId = payload.billingAddressId as string | undefined\n if (base.customerEntityId && shippingSnapshot && base.saveShippingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: shippingSnapshot.addressLine1 ?? shippingSnapshot.name ?? 'Address',\n name: shippingSnapshot.name ?? undefined,\n addressLine2: shippingSnapshot.addressLine2 ?? undefined,\n buildingNumber: shippingSnapshot.buildingNumber ?? undefined,\n flatNumber: shippingSnapshot.flatNumber ?? undefined,\n city: shippingSnapshot.city ?? undefined,\n region: shippingSnapshot.region ?? undefined,\n postalCode: shippingSnapshot.postalCode ?? undefined,\n country: shippingSnapshot.country ?? undefined,\n purpose: shippingSnapshot.purpose ?? undefined,\n isPrimary: shippingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) shippingId = res.result.id\n }\n if (base.customerEntityId && billingSnapshot && base.saveBillingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: billingSnapshot.addressLine1 ?? billingSnapshot.name ?? 'Address',\n name: billingSnapshot.name ?? undefined,\n addressLine2: billingSnapshot.addressLine2 ?? undefined,\n buildingNumber: billingSnapshot.buildingNumber ?? undefined,\n flatNumber: billingSnapshot.flatNumber ?? undefined,\n city: billingSnapshot.city ?? undefined,\n region: billingSnapshot.region ?? undefined,\n postalCode: billingSnapshot.postalCode ?? undefined,\n country: billingSnapshot.country ?? undefined,\n purpose: billingSnapshot.purpose ?? undefined,\n isPrimary: billingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) billingId = res.result.id\n }\n if (!base.useCustomShipping && shippingId) payload.shippingAddressId = shippingId\n if (!base.useCustomBilling && !sameAsShipping && billingId) payload.billingAddressId = billingId\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const endpoint = documentKind === 'order' ? 'sales/orders' : 'sales/quotes'\n const { result } = await createCrud<{ id?: string; orderId?: string; quoteId?: string }>(endpoint, payload, {\n errorMessage: t('sales.documents.form.errors.submit', 'Failed to create document.'),\n })\n const newId =\n (result && typeof result.id === 'string' && result.id) ||\n (result && typeof result.orderId === 'string' && result.orderId) ||\n (result && typeof result.quoteId === 'string' && result.quoteId) ||\n null\n if (!newId) {\n throw createCrudFormError(t('sales.documents.form.errors.id', 'Document id missing after create.'))\n }\n flash(t('sales.documents.form.success', 'Sales document created.'), 'success')\n onCreated({ id: newId, kind: documentKind })\n } catch (err) {\n if (err instanceof Error) throw err\n throw createCrudFormError(t('sales.documents.form.errors.submit', 'Failed to create document.'))\n }\n },\n [onCreated, t],\n )\n\n const cancelHref = initialKind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n\n return (\n <CrudForm<SalesDocumentFormValues>\n title={t('sales.documents.form.title', 'Create sales document')}\n backHref={cancelHref}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n entityIds={[E.sales.sales_quote, E.sales.sales_order]}\n submitLabel={t('sales.documents.form.submit', 'Create')}\n cancelHref={cancelHref}\n onSubmit={handleSubmit}\n />\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { EmailInput } from '@open-mercato/ui/primitives/email-input'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { SwitchField } from '@open-mercato/ui/primitives/switch-field'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport { createCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryEntrySelect,\n type DictionaryOption,\n type DictionarySelectLabels,\n} from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { Building2, Mail, Plus, Store, UserRound } from 'lucide-react'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport {\n buildCompanyPayload,\n buildPersonPayload,\n createCompanyFormFields,\n createCompanyFormGroups,\n createCompanyFormSchema,\n createPersonFormFields,\n createPersonFormGroups,\n createPersonFormSchema,\n type CompanyFormValues,\n type PersonFormValues,\n} from '@open-mercato/core/modules/customers/components/formConfig'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n formatAddressString,\n type AddressFormatStrategy,\n type AddressValue,\n} from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'\n\ntype DocumentKind = 'quote' | 'order'\n\ntype AddressDraft = AddressEditorDraft\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = { id: string; label: string }\n\ntype AddressOption = {\n id: string\n label: string\n summary: string\n name?: string | null\n isPrimary: boolean\n value: AddressValue\n}\n\nexport type SalesDocumentFormValues = {\n documentKind: DocumentKind\n documentNumber?: string\n currencyCode: string\n channelId?: string | null\n customerEntityId?: string | null\n customerEmail?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n useCustomShipping?: boolean\n useCustomBilling?: boolean\n sameAsShipping?: boolean\n saveShippingAddress?: boolean\n saveBillingAddress?: boolean\n shippingAddressDraft?: AddressDraft\n billingAddressDraft?: AddressDraft\n comments?: string | null\n} & Record<string, unknown>\n\ntype InboxPreFill = {\n customerEntityId?: string\n currencyCode?: string\n channelId?: string\n comments?: string\n lineItems?: Record<string, unknown>[]\n}\n\ntype SalesDocumentFormProps = {\n onCreated: (params: { id: string; kind: DocumentKind }) => void\n isSubmitting?: boolean\n initialKind?: DocumentKind\n inboxPreFill?: InboxPreFill\n}\n\ntype Translator = (key: string, fallback?: string, params?: Record<string, string | number>) => string\n\ntype QuickCreatePayload = {\n id: string\n kind: 'person' | 'company'\n email?: string | null\n label: string\n subtitle?: string | null\n}\n\ntype CustomerQuickCreateProps = {\n t: Translator\n onCreated: (payload: QuickCreatePayload) => void\n}\n\nfunction CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [dialog, setDialog] = React.useState<'person' | 'company' | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n const { organizationId } = useOrganizationScopeDetail()\n const personSchema = React.useMemo(() => createPersonFormSchema(), [])\n const personFields = React.useMemo(() => createPersonFormFields(t), [t])\n const personGroups = React.useMemo(() => createPersonFormGroups(t), [t])\n const companySchema = React.useMemo(() => createCompanyFormSchema(), [])\n const companyFields = React.useMemo(() => createCompanyFormFields(t), [t])\n const companyGroups = React.useMemo(() => createCompanyFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!menuOpen) return\n const handleClick = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setMenuOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setFormError(null)\n setSaving(false)\n }, [])\n\n const handlePersonCreate = React.useCallback(\n async (values: PersonFormValues) => {\n setSaving(true)\n try {\n const payload = buildPersonPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.people.form.displayName.placeholder', 'New person')\n flash(t('sales.documents.form.customer.quick.personSuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'person',\n email: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n label: displayName,\n subtitle: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.person', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const handleCompanyCreate = React.useCallback(\n async (values: CompanyFormValues) => {\n setSaving(true)\n try {\n const payload = buildCompanyPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/companies', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.companies.form.displayName.placeholder', 'New company')\n const email = typeof values.primaryEmail === 'string' ? values.primaryEmail : null\n const domain =\n typeof values.domain === 'string' && values.domain.trim().length ? values.domain.trim() : null\n flash(t('sales.documents.form.customer.quick.companySuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'company',\n email,\n label: displayName,\n subtitle: domain || email || null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.company', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const renderMenu = () => (\n <div className=\"absolute right-0 z-dropdown mt-2 w-48 rounded border bg-popover p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('person')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <UserRound className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addPerson', 'Create person')}\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('company')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addCompany', 'Create company')}\n </button>\n </div>\n )\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"gap-2\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-expanded={menuOpen}\n >\n <Plus className=\"h-4 w-4\" />\n {t('sales.documents.form.customer.create', 'Create customer')}\n </Button>\n {menuOpen ? renderMenu() : null}\n\n <Dialog open={dialog === 'person'} onOpenChange={(open) => (open ? setDialog('person') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addPerson', 'Create person')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a person without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<PersonFormValues>\n embedded\n fields={personFields}\n groups={personGroups}\n schema={personSchema}\n initialValues={{ addresses: [] as PersonFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handlePersonCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog === 'company'} onOpenChange={(open) => (open ? setDialog('company') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addCompany', 'Create company')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a company without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<CompanyFormValues>\n embedded\n fields={companyFields}\n groups={companyGroups}\n schema={companySchema}\n initialValues={{ addresses: [] as CompanyFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handleCompanyCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction normalizeAddressDraft(draft?: AddressDraft | null): Record<string, unknown> | null {\n if (!draft) return null\n const normalized: Record<string, unknown> = {}\n const assign = (key: keyof AddressDraft, target: string) => {\n const value = draft[key]\n if (typeof value === 'string' && value.trim().length) normalized[target] = value.trim()\n if (typeof value === 'boolean') normalized[target] = value\n }\n assign('name', 'name')\n assign('purpose', 'purpose')\n assign('companyName', 'companyName')\n assign('addressLine1', 'addressLine1')\n assign('addressLine2', 'addressLine2')\n assign('buildingNumber', 'buildingNumber')\n assign('flatNumber', 'flatNumber')\n assign('city', 'city')\n assign('region', 'region')\n assign('postalCode', 'postalCode')\n assign('country', 'country')\n assign('isPrimary', 'isPrimary')\n return Object.keys(normalized).length ? normalized : null\n}\n\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const [customers, setCustomers] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [channels, setChannels] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<AddressOption[]>([])\n const [addressesLoading, setAddressesLoading] = React.useState(false)\n const [addressesError, setAddressesError] = React.useState<string | null>(null)\n const [addressFormat, setAddressFormat] = React.useState<AddressFormatStrategy>('line_first')\n const [defaultCurrency, setDefaultCurrency] = React.useState<string>('USD')\n const addressRequestRef = React.useRef(0)\n const addressAbortRef = React.useRef<AbortController | null>(null)\n const addressTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n const currencyLabels = React.useMemo<DictionarySelectLabels>(() => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n addPrompt: t('sales.documents.form.currency.prompt', 'Currency code'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }), [t])\n const { data: currencyDictionary, refetch: refetchCurrencyDictionary } = useCurrencyDictionary()\n\n const fetchCurrencyOptions = React.useCallback(async (): Promise<DictionaryOption[]> => {\n try {\n const source = currencyDictionary ?? (await refetchCurrencyDictionary())\n if (source && Array.isArray(source.entries)) {\n return source.entries.map((entry) => ({\n value: entry.value,\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }\n return []\n } catch (err) {\n console.error('sales.documents.currency', err)\n return []\n }\n }, [currencyDictionary, refetchCurrencyDictionary])\n\n const loadCustomers = React.useCallback(async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomers(merged)\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n }, [t])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customers.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomers((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customers],\n )\n\n const loadChannels = React.useCallback(async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) setChannels(options)\n return options\n } else {\n setChannels([])\n return []\n }\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n setChannels([])\n return []\n } finally {\n setChannelLoading(false)\n }\n }, [])\n\n const loadDefaultCurrency = React.useCallback(async () => {\n try {\n const call = await apiCall<{ items?: Array<{ currency_code?: string | null }> }>(\n '/api/catalog/price-kinds?isPromotion=false&isActive=true&pageSize=1'\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const code = call.result.items[0]?.currency_code\n if (typeof code === 'string' && code.trim().length) {\n setDefaultCurrency(code.trim().toUpperCase())\n }\n }\n } catch (err) {\n console.error('sales.documents.loadDefaultCurrency', err)\n }\n }, [])\n\n const loadAddresses = React.useCallback(async (customerId?: string | null): Promise<AddressOption[]> => {\n addressRequestRef.current += 1\n const requestId = addressRequestRef.current\n\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n\n if (!customerId) {\n setAddressesError(null)\n setAddressOptions([])\n setAddressesLoading(false)\n return []\n }\n setAddressesLoading(true)\n setAddressesError(null)\n setAddressOptions([])\n const controller = new AbortController()\n addressAbortRef.current = controller\n addressTimeoutRef.current = setTimeout(() => controller.abort(), 12_000)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50', entityId: customerId })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/customers/addresses?${params.toString()}`,\n { signal: controller.signal },\n { fallback: { items: [] } }\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items.reduce<AddressOption[]>((acc, item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return acc\n const value: AddressValue = {\n addressLine1: typeof item.address_line1 === 'string' ? item.address_line1 : null,\n addressLine2: typeof item.address_line2 === 'string' ? item.address_line2 : null,\n buildingNumber: typeof item.building_number === 'string' ? item.building_number : null,\n flatNumber: typeof item.flat_number === 'string' ? item.flat_number : null,\n city: typeof item.city === 'string' ? item.city : null,\n region: typeof item.region === 'string' ? item.region : null,\n postalCode: typeof item.postal_code === 'string' ? item.postal_code : null,\n country: typeof item.country === 'string' ? item.country : null,\n companyName: typeof item.company_name === 'string' ? item.company_name : null,\n }\n const name = typeof item.name === 'string' ? item.name.trim() : ''\n const summary = formatAddressString(value, addressFormat)\n const label = name || summary || id\n const isPrimary = item.is_primary === true\n acc.push({ id, label, summary, value, name: name || null, isPrimary })\n return acc\n }, [])\n if (addressRequestRef.current === requestId) {\n setAddressOptions(options)\n }\n return options\n } else {\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } catch (err) {\n if ((err as DOMException)?.name !== 'AbortError') {\n console.error('sales.documents.loadAddresses', err)\n }\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n if ((err as DOMException)?.name !== 'AbortError') {\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } finally {\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current === controller) {\n addressAbortRef.current = null\n }\n if (addressRequestRef.current === requestId) {\n setAddressesLoading(false)\n }\n }\n return []\n }, [addressFormat, t])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n loadChannels().catch(() => {})\n loadDefaultCurrency().catch(() => {})\n }, [loadChannels, loadCustomers, loadDefaultCurrency])\n\n React.useEffect(\n () => () => {\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n },\n [],\n )\n\n React.useEffect(() => {\n setAddressOptions((prev) =>\n prev.map((entry) => {\n const summary = formatAddressString(entry.value, addressFormat)\n const label = (entry.name && entry.name.trim().length ? entry.name : '') || summary || entry.id\n return { ...entry, summary, label }\n }),\n )\n }, [addressFormat])\n\n React.useEffect(() => {\n let cancelled = false\n async function fetchAddressFormat() {\n try {\n const call = await apiCall<{ addressFormat?: string }>('/api/customers/settings/address-format')\n const format = typeof call.result?.addressFormat === 'string' ? call.result.addressFormat : null\n if (!cancelled && (format === 'street_first' || format === 'line_first')) {\n setAddressFormat(format)\n }\n } catch (err) {\n console.error('sales.documents.addressFormat', err)\n } finally {\n }\n }\n fetchAddressFormat().catch(() => {})\n return () => {\n cancelled = true\n }\n }, [])\n\n const resetAddressFormState = React.useCallback(\n (updateValue: (key: string, value: unknown) => void) => {\n updateValue('shippingAddressId', null)\n updateValue('billingAddressId', null)\n updateValue('shippingAddressDraft', undefined)\n updateValue('billingAddressDraft', undefined)\n updateValue('useCustomShipping', false)\n updateValue('useCustomBilling', false)\n updateValue('saveShippingAddress', false)\n updateValue('saveBillingAddress', false)\n updateValue('sameAsShipping', true)\n },\n [],\n )\n\n function DocumentNumberField({ value, setValue, values }: CrudCustomFieldRenderProps) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const kind: DocumentKind = formValues.documentKind === 'order' ? 'order' : 'quote'\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const autoValueRef = React.useRef<string | null>(null)\n const lastKindRef = React.useRef<DocumentKind | null>(null)\n\n const requestNumber = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const call = await apiCall<{ number?: string; error?: string }>('/api/sales/document-numbers', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n const nextNumber = typeof call.result?.number === 'string' ? call.result.number : null\n if (call.ok && nextNumber) {\n autoValueRef.current = nextNumber\n lastKindRef.current = kind\n setValue(nextNumber)\n } else {\n setError(call.result?.error || t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n }\n } catch (err) {\n console.error('sales.documents.generateNumber', err)\n setError(t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n } finally {\n setLoading(false)\n }\n }, [kind, setValue, t])\n\n React.useEffect(() => {\n const current = typeof value === 'string' ? value.trim() : ''\n if (!current.length && !lastKindRef.current) {\n void requestNumber()\n } else {\n lastKindRef.current = kind\n }\n }, [kind, requestNumber, value])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex w-full flex-col gap-2 md:flex-row md:items-center md:gap-3\">\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n disabled={loading}\n spellCheck={false}\n className=\"w-full md:flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" onClick={requestNumber} disabled={loading}>\n {loading\n ? t('sales.documents.form.numberLoading', 'Generating\u2026')\n : t('sales.documents.form.numberRefresh', 'Generate')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.form.numberHintOrder', 'Format applies to orders and uses the configured counter.')\n : t('sales.documents.form.numberHintQuote', 'Format applies to quotes and uses the configured counter.')}\n </p>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n }\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'documentKind',\n label: '',\n type: 'custom',\n required: false,\n component: ({ value, setValue }) => {\n const current = value === 'order' ? 'order' : 'quote'\n const label = t('sales.documents.form.kind', 'Document type')\n return (\n <div className=\"space-y-2 pt-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">{label}</div>\n <div className=\"inline-flex rounded-lg border bg-background p-1 shadow-sm\">\n {(['quote', 'order'] as DocumentKind[]).map((kind) => (\n <Button\n key={kind}\n type=\"button\"\n variant={current === kind ? 'default' : 'ghost'}\n onClick={() => setValue(kind)}\n >\n {t(`sales.documents.form.kind.${kind}`, kind.charAt(0).toUpperCase() + kind.slice(1))}\n </Button>\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'sales.documents.form.kind.hint',\n \"Please select which kind of sales document you want to create. When creating Quotes - it's kind of Shopping cart or Request for negotiation and could be converted to regular order later\",\n )}\n </p>\n </div>\n )\n },\n },\n {\n id: 'documentNumber',\n label: t('sales.documents.form.number', 'Document number'),\n type: 'custom',\n required: true,\n component: DocumentNumberField,\n },\n {\n id: 'currencyCode',\n label: t('sales.documents.form.currency', 'Currency'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? '')}\n fetchOptions={fetchCurrencyOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n sortOptions=\"none\"\n labels={currencyLabels}\n />\n ),\n },\n {\n id: 'channelId',\n label: t('sales.documents.form.channel', 'Sales channel'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n fetchItems={async (query) => {\n const options = await loadChannels(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'shippingAddressSection',\n label: '',\n type: 'custom',\n component: ({ values, setFormValue }) => {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomShipping === true\n const selectedId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : ''\n const draft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const customerId = typeof formValues.customerEntityId === 'string' ? formValues.customerEntityId : null\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.shipping.title', 'Shipping address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {customerRequired\n ? t('sales.documents.form.address.customerRequired', 'Select customer first or define custom address')\n : t('sales.documents.form.shipping.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <SwitchField\n label={t('sales.documents.form.shipping.custom', 'Define new address')}\n flip\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomShipping', checked)}\n />\n </div>\n {!useCustom ? (\n <Select\n value={selectedId || undefined}\n onValueChange={(value) => updateValue('shippingAddressId', value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')\n }\n />\n </SelectTrigger>\n <SelectContent>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <SelectItem key={addr.id} value={addr.id}>{optionLabel}</SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : null}\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('shippingAddressDraft', next)}\n hidePrimaryToggle\n />\n <SwitchField\n containerClassName=\"col-span-2\"\n label={t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n flip\n checked={formValues.saveShippingAddress === true}\n onCheckedChange={(checked) => updateValue('saveShippingAddress', checked)}\n />\n </div>\n ) : null}\n {addressesError && customerId ? (\n <div className=\"flex items-start justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n <span className=\"flex-1\">{addressesError}</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => loadAddresses(customerId)}\n disabled={addressesLoading}\n className=\"shrink-0\"\n >\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n </div>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'billingAddressSection',\n label: '',\n type: 'custom',\n component: function BillingAddressSectionField({ values, setFormValue }) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomBilling === true\n const selectedId = typeof formValues.billingAddressId === 'string' ? formValues.billingAddressId : ''\n const draft = (formValues.billingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const sameAsShipping = formValues.sameAsShipping !== false\n const shippingId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : null\n const shippingDraft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const shippingDraftKey = JSON.stringify(shippingDraft)\n const billingDraftKey = JSON.stringify(draft)\n const useCustomShipping = formValues.useCustomShipping === true\n\n React.useEffect(() => {\n if (!sameAsShipping) return\n if ((formValues.billingAddressId ?? null) !== shippingId) {\n updateValue('billingAddressId', shippingId)\n }\n if (useCustomShipping !== (formValues.useCustomBilling === true)) {\n updateValue('useCustomBilling', useCustomShipping)\n }\n if (useCustomShipping && shippingDraftKey !== billingDraftKey) {\n updateValue('billingAddressDraft', shippingDraft)\n }\n }, [\n billingDraftKey,\n sameAsShipping,\n updateValue,\n shippingDraft,\n shippingDraftKey,\n shippingId,\n useCustomShipping,\n formValues.billingAddressId,\n formValues.useCustomBilling,\n ])\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.billing.title', 'Billing address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {sameAsShipping\n ? t('sales.documents.form.address.sameAsShippingHint', 'Billing will mirror the shipping address. Uncheck to edit.')\n : t('sales.documents.form.billing.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <SwitchField\n label={t('sales.documents.form.address.sameAsShipping', 'Same as shipping')}\n flip\n checked={sameAsShipping}\n onCheckedChange={(checked) => {\n updateValue('sameAsShipping', checked)\n if (checked) {\n updateValue('useCustomBilling', useCustomShipping)\n updateValue('billingAddressId', shippingId)\n updateValue('billingAddressDraft', shippingDraft)\n }\n }}\n />\n </div>\n\n {!sameAsShipping ? (\n <>\n {!useCustom ? (\n <Select\n value={selectedId || undefined}\n onValueChange={(value) => updateValue('billingAddressId', value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')\n }\n />\n </SelectTrigger>\n <SelectContent>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <SelectItem key={addr.id} value={addr.id}>{optionLabel}</SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : null}\n\n <SwitchField\n label={t('sales.documents.form.shipping.custom', 'Define new address')}\n flip\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomBilling', checked)}\n disabled={false}\n />\n\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('billingAddressDraft', next)}\n hidePrimaryToggle\n />\n <SwitchField\n containerClassName=\"col-span-2\"\n label={t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n flip\n checked={formValues.saveBillingAddress === true}\n onCheckedChange={(checked) => updateValue('saveBillingAddress', checked)}\n />\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'infoNote',\n label: '',\n type: 'custom',\n component: () => (\n <div className=\"rounded-lg border bg-muted/50 p-3 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </div>\n ),\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n currencyLabels,\n fetchCurrencyOptions,\n loadAddresses,\n loadChannels,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'docType', title: '', column: 1, fields: ['documentKind', 'documentNumber'] },\n {\n id: 'customer',\n title: '',\n column: 1,\n fields: [],\n component: function CustomerGroupComponent({ values, setValue }) {\n const emailValue = typeof values.customerEmail === 'string' ? values.customerEmail : ''\n const { duplicate, checking } = useEmailDuplicateCheck(emailValue, {\n disabled: false,\n debounceMs: 400,\n matchMode: 'prefix',\n })\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-3\">\n <LookupSelect\n value={typeof values.customerEntityId === 'string' ? values.customerEntityId : null}\n onChange={(next) => {\n if (next !== values.customerEntityId) {\n resetAddressFormState(setValue)\n }\n setValue('customerEntityId', next)\n loadAddresses(next).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (next) {\n const match = customers.find((entry) => entry.id === next)\n const possibleEmail =\n typeof match?.primaryEmail === 'string' && match.primaryEmail.length\n ? match.primaryEmail\n : null\n if (possibleEmail) {\n setValue('customerEmail', possibleEmail)\n } else {\n fetchCustomerEmail(next, match?.kind)\n .then((email) => {\n if (email) setValue('customerEmail', email)\n })\n .catch(() => {})\n }\n }\n }}\n fetchItems={async (query) => {\n const options = await loadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n actionSlot={\n <CustomerQuickCreate\n t={t}\n onCreated={({ id, email, label, kind, subtitle }) => {\n // Seed the search box with the new customer's display name so it renders immediately\n customerQuerySetter.current?.(label)\n setCustomers((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: subtitle ?? undefined,\n kind,\n primaryEmail: email ?? null,\n }\n return [next, ...prev]\n })\n setValue('customerEntityId', id)\n resetAddressFormState(setValue)\n loadAddresses(id).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (email && !values.customerEmail) {\n setValue('customerEmail', email)\n }\n }}\n />\n }\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) => t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })}\n />\n </div>\n <div className=\"space-y-2\">\n <EmailInput\n value={emailValue}\n onChange={(event) => setValue('customerEmail', event.target.value)}\n placeholder={t('sales.documents.form.email.placeholder', 'Email used for the document')}\n spellCheck={false}\n />\n {duplicate ? (\n <div className=\"flex items-center justify-between rounded border bg-muted px-3 py-2 text-xs text-muted-foreground\">\n <span>\n {t('customers.people.form.emailDuplicateNotice', undefined, { name: duplicate.displayName })}\n </span>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className=\"px-4\"\n type=\"button\"\n disabled={values.customerEntityId === duplicate.id}\n aria-disabled={values.customerEntityId === duplicate.id}\n onClick={() => {\n setValue('customerEntityId', duplicate.id)\n resetAddressFormState(setValue)\n loadAddresses(duplicate.id)\n }}\n >\n {values.customerEntityId === duplicate.id\n ? t('sales.documents.form.email.alreadySelected', 'Selected customer')\n : t('sales.documents.form.email.selectCustomer', 'Select customer')}\n </Button>\n </div>\n ) : null}\n {!duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.form.emailChecking')}</p>\n ) : null}\n </div>\n </div>\n )\n },\n },\n { id: 'channels-comments', title: '', column: 1, fields: ['channelId', 'comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'shipping', title: '', column: 2, fields: ['shippingAddressSection'] },\n { id: 'billing', title: '', column: 2, fields: ['billingAddressSection'] },\n { id: 'custom', title: t('sales.documents.form.customFields', 'Custom fields'), column: 2, kind: 'customFields' },\n ], [\n customers,\n fetchCustomerEmail,\n loadAddresses,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const initialValues = React.useMemo<Partial<SalesDocumentFormValues>>(\n () => ({\n documentKind: initialKind === 'order' ? 'order' : 'quote',\n documentNumber: '',\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n channelId: inboxPreFill?.channelId || undefined,\n customerEntityId: inboxPreFill?.customerEntityId || undefined,\n comments: inboxPreFill?.comments || undefined,\n useCustomShipping: false,\n useCustomBilling: false,\n sameAsShipping: true,\n }),\n [initialKind, inboxPreFill, defaultCurrency]\n )\n\n // When inboxPreFill provides a customer, load their addresses on mount\n React.useEffect(() => {\n if (inboxPreFill?.customerEntityId) {\n loadAddresses(inboxPreFill.customerEntityId)\n }\n }, [inboxPreFill?.customerEntityId, loadAddresses])\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const safeValues = values ?? {}\n const customFields = collectCustomFieldValues(safeValues)\n const base = Object.fromEntries(\n Object.entries(safeValues).filter(([key]) => !key.startsWith('cf_') && !key.startsWith('cf:'))\n ) as SalesDocumentFormValues\n const documentKind: DocumentKind = base.documentKind === 'order' ? 'order' : 'quote'\n const payload: Record<string, unknown> = {\n currencyCode: typeof base.currencyCode === 'string' && base.currencyCode.trim().length\n ? base.currencyCode.trim().toUpperCase()\n : undefined,\n customerEntityId: base.customerEntityId || undefined,\n comments: base.comments ?? undefined,\n metadata: base.customerEmail ? { customerEmail: base.customerEmail } : undefined,\n }\n payload.channelId = base.channelId || undefined\n const documentNumber = typeof base.documentNumber === 'string' ? base.documentNumber.trim() : ''\n if (!documentNumber) {\n throw createCrudFormError(t('sales.documents.form.errors.numberRequired', 'Document number is required.'))\n }\n if (documentKind === 'order') {\n payload.orderNumber = documentNumber\n } else {\n payload.quoteNumber = documentNumber\n }\n const shippingSnapshot = base.useCustomShipping ? normalizeAddressDraft(base.shippingAddressDraft) : null\n let billingSnapshot = base.useCustomBilling ? normalizeAddressDraft(base.billingAddressDraft) : null\n const sameAsShipping = base.sameAsShipping !== false\n if (sameAsShipping) {\n if (shippingSnapshot) {\n billingSnapshot = shippingSnapshot\n } else if (!base.useCustomShipping) {\n payload.billingAddressId = base.shippingAddressId || undefined\n }\n }\n if (shippingSnapshot) {\n payload.shippingAddressSnapshot = shippingSnapshot\n payload.shippingAddressId = undefined\n }\n if (billingSnapshot) {\n payload.billingAddressSnapshot = billingSnapshot\n payload.billingAddressId = undefined\n }\n if (!base.useCustomShipping) payload.shippingAddressId = base.shippingAddressId || undefined\n if (!base.useCustomBilling && !sameAsShipping) payload.billingAddressId = base.billingAddressId || undefined\n\n try {\n let shippingId = payload.shippingAddressId as string | undefined\n let billingId = payload.billingAddressId as string | undefined\n if (base.customerEntityId && shippingSnapshot && base.saveShippingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: shippingSnapshot.addressLine1 ?? shippingSnapshot.name ?? 'Address',\n name: shippingSnapshot.name ?? undefined,\n addressLine2: shippingSnapshot.addressLine2 ?? undefined,\n buildingNumber: shippingSnapshot.buildingNumber ?? undefined,\n flatNumber: shippingSnapshot.flatNumber ?? undefined,\n city: shippingSnapshot.city ?? undefined,\n region: shippingSnapshot.region ?? undefined,\n postalCode: shippingSnapshot.postalCode ?? undefined,\n country: shippingSnapshot.country ?? undefined,\n purpose: shippingSnapshot.purpose ?? undefined,\n isPrimary: shippingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) shippingId = res.result.id\n }\n if (base.customerEntityId && billingSnapshot && base.saveBillingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: billingSnapshot.addressLine1 ?? billingSnapshot.name ?? 'Address',\n name: billingSnapshot.name ?? undefined,\n addressLine2: billingSnapshot.addressLine2 ?? undefined,\n buildingNumber: billingSnapshot.buildingNumber ?? undefined,\n flatNumber: billingSnapshot.flatNumber ?? undefined,\n city: billingSnapshot.city ?? undefined,\n region: billingSnapshot.region ?? undefined,\n postalCode: billingSnapshot.postalCode ?? undefined,\n country: billingSnapshot.country ?? undefined,\n purpose: billingSnapshot.purpose ?? undefined,\n isPrimary: billingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) billingId = res.result.id\n }\n if (!base.useCustomShipping && shippingId) payload.shippingAddressId = shippingId\n if (!base.useCustomBilling && !sameAsShipping && billingId) payload.billingAddressId = billingId\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const endpoint = documentKind === 'order' ? 'sales/orders' : 'sales/quotes'\n const { result } = await createCrud<{ id?: string; orderId?: string; quoteId?: string }>(endpoint, payload, {\n errorMessage: t('sales.documents.form.errors.submit', 'Failed to create document.'),\n })\n const newId =\n (result && typeof result.id === 'string' && result.id) ||\n (result && typeof result.orderId === 'string' && result.orderId) ||\n (result && typeof result.quoteId === 'string' && result.quoteId) ||\n null\n if (!newId) {\n throw createCrudFormError(t('sales.documents.form.errors.id', 'Document id missing after create.'))\n }\n flash(t('sales.documents.form.success', 'Sales document created.'), 'success')\n onCreated({ id: newId, kind: documentKind })\n } catch (err) {\n if (err instanceof Error) throw err\n throw createCrudFormError(t('sales.documents.form.errors.submit', 'Failed to create document.'))\n }\n },\n [onCreated, t],\n )\n\n const cancelHref = initialKind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n\n return (\n <CrudForm<SalesDocumentFormValues>\n title={t('sales.documents.form.title', 'Create sales document')}\n backHref={cancelHref}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n entityIds={[E.sales.sales_quote, E.sales.sales_order]}\n submitLabel={t('sales.documents.form.submit', 'Create')}\n cancelHref={cancelHref}\n onSubmit={handleSubmit}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["item"]
|
|
7
7
|
}
|