@open-mercato/core 0.6.7 → 0.6.8-develop.6874.1.982d6097d8
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 +3 -3
- package/agentic/standalone-guide.md +13 -0
- package/dist/bootstrap.js +16 -1
- package/dist/bootstrap.js.map +2 -2
- package/dist/generated/entities/attachment_quota_reservation/index.js +33 -0
- package/dist/generated/entities/attachment_quota_reservation/index.js.map +7 -0
- package/dist/generated/entities/customer_deal_person_link/index.js +2 -0
- package/dist/generated/entities/customer_deal_person_link/index.js.map +2 -2
- package/dist/generated/entities/customer_user_invitation/index.js +2 -0
- package/dist/generated/entities/customer_user_invitation/index.js.map +2 -2
- package/dist/generated/entities/gateway_payment_operation/index.js +2 -0
- package/dist/generated/entities/gateway_payment_operation/index.js.map +2 -2
- package/dist/generated/entities/gateway_transaction/index.js +2 -0
- package/dist/generated/entities/gateway_transaction/index.js.map +2 -2
- package/dist/generated/entities/organization/index.js +2 -0
- package/dist/generated/entities/organization/index.js.map +2 -2
- package/dist/generated/entities/resources_resource/index.js +2 -0
- package/dist/generated/entities/resources_resource/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +3 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +23 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/salesFixtures.js +31 -2
- package/dist/helpers/integration/salesFixtures.js.map +2 -2
- package/dist/helpers/integration/salesUi.js +5 -0
- package/dist/helpers/integration/salesUi.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +2 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/extension-points.js +16 -0
- package/dist/modules/api_keys/extension-points.js.map +7 -0
- package/dist/modules/attachments/api/route.js +120 -10
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/backend/config/attachments/page.js +1 -1
- package/dist/modules/attachments/backend/config/attachments/page.js.map +2 -2
- package/dist/modules/attachments/data/entities.js +67 -1
- package/dist/modules/attachments/data/entities.js.map +2 -2
- package/dist/modules/attachments/di.js +7 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +1 -1
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/attachments/lib/drivers/index.js.map +1 -1
- package/dist/modules/attachments/lib/drivers/localDriver.js +19 -6
- package/dist/modules/attachments/lib/drivers/localDriver.js.map +2 -2
- package/dist/modules/attachments/lib/quota-recovery-queue.js +9 -0
- package/dist/modules/attachments/lib/quota-recovery-queue.js.map +7 -0
- package/dist/modules/attachments/lib/quota-service.js +224 -0
- package/dist/modules/attachments/lib/quota-service.js.map +7 -0
- package/dist/modules/attachments/lib/upload-limits.js +33 -0
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/attachments/migrations/Migration20260709234741_attachments.js +13 -0
- package/dist/modules/attachments/migrations/Migration20260709234741_attachments.js.map +7 -0
- package/dist/modules/attachments/workers/quota-recovery.js +45 -0
- package/dist/modules/attachments/workers/quota-recovery.js.map +7 -0
- package/dist/modules/audit_logs/api/audit-logs/access/route.js +5 -1
- package/dist/modules/audit_logs/api/audit-logs/access/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +5 -1
- package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/route.js +5 -1
- package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/readScope.js +12 -0
- package/dist/modules/audit_logs/api/audit-logs/readScope.js.map +7 -0
- package/dist/modules/audit_logs/components/AccessLogsTable.js +2 -1
- package/dist/modules/audit_logs/components/AccessLogsTable.js.map +2 -2
- package/dist/modules/audit_logs/components/AuditLogsActions.js +3 -2
- package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
- package/dist/modules/audit_logs/extension-points.js +14 -0
- package/dist/modules/audit_logs/extension-points.js.map +7 -0
- package/dist/modules/auth/api/admin/nav.js +17 -4
- package/dist/modules/auth/api/admin/nav.js.map +2 -2
- package/dist/modules/auth/api/profile/route.js +8 -2
- package/dist/modules/auth/api/profile/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +8 -19
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/auth/profile/page.js.map +2 -2
- package/dist/modules/auth/backend/profile/change-password/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +2 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/settings/page.js +14 -9
- package/dist/modules/auth/backend/settings/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +1 -1
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/components/UserConsentsPanel.js +9 -9
- package/dist/modules/auth/components/UserConsentsPanel.js.map +2 -2
- package/dist/modules/auth/extension-points.js +21 -0
- package/dist/modules/auth/extension-points.js.map +7 -0
- package/dist/modules/auth/frontend/login.js +7 -3
- package/dist/modules/auth/frontend/login.js.map +2 -2
- package/dist/modules/auth/frontend/reset.js +2 -2
- package/dist/modules/auth/frontend/reset.js.map +2 -2
- package/dist/modules/auth/lib/backendChrome.js +45 -29
- package/dist/modules/auth/lib/backendChrome.js.map +2 -2
- package/dist/modules/auth/lib/setup-app.js +17 -2
- package/dist/modules/auth/lib/setup-app.js.map +2 -2
- package/dist/modules/auth/lib/tenantAccess.js +7 -0
- package/dist/modules/auth/lib/tenantAccess.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +29 -44
- package/dist/modules/auth/services/rbacService.js.map +2 -2
- package/dist/modules/business_rules/api/openmercato-call-options/route.js +85 -0
- package/dist/modules/business_rules/api/openmercato-call-options/route.js.map +7 -0
- package/dist/modules/business_rules/api/rules/route.js +71 -4
- package/dist/modules/business_rules/api/rules/route.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +2 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/components/ActionBuilder.js +47 -4
- package/dist/modules/business_rules/components/ActionBuilder.js.map +3 -3
- package/dist/modules/business_rules/components/ActionRow.js +106 -16
- package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionRow.js +8 -4
- package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
- package/dist/modules/business_rules/components/utils/actionValidation.js +6 -0
- package/dist/modules/business_rules/components/utils/actionValidation.js.map +2 -2
- package/dist/modules/business_rules/events.js +13 -0
- package/dist/modules/business_rules/events.js.map +7 -0
- package/dist/modules/business_rules/extension-points.js +13 -0
- package/dist/modules/business_rules/extension-points.js.map +7 -0
- package/dist/modules/business_rules/lib/action-executor.js +148 -0
- package/dist/modules/business_rules/lib/action-executor.js.map +2 -2
- package/dist/modules/business_rules/lib/openmercato-call-options-types.js +5 -0
- package/dist/modules/business_rules/lib/openmercato-call-options-types.js.map +7 -0
- package/dist/modules/business_rules/lib/openmercato-call-options.js +231 -0
- package/dist/modules/business_rules/lib/openmercato-call-options.js.map +7 -0
- package/dist/modules/business_rules/lib/rule-engine.js +5 -1
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +6 -5
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +7 -6
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +3 -3
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -1
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductCategorizeSection.js +3 -3
- package/dist/modules/catalog/components/products/ProductCategorizeSection.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductMediaManager.js +1 -1
- package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +3 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +5 -5
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/catalog/events.js +1 -0
- package/dist/modules/catalog/events.js.map +2 -2
- package/dist/modules/catalog/extension-points.js +27 -0
- package/dist/modules/catalog/extension-points.js.map +7 -0
- package/dist/modules/catalog/widgets/injection/product-bulk-delete/widget.js +10 -5
- package/dist/modules/catalog/widgets/injection/product-bulk-delete/widget.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/product-seo/widget.js +1 -1
- package/dist/modules/catalog/widgets/injection/product-seo/widget.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +52 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +11 -1
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +11 -6
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +2 -1
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +8 -7
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
- package/dist/modules/communication_channels/data/enrichers.js +4 -4
- package/dist/modules/communication_channels/data/enrichers.js.map +2 -2
- package/dist/modules/communication_channels/extension-points.js +20 -0
- package/dist/modules/communication_channels/extension-points.js.map +7 -0
- package/dist/modules/communication_channels/lib/access-control.js +2 -2
- package/dist/modules/communication_channels/lib/access-control.js.map +2 -2
- package/dist/modules/configs/backend/config/system-status/page.js +2 -1
- package/dist/modules/configs/backend/config/system-status/page.js.map +2 -2
- package/dist/modules/configs/extension-points.js +18 -0
- package/dist/modules/configs/extension-points.js.map +7 -0
- package/dist/modules/configs/lib/upgrade-actions.js +12 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +2 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +2 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/di.js +4 -0
- package/dist/modules/currencies/di.js.map +2 -2
- package/dist/modules/currencies/extension-points.js +14 -0
- package/dist/modules/currencies/extension-points.js.map +7 -0
- package/dist/modules/currencies/services/baseCurrencyService.js +42 -0
- package/dist/modules/currencies/services/baseCurrencyService.js.map +7 -0
- package/dist/modules/customer_accounts/api/admin/users/[id].js +10 -1
- package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users-invite.js +63 -4
- package/dist/modules/customer_accounts/api/admin/users-invite.js.map +2 -2
- package/dist/modules/customer_accounts/api/invitations/accept.js +1 -2
- package/dist/modules/customer_accounts/api/invitations/accept.js.map +2 -2
- package/dist/modules/customer_accounts/api/login.js +4 -2
- package/dist/modules/customer_accounts/api/login.js.map +2 -2
- package/dist/modules/customer_accounts/api/magic-link/verify.js +4 -2
- package/dist/modules/customer_accounts/api/magic-link/verify.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/feature-check.js +5 -4
- package/dist/modules/customer_accounts/api/portal/feature-check.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/nav.js +6 -4
- package/dist/modules/customer_accounts/api/portal/nav.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/profile.js +5 -1
- package/dist/modules/customer_accounts/api/portal/profile.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/sessions-refresh.js +3 -3
- package/dist/modules/customer_accounts/api/portal/sessions-refresh.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/users-invite.js +22 -2
- package/dist/modules/customer_accounts/api/portal/users-invite.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +2 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.js +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +2 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/data/entities.js +3 -0
- package/dist/modules/customer_accounts/data/entities.js.map +2 -2
- package/dist/modules/customer_accounts/data/validators.js +1 -0
- package/dist/modules/customer_accounts/data/validators.js.map +2 -2
- package/dist/modules/customer_accounts/emails/CustomerInvitationEmail.js +26 -0
- package/dist/modules/customer_accounts/emails/CustomerInvitationEmail.js.map +7 -0
- package/dist/modules/customer_accounts/extension-points.js +14 -0
- package/dist/modules/customer_accounts/extension-points.js.map +7 -0
- package/dist/modules/customer_accounts/lib/customerAuth.js +7 -2
- package/dist/modules/customer_accounts/lib/customerAuth.js.map +2 -2
- package/dist/modules/customer_accounts/lib/customerAuthServer.js +2 -1
- package/dist/modules/customer_accounts/lib/customerAuthServer.js.map +2 -2
- package/dist/modules/customer_accounts/lib/customerEntityOwnership.js +29 -3
- package/dist/modules/customer_accounts/lib/customerEntityOwnership.js.map +2 -2
- package/dist/modules/customer_accounts/lib/customerUrl.js +19 -10
- package/dist/modules/customer_accounts/lib/customerUrl.js.map +2 -2
- package/dist/modules/customer_accounts/lib/invitationEmail.js +35 -0
- package/dist/modules/customer_accounts/lib/invitationEmail.js.map +7 -0
- package/dist/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.js +13 -0
- package/dist/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.js.map +7 -0
- package/dist/modules/customer_accounts/services/customerInvitationService.js +32 -2
- package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
- package/dist/modules/customer_accounts/services/customerRbacService.js +12 -3
- package/dist/modules/customer_accounts/services/customerRbacService.js.map +2 -2
- package/dist/modules/customer_accounts/setup.js +6 -0
- package/dist/modules/customer_accounts/setup.js.map +2 -2
- package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js +47 -7
- package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -2
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.js +1 -1
- package/dist/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection-table.js +1 -1
- package/dist/modules/customer_accounts/widgets/injection-table.js.map +2 -2
- package/dist/modules/customers/analytics.js +4 -1
- package/dist/modules/customers/analytics.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +3 -4
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +4 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +7 -3
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +5 -4
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/summary/route.js +14 -119
- package/dist/modules/customers/api/deals/summary/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +3 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/utils.js +21 -24
- package/dist/modules/customers/api/utils.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
- package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +2 -1
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +16 -5
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +18 -11
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +2 -1
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.js +17 -3
- package/dist/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +8 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -1
- package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +2 -1
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +26 -10
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/cli.js +28 -11
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +48 -10
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/people.js +2 -0
- package/dist/modules/customers/commands/people.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +2 -1
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/detail/ActiveDealCard.js +2 -1
- package/dist/modules/customers/components/detail/ActiveDealCard.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +2 -3
- package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyDetailTabs.js +26 -6
- package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +6 -5
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +2 -2
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/DealDetailTabs.js +30 -8
- package/dist/modules/customers/components/detail/DealDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +2 -1
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +1 -1
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/MiniWeekCalendar.js +7 -52
- package/dist/modules/customers/components/detail/MiniWeekCalendar.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonDetailTabs.js +30 -8
- package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +231 -216
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/dashboard/helpers.js +4 -3
- package/dist/modules/customers/components/detail/dashboard/helpers.js.map +2 -2
- package/dist/modules/customers/components/detail/legacyActivities.js +69 -0
- package/dist/modules/customers/components/detail/legacyActivities.js.map +7 -0
- package/dist/modules/customers/components/formConfig.js +14 -10
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/data/entities.js +8 -0
- package/dist/modules/customers/data/entities.js.map +2 -2
- package/dist/modules/customers/data/validators.js +5 -2
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/extension-points.js +42 -0
- package/dist/modules/customers/extension-points.js.map +7 -0
- package/dist/modules/customers/lib/calendar/format.js +8 -4
- package/dist/modules/customers/lib/calendar/format.js.map +2 -2
- package/dist/modules/customers/lib/dealStatus.js +38 -0
- package/dist/modules/customers/lib/dealStatus.js.map +7 -0
- package/dist/modules/customers/lib/dealsSummaryQueries.js +144 -0
- package/dist/modules/customers/lib/dealsSummaryQueries.js.map +7 -0
- package/dist/modules/customers/lib/optionalBaseCurrency.js +19 -0
- package/dist/modules/customers/lib/optionalBaseCurrency.js.map +7 -0
- package/dist/modules/customers/lib/visibilityFilter.js +6 -4
- package/dist/modules/customers/lib/visibilityFilter.js.map +2 -2
- package/dist/modules/customers/migrations/Migration20260723210000_customers.js +15 -0
- package/dist/modules/customers/migrations/Migration20260723210000_customers.js.map +7 -0
- package/dist/modules/customers/search.js +50 -29
- package/dist/modules/customers/search.js.map +2 -2
- package/dist/modules/customers/utils/phoneDuplicates.js +1 -2
- package/dist/modules/customers/utils/phoneDuplicates.js.map +2 -2
- package/dist/modules/dashboards/api/layout/[itemId]/route.js +6 -3
- package/dist/modules/dashboards/api/layout/[itemId]/route.js.map +2 -2
- package/dist/modules/dashboards/api/layout/route.js +22 -9
- package/dist/modules/dashboards/api/layout/route.js.map +2 -2
- package/dist/modules/dashboards/api/roles/widgets/route.js +9 -3
- package/dist/modules/dashboards/api/roles/widgets/route.js.map +2 -2
- package/dist/modules/dashboards/api/users/widgets/route.js +9 -3
- package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
- package/dist/modules/dashboards/api/widgets/catalog.js +6 -3
- package/dist/modules/dashboards/api/widgets/catalog.js.map +2 -2
- package/dist/modules/dashboards/api/widgets/data/batch/route.js +12 -3
- package/dist/modules/dashboards/api/widgets/data/batch/route.js.map +2 -2
- package/dist/modules/dashboards/api/widgets/data/route.js +28 -3
- package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
- package/dist/modules/dashboards/api/widgets/data/schema.js +28 -18
- package/dist/modules/dashboards/api/widgets/data/schema.js.map +2 -2
- package/dist/modules/dashboards/components/UnlabelledAmountNotice.js +33 -0
- package/dist/modules/dashboards/components/UnlabelledAmountNotice.js.map +7 -0
- package/dist/modules/dashboards/lib/access.js +5 -3
- package/dist/modules/dashboards/lib/access.js.map +2 -2
- package/dist/modules/dashboards/lib/aggregations.js +113 -46
- package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
- package/dist/modules/dashboards/lib/exactDecimal.js +69 -0
- package/dist/modules/dashboards/lib/exactDecimal.js.map +7 -0
- package/dist/modules/dashboards/lib/formatters.js +84 -11
- package/dist/modules/dashboards/lib/formatters.js.map +2 -2
- package/dist/modules/dashboards/lib/optionalBaseCurrency.js +11 -0
- package/dist/modules/dashboards/lib/optionalBaseCurrency.js.map +7 -0
- package/dist/modules/dashboards/services/widgetDataService.js +316 -14
- package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
- package/dist/modules/dashboards/subscribers/invalidateWidgetDataCache.js +26 -0
- package/dist/modules/dashboards/subscribers/invalidateWidgetDataCache.js.map +7 -0
- package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +9 -3
- package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js +52 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js +52 -30
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +2 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +9 -3
- package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +8 -3
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +26 -18
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +22 -14
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +10 -4
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
- package/dist/modules/data_sync/api/mappings/[id]/route.js +22 -9
- package/dist/modules/data_sync/api/mappings/[id]/route.js.map +2 -2
- package/dist/modules/data_sync/api/mappings/route.js +13 -4
- package/dist/modules/data_sync/api/mappings/route.js.map +2 -2
- package/dist/modules/data_sync/api/options.js +7 -2
- package/dist/modules/data_sync/api/options.js.map +2 -2
- package/dist/modules/data_sync/api/run.js +7 -2
- package/dist/modules/data_sync/api/run.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/cancel.js +8 -3
- package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/retry.js +7 -2
- package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/route.js +8 -3
- package/dist/modules/data_sync/api/runs/[id]/route.js.map +2 -2
- package/dist/modules/data_sync/api/runs.js +7 -2
- package/dist/modules/data_sync/api/runs.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/[id]/route.js +19 -6
- package/dist/modules/data_sync/api/schedules/[id]/route.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/route.js +13 -4
- package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
- package/dist/modules/data_sync/api/validate.js +9 -4
- package/dist/modules/data_sync/api/validate.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +5 -4
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +5 -5
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/data_sync/extension-points.js +13 -0
- package/dist/modules/data_sync/extension-points.js.map +7 -0
- package/dist/modules/data_sync/lib/queue-policy.js +15 -0
- package/dist/modules/data_sync/lib/queue-policy.js.map +7 -0
- package/dist/modules/data_sync/lib/queue.js +16 -1
- package/dist/modules/data_sync/lib/queue.js.map +2 -2
- package/dist/modules/data_sync/lib/start-run.js +2 -1
- package/dist/modules/data_sync/lib/start-run.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-engine.js +35 -2
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-run-service.js +70 -2
- package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +9 -2
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +9 -2
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/design_system/acl.js +9 -0
- package/dist/modules/design_system/acl.js.map +7 -0
- package/dist/modules/design_system/backend/design-system/page.js +11 -0
- package/dist/modules/design_system/backend/design-system/page.js.map +7 -0
- package/dist/modules/design_system/backend/design-system/page.meta.js +15 -0
- package/dist/modules/design_system/backend/design-system/page.meta.js.map +7 -0
- package/dist/modules/design_system/gallery/components/CodeSnippet.js +52 -0
- package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +7 -0
- package/dist/modules/design_system/gallery/components/EntryCard.js +63 -0
- package/dist/modules/design_system/gallery/components/EntryCard.js.map +7 -0
- package/dist/modules/design_system/gallery/components/GalleryShell.js +163 -0
- package/dist/modules/design_system/gallery/components/GalleryShell.js.map +7 -0
- package/dist/modules/design_system/gallery/components/VariantPreview.js +9 -0
- package/dist/modules/design_system/gallery/components/VariantPreview.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/banners.js +186 -0
- package/dist/modules/design_system/gallery/entries/banners.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/buttons.js +361 -0
- package/dist/modules/design_system/gallery/entries/buttons.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/charts.js +457 -0
- package/dist/modules/design_system/gallery/entries/charts.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/dates.js +306 -0
- package/dist/modules/design_system/gallery/entries/dates.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/detail.js +358 -0
- package/dist/modules/design_system/gallery/entries/detail.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/display.js +785 -0
- package/dist/modules/design_system/gallery/entries/display.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/feedback.js +658 -0
- package/dist/modules/design_system/gallery/entries/feedback.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/filters.js +505 -0
- package/dist/modules/design_system/gallery/entries/filters.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/foundations.js +453 -0
- package/dist/modules/design_system/gallery/entries/foundations.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/icons.js +140 -0
- package/dist/modules/design_system/gallery/entries/icons.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/inputs.js +1217 -0
- package/dist/modules/design_system/gallery/entries/inputs.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/messages.js +334 -0
- package/dist/modules/design_system/gallery/entries/messages.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/navigation.js +475 -0
- package/dist/modules/design_system/gallery/entries/navigation.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/notifications.js +257 -0
- package/dist/modules/design_system/gallery/entries/notifications.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/overlays.js +576 -0
- package/dist/modules/design_system/gallery/entries/overlays.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/scaffolding.js +378 -0
- package/dist/modules/design_system/gallery/entries/scaffolding.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/schedule.js +297 -0
- package/dist/modules/design_system/gallery/entries/schedule.js.map +7 -0
- package/dist/modules/design_system/gallery/registry.js +139 -0
- package/dist/modules/design_system/gallery/registry.js.map +7 -0
- package/dist/modules/design_system/gallery/types.js +1 -0
- package/dist/modules/design_system/gallery/types.js.map +7 -0
- package/dist/modules/design_system/index.js +9 -0
- package/dist/modules/design_system/index.js.map +7 -0
- package/dist/modules/design_system/setup.js +14 -0
- package/dist/modules/design_system/setup.js.map +7 -0
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +34 -12
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
- package/dist/modules/dictionaries/api/openapi.js +15 -2
- package/dist/modules/dictionaries/api/openapi.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +1 -1
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js +30 -29
- package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js.map +2 -2
- package/dist/modules/dictionaries/data/validators.js +7 -0
- package/dist/modules/dictionaries/data/validators.js.map +2 -2
- package/dist/modules/dictionaries/lib/clientEntries.js +4 -3
- package/dist/modules/dictionaries/lib/clientEntries.js.map +2 -2
- package/dist/modules/dictionaries/lib/fetchAllEntries.js +43 -0
- package/dist/modules/dictionaries/lib/fetchAllEntries.js.map +7 -0
- package/dist/modules/directory/api/organization-branding/route.js +10 -3
- package/dist/modules/directory/api/organization-branding/route.js.map +2 -2
- package/dist/modules/directory/api/organization-switcher/route.js +84 -20
- package/dist/modules/directory/api/organization-switcher/route.js.map +2 -2
- package/dist/modules/directory/api/organizations/route.js +7 -0
- package/dist/modules/directory/api/organizations/route.js.map +3 -3
- package/dist/modules/directory/api/tenants/route.js +8 -2
- package/dist/modules/directory/api/tenants/route.js.map +2 -2
- package/dist/modules/directory/backend/directory/branding/page.js +31 -8
- package/dist/modules/directory/backend/directory/branding/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +7 -16
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/commands/organizations.js +8 -1
- package/dist/modules/directory/commands/organizations.js.map +2 -2
- package/dist/modules/directory/commands/tenants.js +6 -0
- package/dist/modules/directory/commands/tenants.js.map +2 -2
- package/dist/modules/directory/data/entities.js +4 -0
- package/dist/modules/directory/data/entities.js.map +2 -2
- package/dist/modules/directory/data/validators.js +2 -0
- package/dist/modules/directory/data/validators.js.map +2 -2
- package/dist/modules/directory/extension-points.js +14 -0
- package/dist/modules/directory/extension-points.js.map +7 -0
- package/dist/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.js +13 -0
- package/dist/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.js.map +7 -0
- package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js +5 -1
- package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js +11 -3
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/definitions.js +53 -3
- package/dist/modules/entities/api/definitions.js.map +2 -2
- package/dist/modules/entities/api/entities.js +21 -2
- package/dist/modules/entities/api/entities.js.map +2 -2
- package/dist/modules/entities/api/entity-settings.js +59 -9
- package/dist/modules/entities/api/entity-settings.js.map +2 -2
- package/dist/modules/entities/api/records.js +11 -28
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/api/sidebar-entities.js +34 -12
- package/dist/modules/entities/api/sidebar-entities.js.map +2 -2
- package/dist/modules/entities/backend/config/settings/page.js +10 -0
- package/dist/modules/entities/backend/config/settings/page.js.map +7 -0
- package/dist/modules/entities/backend/config/settings/page.meta.js +36 -0
- package/dist/modules/entities/backend/config/settings/page.meta.js.map +7 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/page.js +1 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +23 -4
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/create/page.js +16 -7
- package/dist/modules/entities/backend/entities/user/create/page.js.map +2 -2
- package/dist/modules/entities/cli.js +193 -19
- package/dist/modules/entities/cli.js.map +2 -2
- package/dist/modules/entities/components/EntitySettingsManager.js +136 -0
- package/dist/modules/entities/components/EntitySettingsManager.js.map +7 -0
- package/dist/modules/entities/components/RecordListRelationCell.js +63 -0
- package/dist/modules/entities/components/RecordListRelationCell.js.map +7 -0
- package/dist/modules/entities/components/SystemEntitiesTable.js +2 -1
- package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
- package/dist/modules/entities/components/UserEntitiesTable.js +2 -1
- package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
- package/dist/modules/entities/components/recordListRelationDisplays.js +80 -0
- package/dist/modules/entities/components/recordListRelationDisplays.js.map +7 -0
- package/dist/modules/entities/extension-points.js +21 -0
- package/dist/modules/entities/extension-points.js.map +7 -0
- package/dist/modules/entities/lib/entityAcl.js +87 -9
- package/dist/modules/entities/lib/entityAcl.js.map +3 -3
- package/dist/modules/feature_toggles/components/FeatureGuard.js +3 -2
- package/dist/modules/feature_toggles/components/FeatureGuard.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js +1 -1
- package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js.map +2 -2
- package/dist/modules/feature_toggles/components/hooks/staleTime.js +5 -0
- package/dist/modules/feature_toggles/components/hooks/staleTime.js.map +7 -0
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js +5 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js.map +2 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js +5 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js.map +2 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js +5 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js.map +2 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js +5 -2
- package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js.map +2 -2
- package/dist/modules/inbox_ops/ai-tools.js +5 -2
- package/dist/modules/inbox_ops/ai-tools.js.map +2 -2
- package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js +14 -1
- package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/proposals/route.js +16 -1
- package/dist/modules/inbox_ops/api/proposals/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/webhook/inbound.js +14 -10
- package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +6 -6
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +25 -20
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/inbox_ops/search.js +15 -4
- package/dist/modules/inbox_ops/search.js.map +2 -2
- package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js +32 -0
- package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js.map +7 -0
- package/dist/modules/integrations/api/[id]/credentials/route.js +11 -5
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/health/route.js +6 -3
- package/dist/modules/integrations/api/[id]/health/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/route.js +6 -3
- package/dist/modules/integrations/api/[id]/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/state/route.js +6 -3
- package/dist/modules/integrations/api/[id]/state/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/version/route.js +6 -3
- package/dist/modules/integrations/api/[id]/version/route.js.map +2 -2
- package/dist/modules/integrations/api/logs/route.js +6 -3
- package/dist/modules/integrations/api/logs/route.js.map +2 -2
- package/dist/modules/integrations/api/route.js +6 -3
- package/dist/modules/integrations/api/route.js.map +2 -2
- package/dist/modules/integrations/api/umes-read.js +2 -2
- package/dist/modules/integrations/api/umes-read.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +2 -4
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/extension-points.js +30 -0
- package/dist/modules/integrations/extension-points.js.map +7 -0
- package/dist/modules/integrations/lib/organization-scope.js +2 -9
- package/dist/modules/integrations/lib/organization-scope.js.map +2 -2
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -5
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +2 -2
- package/dist/modules/integrations/widgets/injection/external-ids/widget.js +14 -0
- package/dist/modules/integrations/widgets/injection/external-ids/widget.js.map +7 -0
- package/dist/modules/messages/api/[id]/route.js +15 -0
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/route.js +77 -8
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/ComposeMessagePageClient.js +2 -1
- package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js +3 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +2 -1
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/dialogs.js +1 -1
- package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +1 -1
- package/dist/modules/messages/extension-points.js +16 -0
- package/dist/modules/messages/extension-points.js.map +7 -0
- package/dist/modules/messages/lib/participantScope.js +15 -0
- package/dist/modules/messages/lib/participantScope.js.map +7 -0
- package/dist/modules/messages/lib/routeHelpers.js +1 -3
- package/dist/modules/messages/lib/routeHelpers.js.map +2 -2
- package/dist/modules/messages/lib/searchLookup.js +8 -16
- package/dist/modules/messages/lib/searchLookup.js.map +2 -2
- package/dist/modules/messages/search.js +10 -5
- package/dist/modules/messages/search.js.map +2 -2
- package/dist/modules/notifications/api/route.js +83 -4
- package/dist/modules/notifications/api/route.js.map +2 -2
- package/dist/modules/notifications/api/unread-count/route.js +25 -6
- package/dist/modules/notifications/api/unread-count/route.js.map +2 -2
- package/dist/modules/notifications/di.js +1 -1
- package/dist/modules/notifications/di.js.map +2 -2
- package/dist/modules/notifications/events.js +4 -2
- package/dist/modules/notifications/events.js.map +2 -2
- package/dist/modules/notifications/lib/notificationRecipients.js +6 -7
- package/dist/modules/notifications/lib/notificationRecipients.js.map +2 -2
- package/dist/modules/notifications/lib/notificationScope.js +26 -0
- package/dist/modules/notifications/lib/notificationScope.js.map +7 -0
- package/dist/modules/notifications/lib/notificationService.js +48 -4
- package/dist/modules/notifications/lib/notificationService.js.map +2 -2
- package/dist/modules/notifications/lib/routeHelpers.js +16 -2
- package/dist/modules/notifications/lib/routeHelpers.js.map +2 -2
- package/dist/modules/payment_gateways/api/capture/route.js +1 -1
- package/dist/modules/payment_gateways/api/capture/route.js.map +2 -2
- package/dist/modules/payment_gateways/api/sessions/route.js +6 -3
- package/dist/modules/payment_gateways/api/sessions/route.js.map +2 -2
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +11 -1
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/data/entities.js +11 -0
- package/dist/modules/payment_gateways/data/entities.js.map +2 -2
- package/dist/modules/payment_gateways/di.js +17 -1
- package/dist/modules/payment_gateways/di.js.map +2 -2
- package/dist/modules/payment_gateways/extension-points.js +19 -0
- package/dist/modules/payment_gateways/extension-points.js.map +7 -0
- package/dist/modules/payment_gateways/lib/capture-ledger.js +183 -0
- package/dist/modules/payment_gateways/lib/capture-ledger.js.map +7 -0
- package/dist/modules/payment_gateways/lib/gateway-service.js +93 -14
- package/dist/modules/payment_gateways/lib/gateway-service.js.map +2 -2
- package/dist/modules/payment_gateways/lib/order-amount-reconciliation.js +58 -0
- package/dist/modules/payment_gateways/lib/order-amount-reconciliation.js.map +7 -0
- package/dist/modules/payment_gateways/lib/payment-operation-idempotency.js +1 -0
- package/dist/modules/payment_gateways/lib/payment-operation-idempotency.js.map +2 -2
- package/dist/modules/payment_gateways/lib/session-idempotency.js +33 -0
- package/dist/modules/payment_gateways/lib/session-idempotency.js.map +2 -2
- package/dist/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.js +16 -0
- package/dist/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.js.map +7 -0
- package/dist/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.js +18 -0
- package/dist/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.js.map +7 -0
- package/dist/modules/payment_gateways/setup.js +47 -0
- package/dist/modules/payment_gateways/setup.js.map +2 -2
- package/dist/modules/payment_gateways/workers/session-initialization-prune.js +50 -0
- package/dist/modules/payment_gateways/workers/session-initialization-prune.js.map +7 -0
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +4 -4
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/planner/components/unavailabilityReasons.js +3 -3
- package/dist/modules/planner/components/unavailabilityReasons.js.map +2 -2
- package/dist/modules/portal/extension-points.js +32 -0
- package/dist/modules/portal/extension-points.js.map +7 -0
- package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +3 -3
- package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.js +134 -0
- package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.js.map +7 -0
- package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.js +11 -0
- package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.js.map +7 -0
- package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +4 -4
- package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +3 -3
- package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js +3 -3
- package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js +4 -4
- package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +4 -4
- package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
- package/dist/modules/portal/frontend/[orgSlug]/portal/verify/page.js +1 -1
- package/dist/modules/portal/frontend/[orgSlug]/portal/verify/page.js.map +2 -2
- package/dist/modules/portal/lib/navigation.js +7 -0
- package/dist/modules/portal/lib/navigation.js.map +7 -0
- package/dist/modules/progress/lib/progressService.js +2 -0
- package/dist/modules/progress/lib/progressService.js.map +2 -2
- package/dist/modules/progress/lib/progressServiceImpl.js +322 -104
- package/dist/modules/progress/lib/progressServiceImpl.js.map +2 -2
- package/dist/modules/query_index/api/openapi.js +13 -1
- package/dist/modules/query_index/api/openapi.js.map +2 -2
- package/dist/modules/query_index/api/reindex.js +10 -0
- package/dist/modules/query_index/api/reindex.js.map +2 -2
- package/dist/modules/query_index/api/status.js +165 -105
- package/dist/modules/query_index/api/status.js.map +2 -2
- package/dist/modules/query_index/cli.js +125 -1
- package/dist/modules/query_index/cli.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +130 -42
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/query_index/data/entities.js +2 -1
- package/dist/modules/query_index/data/entities.js.map +2 -2
- package/dist/modules/query_index/di.js +3 -0
- package/dist/modules/query_index/di.js.map +2 -2
- package/dist/modules/query_index/events.js +20 -0
- package/dist/modules/query_index/events.js.map +7 -0
- package/dist/modules/query_index/extension-points.js +13 -0
- package/dist/modules/query_index/extension-points.js.map +7 -0
- package/dist/modules/query_index/lib/batch.js +11 -4
- package/dist/modules/query_index/lib/batch.js.map +2 -2
- package/dist/modules/query_index/lib/coverage.js +21 -9
- package/dist/modules/query_index/lib/coverage.js.map +2 -2
- package/dist/modules/query_index/lib/document.js +12 -5
- package/dist/modules/query_index/lib/document.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +105 -48
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +95 -19
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/query_index/lib/reindexer.js +43 -37
- package/dist/modules/query_index/lib/reindexer.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +34 -15
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/query_index/lib/subscriber-scope.js +2 -3
- package/dist/modules/query_index/lib/subscriber-scope.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js +17 -0
- package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js.map +7 -0
- package/dist/modules/query_index/subscribers/coverage_refresh.js +4 -0
- package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
- package/dist/modules/query_index/subscribers/delete_one.js +53 -1
- package/dist/modules/query_index/subscribers/delete_one.js.map +3 -3
- package/dist/modules/query_index/subscribers/upsert_one.js +60 -0
- package/dist/modules/query_index/subscribers/upsert_one.js.map +3 -3
- package/dist/modules/resources/api/resources.js +2 -0
- package/dist/modules/resources/api/resources.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +2 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/[id]/page.js +3 -2
- package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +2 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/commands/resources.js +9 -0
- package/dist/modules/resources/commands/resources.js.map +2 -2
- package/dist/modules/resources/components/detail/dictionaries.js +3 -3
- package/dist/modules/resources/components/detail/dictionaries.js.map +2 -2
- package/dist/modules/resources/data/entities.js +3 -0
- package/dist/modules/resources/data/entities.js.map +2 -2
- package/dist/modules/resources/data/validators.js +6 -2
- package/dist/modules/resources/data/validators.js.map +2 -2
- package/dist/modules/resources/extension-points.js +14 -0
- package/dist/modules/resources/extension-points.js.map +7 -0
- package/dist/modules/resources/lib/seeds.js +16 -9
- package/dist/modules/resources/lib/seeds.js.map +2 -2
- package/dist/modules/resources/migrations/Migration20260608231000.js +13 -0
- package/dist/modules/resources/migrations/Migration20260608231000.js.map +7 -0
- package/dist/modules/sales/analytics.js +7 -3
- package/dist/modules/sales/analytics.js.map +2 -2
- package/dist/modules/sales/api/document-history/route.js +2 -1
- package/dist/modules/sales/api/document-history/route.js.map +2 -2
- package/dist/modules/sales/api/documents/factory.js +14 -3
- package/dist/modules/sales/api/documents/factory.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +11 -3
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/create/page.js +11 -14
- package/dist/modules/sales/backend/sales/documents/create/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +184 -23
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +31 -11
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +12 -5
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +48 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +4 -1
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +167 -0
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +7 -0
- package/dist/modules/sales/components/useSalesChannelsEnabled.js +2 -35
- package/dist/modules/sales/components/useSalesChannelsEnabled.js.map +2 -2
- package/dist/modules/sales/data/validators.js +32 -5
- package/dist/modules/sales/data/validators.js.map +2 -2
- package/dist/modules/sales/di.js +7 -0
- package/dist/modules/sales/di.js.map +2 -2
- package/dist/modules/sales/events.js +1 -0
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/extension-points.js +36 -0
- package/dist/modules/sales/extension-points.js.map +7 -0
- package/dist/modules/sales/lib/historyHelpers.js +69 -1
- package/dist/modules/sales/lib/historyHelpers.js.map +2 -2
- package/dist/modules/sales/services/paymentOrderTotalResolver.js +52 -0
- package/dist/modules/sales/services/paymentOrderTotalResolver.js.map +7 -0
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +51 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/dist/modules/sales/workflows.js +10 -7
- package/dist/modules/sales/workflows.js.map +2 -2
- package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js +11 -1
- package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
- package/dist/modules/staff/api/interceptors.js +5 -3
- package/dist/modules/staff/api/interceptors.js.map +2 -2
- package/dist/modules/staff/api/leave-requests.js +45 -42
- package/dist/modules/staff/api/leave-requests.js.map +2 -2
- package/dist/modules/staff/components/detail/dictionaries.js +3 -3
- package/dist/modules/staff/components/detail/dictionaries.js.map +2 -2
- package/dist/modules/sync_excel/api/upload/route.js +15 -2
- package/dist/modules/sync_excel/api/upload/route.js.map +2 -2
- package/dist/modules/sync_excel/widgets/injection/upload-config/widget.client.js +1 -1
- package/dist/modules/sync_excel/widgets/injection/upload-config/widget.client.js.map +2 -2
- package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +1 -1
- package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +1 -1
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +5 -4
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +4 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +3 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +3 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +2 -1
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +3 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/wms/extension-points.js +26 -0
- package/dist/modules/wms/extension-points.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/[id]/page.js +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +3 -2
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +9 -6
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +10 -9
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +8 -7
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js +69 -13
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
- package/dist/modules/workflows/components/BusinessRulesSelector.js +1 -1
- package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +1 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialog.js +3 -3
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +4 -5
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js +2 -2
- package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TransitionsEditor.js +207 -165
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +1 -1
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowLegend.js +1 -1
- package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowSelector.js +1 -1
- package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +1 -1
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js +1 -1
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +1 -1
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +4 -4
- package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
- package/dist/modules/workflows/data/validators.js +34 -1
- package/dist/modules/workflows/data/validators.js.map +3 -3
- package/dist/modules/workflows/events.js +1 -0
- package/dist/modules/workflows/events.js.map +2 -2
- package/dist/modules/workflows/extension-points.js +15 -0
- package/dist/modules/workflows/extension-points.js.map +7 -0
- package/dist/modules/workflows/lib/activity-executor.js +59 -14
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/dist/modules/workflows/lib/format-validation-error.js +46 -1
- package/dist/modules/workflows/lib/format-validation-error.js.map +2 -2
- package/dist/modules/workflows/widgets/injection/order-approval/context-keys.js +10 -0
- package/dist/modules/workflows/widgets/injection/order-approval/context-keys.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +21 -10
- package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +2 -2
- package/generated/entities/attachment_quota_reservation/index.ts +15 -0
- package/generated/entities/customer_deal_person_link/index.ts +1 -0
- package/generated/entities/customer_user_invitation/index.ts +1 -0
- package/generated/entities/gateway_payment_operation/index.ts +1 -0
- package/generated/entities/gateway_transaction/index.ts +1 -0
- package/generated/entities/organization/index.ts +1 -0
- package/generated/entities/resources_resource/index.ts +1 -0
- package/generated/entities.ids.generated.ts +3 -1
- package/generated/entity-fields-registry.ts +23 -0
- package/package.json +19 -18
- package/src/bootstrap.ts +17 -2
- package/src/helpers/integration/salesFixtures.ts +34 -2
- package/src/helpers/integration/salesUi.ts +8 -0
- package/src/modules/api_keys/backend/api-keys/page.tsx +2 -1
- package/src/modules/api_keys/extension-points.ts +13 -0
- package/src/modules/api_keys/i18n/ko.json +42 -0
- package/src/modules/attachments/api/route.ts +130 -9
- package/src/modules/attachments/backend/config/attachments/page.tsx +1 -1
- package/src/modules/attachments/data/entities.ts +59 -0
- package/src/modules/attachments/di.ts +9 -1
- package/src/modules/attachments/fields/attachment.tsx +1 -1
- package/src/modules/attachments/i18n/de.json +15 -0
- package/src/modules/attachments/i18n/en.json +15 -0
- package/src/modules/attachments/i18n/es.json +15 -0
- package/src/modules/attachments/i18n/ko.json +175 -0
- package/src/modules/attachments/i18n/pl.json +15 -0
- package/src/modules/attachments/lib/drivers/index.ts +1 -1
- package/src/modules/attachments/lib/drivers/localDriver.ts +23 -8
- package/src/modules/attachments/lib/drivers/types.ts +5 -0
- package/src/modules/attachments/lib/quota-recovery-queue.ts +16 -0
- package/src/modules/attachments/lib/quota-service.ts +442 -0
- package/src/modules/attachments/lib/upload-limits.ts +35 -0
- package/src/modules/attachments/migrations/.snapshot-open-mercato.json +648 -120
- package/src/modules/attachments/migrations/Migration20260709234741_attachments.ts +12 -0
- package/src/modules/attachments/workers/quota-recovery.ts +68 -0
- package/src/modules/audit_logs/api/audit-logs/access/route.ts +5 -0
- package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +5 -0
- package/src/modules/audit_logs/api/audit-logs/actions/route.ts +5 -0
- package/src/modules/audit_logs/api/audit-logs/readScope.ts +28 -0
- package/src/modules/audit_logs/components/AccessLogsTable.tsx +2 -1
- package/src/modules/audit_logs/components/AuditLogsActions.tsx +3 -2
- package/src/modules/audit_logs/extension-points.ts +11 -0
- package/src/modules/audit_logs/i18n/ko.json +66 -0
- package/src/modules/auth/AGENTS.md +12 -8
- package/src/modules/auth/api/admin/nav.ts +28 -4
- package/src/modules/auth/api/profile/route.ts +8 -2
- package/src/modules/auth/api/users/route.ts +8 -28
- package/src/modules/auth/backend/auth/profile/page.tsx +1 -0
- package/src/modules/auth/backend/profile/change-password/page.tsx +1 -0
- package/src/modules/auth/backend/roles/page.tsx +2 -1
- package/src/modules/auth/backend/settings/page.tsx +17 -8
- package/src/modules/auth/backend/users/page.tsx +2 -1
- package/src/modules/auth/cli.ts +1 -1
- package/src/modules/auth/components/UserConsentsPanel.tsx +9 -9
- package/src/modules/auth/extension-points.ts +18 -0
- package/src/modules/auth/frontend/login.tsx +7 -3
- package/src/modules/auth/frontend/reset.tsx +2 -2
- package/src/modules/auth/i18n/de.json +1 -0
- package/src/modules/auth/i18n/en.json +1 -0
- package/src/modules/auth/i18n/es.json +1 -0
- package/src/modules/auth/i18n/ko.json +255 -0
- package/src/modules/auth/i18n/pl.json +1 -0
- package/src/modules/auth/lib/backendChrome.tsx +71 -33
- package/src/modules/auth/lib/setup-app.ts +21 -2
- package/src/modules/auth/lib/tenantAccess.ts +8 -0
- package/src/modules/auth/services/rbacService.ts +41 -46
- package/src/modules/business_rules/api/openmercato-call-options/route.ts +94 -0
- package/src/modules/business_rules/api/rules/route.ts +92 -4
- package/src/modules/business_rules/backend/rules/page.tsx +2 -1
- package/src/modules/business_rules/components/ActionBuilder.tsx +54 -5
- package/src/modules/business_rules/components/ActionRow.tsx +156 -18
- package/src/modules/business_rules/components/ConditionRow.tsx +9 -6
- package/src/modules/business_rules/components/utils/actionValidation.ts +6 -0
- package/src/modules/business_rules/events.ts +10 -0
- package/src/modules/business_rules/extension-points.ts +10 -0
- package/src/modules/business_rules/i18n/de.json +12 -0
- package/src/modules/business_rules/i18n/en.json +12 -0
- package/src/modules/business_rules/i18n/es.json +12 -0
- package/src/modules/business_rules/i18n/ko.json +396 -0
- package/src/modules/business_rules/i18n/pl.json +12 -0
- package/src/modules/business_rules/lib/action-executor.ts +198 -0
- package/src/modules/business_rules/lib/openmercato-call-options-types.ts +31 -0
- package/src/modules/business_rules/lib/openmercato-call-options.ts +297 -0
- package/src/modules/business_rules/lib/rule-engine.ts +4 -0
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +6 -5
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +7 -6
- package/src/modules/catalog/components/PriceKindSettings.tsx +3 -3
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -1
- package/src/modules/catalog/components/products/ProductCategorizeSection.tsx +3 -3
- package/src/modules/catalog/components/products/ProductMediaManager.tsx +1 -1
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +3 -2
- package/src/modules/catalog/components/products/VariantBuilder.tsx +5 -5
- package/src/modules/catalog/events.ts +1 -0
- package/src/modules/catalog/extension-points.ts +24 -0
- package/src/modules/catalog/i18n/de.json +18 -0
- package/src/modules/catalog/i18n/en.json +18 -0
- package/src/modules/catalog/i18n/es.json +18 -0
- package/src/modules/catalog/i18n/ko.json +723 -0
- package/src/modules/catalog/i18n/pl.json +18 -0
- package/src/modules/catalog/widgets/injection/product-bulk-delete/widget.ts +15 -5
- package/src/modules/catalog/widgets/injection/product-seo/widget.ts +1 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +69 -2
- package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +11 -1
- package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +17 -11
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +2 -1
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +8 -7
- package/src/modules/communication_channels/data/enrichers.ts +6 -26
- package/src/modules/communication_channels/extension-points.ts +17 -0
- package/src/modules/communication_channels/i18n/de.json +2 -2
- package/src/modules/communication_channels/i18n/en.json +2 -2
- package/src/modules/communication_channels/i18n/es.json +2 -2
- package/src/modules/communication_channels/i18n/ko.json +138 -0
- package/src/modules/communication_channels/i18n/pl.json +2 -2
- package/src/modules/communication_channels/lib/access-control.ts +3 -3
- package/src/modules/configs/backend/config/system-status/page.tsx +2 -1
- package/src/modules/configs/extension-points.ts +15 -0
- package/src/modules/configs/i18n/ko.json +197 -0
- package/src/modules/configs/lib/upgrade-actions.ts +14 -0
- package/src/modules/currencies/backend/currencies/page.tsx +2 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -1
- package/src/modules/currencies/di.ts +4 -1
- package/src/modules/currencies/extension-points.ts +11 -0
- 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/ko.json +160 -0
- package/src/modules/currencies/i18n/pl.json +1 -0
- package/src/modules/currencies/services/baseCurrencyService.ts +59 -0
- package/src/modules/customer_accounts/AGENTS.md +3 -3
- package/src/modules/customer_accounts/api/admin/users/[id].ts +16 -1
- package/src/modules/customer_accounts/api/admin/users-invite.ts +81 -3
- package/src/modules/customer_accounts/api/invitations/accept.ts +1 -2
- package/src/modules/customer_accounts/api/login.ts +4 -2
- package/src/modules/customer_accounts/api/magic-link/verify.ts +4 -2
- package/src/modules/customer_accounts/api/portal/feature-check.ts +5 -7
- package/src/modules/customer_accounts/api/portal/nav.ts +5 -3
- package/src/modules/customer_accounts/api/portal/profile.ts +5 -1
- package/src/modules/customer_accounts/api/portal/sessions-refresh.ts +3 -3
- package/src/modules/customer_accounts/api/portal/users-invite.ts +25 -1
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +2 -1
- package/src/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.tsx +2 -2
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +2 -1
- package/src/modules/customer_accounts/data/entities.ts +3 -0
- package/src/modules/customer_accounts/data/validators.ts +1 -0
- package/src/modules/customer_accounts/emails/CustomerInvitationEmail.tsx +45 -0
- package/src/modules/customer_accounts/extension-points.ts +11 -0
- package/src/modules/customer_accounts/i18n/de.json +6 -0
- package/src/modules/customer_accounts/i18n/en.json +6 -0
- package/src/modules/customer_accounts/i18n/es.json +6 -0
- package/src/modules/customer_accounts/i18n/ko.json +354 -0
- package/src/modules/customer_accounts/i18n/pl.json +6 -0
- package/src/modules/customer_accounts/lib/customerAuth.ts +8 -2
- package/src/modules/customer_accounts/lib/customerAuthServer.ts +1 -0
- package/src/modules/customer_accounts/lib/customerEntityOwnership.ts +68 -2
- package/src/modules/customer_accounts/lib/customerUrl.ts +27 -11
- package/src/modules/customer_accounts/lib/invitationEmail.ts +42 -0
- package/src/modules/customer_accounts/migrations/.snapshot-open-mercato.json +16 -0
- package/src/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.ts +13 -0
- package/src/modules/customer_accounts/services/customerInvitationService.ts +56 -3
- package/src/modules/customer_accounts/services/customerRbacService.ts +16 -3
- package/src/modules/customer_accounts/setup.ts +7 -0
- package/src/modules/customer_accounts/subscribers/autoLinkCrm.ts +75 -8
- package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +2 -2
- package/src/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.tsx +1 -3
- package/src/modules/customer_accounts/widgets/injection-table.ts +4 -1
- package/src/modules/customers/analytics.ts +3 -0
- package/src/modules/customers/api/companies/[id]/route.ts +3 -4
- package/src/modules/customers/api/deals/[id]/people/route.ts +3 -0
- package/src/modules/customers/api/deals/[id]/route.ts +10 -2
- package/src/modules/customers/api/deals/aggregate/route.ts +5 -4
- package/src/modules/customers/api/deals/summary/route.ts +15 -162
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +3 -2
- package/src/modules/customers/api/utils.ts +25 -37
- package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
- package/src/modules/customers/backend/customers/companies/page.tsx +2 -1
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +17 -5
- package/src/modules/customers/backend/customers/deals/[id]/hooks/types.ts +1 -0
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +19 -12
- package/src/modules/customers/backend/customers/deals/page.tsx +2 -1
- package/src/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.tsx +35 -3
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +11 -2
- package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -1
- package/src/modules/customers/backend/customers/people/page.tsx +2 -1
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +29 -10
- package/src/modules/customers/cli.ts +28 -11
- package/src/modules/customers/commands/deals.ts +50 -9
- package/src/modules/customers/commands/people.ts +3 -0
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -1
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/detail/ActiveDealCard.tsx +2 -1
- package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +2 -3
- package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +30 -7
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +6 -5
- package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +2 -2
- package/src/modules/customers/components/detail/DealDetailTabs.tsx +34 -9
- package/src/modules/customers/components/detail/DealForm.tsx +5 -1
- package/src/modules/customers/components/detail/DealsSection.tsx +1 -1
- package/src/modules/customers/components/detail/MiniWeekCalendar.tsx +8 -57
- package/src/modules/customers/components/detail/PersonDetailTabs.tsx +34 -9
- package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +29 -14
- package/src/modules/customers/components/detail/dashboard/helpers.ts +4 -3
- package/src/modules/customers/components/detail/legacyActivities.ts +79 -0
- package/src/modules/customers/components/formConfig.tsx +12 -8
- package/src/modules/customers/data/entities.ts +9 -1
- package/src/modules/customers/data/validators.ts +6 -1
- package/src/modules/customers/extension-points.ts +40 -0
- package/src/modules/customers/i18n/de.json +72 -0
- package/src/modules/customers/i18n/en.json +72 -0
- package/src/modules/customers/i18n/es.json +72 -0
- package/src/modules/customers/i18n/ko.json +2855 -0
- package/src/modules/customers/i18n/pl.json +72 -0
- package/src/modules/customers/lib/calendar/format.ts +10 -4
- package/src/modules/customers/lib/dealStatus.ts +48 -0
- package/src/modules/customers/lib/dealsSummaryQueries.ts +211 -0
- package/src/modules/customers/lib/optionalBaseCurrency.ts +34 -0
- package/src/modules/customers/lib/visibilityFilter.ts +7 -5
- package/src/modules/customers/migrations/.snapshot-open-mercato.json +27 -1
- package/src/modules/customers/migrations/Migration20260723210000_customers.ts +15 -0
- package/src/modules/customers/search.ts +59 -27
- package/src/modules/customers/utils/phoneDuplicates.ts +6 -3
- package/src/modules/dashboards/api/layout/[itemId]/route.ts +6 -3
- package/src/modules/dashboards/api/layout/route.ts +22 -9
- package/src/modules/dashboards/api/roles/widgets/route.ts +9 -3
- package/src/modules/dashboards/api/users/widgets/route.ts +9 -3
- package/src/modules/dashboards/api/widgets/catalog.ts +6 -3
- package/src/modules/dashboards/api/widgets/data/batch/route.ts +12 -1
- package/src/modules/dashboards/api/widgets/data/route.ts +29 -1
- package/src/modules/dashboards/api/widgets/data/schema.ts +49 -19
- package/src/modules/dashboards/components/UnlabelledAmountNotice.tsx +43 -0
- package/src/modules/dashboards/i18n/de.json +5 -0
- package/src/modules/dashboards/i18n/en.json +5 -0
- package/src/modules/dashboards/i18n/es.json +5 -0
- package/src/modules/dashboards/i18n/ko.json +118 -0
- package/src/modules/dashboards/i18n/pl.json +5 -0
- package/src/modules/dashboards/lib/access.ts +5 -3
- package/src/modules/dashboards/lib/aggregations.ts +198 -48
- package/src/modules/dashboards/lib/exactDecimal.ts +96 -0
- package/src/modules/dashboards/lib/formatters.ts +137 -12
- package/src/modules/dashboards/lib/optionalBaseCurrency.ts +22 -0
- package/src/modules/dashboards/services/widgetDataService.ts +453 -12
- package/src/modules/dashboards/subscribers/invalidateWidgetDataCache.ts +32 -0
- package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +9 -3
- package/src/modules/dashboards/widgets/dashboard/pipeline-summary/config.ts +86 -0
- package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.tsx +42 -21
- package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +9 -3
- package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +7 -2
- package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +25 -15
- package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +21 -11
- package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +9 -3
- package/src/modules/data_sync/AGENTS.md +1 -0
- package/src/modules/data_sync/api/mappings/[id]/route.ts +22 -9
- package/src/modules/data_sync/api/mappings/route.ts +13 -4
- package/src/modules/data_sync/api/options.ts +7 -2
- package/src/modules/data_sync/api/run.ts +7 -2
- package/src/modules/data_sync/api/runs/[id]/cancel.ts +8 -3
- package/src/modules/data_sync/api/runs/[id]/retry.ts +7 -2
- package/src/modules/data_sync/api/runs/[id]/route.ts +8 -3
- package/src/modules/data_sync/api/runs.ts +7 -2
- package/src/modules/data_sync/api/schedules/[id]/route.ts +19 -6
- package/src/modules/data_sync/api/schedules/route.ts +13 -4
- package/src/modules/data_sync/api/validate.ts +9 -4
- package/src/modules/data_sync/backend/data-sync/page.tsx +5 -4
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +5 -5
- package/src/modules/data_sync/extension-points.ts +10 -0
- package/src/modules/data_sync/i18n/ko.json +125 -0
- package/src/modules/data_sync/lib/adapter.ts +18 -0
- package/src/modules/data_sync/lib/queue-policy.ts +30 -0
- package/src/modules/data_sync/lib/queue.ts +19 -1
- package/src/modules/data_sync/lib/start-run.ts +2 -1
- package/src/modules/data_sync/lib/sync-engine.ts +46 -0
- package/src/modules/data_sync/lib/sync-run-service.ts +82 -1
- package/src/modules/data_sync/workers/sync-export.ts +8 -1
- package/src/modules/data_sync/workers/sync-import.ts +8 -1
- package/src/modules/design_system/AGENTS.md +34 -0
- package/src/modules/design_system/acl.ts +5 -0
- package/src/modules/design_system/backend/design-system/page.meta.ts +11 -0
- package/src/modules/design_system/backend/design-system/page.tsx +14 -0
- package/src/modules/design_system/gallery/components/CodeSnippet.tsx +55 -0
- package/src/modules/design_system/gallery/components/EntryCard.tsx +95 -0
- package/src/modules/design_system/gallery/components/GalleryShell.tsx +206 -0
- package/src/modules/design_system/gallery/components/VariantPreview.tsx +15 -0
- package/src/modules/design_system/gallery/entries/banners.tsx +226 -0
- package/src/modules/design_system/gallery/entries/buttons.tsx +422 -0
- package/src/modules/design_system/gallery/entries/charts.tsx +518 -0
- package/src/modules/design_system/gallery/entries/dates.tsx +325 -0
- package/src/modules/design_system/gallery/entries/detail.tsx +403 -0
- package/src/modules/design_system/gallery/entries/display.tsx +893 -0
- package/src/modules/design_system/gallery/entries/feedback.tsx +746 -0
- package/src/modules/design_system/gallery/entries/filters.tsx +570 -0
- package/src/modules/design_system/gallery/entries/foundations.tsx +529 -0
- package/src/modules/design_system/gallery/entries/icons.tsx +168 -0
- package/src/modules/design_system/gallery/entries/inputs.tsx +1516 -0
- package/src/modules/design_system/gallery/entries/messages.tsx +339 -0
- package/src/modules/design_system/gallery/entries/navigation.tsx +573 -0
- package/src/modules/design_system/gallery/entries/notifications.tsx +285 -0
- package/src/modules/design_system/gallery/entries/overlays.tsx +677 -0
- package/src/modules/design_system/gallery/entries/scaffolding.tsx +430 -0
- package/src/modules/design_system/gallery/entries/schedule.tsx +307 -0
- package/src/modules/design_system/gallery/registry.ts +152 -0
- package/src/modules/design_system/gallery/types.ts +32 -0
- package/src/modules/design_system/i18n/.hardcoded-allowlist.json +71 -0
- package/src/modules/design_system/i18n/de.json +58 -0
- package/src/modules/design_system/i18n/en.json +58 -0
- package/src/modules/design_system/i18n/es.json +58 -0
- package/src/modules/design_system/i18n/ko.json +58 -0
- package/src/modules/design_system/i18n/pl.json +58 -0
- package/src/modules/design_system/index.ts +7 -0
- package/src/modules/design_system/setup.ts +12 -0
- package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +39 -11
- package/src/modules/dictionaries/api/openapi.ts +19 -0
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +1 -1
- package/src/modules/dictionaries/components/hooks/useDictionaryEntries.ts +35 -36
- package/src/modules/dictionaries/data/validators.ts +14 -0
- package/src/modules/dictionaries/i18n/ko.json +130 -0
- package/src/modules/dictionaries/lib/clientEntries.ts +4 -3
- package/src/modules/dictionaries/lib/fetchAllEntries.ts +72 -0
- package/src/modules/directory/api/organization-branding/route.ts +12 -1
- package/src/modules/directory/api/organization-switcher/route.ts +97 -26
- package/src/modules/directory/api/organizations/route.ts +7 -0
- package/src/modules/directory/api/tenants/route.ts +9 -1
- package/src/modules/directory/backend/directory/branding/page.tsx +34 -9
- package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +10 -14
- package/src/modules/directory/backend/directory/organizations/page.tsx +2 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +2 -1
- package/src/modules/directory/commands/organizations.ts +9 -1
- package/src/modules/directory/commands/tenants.ts +6 -0
- package/src/modules/directory/data/entities.ts +3 -0
- package/src/modules/directory/data/validators.ts +2 -0
- package/src/modules/directory/extension-points.ts +11 -0
- package/src/modules/directory/i18n/de.json +4 -1
- package/src/modules/directory/i18n/en.json +4 -1
- package/src/modules/directory/i18n/es.json +4 -1
- package/src/modules/directory/i18n/ko.json +105 -0
- package/src/modules/directory/i18n/pl.json +4 -1
- package/src/modules/directory/migrations/.snapshot-open-mercato.json +18 -1
- package/src/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.ts +13 -0
- package/src/modules/directory/subscribers/invalidateOrgScopeCache.ts +4 -1
- package/src/modules/directory/utils/organizationScope.ts +9 -3
- package/src/modules/entities/api/definitions.ts +55 -3
- package/src/modules/entities/api/entities.ts +30 -2
- package/src/modules/entities/api/entity-settings.ts +66 -22
- package/src/modules/entities/api/records.ts +15 -31
- package/src/modules/entities/api/sidebar-entities.ts +43 -14
- package/src/modules/entities/backend/config/settings/page.meta.ts +34 -0
- package/src/modules/entities/backend/config/settings/page.tsx +12 -0
- package/src/modules/entities/backend/entities/user/[entityId]/page.tsx +1 -1
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +96 -75
- package/src/modules/entities/backend/entities/user/create/page.tsx +16 -7
- package/src/modules/entities/cli.ts +238 -21
- package/src/modules/entities/components/EntitySettingsManager.tsx +160 -0
- package/src/modules/entities/components/RecordListRelationCell.tsx +90 -0
- package/src/modules/entities/components/SystemEntitiesTable.tsx +2 -1
- package/src/modules/entities/components/UserEntitiesTable.tsx +2 -1
- package/src/modules/entities/components/recordListRelationDisplays.ts +109 -0
- package/src/modules/entities/extension-points.ts +18 -0
- package/src/modules/entities/i18n/de.json +9 -0
- package/src/modules/entities/i18n/en.json +9 -0
- package/src/modules/entities/i18n/es.json +9 -0
- package/src/modules/entities/i18n/ko.json +260 -0
- package/src/modules/entities/i18n/pl.json +9 -0
- package/src/modules/entities/lib/entityAcl.ts +98 -11
- package/src/modules/feature_toggles/components/FeatureGuard.tsx +9 -2
- package/src/modules/feature_toggles/components/FeatureToggleOverrideCard.tsx +1 -1
- package/src/modules/feature_toggles/components/hooks/staleTime.ts +5 -0
- package/src/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.ts +13 -1
- package/src/modules/feature_toggles/components/hooks/useFeatureFlagJson.ts +12 -3
- package/src/modules/feature_toggles/components/hooks/useFeatureFlagNumber.ts +10 -1
- package/src/modules/feature_toggles/components/hooks/useFeatureFlagString.ts +10 -1
- package/src/modules/feature_toggles/i18n/ko.json +96 -0
- package/src/modules/inbox_ops/ai-tools.ts +5 -3
- package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.ts +17 -1
- package/src/modules/inbox_ops/api/proposals/route.ts +20 -1
- package/src/modules/inbox_ops/api/webhook/inbound.ts +14 -12
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +6 -6
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +24 -19
- package/src/modules/inbox_ops/components/proposals/types.ts +1 -0
- package/src/modules/inbox_ops/i18n/de.json +3 -0
- package/src/modules/inbox_ops/i18n/en.json +3 -0
- package/src/modules/inbox_ops/i18n/es.json +3 -0
- package/src/modules/inbox_ops/i18n/ko.json +196 -0
- package/src/modules/inbox_ops/i18n/pl.json +3 -0
- package/src/modules/inbox_ops/search.ts +20 -4
- package/src/modules/inbox_ops/subscribers/search-reindex-proposal-created.ts +39 -0
- package/src/modules/integrations/api/[id]/credentials/route.ts +11 -5
- package/src/modules/integrations/api/[id]/health/route.ts +6 -3
- package/src/modules/integrations/api/[id]/route.ts +6 -3
- package/src/modules/integrations/api/[id]/state/route.ts +6 -3
- package/src/modules/integrations/api/[id]/version/route.ts +6 -3
- package/src/modules/integrations/api/logs/route.ts +6 -3
- package/src/modules/integrations/api/route.ts +6 -3
- package/src/modules/integrations/api/umes-read.ts +2 -2
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +2 -2
- package/src/modules/integrations/extension-points.ts +27 -0
- package/src/modules/integrations/i18n/ko.json +129 -0
- package/src/modules/integrations/lib/organization-scope.ts +5 -25
- package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -5
- package/src/modules/integrations/widgets/injection/external-ids/widget.ts +13 -0
- package/src/modules/messages/api/[id]/route.ts +21 -0
- package/src/modules/messages/api/route.ts +109 -9
- package/src/modules/messages/components/ComposeMessagePageClient.tsx +2 -1
- package/src/modules/messages/components/MessageDetailPageClient.tsx +3 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +2 -1
- package/src/modules/messages/components/message-detail/panels/dialogs.tsx +1 -1
- package/src/modules/messages/extension-points.ts +13 -0
- package/src/modules/messages/i18n/de.json +2 -0
- package/src/modules/messages/i18n/en.json +2 -0
- package/src/modules/messages/i18n/es.json +2 -0
- package/src/modules/messages/i18n/ko.json +263 -0
- package/src/modules/messages/i18n/pl.json +2 -0
- package/src/modules/messages/lib/participantScope.ts +64 -0
- package/src/modules/messages/lib/routeHelpers.ts +4 -6
- package/src/modules/messages/lib/searchLookup.ts +11 -34
- package/src/modules/messages/search.ts +11 -5
- package/src/modules/notifications/api/route.ts +123 -3
- package/src/modules/notifications/api/unread-count/route.ts +42 -5
- package/src/modules/notifications/di.ts +1 -1
- package/src/modules/notifications/events.ts +2 -0
- package/src/modules/notifications/i18n/ko.json +55 -0
- package/src/modules/notifications/lib/notificationRecipients.ts +6 -8
- package/src/modules/notifications/lib/notificationScope.ts +40 -0
- package/src/modules/notifications/lib/notificationService.ts +63 -1
- package/src/modules/notifications/lib/routeHelpers.ts +19 -2
- package/src/modules/payment_gateways/api/capture/route.ts +1 -1
- package/src/modules/payment_gateways/api/sessions/route.ts +6 -3
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +13 -1
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +3 -2
- package/src/modules/payment_gateways/data/entities.ts +13 -2
- package/src/modules/payment_gateways/di.ts +28 -2
- package/src/modules/payment_gateways/extension-points.ts +16 -0
- package/src/modules/payment_gateways/i18n/de.json +8 -1
- package/src/modules/payment_gateways/i18n/en.json +8 -1
- package/src/modules/payment_gateways/i18n/es.json +8 -1
- package/src/modules/payment_gateways/i18n/ko.json +87 -0
- package/src/modules/payment_gateways/i18n/pl.json +8 -1
- package/src/modules/payment_gateways/lib/capture-ledger.ts +260 -0
- package/src/modules/payment_gateways/lib/gateway-service.ts +114 -18
- package/src/modules/payment_gateways/lib/order-amount-reconciliation.ts +93 -0
- package/src/modules/payment_gateways/lib/payment-operation-idempotency.ts +1 -0
- package/src/modules/payment_gateways/lib/session-idempotency.ts +36 -0
- package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +44 -1
- package/src/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.ts +21 -0
- package/src/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.ts +17 -0
- package/src/modules/payment_gateways/setup.ts +62 -0
- package/src/modules/payment_gateways/workers/session-initialization-prune.ts +63 -0
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -4
- package/src/modules/planner/components/unavailabilityReasons.ts +3 -3
- package/src/modules/planner/i18n/ko.json +565 -0
- package/src/modules/portal/extension-points.ts +30 -0
- package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +3 -3
- package/src/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.ts +9 -0
- package/src/modules/portal/frontend/[orgSlug]/portal/invite/page.tsx +164 -0
- package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +4 -4
- package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +3 -3
- package/src/modules/portal/frontend/[orgSlug]/portal/profile/page.tsx +3 -3
- package/src/modules/portal/frontend/[orgSlug]/portal/reset-password/page.tsx +5 -5
- package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +4 -4
- package/src/modules/portal/frontend/[orgSlug]/portal/verify/page.tsx +1 -1
- package/src/modules/portal/i18n/de.json +18 -0
- package/src/modules/portal/i18n/en.json +18 -0
- package/src/modules/portal/i18n/es.json +18 -0
- package/src/modules/portal/i18n/ko.json +143 -0
- package/src/modules/portal/i18n/pl.json +18 -0
- package/src/modules/portal/lib/navigation.ts +3 -0
- package/src/modules/progress/AGENTS.md +11 -1
- package/src/modules/progress/i18n/ko.json +20 -0
- package/src/modules/progress/lib/progressService.ts +1 -0
- package/src/modules/progress/lib/progressServiceImpl.ts +385 -117
- package/src/modules/query_index/api/openapi.ts +12 -0
- package/src/modules/query_index/api/reindex.ts +15 -0
- package/src/modules/query_index/api/status.ts +238 -136
- package/src/modules/query_index/cli.ts +180 -1
- package/src/modules/query_index/components/QueryIndexesTable.tsx +194 -47
- package/src/modules/query_index/data/entities.ts +7 -0
- package/src/modules/query_index/di.ts +6 -0
- package/src/modules/query_index/events.ts +17 -0
- package/src/modules/query_index/extension-points.ts +10 -0
- package/src/modules/query_index/i18n/de.json +5 -3
- package/src/modules/query_index/i18n/en.json +5 -3
- package/src/modules/query_index/i18n/es.json +5 -3
- package/src/modules/query_index/i18n/ko.json +69 -0
- package/src/modules/query_index/i18n/pl.json +5 -3
- package/src/modules/query_index/lib/batch.ts +11 -4
- package/src/modules/query_index/lib/coverage.ts +47 -14
- package/src/modules/query_index/lib/document.ts +35 -4
- package/src/modules/query_index/lib/engine.ts +136 -59
- package/src/modules/query_index/lib/indexer.ts +130 -21
- package/src/modules/query_index/lib/reindexer.ts +62 -40
- package/src/modules/query_index/lib/search-tokens.ts +48 -16
- package/src/modules/query_index/lib/subscriber-scope.ts +2 -7
- package/src/modules/query_index/migrations/.snapshot-open-mercato.json +12 -0
- package/src/modules/query_index/migrations/Migration20260731105052_query_index.ts +35 -0
- package/src/modules/query_index/subscribers/coverage_refresh.ts +4 -0
- package/src/modules/query_index/subscribers/delete_one.ts +65 -1
- package/src/modules/query_index/subscribers/upsert_one.ts +68 -1
- package/src/modules/resources/api/resources.ts +2 -0
- package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -1
- package/src/modules/resources/backend/resources/resources/[id]/page.tsx +9 -3
- package/src/modules/resources/backend/resources/resources/page.tsx +2 -1
- package/src/modules/resources/commands/resources.ts +10 -0
- package/src/modules/resources/components/detail/dictionaries.ts +3 -3
- package/src/modules/resources/data/entities.ts +3 -0
- package/src/modules/resources/data/validators.ts +5 -0
- package/src/modules/resources/extension-points.ts +11 -0
- package/src/modules/resources/i18n/ko.json +770 -0
- package/src/modules/resources/lib/seeds.ts +16 -9
- package/src/modules/resources/migrations/.snapshot-open-mercato.json +17 -1
- package/src/modules/resources/migrations/Migration20260608231000.ts +13 -0
- package/src/modules/sales/analytics.ts +4 -0
- package/src/modules/sales/api/document-history/route.ts +1 -0
- package/src/modules/sales/api/documents/factory.ts +28 -3
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +11 -3
- package/src/modules/sales/backend/sales/documents/create/page.tsx +2 -4
- package/src/modules/sales/commands/documents.ts +298 -31
- package/src/modules/sales/components/documents/ItemsSection.tsx +34 -11
- package/src/modules/sales/components/documents/LineItemDialog.tsx +13 -5
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +48 -6
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +6 -1
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +198 -0
- package/src/modules/sales/components/documents/lineItemTypes.ts +1 -0
- package/src/modules/sales/components/useSalesChannelsEnabled.ts +2 -48
- package/src/modules/sales/data/validators.ts +59 -6
- package/src/modules/sales/di.ts +9 -0
- package/src/modules/sales/events.ts +1 -0
- package/src/modules/sales/extension-points.ts +33 -0
- package/src/modules/sales/i18n/de.json +22 -0
- package/src/modules/sales/i18n/en.json +22 -0
- package/src/modules/sales/i18n/es.json +22 -0
- package/src/modules/sales/i18n/ko.json +1442 -0
- package/src/modules/sales/i18n/pl.json +22 -0
- package/src/modules/sales/lib/historyHelpers.ts +88 -1
- package/src/modules/sales/services/paymentOrderTotalResolver.ts +67 -0
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +64 -3
- package/src/modules/sales/workflows.ts +10 -7
- package/src/modules/shipping_carriers/api/webhook/[provider]/route.ts +11 -1
- package/src/modules/shipping_carriers/i18n/ko.json +85 -0
- package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
- package/src/modules/staff/api/interceptors.ts +6 -4
- package/src/modules/staff/api/leave-requests.ts +54 -47
- package/src/modules/staff/components/detail/dictionaries.ts +3 -3
- package/src/modules/staff/i18n/ko.json +1162 -0
- package/src/modules/sync_excel/api/upload/route.ts +15 -2
- package/src/modules/sync_excel/i18n/ko.json +107 -0
- package/src/modules/sync_excel/widgets/injection/upload-config/widget.client.tsx +1 -1
- package/src/modules/translations/i18n/ko.json +45 -0
- package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +1 -1
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +5 -4
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +4 -3
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +3 -2
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +3 -2
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -1
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +3 -2
- package/src/modules/wms/extension-points.ts +23 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +1053 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +2 -2
- package/src/modules/workflows/backend/definitions/create/page.tsx +1 -1
- package/src/modules/workflows/backend/definitions/page.tsx +3 -2
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +16 -7
- package/src/modules/workflows/backend/instances/page.tsx +10 -9
- package/src/modules/workflows/backend/tasks/page.tsx +8 -7
- package/src/modules/workflows/components/ActivitiesEditor.tsx +98 -14
- package/src/modules/workflows/components/BusinessRulesSelector.tsx +1 -1
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +3 -3
- package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +1 -2
- package/src/modules/workflows/components/NodeEditDialog.tsx +3 -3
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +4 -5
- package/src/modules/workflows/components/StepsEditor.tsx +2 -2
- package/src/modules/workflows/components/TransitionsEditor.tsx +78 -20
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +1 -1
- package/src/modules/workflows/components/WorkflowLegend.tsx +1 -1
- package/src/modules/workflows/components/WorkflowSelector.tsx +1 -1
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -4
- package/src/modules/workflows/data/validators.ts +52 -1
- package/src/modules/workflows/events.ts +1 -0
- package/src/modules/workflows/extension-points.ts +12 -0
- package/src/modules/workflows/i18n/de.json +3 -0
- package/src/modules/workflows/i18n/en.json +3 -0
- package/src/modules/workflows/i18n/es.json +3 -0
- package/src/modules/workflows/i18n/ko.json +1204 -0
- package/src/modules/workflows/i18n/pl.json +3 -0
- package/src/modules/workflows/lib/activity-executor.ts +99 -20
- package/src/modules/workflows/lib/format-validation-error.ts +60 -0
- package/src/modules/workflows/widgets/injection/order-approval/context-keys.ts +18 -0
- package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +27 -11
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
import { AddressEditor } from "@open-mercato/core/modules/customers/components/AddressEditor";
|
|
52
52
|
import { useSalesChannelsEnabled } from "../useSalesChannelsEnabled.js";
|
|
53
53
|
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
54
|
+
import { SalesOrderDraftLines, createSalesOrderLineDraft } from "./SalesOrderDraftLines.js";
|
|
54
55
|
const logger = createLogger("sales");
|
|
55
56
|
function CustomerQuickCreate({ t, onCreated }) {
|
|
56
57
|
const [menuOpen, setMenuOpen] = React.useState(false);
|
|
@@ -645,6 +646,7 @@ function CustomerGroupComponent({ values, setValue, t, customers, setCustomers,
|
|
|
645
646
|
}
|
|
646
647
|
function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }) {
|
|
647
648
|
const t = useT();
|
|
649
|
+
const { organizationId, tenantId } = useOrganizationScopeDetail();
|
|
648
650
|
const { enabled: channelsEnabled } = useSalesChannelsEnabled();
|
|
649
651
|
const [customers, setCustomers] = React.useState([]);
|
|
650
652
|
const [customerLoading, setCustomerLoading] = React.useState(false);
|
|
@@ -1121,10 +1123,20 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
|
|
|
1121
1123
|
type: "textarea"
|
|
1122
1124
|
},
|
|
1123
1125
|
{
|
|
1124
|
-
id: "
|
|
1126
|
+
id: "lines",
|
|
1125
1127
|
label: "",
|
|
1126
1128
|
type: "custom",
|
|
1127
|
-
component: (
|
|
1129
|
+
component: ({ value, error, values, setValue }) => values?.documentKind === "order" ? /* @__PURE__ */ jsx(
|
|
1130
|
+
SalesOrderDraftLines,
|
|
1131
|
+
{
|
|
1132
|
+
currencyCode: typeof values.currencyCode === "string" ? values.currencyCode : defaultCurrency,
|
|
1133
|
+
organizationId: organizationId ?? null,
|
|
1134
|
+
tenantId: tenantId ?? null,
|
|
1135
|
+
lines: Array.isArray(value) ? value : [],
|
|
1136
|
+
error,
|
|
1137
|
+
onChange: (lines) => setValue(lines)
|
|
1138
|
+
}
|
|
1139
|
+
) : null
|
|
1128
1140
|
}
|
|
1129
1141
|
], [
|
|
1130
1142
|
addressFormat,
|
|
@@ -1133,6 +1145,9 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
|
|
|
1133
1145
|
addressesLoading,
|
|
1134
1146
|
channelsEnabled,
|
|
1135
1147
|
currencyLabels,
|
|
1148
|
+
defaultCurrency,
|
|
1149
|
+
organizationId,
|
|
1150
|
+
tenantId,
|
|
1136
1151
|
fetchCurrencyOptions,
|
|
1137
1152
|
loadAddresses,
|
|
1138
1153
|
loadChannels,
|
|
@@ -1151,6 +1166,7 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
|
|
|
1151
1166
|
},
|
|
1152
1167
|
{ id: "channels-comments", title: "", column: 1, fields: channelsEnabled ? ["channelId", "comments"] : ["comments"] },
|
|
1153
1168
|
{ id: "currency", title: "", column: 2, fields: ["currencyCode"] },
|
|
1169
|
+
{ id: "lines", title: "", column: 1, fields: ["lines"] },
|
|
1154
1170
|
{ id: "shipping", title: "", column: 2, fields: ["shippingAddressSection"] },
|
|
1155
1171
|
{ id: "billing", title: "", column: 2, fields: ["billingAddressSection"] },
|
|
1156
1172
|
{ id: "custom", title: t("sales.documents.form.customFields", "Custom fields"), column: 2, kind: "customFields" }
|
|
@@ -1171,6 +1187,21 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
|
|
|
1171
1187
|
channelId: inboxPreFill?.channelId || void 0,
|
|
1172
1188
|
customerEntityId: inboxPreFill?.customerEntityId || void 0,
|
|
1173
1189
|
comments: inboxPreFill?.comments || void 0,
|
|
1190
|
+
lines: (inboxPreFill?.lineItems ?? []).map((item, index) => {
|
|
1191
|
+
const unitPrice = Number(item.unitPrice ?? item.unitPriceGross ?? item.unitPriceNet ?? 0);
|
|
1192
|
+
const quantity = Number(item.quantity ?? 1);
|
|
1193
|
+
return createSalesOrderLineDraft({
|
|
1194
|
+
kind: item.kind || (item.productId ? "product" : "service"),
|
|
1195
|
+
productId: typeof item.productId === "string" ? item.productId : void 0,
|
|
1196
|
+
productVariantId: typeof item.productVariantId === "string" ? item.productVariantId : void 0,
|
|
1197
|
+
name: item.productName || item.name || `Line ${index + 1}`,
|
|
1198
|
+
quantity: Number.isFinite(quantity) ? quantity : 1,
|
|
1199
|
+
currencyCode: inboxPreFill?.currencyCode || defaultCurrency,
|
|
1200
|
+
unitPriceNet: Number.isFinite(unitPrice) ? unitPrice : 0,
|
|
1201
|
+
unitPriceGross: Number.isFinite(unitPrice) ? unitPrice : 0,
|
|
1202
|
+
metadata: item.productId ? void 0 : { customLine: true, lineMode: "custom" }
|
|
1203
|
+
});
|
|
1204
|
+
}),
|
|
1174
1205
|
useCustomShipping: false,
|
|
1175
1206
|
useCustomBilling: false,
|
|
1176
1207
|
sameAsShipping: true
|
|
@@ -1203,6 +1234,21 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
|
|
|
1203
1234
|
}
|
|
1204
1235
|
if (documentKind === "order") {
|
|
1205
1236
|
payload.orderNumber = documentNumber;
|
|
1237
|
+
const lines = Array.isArray(base.lines) ? base.lines : [];
|
|
1238
|
+
if (lines.length === 0) {
|
|
1239
|
+
const message = t("sales.orders.linesRequired", "Add at least one line item before creating the order.");
|
|
1240
|
+
throw createCrudFormError(message, { lines: message });
|
|
1241
|
+
}
|
|
1242
|
+
payload.lines = lines.map((line) => {
|
|
1243
|
+
const {
|
|
1244
|
+
orderId: _orderId,
|
|
1245
|
+
quoteId: _quoteId,
|
|
1246
|
+
organizationId: _organizationId,
|
|
1247
|
+
tenantId: _tenantId,
|
|
1248
|
+
...linePayload
|
|
1249
|
+
} = line.payload;
|
|
1250
|
+
return { ...linePayload, currencyCode: linePayload.currencyCode || payload.currencyCode };
|
|
1251
|
+
});
|
|
1206
1252
|
} else {
|
|
1207
1253
|
payload.quoteNumber = documentNumber;
|
|
1208
1254
|
}
|
|
@@ -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, type CrudFormGroupComponentProps } 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'\nimport { useSalesChannelsEnabled } from '../useSalesChannelsEnabled'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('sales')\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 addresses = Array.isArray(values.addresses) ? values.addresses : []\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 if (addresses.length) {\n const normalize = (value?: string | null) => {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length ? trimmed : undefined\n }\n for (const entry of addresses) {\n const normalizedLine1 = normalize(entry.addressLine1)\n if (!normalizedLine1) continue\n const body: Record<string, unknown> = {\n entityId: id,\n ...(organizationId ? { organizationId } : {}),\n addressLine1: normalizedLine1,\n isPrimary: entry.isPrimary ?? false,\n }\n const name = normalize(entry.name)\n if (name !== undefined) body.name = name\n const purpose = normalize(entry.purpose)\n if (purpose !== undefined) body.purpose = purpose\n const line2 = normalize(entry.addressLine2)\n if (line2 !== undefined) body.addressLine2 = line2\n const buildingNumber = normalize(entry.buildingNumber)\n if (buildingNumber !== undefined) body.buildingNumber = buildingNumber\n const flatNumber = normalize(entry.flatNumber)\n if (flatNumber !== undefined) body.flatNumber = flatNumber\n const city = normalize(entry.city)\n if (city !== undefined) body.city = city\n const region = normalize(entry.region)\n if (region !== undefined) body.region = region\n const postalCode = normalize(entry.postalCode)\n if (postalCode !== undefined) body.postalCode = postalCode\n const country = normalize(entry.country)\n if (country !== undefined) body.country = country.toUpperCase()\n if (typeof entry.latitude === 'number') body.latitude = entry.latitude\n if (typeof entry.longitude === 'number') body.longitude = entry.longitude\n try {\n await createCrud('customers/addresses', body)\n } catch (addressErr) {\n const message =\n (addressErr instanceof Error && addressErr.message ? addressErr.message : null) ||\n t('customers.people.detail.addresses.error')\n flash(message, 'error')\n }\n }\n }\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 logger.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 logger.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\ntype DocumentNumberFieldProps = CrudCustomFieldRenderProps & { t: Translator }\n\ntype BillingAddressSectionFieldProps = CrudCustomFieldRenderProps & {\n t: Translator\n addressesLoading: boolean\n addressOptions: AddressOption[]\n addressFormat: AddressFormatStrategy\n}\n\ntype CustomerGroupComponentProps = CrudFormGroupComponentProps & {\n t: Translator\n customers: CustomerOption[]\n setCustomers: React.Dispatch<React.SetStateAction<CustomerOption[]>>\n customerQuerySetter: React.MutableRefObject<((value: string) => void) | null>\n loadAddresses: (customerId?: string | null) => Promise<AddressOption[]>\n loadCustomers: (query?: string) => Promise<CustomerOption[]>\n fetchCustomerEmail: (id: string, kindHint?: 'person' | 'company') => Promise<string | null>\n resetAddressFormState: (updateValue: (key: string, value: unknown) => void) => void\n}\n\nfunction DocumentNumberField({ value, setValue, values, t }: DocumentNumberFieldProps) {\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 logger.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\nfunction BillingAddressSectionField({ values, setFormValue, t, addressesLoading, addressOptions, addressFormat }: BillingAddressSectionFieldProps) {\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\nfunction CustomerGroupComponent({ values, setValue, t, customers, setCustomers, customerQuerySetter, loadAddresses, loadCustomers, fetchCustomerEmail, resetAddressFormState }: CustomerGroupComponentProps) {\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) => { logger.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) => { logger.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\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const { enabled: channelsEnabled } = useSalesChannelsEnabled()\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 logger.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 logger.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 logger.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 logger.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 logger.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 logger.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 logger.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 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: (props) => <DocumentNumberField {...props} t={t} />,\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 ...(channelsEnabled ? [{\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 } satisfies CrudField] : []),\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: (props) => <BillingAddressSectionField {...props} t={t} addressesLoading={addressesLoading} addressOptions={addressOptions} addressFormat={addressFormat} />,\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 channelsEnabled,\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: (ctx) => <CustomerGroupComponent {...ctx} t={t} customers={customers} setCustomers={setCustomers} customerQuerySetter={customerQuerySetter} loadAddresses={loadAddresses} loadCustomers={loadCustomers} fetchCustomerEmail={fetchCustomerEmail} resetAddressFormState={resetAddressFormState} />,\n },\n { id: 'channels-comments', title: '', column: 1, fields: channelsEnabled ? ['channelId', 'comments'] : ['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 channelsEnabled,\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, type CrudFormGroupComponentProps } 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'\nimport { useSalesChannelsEnabled } from '../useSalesChannelsEnabled'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { SalesOrderDraftLines, createSalesOrderLineDraft, type SalesOrderLineDraft } from './SalesOrderDraftLines'\n\nconst logger = createLogger('sales')\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 lines?: SalesOrderLineDraft[]\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 addresses = Array.isArray(values.addresses) ? values.addresses : []\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 if (addresses.length) {\n const normalize = (value?: string | null) => {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length ? trimmed : undefined\n }\n for (const entry of addresses) {\n const normalizedLine1 = normalize(entry.addressLine1)\n if (!normalizedLine1) continue\n const body: Record<string, unknown> = {\n entityId: id,\n ...(organizationId ? { organizationId } : {}),\n addressLine1: normalizedLine1,\n isPrimary: entry.isPrimary ?? false,\n }\n const name = normalize(entry.name)\n if (name !== undefined) body.name = name\n const purpose = normalize(entry.purpose)\n if (purpose !== undefined) body.purpose = purpose\n const line2 = normalize(entry.addressLine2)\n if (line2 !== undefined) body.addressLine2 = line2\n const buildingNumber = normalize(entry.buildingNumber)\n if (buildingNumber !== undefined) body.buildingNumber = buildingNumber\n const flatNumber = normalize(entry.flatNumber)\n if (flatNumber !== undefined) body.flatNumber = flatNumber\n const city = normalize(entry.city)\n if (city !== undefined) body.city = city\n const region = normalize(entry.region)\n if (region !== undefined) body.region = region\n const postalCode = normalize(entry.postalCode)\n if (postalCode !== undefined) body.postalCode = postalCode\n const country = normalize(entry.country)\n if (country !== undefined) body.country = country.toUpperCase()\n if (typeof entry.latitude === 'number') body.latitude = entry.latitude\n if (typeof entry.longitude === 'number') body.longitude = entry.longitude\n try {\n await createCrud('customers/addresses', body)\n } catch (addressErr) {\n const message =\n (addressErr instanceof Error && addressErr.message ? addressErr.message : null) ||\n t('customers.people.detail.addresses.error')\n flash(message, 'error')\n }\n }\n }\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 logger.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 logger.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\ntype DocumentNumberFieldProps = CrudCustomFieldRenderProps & { t: Translator }\n\ntype BillingAddressSectionFieldProps = CrudCustomFieldRenderProps & {\n t: Translator\n addressesLoading: boolean\n addressOptions: AddressOption[]\n addressFormat: AddressFormatStrategy\n}\n\ntype CustomerGroupComponentProps = CrudFormGroupComponentProps & {\n t: Translator\n customers: CustomerOption[]\n setCustomers: React.Dispatch<React.SetStateAction<CustomerOption[]>>\n customerQuerySetter: React.MutableRefObject<((value: string) => void) | null>\n loadAddresses: (customerId?: string | null) => Promise<AddressOption[]>\n loadCustomers: (query?: string) => Promise<CustomerOption[]>\n fetchCustomerEmail: (id: string, kindHint?: 'person' | 'company') => Promise<string | null>\n resetAddressFormState: (updateValue: (key: string, value: unknown) => void) => void\n}\n\nfunction DocumentNumberField({ value, setValue, values, t }: DocumentNumberFieldProps) {\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 logger.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\nfunction BillingAddressSectionField({ values, setFormValue, t, addressesLoading, addressOptions, addressFormat }: BillingAddressSectionFieldProps) {\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\nfunction CustomerGroupComponent({ values, setValue, t, customers, setCustomers, customerQuerySetter, loadAddresses, loadCustomers, fetchCustomerEmail, resetAddressFormState }: CustomerGroupComponentProps) {\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) => { logger.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) => { logger.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\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const { organizationId, tenantId } = useOrganizationScopeDetail()\n const { enabled: channelsEnabled } = useSalesChannelsEnabled()\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 logger.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 logger.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 logger.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 logger.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 logger.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 logger.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 logger.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 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: (props) => <DocumentNumberField {...props} t={t} />,\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 ...(channelsEnabled ? [{\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 } satisfies CrudField] : []),\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: (props) => <BillingAddressSectionField {...props} t={t} addressesLoading={addressesLoading} addressOptions={addressOptions} addressFormat={addressFormat} />,\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'lines',\n label: '',\n type: 'custom',\n component: ({ value, error, values, setValue }) => values?.documentKind === 'order' ? (\n <SalesOrderDraftLines\n currencyCode={typeof values.currencyCode === 'string' ? values.currencyCode : defaultCurrency}\n organizationId={organizationId ?? null}\n tenantId={tenantId ?? null}\n lines={Array.isArray(value) ? value as SalesOrderLineDraft[] : []}\n error={error}\n onChange={(lines) => setValue(lines)}\n />\n ) : null,\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n channelsEnabled,\n currencyLabels,\n defaultCurrency,\n organizationId,\n tenantId,\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: (ctx) => <CustomerGroupComponent {...ctx} t={t} customers={customers} setCustomers={setCustomers} customerQuerySetter={customerQuerySetter} loadAddresses={loadAddresses} loadCustomers={loadCustomers} fetchCustomerEmail={fetchCustomerEmail} resetAddressFormState={resetAddressFormState} />,\n },\n { id: 'channels-comments', title: '', column: 1, fields: channelsEnabled ? ['channelId', 'comments'] : ['comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'lines', title: '', column: 1, fields: ['lines'] },\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 channelsEnabled,\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 lines: (inboxPreFill?.lineItems ?? []).map((item, index) => {\n const unitPrice = Number(item.unitPrice ?? item.unitPriceGross ?? item.unitPriceNet ?? 0)\n const quantity = Number(item.quantity ?? 1)\n return createSalesOrderLineDraft({\n kind: item.kind || (item.productId ? 'product' : 'service'),\n productId: typeof item.productId === 'string' ? item.productId : undefined,\n productVariantId: typeof item.productVariantId === 'string' ? item.productVariantId : undefined,\n name: item.productName || item.name || `Line ${index + 1}`,\n quantity: Number.isFinite(quantity) ? quantity : 1,\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n unitPriceNet: Number.isFinite(unitPrice) ? unitPrice : 0,\n unitPriceGross: Number.isFinite(unitPrice) ? unitPrice : 0,\n metadata: item.productId ? undefined : { customLine: true, lineMode: 'custom' },\n })\n }),\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 const lines = Array.isArray(base.lines) ? base.lines : []\n if (lines.length === 0) {\n const message = t('sales.orders.linesRequired', 'Add at least one line item before creating the order.')\n throw createCrudFormError(message, { lines: message })\n }\n payload.lines = lines.map((line) => {\n const {\n orderId: _orderId,\n quoteId: _quoteId,\n organizationId: _organizationId,\n tenantId: _tenantId,\n ...linePayload\n } = line.payload\n return { ...linePayload, currencyCode: linePayload.currencyCode || payload.currencyCode }\n })\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
|
}
|