@open-mercato/core 0.8.1-develop.7237.1.635faf2c7a → 0.8.1-develop.7239.1.d90c352076

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.
@@ -1,4 +1,4 @@
1
- [build:core] found 5047 entry points
1
+ [build:core] found 5048 entry points
2
2
  [build:core] built successfully
3
3
  [build:core:generated] found 233 entry points
4
4
  [build:core:generated] built successfully
@@ -49,11 +49,14 @@ import {
49
49
  formatAddressString
50
50
  } from "@open-mercato/core/modules/customers/utils/addressFormat";
51
51
  import { AddressEditor } from "@open-mercato/core/modules/customers/components/AddressEditor";
52
+ import { extensionPoints as customersExtensionPoints } from "@open-mercato/core/modules/customers/extension-points";
53
+ import { crudFormExtensionSpotId } from "@open-mercato/shared/modules/widgets/extension-points";
52
54
  import { useSalesChannelsEnabled } from "../useSalesChannelsEnabled.js";
53
55
  import { createLogger } from "@open-mercato/shared/lib/logger";
54
56
  import { SalesOrderDraftLines, createSalesOrderLineDraft } from "./SalesOrderDraftLines.js";
55
57
  import { normalizeAddressDraft } from "./normalizeAddressDraft.js";
56
58
  const logger = createLogger("sales");
59
+ const CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID = crudFormExtensionSpotId("customers.customer_entity");
57
60
  function CustomerQuickCreate({ t, onCreated }) {
58
61
  const [menuOpen, setMenuOpen] = React.useState(false);
59
62
  const [dialog, setDialog] = React.useState(null);
@@ -268,6 +271,8 @@ function CustomerQuickCreate({ t, onCreated }) {
268
271
  submitLabel: t("common.save", "Save"),
269
272
  cancelHref: void 0,
270
273
  onSubmit: (values) => handlePersonCreate(values),
274
+ injectionSpotId: customersExtensionPoints.hosts.personForm.spotId,
275
+ legacyInjectionSpotId: CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID,
271
276
  entityIds: [E.customers.customer_entity, E.customers.customer_person_profile]
272
277
  }
273
278
  )
@@ -302,6 +307,8 @@ function CustomerQuickCreate({ t, onCreated }) {
302
307
  submitLabel: t("common.save", "Save"),
303
308
  cancelHref: void 0,
304
309
  onSubmit: (values) => handleCompanyCreate(values),
310
+ injectionSpotId: customersExtensionPoints.hosts.companyForm.spotId,
311
+ legacyInjectionSpotId: CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID,
305
312
  entityIds: [E.customers.customer_entity, E.customers.customer_company_profile]
306
313
  }
307
314
  )
@@ -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'\nimport { SalesOrderDraftLines, createSalesOrderLineDraft, type SalesOrderLineDraft } from './SalesOrderDraftLines'\nimport { normalizeAddressDraft } from './normalizeAddressDraft'\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\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 showPhoneField\n showTaxIdField\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 showPhoneField\n showTaxIdField\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 rendersOwnError: true,\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 titleHeadingLevel={1}\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": ";AA+SM,SAiSE,UAxRA,KATF;AA7SN,YAAY,WAAW;AACvB,SAAS,gBAAuH;AAChI,SAAS,oBAA2C;AACpD,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,gCAAgC;AACzC,SAAS,2BAA2B;AACpC,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,OAGK;AACP,SAAS,WAAiB,MAAM,OAAO,iBAAiB;AACxD,SAAS,8BAA8B;AACvC,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,kCAAkC;AAC3C;AAAA,EACE;AAAA,OAGK;AACP,SAAS,qBAA8C;AACvD,SAAS,+BAA+B;AACxC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB,iCAA2D;AAC1F,SAAS,6BAA6B;AAEtC,MAAM,SAAS,aAAa,OAAO;AA2EnC,SAAS,oBAAoB,EAAE,GAAG,UAAU,GAA6B;AACvE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAsC,IAAI;AAC5E,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAwB,IAAI;AACpE,QAAM,UAAU,MAAM,OAA8B,IAAI;AACxD,QAAM,EAAE,eAAe,IAAI,2BAA2B;AACtD,QAAM,eAAe,MAAM,QAAQ,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACrE,QAAM,eAAe,MAAM,QAAQ,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AACvE,QAAM,eAAe,MAAM,QAAQ,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AACvE,QAAM,gBAAgB,MAAM,QAAQ,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACvE,QAAM,gBAAgB,MAAM,QAAQ,MAAM,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;AACzE,QAAM,gBAAgB,MAAM,QAAQ,MAAM,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzE,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AACf,UAAM,cAAc,CAAC,UAAsB;AACzC,UAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,SAAS,MAAM,MAAc,GAAG;AACtE,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,WAAW;AAClD,WAAO,MAAM,SAAS,oBAAoB,aAAa,WAAW;AAAA,EACpE,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,cAAU,IAAI;AACd,iBAAa,IAAI;AACjB,cAAU,KAAK;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,WAA6B;AAClC,gBAAU,IAAI;AACd,UAAI;AACF,cAAM,YAAY,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY,CAAC;AACxE,cAAM,UAAU,mBAAmB,QAAQ,cAAc;AACzD,cAAM,EAAE,OAAO,IAAI,MAAM,WAA+C,oBAAoB,SAAS;AAAA,UACnG,cAAc,EAAE,6CAA6C,4BAA4B;AAAA,QAC3F,CAAC;AACD,cAAM,KACH,UAAU,OAAO,OAAO,aAAa,YAAY,OAAO,YACxD,UAAU,OAAO,OAAO,OAAO,YAAY,OAAO,MACnD;AACF,YAAI,CAAC,GAAI,OAAM,IAAI,MAAM,qBAAqB;AAC9C,YAAI,UAAU,QAAQ;AACpB,gBAAM,YAAY,CAAC,UAA0B;AAC3C,gBAAI,OAAO,UAAU,SAAU,QAAO;AACtC,kBAAM,UAAU,MAAM,KAAK;AAC3B,mBAAO,QAAQ,SAAS,UAAU;AAAA,UACpC;AACA,qBAAW,SAAS,WAAW;AAC7B,kBAAM,kBAAkB,UAAU,MAAM,YAAY;AACpD,gBAAI,CAAC,gBAAiB;AACtB,kBAAM,OAAgC;AAAA,cACpC,UAAU;AAAA,cACV,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,cAC3C,cAAc;AAAA,cACd,WAAW,MAAM,aAAa;AAAA,YAChC;AACA,kBAAM,OAAO,UAAU,MAAM,IAAI;AACjC,gBAAI,SAAS,OAAW,MAAK,OAAO;AACpC,kBAAM,UAAU,UAAU,MAAM,OAAO;AACvC,gBAAI,YAAY,OAAW,MAAK,UAAU;AAC1C,kBAAM,QAAQ,UAAU,MAAM,YAAY;AAC1C,gBAAI,UAAU,OAAW,MAAK,eAAe;AAC7C,kBAAM,iBAAiB,UAAU,MAAM,cAAc;AACrD,gBAAI,mBAAmB,OAAW,MAAK,iBAAiB;AACxD,kBAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,gBAAI,eAAe,OAAW,MAAK,aAAa;AAChD,kBAAM,OAAO,UAAU,MAAM,IAAI;AACjC,gBAAI,SAAS,OAAW,MAAK,OAAO;AACpC,kBAAM,SAAS,UAAU,MAAM,MAAM;AACrC,gBAAI,WAAW,OAAW,MAAK,SAAS;AACxC,kBAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,gBAAI,eAAe,OAAW,MAAK,aAAa;AAChD,kBAAM,UAAU,UAAU,MAAM,OAAO;AACvC,gBAAI,YAAY,OAAW,MAAK,UAAU,QAAQ,YAAY;AAC9D,gBAAI,OAAO,MAAM,aAAa,SAAU,MAAK,WAAW,MAAM;AAC9D,gBAAI,OAAO,MAAM,cAAc,SAAU,MAAK,YAAY,MAAM;AAChE,gBAAI;AACF,oBAAM,WAAW,uBAAuB,IAAI;AAAA,YAC9C,SAAS,YAAY;AACnB,oBAAM,WACH,sBAAsB,SAAS,WAAW,UAAU,WAAW,UAAU,SAC1E,EAAE,yCAAyC;AAC7C,oBAAM,SAAS,OAAO;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AACA,cAAM,cACJ,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,KAAK,EAAE,SAChE,OAAO,YAAY,KAAK,IACxB,EAAE,iDAAiD,YAAY;AACrE,cAAM,EAAE,qDAAqD,mBAAmB,GAAG,SAAS;AAC5F,kBAAU;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN,OAAO,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe;AAAA,UACvE,OAAO;AAAA,UACP,UAAU,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe;AAAA,QAC5E,CAAC;AACD,oBAAY;AAAA,MACd,SAAS,KAAK;AACZ,eAAO,MAAM,sCAAsC,EAAE,IAAI,CAAC;AAC1D,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,6CAA6C,4BAA4B;AACjF,qBAAa,OAAO;AACpB,cAAM;AAAA,MACR,UAAE;AACA,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,aAAa,WAAW,gBAAgB,CAAC;AAAA,EAC5C;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,WAA8B;AACnC,gBAAU,IAAI;AACd,UAAI;AACF,cAAM,UAAU,oBAAoB,QAAQ,cAAc;AAC1D,cAAM,EAAE,OAAO,IAAI,MAAM,WAA+C,uBAAuB,SAAS;AAAA,UACtG,cAAc,EAAE,6CAA6C,4BAA4B;AAAA,QAC3F,CAAC;AACD,cAAM,KACH,UAAU,OAAO,OAAO,aAAa,YAAY,OAAO,YACxD,UAAU,OAAO,OAAO,OAAO,YAAY,OAAO,MACnD;AACF,YAAI,CAAC,GAAI,OAAM,IAAI,MAAM,qBAAqB;AAC9C,cAAM,cACJ,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,KAAK,EAAE,SAChE,OAAO,YAAY,KAAK,IACxB,EAAE,oDAAoD,aAAa;AACzE,cAAM,QAAQ,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe;AAC9E,cAAM,SACJ,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK,EAAE,SAAS,OAAO,OAAO,KAAK,IAAI;AAC5F,cAAM,EAAE,sDAAsD,mBAAmB,GAAG,SAAS;AAC7F,kBAAU;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP,UAAU,UAAU,SAAS;AAAA,QAC/B,CAAC;AACD,oBAAY;AAAA,MACd,SAAS,KAAK;AACZ,eAAO,MAAM,uCAAuC,EAAE,IAAI,CAAC;AAC3D,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,6CAA6C,4BAA4B;AACjF,qBAAa,OAAO;AACpB,cAAM;AAAA,MACR,UAAE;AACA,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,aAAa,WAAW,gBAAgB,CAAC;AAAA,EAC5C;AAEA,QAAM,aAAa,MACjB,qBAAC,SAAI,WAAU,iFACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,oBAAU,QAAQ;AAClB,sBAAY,KAAK;AACjB,uBAAa,IAAI;AAAA,QACnB;AAAA,QAEA;AAAA,8BAAC,aAAU,WAAU,iCAAgC;AAAA,UACpD,EAAE,2CAA2C,eAAe;AAAA;AAAA;AAAA,IAC/D;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,oBAAU,SAAS;AACnB,sBAAY,KAAK;AACjB,uBAAa,IAAI;AAAA,QACnB;AAAA,QAEA;AAAA,8BAAC,aAAU,WAAU,iCAAgC;AAAA,UACpD,EAAE,4CAA4C,gBAAgB;AAAA;AAAA;AAAA,IACjE;AAAA,KACF;AAGF,SACE,qBAAC,SAAI,WAAU,YAAW,KAAK,SAC7B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAS,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI;AAAA,QAC1C,iBAAe;AAAA,QAEf;AAAA,8BAAC,QAAK,WAAU,WAAU;AAAA,UACzB,EAAE,wCAAwC,iBAAiB;AAAA;AAAA;AAAA,IAC9D;AAAA,IACC,WAAW,WAAW,IAAI;AAAA,IAE3B,oBAAC,UAAO,MAAM,WAAW,UAAU,cAAc,CAAC,SAAU,OAAO,UAAU,QAAQ,IAAI,YAAY,GACnG,+BAAC,iBAAc,WAAU,6CACvB;AAAA,2BAAC,gBACC;AAAA,4BAAC,eAAa,YAAE,2CAA2C,eAAe,GAAE;AAAA,QAC5E,oBAAC,qBACE,YAAE,yDAAyD,yCAAyC,GACvG;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACZ;AAAA,oBAAY,oBAAC,OAAE,WAAU,4BAA4B,qBAAU,IAAO;AAAA,QACvE;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAC,UAAU;AACnB,oBAAM,gBAAgB;AACtB,kBAAI,OAAQ,MAAc,aAAa,6BAA6B,YAAY;AAC9E,gBAAC,MAAc,YAAY,yBAAyB;AAAA,cACtD;AAAA,YACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,eAAe,EAAE,WAAW,CAAC,EAAmC;AAAA,gBAChE,aAAa,EAAE,eAAe,MAAM;AAAA,gBACpC,YAAY;AAAA,gBACZ,UAAU,CAAC,WAAW,mBAAmB,MAAM;AAAA,gBAC/C,WAAW,CAAC,EAAE,UAAU,iBAAiB,EAAE,UAAU,uBAAuB;AAAA;AAAA,YAC9E;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAEA,oBAAC,UAAO,MAAM,WAAW,WAAW,cAAc,CAAC,SAAU,OAAO,UAAU,SAAS,IAAI,YAAY,GACrG,+BAAC,iBAAc,WAAU,6CACvB;AAAA,2BAAC,gBACC;AAAA,4BAAC,eAAa,YAAE,4CAA4C,gBAAgB,GAAE;AAAA,QAC9E,oBAAC,qBACE,YAAE,yDAAyD,0CAA0C,GACxG;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACZ;AAAA,oBAAY,oBAAC,OAAE,WAAU,4BAA4B,qBAAU,IAAO;AAAA,QACvE;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAC,UAAU;AACnB,oBAAM,gBAAgB;AACtB,kBAAI,OAAQ,MAAc,aAAa,6BAA6B,YAAY;AAC9E,gBAAC,MAAc,YAAY,yBAAyB;AAAA,cACtD;AAAA,YACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,eAAe,EAAE,WAAW,CAAC,EAAoC;AAAA,gBACjE,aAAa,EAAE,eAAe,MAAM;AAAA,gBACpC,YAAY;AAAA,gBACZ,UAAU,CAAC,WAAW,oBAAoB,MAAM;AAAA,gBAChD,WAAW,CAAC,EAAE,UAAU,iBAAiB,EAAE,UAAU,wBAAwB;AAAA;AAAA,YAC/E;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,qBAAqB,OAAkB,MAA8C;AAC5F,QAAM,SAA2B,CAAC;AAClC,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,YAAY,SAAS,KAAM;AAC/C,UAAM,SAAS;AACf,UAAM,KAAK,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK;AACvD,QAAI,CAAC,GAAI;AACT,UAAM,cACJ,OAAO,OAAO,iBAAiB,WAC3B,OAAO,eACP,OAAO,OAAO,SAAS,WACrB,OAAO,OACP;AACR,UAAM,QAAQ,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAChF,UAAM,SAAS,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;AACnF,UAAM,QAAQ,gBAAgB,SAAS,UAAU;AACjD,UAAM,WAAW,SAAS,WAAW,QAAQ,UAAU;AACvD,WAAO,KAAK,EAAE,IAAI,OAAO,GAAG,KAAK,IAAI,UAAU,MAAM,cAAc,MAAM,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAsBA,SAAS,oBAAoB,EAAE,OAAO,UAAU,QAAQ,EAAE,GAA6B;AACrF,QAAM,aAAc,UAAU,CAAC;AAC/B,QAAM,OAAqB,WAAW,iBAAiB,UAAU,UAAU;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,eAAe,MAAM,OAAsB,IAAI;AACrD,QAAM,cAAc,MAAM,OAA4B,IAAI;AAE1D,QAAM,gBAAgB,MAAM,YAAY,YAAY;AAClD,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,MAAM,QAA6C,+BAA+B;AAAA,QAC7F,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,MAC/B,CAAC;AACD,YAAM,aAAa,OAAO,KAAK,QAAQ,WAAW,WAAW,KAAK,OAAO,SAAS;AAClF,UAAI,KAAK,MAAM,YAAY;AACzB,qBAAa,UAAU;AACvB,oBAAY,UAAU;AACtB,iBAAS,UAAU;AAAA,MACrB,OAAO;AACL,iBAAS,KAAK,QAAQ,SAAS,EAAE,8CAA8C,uCAAuC,CAAC;AAAA,MACzH;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,kCAAkC,EAAE,IAAI,CAAC;AACtD,eAAS,EAAE,8CAA8C,uCAAuC,CAAC;AAAA,IACnG,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC;AAEtB,QAAM,UAAU,MAAM;AACpB,UAAM,UAAU,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI;AAC3D,QAAI,CAAC,QAAQ,UAAU,CAAC,YAAY,SAAS;AAC3C,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,kBAAY,UAAU;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,KAAK,CAAC;AAE/B,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,mEACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,UAChD,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,SAAS,eAAe,UAAU,SACvE,oBACG,EAAE,sCAAsC,kBAAa,IACrD,EAAE,sCAAsC,UAAU,GACxD;AAAA,OACF;AAAA,IACA,oBAAC,OAAE,WAAU,iCACV,mBAAS,UACN,EAAE,wCAAwC,2DAA2D,IACrG,EAAE,wCAAwC,2DAA2D,GAC3G;AAAA,IACC,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,KACjE;AAEJ;AAEA,SAAS,2BAA2B,EAAE,QAAQ,cAAc,GAAG,kBAAkB,gBAAgB,cAAc,GAAoC;AACjJ,QAAM,aAAc,UAAU,CAAC;AAC/B,QAAM,cAAc,iBAAiB,MAAM;AAAA,EAAC;AAC5C,QAAM,YAAY,WAAW,qBAAqB;AAClD,QAAM,aAAa,OAAO,WAAW,qBAAqB,WAAW,WAAW,mBAAmB;AACnG,QAAM,QAAS,WAAW,uBAAuB,CAAC;AAClD,QAAM,mBAAmB,CAAC,WAAW;AACrC,QAAM,iBAAiB,WAAW,mBAAmB;AACrD,QAAM,aAAa,OAAO,WAAW,sBAAsB,WAAW,WAAW,oBAAoB;AACrG,QAAM,gBAAiB,WAAW,wBAAwB,CAAC;AAC3D,QAAM,mBAAmB,KAAK,UAAU,aAAa;AACrD,QAAM,kBAAkB,KAAK,UAAU,KAAK;AAC5C,QAAM,oBAAoB,WAAW,sBAAsB;AAE3D,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,eAAgB;AACrB,SAAK,WAAW,oBAAoB,UAAU,YAAY;AACxD,kBAAY,oBAAoB,UAAU;AAAA,IAC5C;AACA,QAAI,uBAAuB,WAAW,qBAAqB,OAAO;AAChE,kBAAY,oBAAoB,iBAAiB;AAAA,IACnD;AACA,QAAI,qBAAqB,qBAAqB,iBAAiB;AAC7D,kBAAY,uBAAuB,aAAa;AAAA,IAClD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,sEACb;AAAA,2BAAC,SACC;AAAA,4BAAC,OAAE,WAAU,2BACV,YAAE,sCAAsC,iBAAiB,GAC5D;AAAA,QACA,oBAAC,OAAE,WAAU,iCACV,2BACG,EAAE,mDAAmD,4DAA4D,IACjH,EAAE,qCAAqC,wCAAwC,GACrF;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,+CAA+C,kBAAkB;AAAA,UAC1E,MAAI;AAAA,UACJ,SAAS;AAAA,UACT,iBAAiB,CAAC,YAAY;AAC5B,wBAAY,kBAAkB,OAAO;AACrC,gBAAI,SAAS;AACX,0BAAY,oBAAoB,iBAAiB;AACjD,0BAAY,oBAAoB,UAAU;AAC1C,0BAAY,uBAAuB,aAAa;AAAA,YAClD;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAEC,CAAC,iBACA,iCACG;AAAA,OAAC,YACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,cAAc;AAAA,UACrB,eAAe,CAAC,UAAU,YAAY,oBAAoB,SAAS,IAAI;AAAA,UACvE,UAAU,oBAAoB;AAAA,UAE9B;AAAA,gCAAC,iBACC;AAAA,cAAC;AAAA;AAAA,gBACC,aACE,mBACI,EAAE,wCAAwC,yBAAoB,IAC9D,EAAE,4CAA4C,gBAAgB;AAAA;AAAA,YAEtE,GACF;AAAA,YACA,oBAAC,iBACE,yBAAe,IAAI,CAAC,SAAS;AAC5B,oBAAM,cAAc,KAAK,UAAU,GAAG,KAAK,KAAK,WAAM,KAAK,OAAO,KAAK,KAAK;AAC5E,qBACE,oBAAC,cAAyB,OAAO,KAAK,IAAK,yBAA1B,KAAK,EAAiC;AAAA,YAE3D,CAAC,GACH;AAAA;AAAA;AAAA,MACF,IACE;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,wCAAwC,oBAAoB;AAAA,UACrE,MAAI;AAAA,UACJ,SAAS;AAAA,UACT,iBAAiB,CAAC,YAAY,YAAY,oBAAoB,OAAO;AAAA,UACrE,UAAU;AAAA;AAAA,MACZ;AAAA,MAEC,YACC,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,QAAQ;AAAA,YACR;AAAA,YACA,UAAU,CAAC,SAAS,YAAY,uBAAuB,IAAI;AAAA,YAC3D,mBAAiB;AAAA,YACjB,gBAAc;AAAA,YACd,gBAAc;AAAA;AAAA,QAChB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,oBAAmB;AAAA,YACnB,OAAO,EAAE,+CAA+C,mCAAmC;AAAA,YAC3F,MAAI;AAAA,YACJ,SAAS,WAAW,uBAAuB;AAAA,YAC3C,iBAAiB,CAAC,YAAY,YAAY,sBAAsB,OAAO;AAAA;AAAA,QACzE;AAAA,SACF,IACE;AAAA,OACN,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,uBAAuB,EAAE,QAAQ,UAAU,GAAG,WAAW,cAAc,qBAAqB,eAAe,eAAe,oBAAoB,sBAAsB,GAAgC;AAC3M,QAAM,aAAa,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AACrF,QAAM,EAAE,WAAW,SAAS,IAAI,uBAAuB,YAAY;AAAA,IACjE,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EACb,CAAC;AACD,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAI,WAAU,aACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAAmB;AAAA,QAC/E,UAAU,CAAC,SAAS;AAClB,cAAI,SAAS,OAAO,kBAAkB;AACpC,kCAAsB,QAAQ;AAAA,UAChC;AACA,mBAAS,oBAAoB,IAAI;AACjC,wBAAc,IAAI,EAAE,KAAK,CAAC,UAAU;AAClC,kBAAM,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS;AACnD,gBAAI,SAAS;AACX,uBAAS,qBAAqB,QAAQ,EAAE;AAAA,YAC1C;AAAA,UACF,CAAC,EAAE,MAAM,CAAC,QAAQ;AAAE,mBAAO,MAAM,qCAAqC,EAAE,IAAI,CAAC;AAAA,UAAE,CAAC;AAChF,cAAI,MAAM;AACR,kBAAM,QAAQ,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,IAAI;AACzD,kBAAM,gBACJ,OAAO,OAAO,iBAAiB,YAAY,MAAM,aAAa,SAC1D,MAAM,eACN;AACN,gBAAI,eAAe;AACjB,uBAAS,iBAAiB,aAAa;AAAA,YACzC,OAAO;AACL,iCAAmB,MAAM,OAAO,IAAI,EACjC,KAAK,CAAC,UAAU;AACf,oBAAI,MAAO,UAAS,iBAAiB,KAAK;AAAA,cAC5C,CAAC,EACA,MAAM,MAAM;AAAA,cAAC,CAAC;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,QACA,YAAY,OAAO,UAAU;AAC3B,gBAAM,UAAU,MAAM,cAAc,KAAK;AACzC,iBAAO,QAAQ,IAAsB,CAAC,SAAS;AAAA,YAC7C,IAAI,IAAI;AAAA,YACR,OAAO,IAAI;AAAA,YACX,UAAU,IAAI,YAAY;AAAA,YAC1B,MACE,IAAI,SAAS,WACX,oBAAC,aAAU,WAAU,iCAAgC,IAErD,oBAAC,aAAU,WAAU,iCAAgC;AAAA,UAE3D,EAAE;AAAA,QACJ;AAAA,QACA,YACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW,CAAC,EAAE,IAAI,OAAO,OAAO,MAAM,SAAS,MAAM;AAEnD,kCAAoB,UAAU,KAAK;AACnC,2BAAa,CAAC,SAAS;AACrB,sBAAM,SAAS,KAAK,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AACnD,oBAAI,OAAQ,QAAO;AACnB,sBAAM,OAAuB;AAAA,kBAC3B;AAAA,kBACA;AAAA,kBACA,UAAU,YAAY;AAAA,kBACtB;AAAA,kBACA,cAAc,SAAS;AAAA,gBACzB;AACA,uBAAO,CAAC,MAAM,GAAG,IAAI;AAAA,cACvB,CAAC;AACD,uBAAS,oBAAoB,EAAE;AAC/B,oCAAsB,QAAQ;AAC9B,4BAAc,EAAE,EAAE,KAAK,CAAC,UAAU;AAChC,sBAAM,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS;AACnD,oBAAI,SAAS;AACX,2BAAS,qBAAqB,QAAQ,EAAE;AAAA,gBAC1C;AAAA,cACF,CAAC,EAAE,MAAM,CAAC,QAAQ;AAAE,uBAAO,MAAM,qCAAqC,EAAE,IAAI,CAAC;AAAA,cAAE,CAAC;AAChF,kBAAI,SAAS,CAAC,OAAO,eAAe;AAClC,yBAAS,iBAAiB,KAAK;AAAA,cACjC;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEF,SAAS,CAAC,EAAE,SAAS,MAAM;AACzB,8BAAoB,UAAU;AAAA,QAChC;AAAA,QACA,mBAAmB,EAAE,6CAA6C,wBAAmB;AAAA,QACrF,cAAc,EAAE,yCAAyC,yBAAoB;AAAA,QAC7E,YAAY,EAAE,uCAAuC,qBAAqB;AAAA,QAC1E,mBAAmB,CAAC,OAAO,EAAE,0CAA0C,6BAA6B,EAAE,GAAG,CAAC;AAAA;AAAA,IAC5G,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,UAAU,SAAS,iBAAiB,MAAM,OAAO,KAAK;AAAA,UACjE,aAAa,EAAE,0CAA0C,6BAA6B;AAAA,UACtF,YAAY;AAAA;AAAA,MACd;AAAA,MACC,YACC,qBAAC,SAAI,WAAU,qGACb;AAAA,4BAAC,UACE,YAAE,8CAA8C,QAAW,EAAE,MAAM,UAAU,YAAY,CAAC,GAC7F;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,MAAK;AAAA,YACL,UAAU,OAAO,qBAAqB,UAAU;AAAA,YAChD,iBAAe,OAAO,qBAAqB,UAAU;AAAA,YACrD,SAAS,MAAM;AACb,uBAAS,oBAAoB,UAAU,EAAE;AACzC,oCAAsB,QAAQ;AAC9B,4BAAc,UAAU,EAAE;AAAA,YAC5B;AAAA,YAEC,iBAAO,qBAAqB,UAAU,KACnC,EAAE,8CAA8C,mBAAmB,IACnE,EAAE,6CAA6C,iBAAiB;AAAA;AAAA,QACtE;AAAA,SACF,IACE;AAAA,MACH,CAAC,aAAa,WACb,oBAAC,OAAE,WAAU,iCAAiC,YAAE,qCAAqC,GAAE,IACrF;AAAA,OACN;AAAA,KACF;AAEJ;AAEO,SAAS,kBAAkB,EAAE,WAAW,eAAe,OAAO,aAAa,aAAa,GAA2B;AACxH,QAAM,IAAI,KAAK;AACf,QAAM,EAAE,gBAAgB,SAAS,IAAI,2BAA2B;AAChE,QAAM,EAAE,SAAS,gBAAgB,IAAI,wBAAwB;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAA2B,CAAC,CAAC;AACrE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,KAAK;AAClE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA0B,CAAC,CAAC;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAS,KAAK;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAA0B,CAAC,CAAC;AAC9E,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,KAAK;AACpE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAwB,IAAI;AAC9E,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAgC,YAAY;AAC5F,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAiB,KAAK;AAC1E,QAAM,oBAAoB,MAAM,OAAO,CAAC;AACxC,QAAM,kBAAkB,MAAM,OAA+B,IAAI;AACjE,QAAM,oBAAoB,MAAM,OAA6C,IAAI;AACjF,QAAM,sBAAsB,MAAM,OAAyC,IAAI;AAC/E,QAAM,iBAAiB,MAAM,QAAgC,OAAO;AAAA,IAClE,aAAa,EAAE,6CAA6C,iBAAiB;AAAA,IAC7E,UAAU,EAAE,qCAAqC,cAAc;AAAA,IAC/D,WAAW,EAAE,wCAAwC,eAAe;AAAA,IACpE,aAAa,EAAE,6CAA6C,cAAc;AAAA,IAC1E,YAAY,EAAE,4CAA4C,eAAe;AAAA,IACzE,kBAAkB,EAAE,kDAAkD,UAAU;AAAA,IAChF,YAAY,EAAE,4CAA4C,OAAO;AAAA,IACjE,kBAAkB,EAAE,kDAAkD,cAAc;AAAA,IACpF,YAAY,EAAE,4CAA4C,2BAA2B;AAAA,IACrF,aAAa,EAAE,wCAAwC,QAAQ;AAAA,IAC/D,WAAW,EAAE,sCAAsC,MAAM;AAAA,IACzD,kBAAkB;AAAA,IAClB,oBAAoB,EAAE,yCAAyC,iBAAiB;AAAA,IAChF,WAAW,EAAE,2CAA2C,4BAA4B;AAAA,IACpF,WAAW,EAAE,2CAA2C,0BAA0B;AAAA,IAClF,cAAc,EAAE,yCAAyC,0BAAqB;AAAA,IAC9E,aAAa,EAAE,wCAAwC,4BAA4B;AAAA,EACrF,IAAI,CAAC,CAAC,CAAC;AACP,QAAM,EAAE,MAAM,oBAAoB,SAAS,0BAA0B,IAAI,sBAAsB;AAE/F,QAAM,uBAAuB,MAAM,YAAY,YAAyC;AACtF,QAAI;AACF,YAAM,SAAS,sBAAuB,MAAM,0BAA0B;AACtE,UAAI,UAAU,MAAM,QAAQ,OAAO,OAAO,GAAG;AAC3C,eAAO,OAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,UACpC,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,UACb,OAAO,MAAM,SAAS;AAAA,UACtB,MAAM,MAAM,QAAQ;AAAA,QACtB,EAAE;AAAA,MACJ;AACA,aAAO,CAAC;AAAA,IACV,SAAS,KAAK;AACZ,aAAO,MAAM,4BAA4B,EAAE,IAAI,CAAC;AAChD,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,oBAAoB,yBAAyB,CAAC;AAElD,QAAM,gBAAgB,MAAM,YAAY,OAAO,UAAmB;AAChE,uBAAmB,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,UAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,YAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5C,QAA+B,yBAAyB,OAAO,SAAS,CAAC,EAAE;AAAA,QAC3E,QAA+B,4BAA4B,OAAO,SAAS,CAAC,EAAE;AAAA,MAChF,CAAC;AACD,YAAM,cAAc,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,IAAI,CAAC;AACxF,YAAM,eAAe,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,QAAQ,SAAS,CAAC,IAAI,CAAC;AAC/F,YAAM,SAAS,CAAC,GAAG,qBAAqB,aAAa,QAAQ,GAAG,GAAG,qBAAqB,cAAc,SAAS,CAAC;AAChH,mBAAa,MAAM;AACnB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,aAAO,MAAM,iCAAiC,EAAE,IAAI,CAAC;AACrD,YAAM,EAAE,yCAAyC,2BAA2B,GAAG,OAAO;AACtF,aAAO,CAAC;AAAA,IACV,UAAE;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,CAAC,CAAC;AAEN,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,IAAY,aAA4D;AAC7E,UAAI;AACF,cAAM,OAAO,YAAY,UAAU,KAAK,CAACA,UAASA,MAAK,OAAO,EAAE,GAAG,QAAQ;AAC3E,cAAM,WAAW,SAAS,YAAY,6BAA6B;AACnE,cAAM,SAAS,IAAI,gBAAgB,EAAE,IAAI,UAAU,KAAK,MAAM,IAAI,CAAC;AACnE,cAAM,OAAO,MAAM,QAAoD,GAAG,QAAQ,IAAI,OAAO,SAAS,CAAC,EAAE;AACzG,YAAI,CAAC,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,CAAC,KAAK,OAAO,MAAM,OAAQ,QAAO;AACxF,cAAM,OAAO,KAAK,OAAO,MAAM,CAAC;AAChC,cAAM,QACH,OAAO,MAAM,kBAAkB,YAAY,KAAK,iBAChD,OAAQ,MAAc,iBAAiB,YAAa,KAAa,gBAClE;AACF,YAAI,OAAO;AACT;AAAA,YAAa,CAAC,SACZ,KAAK,IAAI,CAAC,UAAW,MAAM,OAAO,KAAK,EAAE,GAAG,OAAO,cAAc,MAAM,IAAI,KAAM;AAAA,UACnF;AAAA,QACF;AACA,eAAO,SAAS;AAAA,MAClB,SAAS,KAAK;AACZ,eAAO,MAAM,sCAAsC,EAAE,IAAI,CAAC;AAC1D,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,eAAe,MAAM,YAAY,OAAO,UAAmB;AAC/D,sBAAkB,IAAI;AACtB,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,UAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,YAAM,OAAO,MAAM;AAAA,QACjB,uBAAuB,OAAO,SAAS,CAAC;AAAA,MAC1C;AACA,UAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAChD,cAAM,UAAU,KAAK,OAAO,MACzB,IAAI,CAAC,SAAS;AACb,gBAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,cAAI,CAAC,GAAI,QAAO;AAChB,gBAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACtF,gBAAM,OAAO,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACrF,iBAAO,EAAE,IAAI,OAAO,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM;AAAA,QAC1D,CAAC,EACA,OAAO,CAAC,QAA8B,CAAC,CAAC,GAAG;AAC9C,YAAI,CAAC,MAAO,aAAY,OAAO;AAC/B,eAAO;AAAA,MACT,OAAO;AACL,oBAAY,CAAC,CAAC;AACd,eAAO,CAAC;AAAA,MACV;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,gCAAgC,EAAE,IAAI,CAAC;AACpD,kBAAY,CAAC,CAAC;AACd,aAAO,CAAC;AAAA,IACV,UAAE;AACA,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM,YAAY,YAAY;AACxD,QAAI;AACF,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,MACF;AACA,UAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,KAAK,OAAO,MAAM,QAAQ;AAC5E,cAAM,OAAO,KAAK,OAAO,MAAM,CAAC,GAAG;AACnC,YAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,QAAQ;AAClD,6BAAmB,KAAK,KAAK,EAAE,YAAY,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,uCAAuC,EAAE,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM,YAAY,OAAO,eAAyD;AACtG,sBAAkB,WAAW;AAC7B,UAAM,YAAY,kBAAkB;AAEpC,QAAI,kBAAkB,SAAS;AAC7B,mBAAa,kBAAkB,OAAO;AACtC,wBAAkB,UAAU;AAAA,IAC9B;AACA,QAAI,gBAAgB,SAAS;AAC3B,sBAAgB,QAAQ,MAAM;AAC9B,sBAAgB,UAAU;AAAA,IAC5B;AAEA,QAAI,CAAC,YAAY;AACf,wBAAkB,IAAI;AACtB,wBAAkB,CAAC,CAAC;AACpB,0BAAoB,KAAK;AACzB,aAAO,CAAC;AAAA,IACV;AACA,wBAAoB,IAAI;AACxB,sBAAkB,IAAI;AACtB,sBAAkB,CAAC,CAAC;AACpB,UAAM,aAAa,IAAI,gBAAgB;AACvC,oBAAgB,UAAU;AAC1B,sBAAkB,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,IAAM;AACvE,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,UAAU,WAAW,CAAC;AACtF,YAAM,OAAO,MAAM;AAAA,QACjB,4BAA4B,OAAO,SAAS,CAAC;AAAA,QAC7C,EAAE,QAAQ,WAAW,OAAO;AAAA,QAC5B,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,UAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAChD,cAAM,UAAU,KAAK,OAAO,MAAM,OAAwB,CAAC,KAAK,SAAS;AACvE,gBAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,cAAI,CAAC,GAAI,QAAO;AAChB,gBAAM,QAAsB;AAAA,YAC1B,cAAc,OAAO,KAAK,kBAAkB,WAAW,KAAK,gBAAgB;AAAA,YAC5E,cAAc,OAAO,KAAK,kBAAkB,WAAW,KAAK,gBAAgB;AAAA,YAC5E,gBAAgB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,YAClF,YAAY,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,YACtE,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,YAClD,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,YACxD,YAAY,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,YACtE,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,YAC3D,aAAa,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;AAAA,UAC3E;AACA,gBAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AAChE,gBAAM,UAAU,oBAAoB,OAAO,aAAa;AACxD,gBAAM,QAAQ,QAAQ,WAAW;AACjC,gBAAM,YAAY,KAAK,eAAe;AACtC,cAAI,KAAK,EAAE,IAAI,OAAO,SAAS,OAAO,MAAM,QAAQ,MAAM,UAAU,CAAC;AACrE,iBAAO;AAAA,QACT,GAAG,CAAC,CAAC;AACL,YAAI,kBAAkB,YAAY,WAAW;AAC3C,4BAAkB,OAAO;AAAA,QAC3B;AACA,eAAO;AAAA,MACT,OAAO;AACL,YAAI,kBAAkB,YAAY,WAAW;AAC3C,4BAAkB,CAAC,CAAC;AACpB;AAAA,YACE,EAAE,8CAA8C,2BAA2B;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAK,KAAsB,SAAS,cAAc;AAChD,eAAO,MAAM,iCAAiC,EAAE,IAAI,CAAC;AAAA,MACvD;AACA,UAAI,kBAAkB,YAAY,WAAW;AAC3C,0BAAkB,CAAC,CAAC;AACpB,YAAK,KAAsB,SAAS,cAAc;AAChD;AAAA,YACE,EAAE,8CAA8C,2BAA2B;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAI,kBAAkB,SAAS;AAC7B,qBAAa,kBAAkB,OAAO;AACtC,0BAAkB,UAAU;AAAA,MAC9B;AACA,UAAI,gBAAgB,YAAY,YAAY;AAC1C,wBAAgB,UAAU;AAAA,MAC5B;AACA,UAAI,kBAAkB,YAAY,WAAW;AAC3C,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV,GAAG,CAAC,eAAe,CAAC,CAAC;AAErB,QAAM,UAAU,MAAM;AACpB,kBAAc,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC9B,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC7B,wBAAoB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACtC,GAAG,CAAC,cAAc,eAAe,mBAAmB,CAAC;AAErD,QAAM;AAAA,IACJ,MAAM,MAAM;AACV,UAAI,gBAAgB,SAAS;AAC3B,wBAAgB,QAAQ,MAAM;AAC9B,wBAAgB,UAAU;AAAA,MAC5B;AACA,UAAI,kBAAkB,SAAS;AAC7B,qBAAa,kBAAkB,OAAO;AACtC,0BAAkB,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,MAAM;AACpB;AAAA,MAAkB,CAAC,SACjB,KAAK,IAAI,CAAC,UAAU;AAClB,cAAM,UAAU,oBAAoB,MAAM,OAAO,aAAa;AAC9D,cAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,KAAK,EAAE,SAAS,MAAM,OAAO,OAAO,WAAW,MAAM;AAC7F,eAAO,EAAE,GAAG,OAAO,SAAS,MAAM;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,mBAAe,qBAAqB;AAClC,UAAI;AACF,cAAM,OAAO,MAAM,QAAoC,wCAAwC;AAC/F,cAAM,SAAS,OAAO,KAAK,QAAQ,kBAAkB,WAAW,KAAK,OAAO,gBAAgB;AAC5F,YAAI,CAAC,cAAc,WAAW,kBAAkB,WAAW,eAAe;AACxE,2BAAiB,MAAM;AAAA,QACzB;AAAA,MACF,SAAS,KAAK;AACZ,eAAO,MAAM,iCAAiC,EAAE,IAAI,CAAC;AAAA,MACvD,UAAE;AAAA,MACF;AAAA,IACF;AACA,uBAAmB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnC,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwB,MAAM;AAAA,IAClC,CAAC,gBAAuD;AACtD,kBAAY,qBAAqB,IAAI;AACrC,kBAAY,oBAAoB,IAAI;AACpC,kBAAY,wBAAwB,MAAS;AAC7C,kBAAY,uBAAuB,MAAS;AAC5C,kBAAY,qBAAqB,KAAK;AACtC,kBAAY,oBAAoB,KAAK;AACrC,kBAAY,uBAAuB,KAAK;AACxC,kBAAY,sBAAsB,KAAK;AACvC,kBAAY,kBAAkB,IAAI;AAAA,IACpC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM,QAAqB,MAAM;AAAA,IAC9C;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW,CAAC,EAAE,OAAO,SAAS,MAAM;AAClC,cAAM,UAAU,UAAU,UAAU,UAAU;AAC9C,cAAM,QAAQ,EAAE,6BAA6B,eAAe;AAC5D,eACE,qBAAC,SAAI,WAAU,kBACb;AAAA,+BAAC,SAAI,WAAU,2CACb;AAAA,gCAAC,SAAI,WAAU,yCAAyC,iBAAM;AAAA,YAC9D,oBAAC,SAAI,WAAU,6DACX,WAAC,SAAS,OAAO,EAAqB,IAAI,CAAC,SAC3C;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,YAAY,OAAO,YAAY;AAAA,gBACxC,SAAS,MAAM,SAAS,IAAI;AAAA,gBAE3B,YAAE,6BAA6B,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA;AAAA,cAL/E;AAAA,YAMP,CACD,GACH;AAAA,aACF;AAAA,UACA,oBAAC,OAAE,WAAU,iCACV;AAAA,YACC;AAAA,YACA;AAAA,UACF,GACF;AAAA,WACF;AAAA,MAEJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,+BAA+B,iBAAiB;AAAA,MACzD,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW,CAAC,UAAU,oBAAC,uBAAqB,GAAG,OAAO,GAAM;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,iCAAiC,UAAU;AAAA,MACpD,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW,CAAC,EAAE,OAAO,SAAS,MAC5B;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,SAAS,SAAS,QAAQ,EAAE;AAAA,UACvC,cAAc;AAAA,UACd,mBAAmB;AAAA,UACnB,YAAW;AAAA,UACX,iBAAgB;AAAA,UAChB,aAAY;AAAA,UACZ,QAAQ;AAAA;AAAA,MACV;AAAA,IAEJ;AAAA,IACA,GAAI,kBAAkB,CAAC;AAAA,MACrB,IAAI;AAAA,MACJ,OAAO,EAAE,gCAAgC,eAAe;AAAA,MACxD,MAAM;AAAA,MACN,WAAW,CAAC,EAAE,OAAO,SAAS,MAC5B;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,UACjC,YAAY,OAAO,UAAU;AAC3B,kBAAM,UAAU,MAAM,aAAa,KAAK;AACxC,mBAAO,QAAQ,IAAsB,CAAC,SAAS;AAAA,cAC7C,IAAI,IAAI;AAAA,cACR,OAAO,IAAI;AAAA,cACX,MAAM,oBAAC,SAAM,WAAU,iCAAgC;AAAA,YACzD,EAAE;AAAA,UACJ;AAAA,UACA,mBAAmB,EAAE,4CAA4C,kBAAkB;AAAA,UACnF,cAAc,EAAE,wCAAwC,wBAAmB;AAAA,UAC3E,YAAY,EAAE,sCAAsC,oBAAoB;AAAA,UACxE,mBAAmB,CAAC,OAAO,EAAE,yCAAyC,4BAA4B,EAAE,GAAG,CAAC;AAAA;AAAA,MAC1G;AAAA,IAEJ,CAAqB,IAAI,CAAC;AAAA,IAC1B;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,EAAE,QAAQ,aAAa,MAAM;AACvC,cAAM,aAAc,UAAU,CAAC;AAC/B,cAAM,cAAc,iBAAiB,MAAM;AAAA,QAAC;AAC5C,cAAM,YAAY,WAAW,sBAAsB;AACnD,cAAM,aAAa,OAAO,WAAW,sBAAsB,WAAW,WAAW,oBAAoB;AACrG,cAAM,QAAS,WAAW,wBAAwB,CAAC;AACnD,cAAM,mBAAmB,CAAC,WAAW;AACrC,cAAM,aAAa,OAAO,WAAW,qBAAqB,WAAW,WAAW,mBAAmB;AACnG,eACE,qBAAC,SAAI,WAAU,aACb;AAAA,+BAAC,SAAI,WAAU,sEACb;AAAA,iCAAC,SACC;AAAA,kCAAC,OAAE,WAAU,2BACV,YAAE,uCAAuC,kBAAkB,GAC9D;AAAA,cACA,oBAAC,OAAE,WAAU,iCACV,6BACG,EAAE,iDAAiD,gDAAgD,IACnG,EAAE,sCAAsC,wCAAwC,GACtF;AAAA,eACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,wCAAwC,oBAAoB;AAAA,gBACrE,MAAI;AAAA,gBACJ,SAAS;AAAA,gBACT,iBAAiB,CAAC,YAAY,YAAY,qBAAqB,OAAO;AAAA;AAAA,YACxE;AAAA,aACF;AAAA,UACC,CAAC,YACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,cAAc;AAAA,cACrB,eAAe,CAAC,UAAU,YAAY,qBAAqB,SAAS,IAAI;AAAA,cACxE,UAAU,oBAAoB;AAAA,cAE9B;AAAA,oCAAC,iBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,aACE,mBACI,EAAE,wCAAwC,yBAAoB,IAC9D,EAAE,4CAA4C,gBAAgB;AAAA;AAAA,gBAEtE,GACF;AAAA,gBACA,oBAAC,iBACE,yBAAe,IAAI,CAAC,SAAS;AAC5B,wBAAM,cAAc,KAAK,UAAU,GAAG,KAAK,KAAK,WAAM,KAAK,OAAO,KAAK,KAAK;AAC5E,yBACE,oBAAC,cAAyB,OAAO,KAAK,IAAK,yBAA1B,KAAK,EAAiC;AAAA,gBAE3D,CAAC,GACH;AAAA;AAAA;AAAA,UACF,IACE;AAAA,UACH,YACC,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR;AAAA,gBACA,UAAU,CAAC,SAAS,YAAY,wBAAwB,IAAI;AAAA,gBAC5D,mBAAiB;AAAA,gBACjB,gBAAc;AAAA,gBACd,gBAAc;AAAA;AAAA,YAChB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,oBAAmB;AAAA,gBACnB,OAAO,EAAE,+CAA+C,mCAAmC;AAAA,gBAC3F,MAAI;AAAA,gBACJ,SAAS,WAAW,wBAAwB;AAAA,gBAC5C,iBAAiB,CAAC,YAAY,YAAY,uBAAuB,OAAO;AAAA;AAAA,YAC1E;AAAA,aACF,IACE;AAAA,UACH,kBAAkB,aACjB,qBAAC,SAAI,WAAU,mIACb;AAAA,gCAAC,UAAK,WAAU,UAAU,0BAAe;AAAA,YACzC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS,MAAM,cAAc,UAAU;AAAA,gBACvC,UAAU;AAAA,gBACV,WAAU;AAAA,gBAET,YAAE,gCAAgC,WAAW;AAAA;AAAA,YAChD;AAAA,aACF,IACE;AAAA,WACN;AAAA,MAEJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,UAAU,oBAAC,8BAA4B,GAAG,OAAO,GAAM,kBAAoC,gBAAgC,eAA8B;AAAA,IACvK;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,iCAAiC,UAAU;AAAA,MACpD,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,WAAW,CAAC,EAAE,OAAO,OAAO,QAAQ,SAAS,MAAM,QAAQ,iBAAiB,UAC1E;AAAA,QAAC;AAAA;AAAA,UACC,cAAc,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe;AAAA,UAC9E,gBAAgB,kBAAkB;AAAA,UAClC,UAAU,YAAY;AAAA,UACtB,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAiC,CAAC;AAAA,UAChE;AAAA,UACA,UAAU,CAAC,UAAU,SAAS,KAAK;AAAA;AAAA,MACrC,IACE;AAAA,IACN;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM,QAAyB,MAAM;AAAA,IAClD,EAAE,IAAI,WAAW,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,gBAAgB,EAAE;AAAA,IAClF;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,CAAC;AAAA,MACT,WAAW,CAAC,QAAQ,oBAAC,0BAAwB,GAAG,KAAK,GAAM,WAAsB,cAA4B,qBAA0C,eAA8B,eAA8B,oBAAwC,uBAA8C;AAAA,IAC3S;AAAA,IACA,EAAE,IAAI,qBAAqB,OAAO,IAAI,QAAQ,GAAG,QAAQ,kBAAkB,CAAC,aAAa,UAAU,IAAI,CAAC,UAAU,EAAE;AAAA,IACpH,EAAE,IAAI,YAAY,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE;AAAA,IACjE,EAAE,IAAI,SAAS,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE;AAAA,IACvD,EAAE,IAAI,YAAY,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,wBAAwB,EAAE;AAAA,IAC3E,EAAE,IAAI,WAAW,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,EAAE;AAAA,IACzE,EAAE,IAAI,UAAU,OAAO,EAAE,qCAAqC,eAAe,GAAG,QAAQ,GAAG,MAAM,eAAe;AAAA,EAClH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,MAAM;AAAA,IAC1B,OAAO;AAAA,MACL,cAAc,gBAAgB,UAAU,UAAU;AAAA,MAClD,gBAAgB;AAAA,MAChB,cAAc,cAAc,gBAAgB;AAAA,MAC5C,WAAW,cAAc,aAAa;AAAA,MACtC,kBAAkB,cAAc,oBAAoB;AAAA,MACpD,UAAU,cAAc,YAAY;AAAA,MACpC,QAAQ,cAAc,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,UAAU;AAC1D,cAAM,YAAY,OAAO,KAAK,aAAa,KAAK,kBAAkB,KAAK,gBAAgB,CAAC;AACxF,cAAM,WAAW,OAAO,KAAK,YAAY,CAAC;AAC1C,eAAO,0BAA0B;AAAA,UAC/B,MAAM,KAAK,SAAS,KAAK,YAAY,YAAY;AAAA,UACjD,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,UACjE,kBAAkB,OAAO,KAAK,qBAAqB,WAAW,KAAK,mBAAmB;AAAA,UACtF,MAAM,KAAK,eAAe,KAAK,QAAQ,QAAQ,QAAQ,CAAC;AAAA,UACxD,UAAU,OAAO,SAAS,QAAQ,IAAI,WAAW;AAAA,UACjD,cAAc,cAAc,gBAAgB;AAAA,UAC5C,cAAc,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,UACvD,gBAAgB,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,UACzD,UAAU,KAAK,YAAY,SAAY,EAAE,YAAY,MAAM,UAAU,SAAS;AAAA,QAChF,CAAC;AAAA,MACH,CAAC;AAAA,MACD,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAClB;AAAA,IACA,CAAC,aAAa,cAAc,eAAe;AAAA,EAC7C;AAGA,QAAM,UAAU,MAAM;AACpB,QAAI,cAAc,kBAAkB;AAClC,oBAAc,aAAa,gBAAgB;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,cAAc,kBAAkB,aAAa,CAAC;AAElD,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO,WAAoC;AACzC,YAAM,aAAa,UAAU,CAAC;AAC9B,YAAM,eAAe,yBAAyB,UAAU;AACxD,YAAM,OAAO,OAAO;AAAA,QAClB,OAAO,QAAQ,UAAU,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,KAAK,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC;AAAA,MAC/F;AACA,YAAM,eAA6B,KAAK,iBAAiB,UAAU,UAAU;AAC7E,YAAM,UAAmC;AAAA,QACvC,cAAc,OAAO,KAAK,iBAAiB,YAAY,KAAK,aAAa,KAAK,EAAE,SAC5E,KAAK,aAAa,KAAK,EAAE,YAAY,IACrC;AAAA,QACJ,kBAAkB,KAAK,oBAAoB;AAAA,QAC3C,UAAU,KAAK,YAAY;AAAA,QAC3B,UAAU,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI;AAAA,MACzE;AACA,cAAQ,YAAY,KAAK,aAAa;AACtC,YAAM,iBAAiB,OAAO,KAAK,mBAAmB,WAAW,KAAK,eAAe,KAAK,IAAI;AAC9F,UAAI,CAAC,gBAAgB;AACnB,cAAM,oBAAoB,EAAE,8CAA8C,8BAA8B,CAAC;AAAA,MAC3G;AACA,UAAI,iBAAiB,SAAS;AAC5B,gBAAQ,cAAc;AACtB,cAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,YAAI,MAAM,WAAW,GAAG;AACtB,gBAAM,UAAU,EAAE,8BAA8B,uDAAuD;AACvG,gBAAM,oBAAoB,SAAS,EAAE,OAAO,QAAQ,CAAC;AAAA,QACvD;AACA,gBAAQ,QAAQ,MAAM,IAAI,CAAC,SAAS;AAClC,gBAAM;AAAA,YACJ,SAAS;AAAA,YACT,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,UAAU;AAAA,YACV,GAAG;AAAA,UACL,IAAI,KAAK;AACT,iBAAO,EAAE,GAAG,aAAa,cAAc,YAAY,gBAAgB,QAAQ,aAAa;AAAA,QAC1F,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,cAAc;AAAA,MACxB;AACA,YAAM,mBAAmB,KAAK,oBAAoB,sBAAsB,KAAK,oBAAoB,IAAI;AACrG,UAAI,kBAAkB,KAAK,mBAAmB,sBAAsB,KAAK,mBAAmB,IAAI;AAChG,YAAM,iBAAiB,KAAK,mBAAmB;AAC/C,UAAI,gBAAgB;AAClB,YAAI,kBAAkB;AACpB,4BAAkB;AAAA,QACpB,WAAW,CAAC,KAAK,mBAAmB;AAClC,kBAAQ,mBAAmB,KAAK,qBAAqB;AAAA,QACvD;AAAA,MACF;AACA,UAAI,kBAAkB;AACpB,gBAAQ,0BAA0B;AAClC,gBAAQ,oBAAoB;AAAA,MAC9B;AACA,UAAI,iBAAiB;AACnB,gBAAQ,yBAAyB;AACjC,gBAAQ,mBAAmB;AAAA,MAC7B;AACA,UAAI,CAAC,KAAK,kBAAmB,SAAQ,oBAAoB,KAAK,qBAAqB;AACnF,UAAI,CAAC,KAAK,oBAAoB,CAAC,eAAgB,SAAQ,mBAAmB,KAAK,oBAAoB;AAEnG,UAAI;AACF,YAAI,aAAa,QAAQ;AACzB,YAAI,YAAY,QAAQ;AACxB,YAAI,KAAK,oBAAoB,oBAAoB,KAAK,qBAAqB;AACzE,gBAAM,MAAM,MAAM,WAA4B,uBAAuB;AAAA,YACnE,UAAU,KAAK;AAAA,YACf,cAAc,iBAAiB,gBAAgB,iBAAiB,QAAQ;AAAA,YACxE,MAAM,iBAAiB,QAAQ;AAAA,YAC/B,cAAc,iBAAiB,gBAAgB;AAAA,YAC/C,gBAAgB,iBAAiB,kBAAkB;AAAA,YACnD,YAAY,iBAAiB,cAAc;AAAA,YAC3C,MAAM,iBAAiB,QAAQ;AAAA,YAC/B,QAAQ,iBAAiB,UAAU;AAAA,YACnC,YAAY,iBAAiB,cAAc;AAAA,YAC3C,SAAS,iBAAiB,WAAW;AAAA,YACrC,SAAS,iBAAiB,WAAW;AAAA,YACrC,WAAW,iBAAiB,aAAa;AAAA,UAC3C,CAAC;AACD,cAAI,KAAK,QAAQ,GAAI,cAAa,IAAI,OAAO;AAAA,QAC/C;AACA,YAAI,KAAK,oBAAoB,mBAAmB,KAAK,oBAAoB;AACvE,gBAAM,MAAM,MAAM,WAA4B,uBAAuB;AAAA,YACnE,UAAU,KAAK;AAAA,YACf,cAAc,gBAAgB,gBAAgB,gBAAgB,QAAQ;AAAA,YACtE,MAAM,gBAAgB,QAAQ;AAAA,YAC9B,cAAc,gBAAgB,gBAAgB;AAAA,YAC9C,gBAAgB,gBAAgB,kBAAkB;AAAA,YAClD,YAAY,gBAAgB,cAAc;AAAA,YAC1C,MAAM,gBAAgB,QAAQ;AAAA,YAC9B,QAAQ,gBAAgB,UAAU;AAAA,YAClC,YAAY,gBAAgB,cAAc;AAAA,YAC1C,SAAS,gBAAgB,WAAW;AAAA,YACpC,SAAS,gBAAgB,WAAW;AAAA,YACpC,WAAW,gBAAgB,aAAa;AAAA,UAC1C,CAAC;AACD,cAAI,KAAK,QAAQ,GAAI,aAAY,IAAI,OAAO;AAAA,QAC9C;AACA,YAAI,CAAC,KAAK,qBAAqB,WAAY,SAAQ,oBAAoB;AACvE,YAAI,CAAC,KAAK,oBAAoB,CAAC,kBAAkB,UAAW,SAAQ,mBAAmB;AACvF,YAAI,OAAO,KAAK,YAAY,EAAE,OAAQ,SAAQ,eAAe;AAE7D,cAAM,WAAW,iBAAiB,UAAU,iBAAiB;AAC7D,cAAM,EAAE,OAAO,IAAI,MAAM,WAAgE,UAAU,SAAS;AAAA,UAC1G,cAAc,EAAE,sCAAsC,4BAA4B;AAAA,QACpF,CAAC;AACD,cAAM,QACH,UAAU,OAAO,OAAO,OAAO,YAAY,OAAO,MAClD,UAAU,OAAO,OAAO,YAAY,YAAY,OAAO,WACvD,UAAU,OAAO,OAAO,YAAY,YAAY,OAAO,WACxD;AACF,YAAI,CAAC,OAAO;AACV,gBAAM,oBAAoB,EAAE,kCAAkC,mCAAmC,CAAC;AAAA,QACpG;AACA,cAAM,EAAE,gCAAgC,yBAAyB,GAAG,SAAS;AAC7E,kBAAU,EAAE,IAAI,OAAO,MAAM,aAAa,CAAC;AAAA,MAC7C,SAAS,KAAK;AACZ,YAAI,eAAe,MAAO,OAAM;AAChC,cAAM,oBAAoB,EAAE,sCAAsC,4BAA4B,CAAC;AAAA,MACjG;AAAA,IACF;AAAA,IACA,CAAC,WAAW,CAAC;AAAA,EACf;AAEA,QAAM,aAAa,gBAAgB,UAAU,0BAA0B;AAEvE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,8BAA8B,uBAAuB;AAAA,MAC9D,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,CAAC,EAAE,MAAM,aAAa,EAAE,MAAM,WAAW;AAAA,MACpD,aAAa,EAAE,+BAA+B,QAAQ;AAAA,MACtD;AAAA,MACA,UAAU;AAAA;AAAA,EACZ;AAEJ;",
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 { extensionPoints as customersExtensionPoints } from '@open-mercato/core/modules/customers/extension-points'\nimport { crudFormExtensionSpotId } from '@open-mercato/shared/modules/widgets/extension-points'\nimport { useSalesChannelsEnabled } from '../useSalesChannelsEnabled'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { SalesOrderDraftLines, createSalesOrderLineDraft, type SalesOrderLineDraft } from './SalesOrderDraftLines'\nimport { normalizeAddressDraft } from './normalizeAddressDraft'\n\nconst logger = createLogger('sales')\n\n// Before this change, `CrudForm` auto-derived its injection spot id from\n// `entityIds[0]` (`E.customers.customer_entity`), which resolves to this id.\n// Declaring `injectionSpotId` below on the two quick-create dialogs replaces\n// that auto-derived id with the customers module's declared host \u2014 bridge the\n// legacy one for one minor version per BACKWARD_COMPATIBILITY.md \u00A76.\nconst CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID = crudFormExtensionSpotId('customers.customer_entity')\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 injectionSpotId={customersExtensionPoints.hosts.personForm.spotId}\n legacyInjectionSpotId={CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID}\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 injectionSpotId={customersExtensionPoints.hosts.companyForm.spotId}\n legacyInjectionSpotId={CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID}\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\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 showPhoneField\n showTaxIdField\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 showPhoneField\n showTaxIdField\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 rendersOwnError: true,\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 titleHeadingLevel={1}\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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.8.1-develop.7237.1.635faf2c7a",
3
+ "version": "0.8.1-develop.7239.1.d90c352076",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -253,16 +253,16 @@
253
253
  "zod": "^4.4.3"
254
254
  },
255
255
  "peerDependencies": {
256
- "@open-mercato/ai-assistant": "0.8.1-develop.7237.1.635faf2c7a",
257
- "@open-mercato/shared": "0.8.1-develop.7237.1.635faf2c7a",
258
- "@open-mercato/ui": "0.8.1-develop.7237.1.635faf2c7a",
256
+ "@open-mercato/ai-assistant": "0.8.1-develop.7239.1.d90c352076",
257
+ "@open-mercato/shared": "0.8.1-develop.7239.1.d90c352076",
258
+ "@open-mercato/ui": "0.8.1-develop.7239.1.d90c352076",
259
259
  "react": "^19.0.0",
260
260
  "react-dom": "^19.0.0"
261
261
  },
262
262
  "devDependencies": {
263
- "@open-mercato/ai-assistant": "0.8.1-develop.7237.1.635faf2c7a",
264
- "@open-mercato/shared": "0.8.1-develop.7237.1.635faf2c7a",
265
- "@open-mercato/ui": "0.8.1-develop.7237.1.635faf2c7a",
263
+ "@open-mercato/ai-assistant": "0.8.1-develop.7239.1.d90c352076",
264
+ "@open-mercato/shared": "0.8.1-develop.7239.1.d90c352076",
265
+ "@open-mercato/ui": "0.8.1-develop.7239.1.d90c352076",
266
266
  "@testing-library/dom": "^10.4.1",
267
267
  "@testing-library/jest-dom": "^7.0.1",
268
268
  "@testing-library/react": "^16.3.3",
@@ -57,6 +57,8 @@ import {
57
57
  type AddressValue,
58
58
  } from '@open-mercato/core/modules/customers/utils/addressFormat'
59
59
  import { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'
60
+ import { extensionPoints as customersExtensionPoints } from '@open-mercato/core/modules/customers/extension-points'
61
+ import { crudFormExtensionSpotId } from '@open-mercato/shared/modules/widgets/extension-points'
60
62
  import { useSalesChannelsEnabled } from '../useSalesChannelsEnabled'
61
63
  import { createLogger } from '@open-mercato/shared/lib/logger'
62
64
  import { SalesOrderDraftLines, createSalesOrderLineDraft, type SalesOrderLineDraft } from './SalesOrderDraftLines'
@@ -64,6 +66,13 @@ import { normalizeAddressDraft } from './normalizeAddressDraft'
64
66
 
65
67
  const logger = createLogger('sales')
66
68
 
69
+ // Before this change, `CrudForm` auto-derived its injection spot id from
70
+ // `entityIds[0]` (`E.customers.customer_entity`), which resolves to this id.
71
+ // Declaring `injectionSpotId` below on the two quick-create dialogs replaces
72
+ // that auto-derived id with the customers module's declared host — bridge the
73
+ // legacy one for one minor version per BACKWARD_COMPATIBILITY.md §6.
74
+ const CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID = crudFormExtensionSpotId('customers.customer_entity')
75
+
67
76
  type DocumentKind = 'quote' | 'order'
68
77
 
69
78
  type AddressDraft = AddressEditorDraft
@@ -370,6 +379,8 @@ function CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {
370
379
  submitLabel={t('common.save', 'Save')}
371
380
  cancelHref={undefined}
372
381
  onSubmit={(values) => handlePersonCreate(values)}
382
+ injectionSpotId={customersExtensionPoints.hosts.personForm.spotId}
383
+ legacyInjectionSpotId={CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID}
373
384
  entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}
374
385
  />
375
386
  </div>
@@ -404,6 +415,8 @@ function CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {
404
415
  submitLabel={t('common.save', 'Save')}
405
416
  cancelHref={undefined}
406
417
  onSubmit={(values) => handleCompanyCreate(values)}
418
+ injectionSpotId={customersExtensionPoints.hosts.companyForm.spotId}
419
+ legacyInjectionSpotId={CUSTOMER_QUICK_CREATE_LEGACY_INJECTION_SPOT_ID}
407
420
  entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}
408
421
  />
409
422
  </div>