@open-mercato/core 0.4.8-develop-d16e2f51dc → 0.4.8-develop-4b58cde65d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/entities/sales_return/index.js +31 -0
- package/dist/generated/entities/sales_return/index.js.map +7 -0
- package/dist/generated/entities/sales_return_line/index.js +29 -0
- package/dist/generated/entities/sales_return_line/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +2 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +4 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/sales/acl.js +2 -0
- package/dist/modules/sales/acl.js.map +2 -2
- package/dist/modules/sales/api/document-history/route.js +20 -2
- package/dist/modules/sales/api/document-history/route.js.map +2 -2
- package/dist/modules/sales/api/documents/factory.js +34 -0
- package/dist/modules/sales/api/documents/factory.js.map +2 -2
- package/dist/modules/sales/api/returns/[id]/route.js +147 -0
- package/dist/modules/sales/api/returns/[id]/route.js.map +7 -0
- package/dist/modules/sales/api/returns/route.js +158 -0
- package/dist/modules/sales/api/returns/route.js.map +7 -0
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +20 -1
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/index.js +1 -0
- package/dist/modules/sales/commands/index.js.map +2 -2
- package/dist/modules/sales/commands/returns.js +467 -0
- package/dist/modules/sales/commands/returns.js.map +7 -0
- package/dist/modules/sales/components/documents/ReturnDialog.js +176 -0
- package/dist/modules/sales/components/documents/ReturnDialog.js.map +7 -0
- package/dist/modules/sales/components/documents/ReturnsSection.js +188 -0
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +7 -0
- package/dist/modules/sales/data/entities.js +115 -1
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/data/validators.js +13 -0
- package/dist/modules/sales/data/validators.js.map +2 -2
- package/dist/modules/sales/events.js +4 -0
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/lib/calculations.js +7 -0
- package/dist/modules/sales/lib/calculations.js.map +2 -2
- package/dist/modules/sales/lib/dictionaries.js +1 -0
- package/dist/modules/sales/lib/dictionaries.js.map +2 -2
- package/dist/modules/sales/lib/documentNumberTokens.js +2 -0
- package/dist/modules/sales/lib/documentNumberTokens.js.map +2 -2
- package/dist/modules/sales/lib/historyHelpers.js +15 -7
- package/dist/modules/sales/lib/historyHelpers.js.map +2 -2
- package/dist/modules/sales/lib/makeSalesLineRoute.js +42 -37
- package/dist/modules/sales/lib/makeSalesLineRoute.js.map +2 -2
- package/dist/modules/sales/migrations/Migration20260309073310.js +23 -0
- package/dist/modules/sales/migrations/Migration20260309073310.js.map +7 -0
- package/dist/modules/sales/services/salesDocumentNumberGenerator.js +8 -6
- package/dist/modules/sales/services/salesDocumentNumberGenerator.js.map +2 -2
- package/dist/modules/sales/setup.js +1 -1
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +25 -16
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/generated/entities/sales_return/index.ts +14 -0
- package/generated/entities/sales_return_line/index.ts +13 -0
- package/generated/entities.ids.generated.ts +2 -0
- package/generated/entity-fields-registry.ts +4 -0
- package/package.json +3 -3
- package/src/modules/sales/AGENTS.md +1 -0
- package/src/modules/sales/acl.ts +2 -0
- package/src/modules/sales/api/document-history/route.ts +25 -1
- package/src/modules/sales/api/documents/factory.ts +35 -0
- package/src/modules/sales/api/returns/[id]/route.ts +156 -0
- package/src/modules/sales/api/returns/route.ts +171 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +18 -0
- package/src/modules/sales/commands/index.ts +1 -0
- package/src/modules/sales/commands/returns.ts +540 -0
- package/src/modules/sales/components/documents/ReturnDialog.tsx +216 -0
- package/src/modules/sales/components/documents/ReturnsSection.tsx +270 -0
- package/src/modules/sales/data/entities.ts +99 -3
- package/src/modules/sales/data/validators.ts +16 -0
- package/src/modules/sales/events.ts +5 -0
- package/src/modules/sales/i18n/de.json +32 -0
- package/src/modules/sales/i18n/en.json +32 -0
- package/src/modules/sales/i18n/es.json +32 -0
- package/src/modules/sales/i18n/pl.json +32 -0
- package/src/modules/sales/lib/calculations.ts +9 -0
- package/src/modules/sales/lib/dictionaries.ts +1 -0
- package/src/modules/sales/lib/documentNumberTokens.ts +2 -1
- package/src/modules/sales/lib/historyHelpers.ts +20 -9
- package/src/modules/sales/lib/makeSalesLineRoute.ts +42 -37
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +398 -0
- package/src/modules/sales/migrations/Migration20260309073310.ts +26 -0
- package/src/modules/sales/services/salesDocumentNumberGenerator.ts +15 -4
- package/src/modules/sales/setup.ts +1 -1
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +26 -17
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/sales/backend/sales/documents/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\n\n\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams, useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport {\n CustomDataSection,\n DetailFieldsSection,\n ErrorMessage,\n InlineTextEditor,\n LoadingMessage,\n TabEmptyState,\n TagsSection,\n type TagOption,\n} from '@open-mercato/ui/backend/detail'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { ArrowRightLeft, Building2, CreditCard, Mail, Pencil, Plus, Send, Store, Truck, UserRound, Wand2, X } from 'lucide-react'\nimport { FormHeader, type ActionItem } from '@open-mercato/ui/backend/forms'\nimport { VersionHistoryAction } from '@open-mercato/ui/backend/version-history'\nimport { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'\nimport Link from 'next/link'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { DocumentCustomerCard } from '@open-mercato/core/modules/sales/components/DocumentCustomerCard'\nimport { SalesDocumentAddressesSection } from '@open-mercato/core/modules/sales/components/documents/AddressesSection'\nimport { SalesDocumentItemsSection } from '@open-mercato/core/modules/sales/components/documents/ItemsSection'\nimport { SalesDocumentPaymentsSection } from '@open-mercato/core/modules/sales/components/documents/PaymentsSection'\nimport { SalesDocumentAdjustmentsSection } from '@open-mercato/core/modules/sales/components/documents/AdjustmentsSection'\nimport type { AdjustmentRowData } from '@open-mercato/core/modules/sales/components/documents/AdjustmentDialog'\nimport { SalesShipmentsSection } from '@open-mercato/core/modules/sales/components/documents/ShipmentsSection'\nimport { DocumentTotals } from '@open-mercato/core/modules/sales/components/documents/DocumentTotals'\nimport { E } from '#generated/entities.ids.generated'\nimport type { DictionarySelectLabels } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport type { SalesAdjustmentKind } from '@open-mercato/core/modules/sales/data/entities'\nimport { DictionaryValue, createDictionaryMap, renderDictionaryColor, renderDictionaryIcon, type DictionaryMap } from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\nimport { DictionaryEntrySelect } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { NotesSection, mapCommentSummary, type NotesDataAdapter } from '@open-mercato/ui/backend/detail'\nimport {\n emitSalesDocumentTotalsRefresh,\n subscribeSalesDocumentTotalsRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport {\n subscribeSalesDocumentDataRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentDataEvents'\nimport type { CommentSummary, SectionAction } from '@open-mercato/ui/backend/detail'\nimport { ICON_SUGGESTIONS } from '@open-mercato/core/modules/customers/lib/dictionaries'\nimport { readMarkdownPreferenceCookie, writeMarkdownPreferenceCookie } from '@open-mercato/core/modules/customers/lib/markdownPreference'\nimport { InjectionSpot, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\n\nfunction formatMessageAmount(amount: number | null | undefined, currency: string | null | undefined): string | null {\n if (typeof amount !== 'number' || !Number.isFinite(amount)) return null\n if (!currency) return amount.toLocaleString()\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(amount)\n } catch {\n return `${amount.toLocaleString()} ${currency}`\n }\n}\n\nfunction CurrencyInlineEditor({\n label,\n value,\n options,\n labels,\n emptyLabel,\n onSave,\n error,\n onClearError,\n locked,\n onLocked,\n}: {\n label: string\n value: string | null | undefined\n options: { value: string; label: string; color?: string | null; icon?: string | null }[]\n labels: DictionarySelectLabels\n emptyLabel: string\n onSave: (next: string | null) => Promise<void>\n error: string | null\n onClearError: () => void\n locked?: boolean\n onLocked?: () => void\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const normalizedValue = React.useMemo(() => (typeof value === 'string' ? value.toUpperCase() : undefined), [value])\n const [draft, setDraft] = React.useState<string | undefined>(normalizedValue)\n const [saving, setSaving] = React.useState(false)\n const appearanceMap = React.useMemo(\n () =>\n createDictionaryMap(\n options.map((option) => ({\n value: option.value.toUpperCase(),\n label: option.label,\n color: option.color ?? undefined,\n icon: option.icon ?? undefined,\n }))\n ),\n [options]\n )\n\n React.useEffect(() => {\n if (!editing) setDraft(normalizedValue)\n }, [editing, normalizedValue])\n\n React.useEffect(() => {\n if (locked && editing) {\n setEditing(false)\n }\n }, [editing, locked])\n\n const fetchOptions = React.useCallback(async () => options, [options])\n\n const handleLocked = React.useCallback(() => {\n if (onLocked) onLocked()\n }, [onLocked])\n\n const handleActivate = React.useCallback(() => {\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (!editing) {\n setEditing(true)\n }\n }, [editing, handleLocked, locked, onClearError])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n try {\n onClearError()\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n console.error('sales.documents.currency.save', err)\n } finally {\n setSaving(false)\n }\n }, [draft, onClearError, onSave])\n\n return (\n <div\n className={cn(\n 'group rounded-lg border bg-card p-4',\n !editing ? 'cursor-pointer' : null,\n locked ? 'cursor-not-allowed opacity-80' : null\n )}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n onClearError()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) {\n void handleSave()\n }\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ? next.toUpperCase() : undefined)}\n fetchOptions={fetchOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={labels}\n />\n <DictionaryValue\n value={draft ?? normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n onClearError()\n setEditing(false)\n setDraft(value ?? undefined)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <DictionaryValue\n value={normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"mt-1 inline-flex items-center gap-2 text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (editing) {\n onClearError()\n setDraft(value ?? undefined)\n }\n setEditing((prev) => !prev)\n }}\n aria-disabled={locked ? true : undefined}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype SnapshotDraft = {\n displayName: string\n kind: 'company' | 'person'\n primaryEmail: string\n primaryPhone: string\n firstName: string\n lastName: string\n legalName: string\n}\n\nfunction createSnapshotDraft(\n snapshot: CustomerSnapshot | null,\n fallbackName: string | null,\n fallbackEmail: string | null,\n): SnapshotDraft {\n const customer = snapshot?.customer ?? null\n const personProfile = customer?.personProfile ?? snapshot?.contact ?? null\n const companyProfile = customer?.companyProfile ?? null\n const resolvedKind: 'company' | 'person' =\n customer?.kind === 'person' || snapshot?.contact ? 'person' : 'company'\n return {\n displayName:\n (customer?.displayName && customer.displayName.trim()) ||\n (fallbackName && fallbackName.trim()) ||\n '',\n kind: resolvedKind,\n primaryEmail:\n (customer?.primaryEmail && customer.primaryEmail.trim()) ||\n (fallbackEmail && fallbackEmail.trim()) ||\n '',\n primaryPhone: (customer?.primaryPhone && customer.primaryPhone.trim()) || '',\n firstName: (personProfile?.firstName && personProfile.firstName.trim()) || '',\n lastName: (personProfile?.lastName && personProfile.lastName.trim()) || '',\n legalName: (companyProfile?.legalName && companyProfile.legalName.trim()) || '',\n }\n}\n\nfunction CustomerInlineEditor({\n label,\n customerId,\n customerName,\n customerEmail,\n customerSnapshot,\n customers,\n customerLoading,\n onLoadCustomers,\n fetchCustomerEmail,\n onSave,\n onSaveSnapshot,\n saving,\n error,\n guardMessage,\n onClearError,\n}: {\n label: string\n customerId: string | null\n customerName: string | null\n customerEmail: string | null | undefined\n customerSnapshot: CustomerSnapshot | null\n customers: CustomerOption[]\n customerLoading: boolean\n onLoadCustomers: (query?: string) => Promise<CustomerOption[]>\n fetchCustomerEmail: (id: string, kindHint?: 'person' | 'company') => Promise<string | null>\n onSave: (id: string | null, email: string | null) => Promise<void>\n onSaveSnapshot: (snapshot: CustomerSnapshot) => Promise<void>\n saving: boolean\n error: string | null\n guardMessage?: string | null\n onClearError: () => void\n}) {\n const t = useT()\n const [mode, setMode] = React.useState<'select' | 'snapshot' | null>(null)\n const [draftId, setDraftId] = React.useState<string | null>(customerId)\n const [draftEmail, setDraftEmail] = React.useState<string | null>(customerEmail ?? null)\n const [snapshotDraft, setSnapshotDraft] = React.useState<SnapshotDraft>(() =>\n createSnapshotDraft(customerSnapshot, customerName, customerEmail ?? null),\n )\n const selectedRef = React.useRef<string | null>(customerId)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n\n const currentLabel = React.useMemo(() => {\n if (customerName && customerName.trim().length) return customerName\n const match = customers.find((entry) => entry.id === customerId)\n return match?.label ?? null\n }, [customerId, customerName, customers])\n\n React.useEffect(() => {\n selectedRef.current = draftId\n }, [draftId])\n\n React.useEffect(() => {\n if (mode !== 'select') {\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n onClearError()\n }\n }, [customerEmail, customerId, mode, onClearError])\n\n React.useEffect(() => {\n if (mode !== 'snapshot') {\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }\n }, [customerEmail, customerSnapshot, currentLabel, mode])\n\n React.useEffect(() => {\n if (mode !== 'select') return\n const labelValue = currentLabel\n if (labelValue && customerQuerySetter.current) {\n customerQuerySetter.current(labelValue)\n }\n void onLoadCustomers(labelValue ?? undefined)\n }, [currentLabel, mode, onLoadCustomers])\n\n const handleSelectActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('select')\n void onLoadCustomers()\n }, [guardMessage, onClearError, onLoadCustomers])\n\n const handleSnapshotActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('snapshot')\n }, [guardMessage, onClearError])\n\n const handleCancel = React.useCallback(() => {\n onClearError()\n setMode(null)\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }, [customerEmail, customerId, customerSnapshot, currentLabel, onClearError])\n\n const buildSnapshotPayload = React.useCallback((): CustomerSnapshot => {\n const kind = snapshotDraft.kind\n const displayNameRaw = snapshotDraft.displayName.trim()\n const primaryEmailRaw = snapshotDraft.primaryEmail.trim()\n const primaryPhoneRaw = snapshotDraft.primaryPhone.trim()\n const firstNameRaw = snapshotDraft.firstName.trim()\n const lastNameRaw = snapshotDraft.lastName.trim()\n const legalNameRaw = snapshotDraft.legalName.trim()\n const nameFromParts =\n kind === 'person'\n ? [firstNameRaw, lastNameRaw].filter((value) => value.length).join(' ').trim()\n : legalNameRaw\n const resolvedDisplayName = displayNameRaw || nameFromParts || null\n const baseCustomer = customerSnapshot?.customer ?? {}\n const nextPersonProfile =\n kind === 'person'\n ? {\n ...(baseCustomer.personProfile ?? customerSnapshot?.contact ?? {}),\n firstName: firstNameRaw || null,\n lastName: lastNameRaw || null,\n }\n : null\n const nextCompanyProfile =\n kind === 'company'\n ? { ...(baseCustomer.companyProfile ?? {}), legalName: legalNameRaw || null }\n : null\n return {\n ...(customerSnapshot ?? {}),\n customer: {\n ...baseCustomer,\n kind,\n displayName: resolvedDisplayName,\n primaryEmail: primaryEmailRaw || null,\n primaryPhone: primaryPhoneRaw || null,\n personProfile: nextPersonProfile,\n companyProfile: nextCompanyProfile,\n },\n contact: customerSnapshot?.contact ?? null,\n }\n }, [customerSnapshot, snapshotDraft])\n\n const handleSaveSelection = React.useCallback(async () => {\n try {\n onClearError()\n await onSave(draftId, draftEmail)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.save', err)\n }\n }, [draftEmail, draftId, onClearError, onSave])\n\n const handleSaveSnapshot = React.useCallback(async () => {\n try {\n onClearError()\n const payload = buildSnapshotPayload()\n await onSaveSnapshot(payload)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.snapshot.save', err)\n }\n }, [buildSnapshotPayload, onClearError, onSaveSnapshot])\n\n if (mode === 'select') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSelection()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0 space-y-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <LookupSelect\n value={draftId}\n onChange={(next) => {\n setDraftId(next)\n setDraftEmail(null)\n selectedRef.current = next\n if (!next) return\n const match = customers.find((entry) => entry.id === next)\n if (match?.primaryEmail) {\n setDraftEmail(match.primaryEmail)\n } else {\n const selectedId = next\n fetchCustomerEmail(selectedId, match?.kind)\n .then((resolved) => {\n if (resolved && selectedRef.current === selectedId) setDraftEmail(resolved)\n })\n .catch(() => {})\n }\n }}\n fetchItems={async (query) => {\n const options = await onLoadCustomers(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 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) =>\n t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })\n }\n />\n {customerLoading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n </p>\n ) : null}\n {draftEmail ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" aria-hidden />\n <span className=\"truncate\">{draftEmail}</span>\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSelection()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )\n }\n\n if (mode === 'snapshot') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSnapshot()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.detail.customerSnapshot.hint', 'Edit the snapshot stored on this document.')}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"mt-3 space-y-3\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.displayName.label', 'Display name')}\n </label>\n <Input\n value={snapshotDraft.displayName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, displayName: event.target.value }))}\n placeholder={t('customers.people.form.displayName.placeholder', 'Enter display name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('sales.documents.detail.customerSnapshot.kind', 'Customer type')}\n </label>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'company' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'company' }))}\n >\n {t('customers.widgets.newCustomers.kind.company', 'Company')}\n </Button>\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'person' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'person' }))}\n >\n {t('customers.widgets.newCustomers.kind.person', 'Person')}\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryEmail', 'Primary email')}\n </label>\n <Input\n type=\"email\"\n value={snapshotDraft.primaryEmail}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryEmail: event.target.value }))}\n placeholder={t('customers.people.form.primaryEmailPlaceholder', 'name@example.com')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryPhone', 'Primary phone')}\n </label>\n <Input\n type=\"tel\"\n value={snapshotDraft.primaryPhone}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryPhone: event.target.value }))}\n placeholder={t('customers.people.form.primaryPhonePlaceholder', '+00 000 000 000')}\n />\n </div>\n </div>\n\n {snapshotDraft.kind === 'person' ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.firstName', 'First name')}\n </label>\n <Input\n value={snapshotDraft.firstName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, firstName: event.target.value }))}\n placeholder={t('customers.people.form.firstName', 'First name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.lastName', 'Last name')}\n </label>\n <Input\n value={snapshotDraft.lastName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, lastName: event.target.value }))}\n placeholder={t('customers.people.form.lastName', 'Last name')}\n />\n </div>\n </div>\n ) : (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.companies.detail.fields.legalName', 'Legal name')}\n </label>\n <Input\n value={snapshotDraft.legalName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, legalName: event.target.value }))}\n placeholder={t('customers.companies.detail.fields.legalNamePlaceholder', 'Add legal name')}\n />\n </div>\n )}\n\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSnapshot()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <DocumentCustomerCard\n label={label}\n name={customerName ?? null}\n email={customerEmail ?? undefined}\n kind={customerSnapshot?.customer?.kind === 'person' ? 'person' : 'company'}\n className=\"h-full\"\n onEditSnapshot={handleSnapshotActivate}\n onSelectCustomer={handleSelectActivate}\n />\n )\n}\n\ntype CustomerSnapshot = {\n customer?: {\n id?: string | null\n kind?: 'person' | 'company' | null\n displayName?: string | null\n primaryEmail?: string | null\n primaryPhone?: string | null\n personProfile?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n companyProfile?: {\n id?: string | null\n legalName?: string | null\n brandName?: string | null\n domain?: string | null\n websiteUrl?: string | null\n } | null\n } | null\n contact?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n}\n\ntype AddressSnapshot = {\n name?: string | null\n companyName?: string | null\n addressLine1?: string | null\n addressLine2?: string | null\n city?: string | null\n region?: string | null\n postalCode?: string | null\n country?: string | null\n}\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 = {\n id: string\n label: string\n}\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n carrierCode?: string | null\n serviceLevel?: string | null\n estimatedTransitDays?: number | null\n currencyCode?: string | null\n baseRateNet?: string | null\n baseRateGross?: string | null\n providerKey?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype PaymentMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n providerKey?: string | null\n terms?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\ntype DocumentRecord = {\n id: string\n orderNumber?: string | null\n quoteNumber?: string | null\n status?: string | null\n statusEntryId?: string | null\n currencyCode?: string | null\n customerEntityId?: string | null\n billingAddressId?: string | null\n shippingAddressId?: string | null\n customerReference?: string | null\n externalReference?: string | null\n channelId?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n customerSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n channelCode?: string | null\n comment?: string | null\n subtotalNetAmount?: number | null\n subtotalGrossAmount?: number | null\n discountTotalAmount?: number | null\n taxTotalAmount?: number | null\n shippingNetAmount?: number | null\n shippingGrossAmount?: number | null\n surchargeTotalAmount?: number | null\n grandTotalNetAmount?: number | null\n grandTotalGrossAmount?: number | null\n paidTotalAmount?: number | null\n refundedTotalAmount?: number | null\n outstandingAmount?: number | null\n createdAt?: string\n updatedAt?: string\n metadata?: Record<string, unknown> | null\n customFields?: Record<string, unknown> | null\n tags?: TagOption[] | null\n}\n\ntype DocumentUpdateResult = {\n orderNumber?: string | null\n quoteNumber?: string | null\n externalReference?: string | null\n customerReference?: string | null\n comment?: string | null\n currencyCode?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n statusEntryId?: string | null\n status?: string | null\n channelId?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerEntityId?: string | null\n customerSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n metadata?: Record<string, unknown> | null\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.filter((entry) => entry !== undefined)\n }\n if (value === undefined) return null\n return value\n}\n\nconst prefixCustomFieldValues = (input: Record<string, unknown> | null | undefined): Record<string, unknown> => {\n if (!input || typeof input !== 'object') return {}\n return Object.entries(input).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const normalized = key.startsWith('cf_') ? key : `cf_${key}`\n acc[normalized] = value\n return acc\n }, {})\n}\n\nconst resolveLineItemCount = (record: unknown): number | null => {\n if (!record || typeof record !== 'object') return null\n const current = (record as any).lineItemCount ?? (record as any).line_item_count\n if (typeof current !== 'number') return null\n return Number.isFinite(current) ? current : null\n}\n\nasync function fetchDocument(id: string, kind: 'order' | 'quote', errorMessage: string): Promise<DocumentRecord | null> {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\n const payload = await readApiResultOrThrow<{ items?: DocumentRecord[] }>(\n `/api/sales/${kind === 'order' ? 'orders' : 'quotes'}?${params.toString()}`,\n undefined,\n { errorMessage }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.length ? (items[0] as DocumentRecord) : null\n}\n\nfunction resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {\n if (!snapshot) return fallback ?? null\n const displayName =\n typeof snapshot.customer?.displayName === 'string' && snapshot.customer.displayName.trim().length\n ? snapshot.customer.displayName.trim()\n : null\n if (displayName) return displayName\n const contact = snapshot.contact ?? null\n const personProfile = snapshot.customer?.personProfile ?? null\n const preferred =\n (contact?.preferredName && contact.preferredName.trim()) ||\n (personProfile?.preferredName && personProfile.preferredName.trim()) ||\n null\n const firstName =\n (contact?.firstName && contact.firstName.trim()) ||\n (personProfile?.firstName && personProfile.firstName.trim()) ||\n null\n const lastName =\n (contact?.lastName && contact.lastName.trim()) ||\n (personProfile?.lastName && personProfile.lastName.trim()) ||\n null\n const parts = [preferred ?? firstName, lastName].filter((part) => part && part.length)\n if (parts.length) return parts.join(' ')\n const legalName =\n (snapshot.customer?.companyProfile?.legalName &&\n snapshot.customer.companyProfile.legalName.trim()) ||\n null\n if (legalName) return legalName\n return fallback ?? null\n}\n\nfunction resolveCustomerEmail(snapshot: CustomerSnapshot | null | undefined) {\n if (!snapshot) return null\n const primary =\n (snapshot.customer?.primaryEmail && snapshot.customer.primaryEmail.trim()) ||\n null\n if (primary) return primary\n return null\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction SectionCard({\n title,\n action,\n children,\n muted,\n}: {\n title: string\n action?: React.ReactNode\n children: React.ReactNode\n muted?: boolean\n}) {\n return (\n <div className={cn('rounded border p-4', muted ? 'bg-muted/30' : 'bg-card')}>\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{title}</p>\n {action}\n </div>\n {children}\n </div>\n )\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction ContactEmailInlineEditor({\n label,\n value,\n placeholder,\n emptyLabel,\n onSave,\n renderDisplay,\n recordId,\n}: {\n label: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel: string\n renderDisplay: (params: { value: string | null | undefined; emptyLabel: string }) => React.ReactNode\n onSave: (next: string | null) => Promise<void>\n recordId?: string | null\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState(value ?? '')\n const [error, setError] = React.useState<string | null>(null)\n const [saving, setSaving] = React.useState(false)\n const trimmedDraft = React.useMemo(() => draft.trim(), [draft])\n const isValidEmail = React.useMemo(() => {\n if (!trimmedDraft.length) return true\n return EMAIL_REGEX.test(trimmedDraft)\n }, [trimmedDraft])\n const { duplicate, checking } = useEmailDuplicateCheck(draft, {\n recordId: typeof recordId === 'string' ? recordId : null,\n disabled: !editing || !!error || saving || !trimmedDraft.length || !isValidEmail,\n matchMode: 'prefix',\n })\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? '')\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const normalized = trimmedDraft.length ? trimmedDraft : ''\n if (normalized.length && !EMAIL_REGEX.test(normalized)) {\n setError(t('customers.people.detail.inline.emailInvalid', 'Enter a valid email address.'))\n return\n }\n setError(null)\n setSaving(true)\n try {\n await onSave(normalized.length ? normalized : null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('customers.people.detail.inline.error', 'Failed to save value.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [onSave, t, trimmedDraft])\n\n const interactiveProps =\n !editing && !saving\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: () => setEditing(true),\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n }\n },\n }\n : {}\n\n return (\n <div className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\" {...interactiveProps}>\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <form\n className=\"mt-2 space-y-2\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!saving) void handleSave()\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n className=\"w-full rounded-md border pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n value={draft}\n onChange={(event) => {\n if (error) setError(null)\n setDraft(event.target.value)\n }}\n placeholder={placeholder}\n type=\"email\"\n autoFocus\n spellCheck={false}\n />\n </div>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n {!error && duplicate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('customers.people.detail.inline.emailDuplicate', undefined, { name: duplicate.displayName })}{' '}\n <Link\n className=\"font-medium text-primary underline underline-offset-2\"\n href={`/backend/customers/people/${duplicate.id}`}\n >\n {t('customers.people.detail.inline.emailDuplicateLink')}\n </Link>\n </p>\n ) : null}\n {!error && !duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.detail.inline.emailChecking')}</p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? '')\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"mt-1\">{renderDisplay({ value, emptyLabel })}</div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? '')\n setError(null)\n }\n setEditing((prev) => !prev)\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n disabled={saving}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction ChannelInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: ChannelOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<ChannelOption[]>\n onSave: (next: string | null) => Promise<void>\n saveLabel: string\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const current = React.useMemo(\n () => (draft ?? value ? options.find((opt) => opt.id === (draft ?? value)) ?? null : null),\n [draft, options, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n const query = current?.label ?? value ?? ''\n setSearchQueryRef.current(query)\n }, [current?.label, editing, value])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleActivate = React.useCallback(() => {\n if (!editing) {\n setEditing(true)\n prefillSearch()\n void onLoadOptions()\n }\n }, [editing, onLoadOptions, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\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 {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm text-foreground\">\n {current ? (\n <span className=\"text-sm\">{current.label}</span>\n ) : value ? (\n <span className=\"text-sm\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype MethodOption = ShippingMethodOption | PaymentMethodOption\n\nfunction MethodInlineEditor({\n label,\n value,\n snapshot,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n placeholder,\n loadingLabel,\n emptyResultsLabel,\n selectedHint,\n icon,\n allowClear = true,\n}: {\n label: string\n value: string | null | undefined\n snapshot: Record<string, unknown> | null\n emptyLabel: string\n options: MethodOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<MethodOption[]>\n onSave: (nextId: string | null) => Promise<void>\n saveLabel: string\n placeholder: string\n loadingLabel: string\n emptyResultsLabel: string\n selectedHint: (id: string) => string\n icon: React.ReactNode\n allowClear?: boolean\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const resolveDisplay = React.useCallback(\n (id: string | null | undefined): { label: string | null; description: string | null } => {\n if (!id) return { label: null, description: null }\n const option = options.find((entry) => entry.id === id)\n if (option) {\n return {\n label: option.name ?? option.code,\n description: option.description ?? null,\n }\n }\n const snapName =\n snapshot && typeof (snapshot as any)?.name === 'string' ? (snapshot as any).name : null\n const snapCode =\n snapshot && typeof (snapshot as any)?.code === 'string' ? (snapshot as any).code : null\n const snapDescription =\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null\n return {\n label: snapName ?? snapCode ?? id,\n description: snapDescription,\n }\n },\n [options, snapshot]\n )\n\n const currentDisplay = React.useMemo(\n () => resolveDisplay(draft ?? value ?? null),\n [draft, resolveDisplay, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n setSearchQueryRef.current('')\n }, [editing])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={containerClasses}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (editing) return\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.name ?? item.code,\n subtitle: item.code,\n icon: icon,\n }))\n }}\n minQuery={0}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\n }}\n searchPlaceholder={placeholder}\n loadingLabel={loadingLabel}\n emptyLabel={emptyResultsLabel}\n selectedHintLabel={(id) => selectedHint(id)}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n {allowClear ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => setDraft(null)}\n disabled={saving}\n >\n {t('ui.actions.clear', 'Clear')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n {currentDisplay.label ? (\n <div className=\"space-y-1\">\n <span className=\"text-sm\">{currentDisplay.label}</span>\n {currentDisplay.description ? (\n <p className=\"text-xs text-muted-foreground\">{currentDisplay.description}</p>\n ) : null}\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={triggerClasses}\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions('')\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction StatusInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n onSave,\n onLoadOptions,\n labels,\n manageHref,\n loading,\n saveLabel,\n dictionaryMap,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: StatusOption[]\n onSave: (entryId: string | null, value: string | null) => Promise<void>\n onLoadOptions: () => Promise<StatusOption[]>\n labels: DictionarySelectLabels\n manageHref?: string\n loading: boolean\n saveLabel: string\n dictionaryMap: DictionaryMap\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | undefined>(value ?? undefined)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const fetchStatusOptions = React.useCallback(\n async () =>\n (await onLoadOptions()).map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n })),\n [onLoadOptions]\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? undefined)\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const selected = draft ? options.find((opt) => opt.value === draft) ?? null : null\n if (draft && !selected) {\n setError(t('sales.documents.detail.statusInvalid', 'Selected status could not be found.'))\n return\n }\n setSaving(true)\n setError(null)\n try {\n await onSave(selected?.id ?? null, draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, options, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (!editing) {\n setEditing(true)\n void onLoadOptions()\n }\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n void onLoadOptions()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ?? undefined)}\n fetchOptions={fetchStatusOptions}\n allowInlineCreate={false}\n allowAppearance\n manageHref={manageHref}\n labels={labels}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {labels.loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n <DictionaryValue\n value={value}\n map={dictionaryMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm\"\n iconWrapperClassName=\"inline-flex h-6 w-6 items-center justify-center rounded border border-border bg-card\"\n iconClassName=\"h-4 w-4\"\n colorClassName=\"h-3 w-3 rounded-full\"\n />\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(normalizedValue)\n setError(null)\n }\n setEditing((prev) => !prev)\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nexport default function SalesDocumentDetailPage({\n params,\n initialKind,\n includeAmountInMessageMetadata,\n}: {\n params: { id: string }\n initialKind?: 'order' | 'quote'\n includeAmountInMessageMetadata?: boolean\n}) {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [loading, setLoading] = React.useState(true)\n const [record, setRecord] = React.useState<DocumentRecord | null>(null)\n const [tags, setTags] = React.useState<TagOption[]>([])\n const [kind, setKind] = React.useState<'order' | 'quote'>('quote')\n const [error, setError] = React.useState<string | null>(null)\n const [reloadKey, setReloadKey] = React.useState(0)\n const [activeTab, setActiveTab] = React.useState<string>('comments')\n const [sectionAction, setSectionAction] = React.useState<SectionAction | null>(null)\n const detailSectionRef = React.useRef<HTMLDivElement | null>(null)\n const [generating, setGenerating] = React.useState(false)\n const [converting, setConverting] = React.useState(false)\n const [deleting, setDeleting] = React.useState(false)\n const [sending, setSending] = React.useState(false)\n const [sendOpen, setSendOpen] = React.useState(false)\n const [validForDays, setValidForDays] = React.useState(14)\n const [numberEditing, setNumberEditing] = React.useState(false)\n const [canEditNumber, setCanEditNumber] = React.useState(false)\n const [currencyError, setCurrencyError] = React.useState<string | null>(null)\n const [hasItems, setHasItems] = React.useState(false)\n const [hasPayments, setHasPayments] = React.useState(false)\n const [customerOptions, setCustomerOptions] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [customerSaving, setCustomerSaving] = React.useState(false)\n const [customerError, setCustomerError] = React.useState<string | null>(null)\n const [editingGuards, setEditingGuards] = React.useState<{\n customer: string[] | null\n addresses: string[] | null\n } | null>(null)\n const [channelOptions, setChannelOptions] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const channelOptionsRef = React.useRef<Map<string, ChannelOption>>(new Map())\n const [shippingMethodOptions, setShippingMethodOptions] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const shippingMethodOptionsRef = React.useRef<Map<string, ShippingMethodOption>>(new Map())\n const [paymentMethodOptions, setPaymentMethodOptions] = React.useState<PaymentMethodOption[]>([])\n const [paymentMethodLoading, setPaymentMethodLoading] = React.useState(false)\n const paymentMethodOptionsRef = React.useRef<Map<string, PaymentMethodOption>>(new Map())\n const [statusOptions, setStatusOptions] = React.useState<StatusOption[]>([])\n const [statusLoading, setStatusLoading] = React.useState(false)\n const statusOptionsRef = React.useRef<Map<string, StatusOption>>(new Map())\n const [adjustmentRows, setAdjustmentRows] = React.useState<AdjustmentRowData[]>([])\n const mutationContextId = React.useMemo(\n () => (record?.id ? `sales-document:${kind}:${record.id}` : `sales-document:${kind}:pending`),\n [kind, record?.id],\n )\n const detailsInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:details`, [kind])\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n kind: SalesDocumentKind\n record: DocumentRecord | null\n formId: string\n resourceKind: string\n resourceId?: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const detailInjectionContext = React.useMemo(\n () => ({\n kind,\n record,\n formId: mutationContextId,\n resourceKind: `sales.${kind}`,\n resourceId: record?.id ?? undefined,\n retryLastMutation,\n }),\n [kind, mutationContextId, record, retryLastMutation],\n )\n const runMutationWithContext = React.useCallback(\n async <T,>(operation: () => Promise<T>, mutationPayload?: Record<string, unknown>): Promise<T> => {\n return runMutation({\n operation,\n mutationPayload,\n context: detailInjectionContext,\n })\n },\n [detailInjectionContext, runMutation],\n )\n const clearCustomerError = React.useCallback(() => setCustomerError(null), [])\n const { data: currencyDictionary } = useCurrencyDictionary()\n const scopeVersion = useOrganizationScopeVersion()\n const parseNumber = React.useCallback((value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return NaN\n }, [])\n\n const loadErrorMessage = React.useMemo(\n () => t('sales.documents.detail.error', 'Document not found or inaccessible.'),\n [t]\n )\n\n React.useEffect(() => {\n let active = true\n async function loadNumberPermission() {\n try {\n const call = await apiCall<{ granted?: unknown[] }>(\n '/api/auth/feature-check',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ features: ['sales.documents.number.edit'] }),\n }\n )\n if (!active) return\n const granted = Array.isArray(call.result?.granted)\n ? call.result?.granted.map((item) => String(item))\n : []\n const has = granted.some((feature) => {\n if (feature === '*') return true\n if (feature === 'sales.documents.number.edit') return true\n if (feature.endsWith('.*')) {\n const prefix = feature.slice(0, -2)\n return 'sales.documents.number.edit' === prefix || 'sales.documents.number.edit'.startsWith(`${prefix}.`)\n }\n return false\n })\n setCanEditNumber(Boolean(call.ok && has))\n } catch {\n if (active) setCanEditNumber(false)\n }\n }\n loadNumberPermission().catch(() => {})\n return () => {\n active = false\n }\n }, [scopeVersion])\n const saveShortcutLabel = React.useMemo(\n () => t('sales.documents.detail.inline.save', 'Save \u2318\u23CE / Ctrl+Enter'),\n [t]\n )\n const customDataLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.customDataLoading', 'Loading custom data\u2026'),\n emptyValue: t('sales.documents.detail.empty', 'Not set'),\n noFields: t('entities.customFields.empty'),\n defineFields: t('sales.documents.detail.customDataDefine', 'Define custom fields first.'),\n saveShortcut: saveShortcutLabel,\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [saveShortcutLabel, t],\n )\n const tagLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.tags.loading', 'Loading tags\u2026'),\n placeholder: t('sales.documents.detail.tags.placeholder', 'Type to add tags'),\n empty: t('sales.documents.detail.tags.placeholder', 'No tags yet. Add labels to keep documents organized.'),\n loadError: t('sales.documents.detail.tags.loadError', 'Failed to load tags.'),\n createError: t('sales.documents.detail.tags.createError', 'Failed to create tag.'),\n updateError: t('sales.documents.detail.tags.updateError', 'Failed to update tags.'),\n labelRequired: t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'),\n saveShortcut: t('sales.documents.detail.tags.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter'),\n cancelShortcut: t('sales.documents.detail.tags.cancelShortcut', 'Cancel (Esc)'),\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [t],\n )\n\n const upsertChannelOptions = React.useCallback((options: ChannelOption[]) => {\n setChannelOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n channelOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertShippingMethodOptions = React.useCallback((options: ShippingMethodOption[]) => {\n setShippingMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n shippingMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertPaymentMethodOptions = React.useCallback((options: PaymentMethodOption[]) => {\n setPaymentMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n paymentMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertStatusOptions = React.useCallback((options: StatusOption[]) => {\n setStatusOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.value, opt]))\n options.forEach((opt) => map.set(opt.value, opt))\n statusOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const loadCustomers = React.useCallback(\n 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 setCustomerOptions((prev) => {\n const combined = [...prev]\n merged.forEach((entry) => {\n if (!combined.some((item) => item.id === entry.id)) {\n combined.push(entry)\n }\n })\n return combined\n })\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n },\n [t]\n )\n\n const loadChannels = React.useCallback(\n 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) upsertChannelOptions(options)\n return options\n }\n if (!query) upsertChannelOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n if (!query) {\n flash(t('sales.channels.offers.filters.channelsLoadError', 'Failed to load channels'), 'error')\n }\n return []\n } finally {\n setChannelLoading(false)\n }\n },\n [t, upsertChannelOptions]\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string) => {\n setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${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 const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n carrierCode: typeof (item as any)?.carrierCode === 'string' ? (item as any).carrierCode : null,\n serviceLevel: typeof (item as any)?.serviceLevel === 'string' ? (item as any).serviceLevel : null,\n estimatedTransitDays:\n typeof (item as any)?.estimatedTransitDays === 'number'\n ? (item as any).estimatedTransitDays\n : null,\n currencyCode: typeof item?.currencyCode === 'string' ? item.currencyCode : null,\n baseRateNet:\n typeof (item as any)?.baseRateNet === 'string'\n ? (item as any).baseRateNet\n : typeof (item as any)?.baseRateNet === 'number'\n ? (item as any).baseRateNet.toString()\n : null,\n baseRateGross:\n typeof (item as any)?.baseRateGross === 'string'\n ? (item as any).baseRateGross\n : typeof (item as any)?.baseRateGross === 'number'\n ? (item as any).baseRateGross.toString()\n : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) upsertShippingMethodOptions(options)\n return options\n }\n if (!query) upsertShippingMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadShippingMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.shippingMethodLoadError', 'Failed to load shipping methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setShippingMethodLoading(false)\n }\n },\n [t, upsertShippingMethodOptions]\n )\n\n const loadPaymentMethods = React.useCallback(\n async (query?: string) => {\n setPaymentMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-methods?${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 const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n terms: typeof (item as any)?.terms === 'string' ? (item as any).terms : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is PaymentMethodOption => !!entry)\n if (!query) upsertPaymentMethodOptions(options)\n return options\n }\n if (!query) upsertPaymentMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadPaymentMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.paymentMethodLoadError', 'Failed to load payment methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setPaymentMethodLoading(false)\n }\n },\n [t, upsertPaymentMethodOptions]\n )\n\n const refreshPaymentPresence = React.useCallback(async () => {\n if (!record?.id || kind !== 'order') {\n setHasPayments(false)\n return\n }\n const params = new URLSearchParams({ page: '1', pageSize: '1', orderId: record.id })\n try {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payments?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n setHasPayments(items.some((item) => item && typeof (item as any).id === 'string'))\n } catch (err) {\n console.error('sales.documents.currency.paymentsGuard', err)\n }\n }, [kind, record?.id])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customerOptions.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 setCustomerOptions((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customerOptions],\n )\n\n const ensureChannelOption = React.useCallback(\n async (id: string | null | undefined) => {\n if (!id) return null\n const existing = channelOptionsRef.current.get(id)\n if (existing) return existing\n try {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\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) && call.result.items.length) {\n const item = call.result.items[0]\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 const option: ChannelOption = { id, label: code ? `${label} (${code})` : label }\n upsertChannelOptions([option])\n return option\n }\n } catch (err) {\n console.error('sales.documents.channel.ensure', err)\n }\n return null\n },\n [upsertChannelOptions]\n )\n\n const ensureShippingMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = shippingMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: ShippingMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n carrierCode:\n snapshot && typeof (snapshot as any)?.carrierCode === 'string'\n ? (snapshot as any).carrierCode\n : null,\n serviceLevel:\n snapshot && typeof (snapshot as any)?.serviceLevel === 'string'\n ? (snapshot as any).serviceLevel\n : null,\n estimatedTransitDays:\n snapshot && typeof (snapshot as any)?.estimatedTransitDays === 'number'\n ? (snapshot as any).estimatedTransitDays\n : null,\n currencyCode:\n snapshot && typeof (snapshot as any)?.currencyCode === 'string'\n ? (snapshot as any).currencyCode\n : null,\n }\n upsertShippingMethodOptions([option])\n return option\n },\n [upsertShippingMethodOptions]\n )\n\n const ensurePaymentMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = paymentMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: PaymentMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n providerKey:\n snapshot && typeof (snapshot as any)?.providerKey === 'string'\n ? (snapshot as any).providerKey\n : null,\n terms:\n snapshot && typeof (snapshot as any)?.terms === 'string' ? (snapshot as any).terms : null,\n }\n upsertPaymentMethodOptions([option])\n return option\n },\n [upsertPaymentMethodOptions]\n )\n\n const loadStatuses = React.useCallback(async () => {\n setStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const call = await apiCall<{ items?: Array<{ id?: string; value?: string; label?: string | null; color?: string | null; icon?: string | null }> }>(\n `/api/sales/order-statuses?${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 const value = typeof item?.value === 'string' ? item.value : null\n if (!id || !value) return null\n const label = typeof item?.label === 'string' && item.label.trim().length ? item.label : value\n const color = typeof item?.color === 'string' && item.color.trim().length ? item.color : null\n const icon = typeof item?.icon === 'string' && item.icon.trim().length ? item.icon : null\n return { id, value, label, color, icon }\n })\n .filter((opt): opt is StatusOption => !!opt)\n upsertStatusOptions(options)\n return options\n }\n upsertStatusOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadStatuses', err)\n flash(t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'), 'error')\n return []\n } finally {\n setStatusLoading(false)\n }\n }, [t, upsertStatusOptions])\n\n const ensureStatusOption = React.useCallback(\n (value: string | null | undefined, entryId: string | null | undefined) => {\n if (!value) return\n if (statusOptionsRef.current.has(value)) return\n upsertStatusOptions([\n {\n id: entryId ?? value,\n value,\n label: value,\n color: null,\n icon: null,\n },\n ])\n },\n [upsertStatusOptions]\n )\n\n const fetchDocumentByKind = React.useCallback(\n async (documentId: string, candidateKind: 'order' | 'quote') => {\n return fetchDocument(documentId, candidateKind, loadErrorMessage)\n },\n [loadErrorMessage]\n )\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setLoading(true)\n setError(null)\n const requestedKind = searchParams.get('kind')\n const preferredKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : initialKind ?? null\n const kindsToTry: Array<'order' | 'quote'> = preferredKind\n ? [preferredKind, preferredKind === 'order' ? 'quote' : 'order']\n : ['quote', 'order']\n let lastError: string | null = null\n for (const candidate of kindsToTry) {\n try {\n const entry = await fetchDocumentByKind(params.id, candidate)\n if (entry && !cancelled) {\n setRecord(entry)\n setKind(candidate)\n setLoading(false)\n return\n }\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n lastError = message\n }\n }\n if (!cancelled) {\n setLoading(false)\n setError(lastError ?? loadErrorMessage)\n }\n }\n load().catch((err) => {\n if (cancelled) return\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n setError(message)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [fetchDocumentByKind, initialKind, loadErrorMessage, params.id, reloadKey, searchParams])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n }, [loadCustomers])\n\n React.useEffect(() => {\n setTags(Array.isArray(record?.tags) ? record.tags : [])\n }, [record?.tags])\n\n React.useEffect(() => {\n if (!record) {\n setHasItems(false)\n return\n }\n const lineItemCount = resolveLineItemCount(record)\n if (lineItemCount !== null) {\n setHasItems(lineItemCount > 0)\n }\n }, [record])\n\n React.useEffect(() => {\n loadChannels().catch(() => {})\n loadStatuses().catch(() => {})\n loadShippingMethods().catch(() => {})\n loadPaymentMethods().catch(() => {})\n }, [loadChannels, loadPaymentMethods, loadShippingMethods, loadStatuses, scopeVersion])\n\n React.useEffect(() => {\n void refreshPaymentPresence()\n }, [refreshPaymentPresence])\n\n const normalizeGuardList = React.useCallback((value: unknown): string[] | null => {\n if (value === null) return null\n if (!Array.isArray(value)) return []\n const set = new Set<string>()\n value.forEach((entry) => {\n if (typeof entry === 'string' && entry.trim().length) set.add(entry.trim())\n })\n return Array.from(set)\n }, [])\n\n React.useEffect(() => {\n if (kind !== 'order') {\n setEditingGuards(null)\n return\n }\n let cancelled = false\n async function loadGuards() {\n try {\n const call = await apiCall<{\n orderCustomerEditableStatuses?: unknown\n orderAddressEditableStatuses?: unknown\n }>('/api/sales/settings/order-editing')\n if (!call.ok || cancelled) return\n setEditingGuards({\n customer: normalizeGuardList(call.result?.orderCustomerEditableStatuses ?? null),\n addresses: normalizeGuardList(call.result?.orderAddressEditableStatuses ?? null),\n })\n } catch (err) {\n console.error('sales.documents.loadGuards', err)\n }\n }\n void loadGuards()\n return () => {\n cancelled = true\n }\n }, [kind, normalizeGuardList, scopeVersion])\n\n React.useEffect(() => {\n if (!record?.channelId) return\n void ensureChannelOption(record.channelId)\n }, [ensureChannelOption, record?.channelId])\n\n React.useEffect(() => {\n if (kind !== 'order') return\n ensureShippingMethodOption(record?.shippingMethodId ?? null, record?.shippingMethodSnapshot ?? null)\n const paymentMethodSnapshotOrCode =\n record?.paymentMethodSnapshot ??\n (record?.paymentMethodCode ? { code: record.paymentMethodCode } : null)\n ensurePaymentMethodOption(record?.paymentMethodId ?? null, paymentMethodSnapshotOrCode)\n }, [\n ensurePaymentMethodOption,\n ensureShippingMethodOption,\n kind,\n record?.paymentMethodCode,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n ])\n\n React.useEffect(() => {\n ensureStatusOption(record?.status ?? null, record?.statusEntryId ?? null)\n }, [ensureStatusOption, record?.status, record?.statusEntryId])\n\n const handleRetry = React.useCallback(() => {\n setReloadKey((prev) => prev + 1)\n }, [])\n\n const loadAdjustmentsForTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', [kind === 'order' ? 'orderId' : 'quoteId']: record.id })\n const resourcePath = kind === 'order' ? '/api/sales/order-adjustments' : '/api/sales/quote-adjustments'\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `${resourcePath}?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped: AdjustmentRowData[] = items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const amountNet = parseNumber(\n (item as any).amount_net ?? (item as any).amountNet ?? (item as any).amount_net_amount\n )\n const amountGross = parseNumber(\n (item as any).amount_gross ?? (item as any).amountGross ?? (item as any).amount_gross_amount\n )\n const rateRaw = parseNumber((item as any).rate)\n const kindValue =\n typeof item.kind === 'string' && item.kind.trim().length\n ? (item.kind.trim() as SalesAdjustmentKind)\n : 'custom'\n const currency =\n typeof (item as any).currency_code === 'string'\n ? (item as any).currency_code\n : typeof (item as any).currencyCode === 'string'\n ? (item as any).currencyCode\n : record?.currencyCode ?? null\n return {\n id,\n label: typeof item.label === 'string' ? item.label : null,\n code: typeof item.code === 'string' ? item.code : null,\n kind: kindValue,\n calculatorKey:\n typeof (item as any).calculator_key === 'string'\n ? (item as any).calculator_key\n : typeof (item as any).calculatorKey === 'string'\n ? (item as any).calculatorKey\n : null,\n rate: Number.isFinite(rateRaw) ? rateRaw : null,\n amountNet: Number.isFinite(amountNet) ? amountNet : null,\n amountGross: Number.isFinite(amountGross) ? amountGross : null,\n currencyCode: currency,\n position:\n typeof item.position === 'number'\n ? item.position\n : typeof (item as any).position === 'string'\n ? Number((item as any).position)\n : 0,\n customFields: null,\n customFieldSetId:\n typeof (item as any).custom_field_set_id === 'string'\n ? (item as any).custom_field_set_id\n : typeof (item as any).customFieldSetId === 'string'\n ? (item as any).customFieldSetId\n : null,\n }\n })\n .filter((entry): entry is AdjustmentRowData => Boolean(entry))\n const ordered = [...mapped].sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n setAdjustmentRows(ordered)\n } catch (err) {\n console.error('sales.documents.adjustments.totals.load', err)\n }\n }, [kind, parseNumber, record?.currencyCode, record?.id])\n\n React.useEffect(() => {\n void loadAdjustmentsForTotals()\n }, [loadAdjustmentsForTotals])\n\n const refreshDocumentTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const updated = await fetchDocumentByKind(record.id, kind)\n if (updated) {\n setRecord(updated)\n }\n await loadAdjustmentsForTotals()\n } catch (err) {\n console.error('sales.documents.totals.refresh', err)\n }\n }, [fetchDocumentByKind, kind, loadAdjustmentsForTotals, record?.id])\n\n React.useEffect(\n () =>\n subscribeSalesDocumentTotalsRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n void refreshDocumentTotals()\n }),\n [kind, record?.id, refreshDocumentTotals],\n )\n\n // Subscribe to document data refresh events (e.g., from workflow status updates)\n React.useEffect(\n () =>\n subscribeSalesDocumentDataRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n // Increment reloadKey to trigger a full document reload\n setReloadKey((prev) => prev + 1)\n }),\n [kind, record?.id],\n )\n\n const statusDictionaryMap = React.useMemo(\n () =>\n createDictionaryMap(\n statusOptions.map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n }))\n ),\n [statusOptions]\n )\n const statusOptionsForEditor = React.useMemo(() => {\n if (kind === 'order') {\n return statusOptions.filter((option) => option.value !== 'sent')\n }\n return statusOptions\n }, [kind, statusOptions])\n const number = record?.orderNumber ?? record?.quoteNumber ?? record?.id\n const numberEditorKey = `${record?.id ?? 'unknown'}:${number ?? ''}`\n const customerSnapshot = (record?.customerSnapshot ?? null) as CustomerSnapshot | null\n const billingSnapshot = (record?.billingAddressSnapshot ?? null) as AddressSnapshot | null\n const shippingSnapshot = (record?.shippingAddressSnapshot ?? null) as AddressSnapshot | null\n const customerName = resolveCustomerName(customerSnapshot, record?.customerName ?? record?.customerEntityId ?? null)\n const metadataEmail =\n record?.metadata && typeof (record.metadata as Record<string, unknown>).customerEmail === 'string'\n ? (record.metadata as Record<string, unknown>).customerEmail\n : null\n const contactEmail = resolveCustomerEmail(customerSnapshot) ?? metadataEmail ?? record?.contactEmail ?? null\n const statusDisplay = record?.status ? statusDictionaryMap[record.status] ?? null : null\n const previewAmount = formatMessageAmount(record?.grandTotalGrossAmount ?? null, record?.currencyCode ?? null)\n const messagePreviewMetadata: Record<string, string> = {}\n if (includeAmountInMessageMetadata && previewAmount) {\n messagePreviewMetadata[t('sales.documents.detail.totals.grandTotalGross')] = previewAmount\n }\n const contactRecordId = customerSnapshot?.contact?.id ?? customerSnapshot?.customer?.id ?? record?.customerEntityId ?? null\n const resolveAdjustmentLabel = React.useCallback(\n (row: AdjustmentRowData) => {\n const base = (row.label ?? '').trim()\n const fallback = t(`sales.documents.adjustments.kindLabels.${row.kind}`, row.kind)\n const label = base.length ? base : fallback\n const hasRate = Number.isFinite(row.rate) && row.rate !== null\n const suffix = hasRate ? ` (${row.rate}%)` : ''\n return `${label}${suffix}`\n },\n [t]\n )\n const totalsItems = React.useMemo(() => {\n if (!record) return []\n const items: { key: string; label: string; amount: number | null | undefined; emphasize?: boolean }[] = [\n {\n key: 'subtotalNetAmount',\n label: t('sales.documents.detail.totals.subtotalNet', 'Subtotal (net)'),\n amount: record.subtotalNetAmount ?? null,\n },\n {\n key: 'subtotalGrossAmount',\n label: t('sales.documents.detail.totals.subtotalGross', 'Subtotal (gross)'),\n amount: record.subtotalGrossAmount ?? null,\n },\n {\n key: 'discountTotalAmount',\n label: t('sales.documents.detail.totals.discountTotal', 'Discounts'),\n amount: record.discountTotalAmount ?? null,\n },\n {\n key: 'taxTotalAmount',\n label: t('sales.documents.detail.totals.taxTotal', 'Tax total'),\n amount: record.taxTotalAmount ?? null,\n },\n ]\n if (kind === 'order') {\n items.push(\n {\n key: 'shippingNetAmount',\n label: t('sales.documents.detail.totals.shippingNet', 'Shipping (net)'),\n amount: record.shippingNetAmount ?? null,\n },\n {\n key: 'shippingGrossAmount',\n label: t('sales.documents.detail.totals.shippingGross', 'Shipping (gross)'),\n amount: record.shippingGrossAmount ?? null,\n },\n {\n key: 'surchargeTotalAmount',\n label: t('sales.documents.detail.totals.surchargeTotal', 'Surcharges'),\n amount: record.surchargeTotalAmount ?? null,\n }\n )\n }\n if (adjustmentRows.length) {\n adjustmentRows.forEach((adj) => {\n items.push({\n key: `adjustment-${adj.id}`,\n label: resolveAdjustmentLabel(adj),\n amount: adj.amountGross ?? adj.amountNet ?? null,\n })\n })\n }\n items.push(\n {\n key: 'grandTotalNetAmount',\n label: t('sales.documents.detail.totals.grandTotalNet', 'Grand total (net)'),\n amount: record.grandTotalNetAmount ?? null,\n emphasize: true,\n },\n {\n key: 'grandTotalGrossAmount',\n label: t('sales.documents.detail.totals.grandTotalGross', 'Grand total (gross)'),\n amount: record.grandTotalGrossAmount ?? null,\n emphasize: true,\n }\n )\n if (kind === 'order') {\n items.push(\n {\n key: 'paidTotalAmount',\n label: t('sales.documents.detail.totals.paidTotal', 'Paid'),\n amount: record.paidTotalAmount ?? null,\n },\n {\n key: 'refundedTotalAmount',\n label: t('sales.documents.detail.totals.refundedTotal', 'Refunded'),\n amount: record.refundedTotalAmount ?? null,\n },\n {\n key: 'outstandingAmount',\n label: t('sales.documents.detail.totals.outstandingTotal', 'Outstanding'),\n amount: record.outstandingAmount ?? null,\n emphasize: true,\n }\n )\n }\n return items\n }, [\n kind,\n record,\n record?.discountTotalAmount,\n record?.grandTotalGrossAmount,\n record?.grandTotalNetAmount,\n record?.outstandingAmount,\n record?.paidTotalAmount,\n record?.refundedTotalAmount,\n record?.shippingGrossAmount,\n record?.shippingNetAmount,\n record?.surchargeTotalAmount,\n record?.subtotalGrossAmount,\n record?.subtotalNetAmount,\n record?.taxTotalAmount,\n adjustmentRows,\n resolveAdjustmentLabel,\n t,\n ])\n const guardAllows = (list: string[] | null | undefined, status: string | null | undefined) => {\n if (list === null || list === undefined) return true\n if (list.length === 0) return false\n if (!status) return false\n return list.includes(status)\n }\n const customerGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.customer ?? null, record?.status ?? null)\n const addressGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.addresses ?? null, record?.status ?? null)\n const customerGuardMessage = customerGuardBlocked\n ? t('sales.documents.detail.customerBlocked', 'Customer cannot be changed for the current status.')\n : null\n const addressGuardMessage = addressGuardBlocked\n ? t('sales.documents.detail.addresses.blocked', 'Addresses cannot be changed for the current status.')\n : null\n React.useEffect(() => {\n const id = record?.customerEntityId ?? null\n if (!id) return\n const label = customerName ?? id\n setCustomerOptions((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: contactEmail ?? null,\n kind: 'company',\n primaryEmail: contactEmail ?? null,\n }\n return [next, ...prev]\n })\n }, [contactEmail, customerName, record?.customerEntityId])\n const currencyEntries = React.useMemo(() => {\n const entries = Array.isArray(currencyDictionary?.entries) ? currencyDictionary.entries : []\n return entries.map((entry) => ({\n value: entry.value.toUpperCase(),\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }, [currencyDictionary?.entries])\n const currencyOptions = React.useMemo(() => {\n const set = new Map<string, { value: string; label: string; color: string | null; icon: string | null }>()\n currencyEntries.forEach((entry) => {\n set.set(entry.value, { value: entry.value, label: entry.label, color: entry.color ?? null, icon: entry.icon ?? null })\n })\n const currentCode = typeof record?.currencyCode === 'string' ? record.currencyCode.toUpperCase() : null\n if (currentCode && !set.has(currentCode)) {\n set.set(currentCode, { value: currentCode, label: currentCode, color: null, icon: null })\n }\n return Array.from(set.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n }, [currencyEntries, record?.currencyCode])\n const currencyLabels = React.useMemo(\n () => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\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 }),\n [t]\n )\n const currencyLocked = React.useMemo(\n () => hasItems || (kind === 'order' && hasPayments),\n [hasItems, hasPayments, kind]\n )\n const currencyLockMessage = React.useMemo(\n () =>\n currencyLocked\n ? t(\n 'sales.documents.detail.currencyLocked',\n 'Currency cannot be changed after adding items or payments.'\n )\n : null,\n [currencyLocked, t]\n )\n const statusLabels = React.useMemo<DictionarySelectLabels>(\n () => ({\n placeholder: t('sales.documents.detail.status.placeholder', 'Select status'),\n addLabel: t('sales.config.statuses.actions.add', 'Add status'),\n dialogTitle: t('sales.documents.detail.status.dialogTitle', 'Add status'),\n valueLabel: t('sales.documents.detail.status.valueLabel', 'Value'),\n valuePlaceholder: t('sales.documents.detail.status.valuePlaceholder', 'e.g. confirmed'),\n labelLabel: t('sales.documents.detail.status.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.detail.status.labelPlaceholder', 'Display label'),\n emptyError: t('sales.documents.detail.status.emptyError', 'Status value is required.'),\n cancelLabel: t('sales.documents.detail.status.cancel', 'Cancel'),\n saveLabel: t('sales.documents.detail.status.save', 'Save'),\n saveShortcutHint: 'Ctrl/Cmd + Enter',\n successCreateLabel: t('sales.documents.detail.status.created', 'Status saved.'),\n errorLoad: t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'),\n errorSave: t('sales.documents.detail.status.errorSave', 'Failed to save status.'),\n loadingLabel: t('sales.documents.detail.status.loading', 'Loading statuses\u2026'),\n manageTitle: t('sales.documents.detail.status.manage', 'Manage statuses'),\n }),\n [t]\n )\n\n const updateDocument = React.useCallback(\n async (patch: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const mutation = { id: record.id, ...patch }\n return runMutationWithContext(\n () =>\n apiCallOrThrow<DocumentUpdateResult>(\n endpoint,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(mutation),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n ),\n mutation,\n )\n },\n [kind, record, runMutationWithContext, t]\n )\n\n const handleUpdateCurrency = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (currencyLocked) {\n const message =\n currencyLockMessage ??\n t('sales.documents.detail.currencyLocked', 'Currency cannot be changed after adding items or payments.')\n flash(message, 'error')\n throw new Error(message)\n }\n const normalized = typeof next === 'string' ? next.trim().toUpperCase() : ''\n if (!/^[A-Z]{3}$/.test(normalized)) {\n const message = t('sales.documents.detail.currencyInvalid', 'Currency code must be 3 letters.')\n flash(message, 'error')\n throw new Error(message)\n }\n try {\n const call = await updateDocument({ currencyCode: normalized })\n const savedCode = call.result?.currencyCode ?? normalized\n setRecord((prev) => (prev ? { ...prev, currencyCode: savedCode } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n return savedCode\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [currencyLockMessage, currencyLocked, record, t, updateDocument]\n )\n\n const handleUpdatePlacedAt = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { placedAt: string | null } = { placedAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.placedAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedPlacedAt =\n typeof call.result?.placedAt === 'string' ? call.result.placedAt : payload.placedAt\n setRecord((prev) => (prev ? { ...prev, placedAt: savedPlacedAt } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExpectedDeliveryAt = React.useCallback(\n async (next: string | null) => {\n if (!record || kind !== 'order') return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { expectedDeliveryAt: string | null } = { expectedDeliveryAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.expectedDeliveryAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedExpectedDelivery =\n typeof call.result?.expectedDeliveryAt === 'string'\n ? call.result.expectedDeliveryAt\n : payload.expectedDeliveryAt\n setRecord((prev) => (prev ? { ...prev, expectedDeliveryAt: savedExpectedDelivery } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [canEditNumber, kind, record, t, updateDocument]\n )\n\n const handleUpdateComment = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ comment: normalized.length ? normalized : null })\n const savedComment =\n typeof call.result?.comment === 'string'\n ? call.result.comment\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, comment: savedComment } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExternalReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ externalReference: normalized.length ? normalized : null })\n const savedExternalReference =\n typeof call.result?.externalReference === 'string'\n ? call.result.externalReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, externalReference: savedExternalReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateCustomerReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ customerReference: normalized.length ? normalized : null })\n const savedCustomerReference =\n typeof call.result?.customerReference === 'string'\n ? call.result.customerReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, customerReference: savedCustomerReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateContactEmail = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (customerGuardMessage) {\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n const baseMetadata = (record.metadata ?? {}) as Record<string, unknown>\n const trimmed = typeof next === 'string' ? next.trim() : ''\n const nextValue = trimmed.length ? trimmed : null\n const updatedMetadata =\n nextValue === null\n ? Object.fromEntries(Object.entries(baseMetadata).filter(([key]) => key !== 'customerEmail'))\n : { ...baseMetadata, customerEmail: nextValue }\n const metadataPayload = Object.keys(updatedMetadata).length ? updatedMetadata : null\n const snapshotBase = (record.customerSnapshot ?? null) as CustomerSnapshot | null\n const nextSnapshot =\n snapshotBase || nextValue !== null\n ? {\n ...(snapshotBase ?? {}),\n customer: {\n ...(snapshotBase?.customer ?? {}),\n primaryEmail: nextValue,\n },\n }\n : null\n try {\n const call = await updateDocument({ metadata: metadataPayload, customerSnapshot: nextSnapshot })\n const savedMetadata =\n (call.result?.metadata as Record<string, unknown> | null | undefined) ?? metadataPayload ?? null\n const snapshotFromResult = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot = hasSnapshotInResponse ? snapshotFromResult : nextSnapshot\n const savedEmail =\n resolveCustomerEmail(savedSnapshot ?? null) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : undefined) ??\n (typeof savedMetadata?.customerEmail === 'string' ? (savedMetadata.customerEmail as string) : undefined) ??\n nextValue\n setRecord((prev) => {\n if (!prev) return prev\n const resolvedEmail = savedEmail === undefined ? prev.contactEmail ?? null : savedEmail ?? null\n return {\n ...prev,\n metadata: savedMetadata ?? null,\n customerSnapshot: savedSnapshot ?? prev.customerSnapshot ?? null,\n contactEmail: resolvedEmail,\n }\n })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw new Error(message)\n }\n },\n [customerGuardMessage, record, t, updateDocument]\n )\n\n const handleUpdateChannel = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ channelId: nextId })\n const savedChannelId =\n typeof call.result?.channelId === 'string' ? call.result.channelId : nextId ?? null\n setRecord((prev) => (prev ? { ...prev, channelId: savedChannelId } : prev))\n if (savedChannelId) {\n void ensureChannelOption(savedChannelId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureChannelOption, record, t, updateDocument]\n )\n\n const handleUpdateShippingMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? shippingMethodOptionsRef.current.get(nextId) ??\n shippingMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n shippingMethodId: nextId,\n shippingMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.shippingMethodId === 'string' ? call.result.shippingMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.shippingMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.shippingMethodCode === 'string'\n ? call.result.shippingMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n shippingMethodId: savedId,\n shippingMethodCode: savedCode,\n shippingMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensureShippingMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensureShippingMethodOption,\n record,\n kind,\n shippingMethodOptions,\n shippingMethodOptionsRef,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdatePaymentMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? paymentMethodOptionsRef.current.get(nextId) ??\n paymentMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n paymentMethodId: nextId,\n paymentMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.paymentMethodId === 'string' ? call.result.paymentMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.paymentMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.paymentMethodCode === 'string'\n ? call.result.paymentMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n paymentMethodId: savedId,\n paymentMethodCode: savedCode,\n paymentMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensurePaymentMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensurePaymentMethodOption,\n kind,\n paymentMethodOptions,\n paymentMethodOptionsRef,\n record,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdateStatus = React.useCallback(\n async (entryId: string | null, value: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ statusEntryId: entryId })\n const savedStatusEntryId =\n typeof call.result?.statusEntryId === 'string' ? call.result.statusEntryId : entryId ?? null\n const savedStatus =\n typeof call.result?.status === 'string'\n ? call.result.status\n : value\n setRecord((prev) => (prev ? { ...prev, statusEntryId: savedStatusEntryId, status: savedStatus ?? null } : prev))\n if (savedStatus) {\n ensureStatusOption(savedStatus, savedStatusEntryId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureStatusOption, record, t, updateDocument]\n )\n\n const handleUpdateCustomer = React.useCallback(\n async (nextId: string | null, email: string | null) => {\n if (!record) return\n const changedCustomer = nextId !== record.customerEntityId\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n if (changedCustomer) {\n const hasAddresses =\n !!record.shippingAddressId ||\n !!record.billingAddressId ||\n !!record.shippingAddressSnapshot ||\n !!record.billingAddressSnapshot\n if (hasAddresses) {\n const confirmed = await confirm({\n title: t(\n 'sales.documents.detail.customerChangeConfirm',\n 'Change the customer? Existing shipping and billing addresses will be unassigned.'\n ),\n variant: 'default',\n })\n if (!confirmed) return\n }\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const payload: Record<string, unknown> = { customerEntityId: nextId }\n if (email && email.trim().length) {\n payload.metadata = { customerEmail: email.trim() }\n }\n const call = await updateDocument(payload)\n const snapshot = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const selected = customerOptions.find((entry) => entry.id === nextId) ?? null\n const resolvedName =\n (call.result?.customerName as string | undefined) ??\n resolveCustomerName(snapshot, selected?.label ?? record.customerName ?? record.customerEntityId ?? null)\n const resolvedEmail =\n resolveCustomerEmail(snapshot) ??\n (call.result?.contactEmail as string | undefined | null) ??\n email ??\n selected?.primaryEmail ??\n null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerEntityId: nextId ?? null,\n customerName: nextId ? resolvedName ?? prev.customerName : resolvedName ?? null,\n contactEmail: resolvedEmail ?? (nextId ? prev.contactEmail ?? null : null),\n customerSnapshot:\n hasSnapshotInResponse || changedCustomer\n ? snapshot\n : prev.customerSnapshot ?? null,\n shippingAddressId: changedCustomer ? null : prev.shippingAddressId ?? null,\n billingAddressId: changedCustomer ? null : prev.billingAddressId ?? null,\n shippingAddressSnapshot: changedCustomer ? null : prev.shippingAddressSnapshot ?? null,\n billingAddressSnapshot: changedCustomer ? null : prev.billingAddressSnapshot ?? null,\n }\n : prev\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerOptions, record, t, updateDocument]\n )\n\n const handleUpdateCustomerSnapshot = React.useCallback(\n async (snapshot: CustomerSnapshot) => {\n if (!record) return\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const call = await updateDocument({ customerSnapshot: snapshot })\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot =\n (hasSnapshotInResponse ? (call.result?.customerSnapshot ?? null) : snapshot) as CustomerSnapshot | null\n const resolvedName = resolveCustomerName(\n savedSnapshot,\n record.customerName ?? record.customerEntityId ?? null,\n )\n const resolvedEmail =\n resolveCustomerEmail(savedSnapshot) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : record.contactEmail ?? null)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerSnapshot: savedSnapshot ?? null,\n customerName: resolvedName,\n contactEmail: resolvedEmail ?? null,\n }\n : prev,\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerGuardMessage, record, t, updateDocument],\n )\n\n const handleGenerateNumber = React.useCallback(async () => {\n if (!canEditNumber) {\n const message = t('sales.documents.detail.numberEditForbidden', 'You cannot edit document numbers.')\n flash(message, 'error')\n throw new Error(message)\n }\n setGenerating(true)\n try {\n const call = await apiCall<{ number?: 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 throw new Error(t('sales.documents.detail.numberGenerateError', 'Could not generate number.'))\n }\n const payload = kind === 'order' ? { orderNumber: nextNumber } : { quoteNumber: nextNumber }\n const update = await updateDocument(payload)\n const savedNumber =\n kind === 'order'\n ? (typeof update.result?.orderNumber === 'string' ? update.result.orderNumber : nextNumber)\n : (typeof update.result?.quoteNumber === 'string' ? update.result.quoteNumber : nextNumber)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n orderNumber: kind === 'order' ? savedNumber : prev.orderNumber,\n quoteNumber: kind === 'quote' ? savedNumber : prev.quoteNumber,\n }\n : prev\n )\n setNumberEditing(false)\n flash(t('sales.documents.detail.numberGenerated', 'New number generated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.numberGenerateError', 'Could not generate number.')\n flash(message, 'error')\n throw err\n } finally {\n setGenerating(false)\n }\n }, [canEditNumber, kind, t, updateDocument])\n\n const handleUpdateNumber = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (!canEditNumber) {\n const message = t('sales.documents.detail.numberEditForbidden', 'You cannot edit document numbers.')\n flash(message, 'error')\n throw new Error(message)\n }\n const normalized = typeof next === 'string' ? next.trim() : ''\n if (!normalized.length) {\n const message = t('sales.documents.detail.numberRequired', 'Document number is required.')\n flash(message, 'error')\n throw new Error(message)\n }\n try {\n const payload = kind === 'order' ? { orderNumber: normalized } : { quoteNumber: normalized }\n const call = await updateDocument(payload)\n const savedNumber =\n kind === 'order'\n ? (typeof call.result?.orderNumber === 'string' ? call.result.orderNumber : normalized)\n : (typeof call.result?.quoteNumber === 'string' ? call.result.quoteNumber : normalized)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n orderNumber: kind === 'order' ? savedNumber : prev.orderNumber,\n quoteNumber: kind === 'quote' ? savedNumber : prev.quoteNumber,\n }\n : prev\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [canEditNumber, kind, record, t, updateDocument]\n )\n\n const handleConvert = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setConverting(true)\n try {\n await runMutationWithContext(async () => {\n const call = await apiCallOrThrow<{ orderId?: string }>(\n '/api/sales/quotes/convert',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id }),\n },\n { errorMessage: t('sales.documents.detail.convertError', 'Failed to convert quote.') },\n )\n const orderId = call.result?.orderId ?? record.id\n flash(t('sales.documents.detail.convertSuccess', 'Quote converted to order.'), 'success')\n router.replace(`/backend/sales/orders/${orderId}`)\n }, { quoteId: record.id })\n } catch (err) {\n console.error('sales.documents.convert', err)\n flash(t('sales.documents.detail.convertError', 'Failed to convert quote.'), 'error')\n } finally {\n setConverting(false)\n }\n }, [kind, record, router, runMutationWithContext, t])\n\n const handleSendQuote = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setSending(true)\n try {\n await runMutationWithContext(async () => {\n await apiCallOrThrow('/api/sales/quotes/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id, validForDays }),\n })\n flash(t('sales.quotes.send.success', 'Quote sent.'), 'success')\n setSendOpen(false)\n const updated = await fetchDocumentByKind(record.id, 'quote')\n if (updated) setRecord(updated)\n }, { quoteId: record.id, validForDays })\n } catch (err) {\n console.error('sales.quotes.send', err)\n flash(t('sales.quotes.send.failed', 'Failed to send quote.'), 'error')\n } finally {\n setSending(false)\n }\n }, [fetchDocumentByKind, kind, record, runMutationWithContext, t, validForDays])\n\n const handleDelete = React.useCallback(async () => {\n if (!record) return\n const ok = await confirm({\n title: t('sales.documents.detail.deleteConfirm', 'Delete this document? This cannot be undone.'),\n variant: 'default',\n })\n if (!ok) return\n setDeleting(true)\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n try {\n await runMutationWithContext(async () => {\n await apiCallOrThrow(endpoint, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: record.id }),\n }, {\n errorMessage: t('sales.documents.detail.deleteFailed', 'Could not delete document.'),\n })\n }, { id: record.id })\n flash(t('sales.documents.detail.deleted', 'Document deleted.'), 'success')\n const listPath = kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n router.push(listPath)\n } catch (err) {\n console.error('sales.documents.delete', err)\n flash(t('sales.documents.detail.deleteFailed', 'Could not delete document.'), 'error')\n }\n setDeleting(false)\n }, [kind, record, router, runMutationWithContext, t])\n\n const detailFields = React.useMemo(() => {\n const fields: DetailFieldConfig[] = [\n {\n key: 'shippingMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.shippingMethod.label', 'Shipping method')}\n value={record?.shippingMethodId ?? null}\n snapshot={(record?.shippingMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={shippingMethodOptions}\n loading={shippingMethodLoading}\n onLoadOptions={loadShippingMethods}\n onSave={handleUpdateShippingMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.shippingMethod.placeholder', 'Select shipping method')}\n loadingLabel={t('sales.documents.detail.shippingMethod.loading', 'Loading shipping methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.shippingMethod.empty', 'No shipping methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.shippingMethod.selected', 'Selected shipping method: {{id}}', { id })\n }\n icon={<Truck className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n {\n key: 'paymentMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.paymentMethod.label', 'Payment method')}\n value={record?.paymentMethodId ?? null}\n snapshot={(record?.paymentMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={paymentMethodOptions}\n loading={paymentMethodLoading}\n onLoadOptions={loadPaymentMethods}\n onSave={handleUpdatePaymentMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.paymentMethod.placeholder', 'Select payment method')}\n loadingLabel={t('sales.documents.detail.paymentMethod.loading', 'Loading payment methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.paymentMethod.empty', 'No payment methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.paymentMethod.selected', 'Selected payment method: {{id}}', { id })\n }\n icon={<CreditCard className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n ]\n if (kind === 'order') {\n fields.push({\n key: 'expectedDeliveryAt',\n kind: 'text',\n label: t('sales.documents.detail.expectedDeliveryAt.label', 'Expected delivery'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.expectedDeliveryAt.placeholder', 'Add expected delivery date'),\n value: record?.expectedDeliveryAt\n ? new Date(record.expectedDeliveryAt).toISOString().slice(0, 10)\n : null,\n onSave: handleUpdateExpectedDeliveryAt,\n inputType: 'date',\n renderDisplay: (params) => {\n const { value, emptyLabel } = params\n if (value && value.length) {\n return <span className=\"text-sm text-muted-foreground\">{new Date(value).toLocaleDateString()}</span>\n }\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n },\n })\n }\n fields.push(\n {\n key: 'externalRef',\n kind: 'text',\n label: t('sales.documents.detail.externalRef', 'External reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.externalRef.placeholder', 'Add external reference'),\n value: record?.externalReference ?? null,\n onSave: handleUpdateExternalReference,\n },\n {\n key: 'customerRef',\n kind: 'text',\n label: t('sales.documents.detail.customerRef', 'Customer reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.customerRef.placeholder', 'Customer PO or note'),\n value: record?.customerReference ?? null,\n onSave: handleUpdateCustomerReference,\n },\n {\n key: 'comment',\n kind: 'multiline',\n label: t('sales.documents.detail.comment', 'Comment'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.comment.placeholder', 'Add comment'),\n value: record?.comment ?? null,\n onSave: handleUpdateComment,\n gridClassName: 'sm:col-span-2 xl:col-span-3',\n },\n {\n key: 'timestamps',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <SectionCard title={t('sales.documents.detail.timestamps', 'Timestamps')} muted>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.created', 'Created')}: {record?.createdAt ?? '\u2014'}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.updated', 'Updated')}: {record?.updatedAt ?? '\u2014'}\n </p>\n </SectionCard>\n ),\n }\n )\n return fields\n }, [\n handleUpdateComment,\n handleUpdateCustomerReference,\n handleUpdateExpectedDeliveryAt,\n handleUpdateExternalReference,\n handleUpdatePaymentMethod,\n handleUpdateShippingMethod,\n loadPaymentMethods,\n loadShippingMethods,\n paymentMethodLoading,\n paymentMethodOptions,\n record?.comment,\n record?.createdAt,\n record?.customerReference,\n record?.expectedDeliveryAt,\n record?.externalReference,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n record?.updatedAt,\n shippingMethodLoading,\n shippingMethodOptions,\n t,\n kind,\n saveShortcutLabel,\n ])\n\n const summaryCards: Array<{\n key: 'email' | 'channel' | 'status' | 'currency'\n title: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel?: string\n type?: 'email'\n containerClassName?: string\n }> = [\n {\n key: 'email',\n title: t('sales.documents.detail.email', 'Primary email'),\n value: contactEmail,\n placeholder: t('sales.documents.detail.email.placeholder', 'Add email'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n type: 'email' as const,\n },\n {\n key: 'channel',\n title: t('sales.documents.detail.channel', 'Channel'),\n value: record?.channelId ?? null,\n },\n {\n key: 'status',\n title: t('sales.documents.detail.status', 'Status'),\n value: record?.status ?? null,\n },\n {\n key: 'currency',\n title: t('sales.documents.detail.currency', 'Currency'),\n value: record?.currencyCode ?? null,\n containerClassName: 'md:col-start-4 md:row-start-1',\n },\n ]\n\n const renderEmailDisplay = React.useCallback(\n ({ value, emptyLabel }: { value: string | null | undefined; emptyLabel: string }) => {\n const emailValue = typeof value === 'string' ? value.trim() : ''\n if (!emailValue.length) {\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n }\n return (\n <a\n className=\"inline-flex items-center gap-2 text-sm text-primary hover:text-primary/80 hover:underline\"\n href={`mailto:${emailValue}`}\n >\n <Mail className=\"h-4 w-4\" aria-hidden />\n <span className=\"truncate\">{emailValue}</span>\n </a>\n )\n },\n []\n )\n\n const tabInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:tabs`, [kind])\n const { widgets: injectedTabWidgets } = useInjectionWidgets(tabInjectionSpotId, {\n context: detailInjectionContext,\n triggerOnLoad: true,\n })\n const injectedTabs = React.useMemo(\n () =>\n (injectedTabWidgets ?? [])\n .filter((widget) => (widget.placement?.kind ?? 'tab') === 'tab')\n .map((widget) => {\n const id = widget.placement?.groupId ?? widget.widgetId\n const label = widget.placement?.groupLabel\n ? t(widget.placement.groupLabel, widget.module.metadata.title)\n : widget.module.metadata.title\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const render = () => (\n <widget.module.Widget\n context={detailInjectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n )\n return { id, label, priority, render }\n })\n .sort((a, b) => b.priority - a.priority),\n [detailInjectionContext, injectedTabWidgets, record, setRecord],\n )\n const injectedTabMap = React.useMemo(() => new Map(injectedTabs.map((tab) => [tab.id, tab.render])), [injectedTabs])\n\n const tabButtons = React.useMemo<Array<{ id: string; label: string }>>(\n () => {\n const tabs: Array<{ id: string; label: string }> = [\n { id: 'comments', label: t('sales.documents.detail.tabs.comments', 'Comments') },\n { id: 'addresses', label: t('sales.documents.detail.tabs.addresses', 'Addresses') },\n { id: 'items', label: t('sales.documents.detail.tabs.items', 'Items') },\n ]\n if (kind === 'order') {\n tabs.push(\n { id: 'shipments', label: t('sales.documents.detail.tabs.shipments', 'Shipments') },\n { id: 'payments', label: t('sales.documents.detail.tabs.payments', 'Payments') },\n )\n }\n tabs.push({ id: 'adjustments', label: t('sales.documents.detail.tabs.adjustments', 'Adjustments') })\n injectedTabs.forEach((tab) => {\n tabs.push({ id: tab.id, label: tab.label })\n })\n return tabs\n },\n [injectedTabs, kind, t],\n )\n\n React.useEffect(() => {\n if (tabButtons.some((tab) => tab.id === activeTab)) return\n const fallbackTab = tabButtons[0]?.id ?? 'comments'\n if (activeTab !== fallbackTab) {\n setActiveTab(fallbackTab)\n }\n }, [activeTab, tabButtons])\n\n const notesViewerLabel = React.useMemo(() => t('customers.people.detail.notes.you', 'You'), [t])\n\n const salesNotesAdapter = React.useMemo<NotesDataAdapter>(\n () => ({\n list: async ({ entityId }) => {\n if (!record || !entityId || record.id !== entityId) return []\n const params = new URLSearchParams({ contextType: kind, contextId: entityId })\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/notes?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.map(mapCommentSummary)\n },\n create: async ({ entityId, body, appearanceIcon, appearanceColor }) => {\n if (!record || record.id !== entityId) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/notes',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n contextType: kind,\n contextId: entityId,\n body,\n appearanceIcon: appearanceIcon ?? undefined,\n appearanceColor: appearanceColor ?? undefined,\n }),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n return response.result ?? {}\n },\n update: async ({ id, patch }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n const payload: Record<string, unknown> = { id }\n if (patch.body !== undefined) payload.body = patch.body\n if (patch.appearanceIcon !== undefined) payload.appearanceIcon = patch.appearanceIcon\n if (patch.appearanceColor !== undefined) payload.appearanceColor = patch.appearanceColor\n await apiCallOrThrow(\n '/api/sales/notes',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n delete: async ({ id }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n await apiCallOrThrow(\n `/api/sales/notes?id=${encodeURIComponent(id)}`,\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n }),\n [kind, record, t],\n )\n\n const appendShipmentComment = React.useCallback(\n async (body: string) => {\n if (!record) return\n try {\n await salesNotesAdapter.create?.({\n entityId: record.id,\n body,\n appearanceIcon: 'lucide:truck',\n appearanceColor: '#0ea5e9',\n })\n } catch (err) {\n console.error('sales.shipments.comment', err)\n }\n },\n [record, salesNotesAdapter],\n )\n\n const commentEmptyState = React.useMemo(\n () => ({\n title: t('sales.documents.detail.empty.comments.title', 'No comments yet.'),\n description: t('sales.documents.detail.empty.comments.description', 'Notes from teammates will appear here.'),\n actionLabel: t('sales.documents.detail.comments.add', 'Add comment'),\n }),\n [t]\n )\n\n const handleSectionActionChange = React.useCallback((action: SectionAction | null) => {\n setSectionAction(action)\n }, [])\n\n const handleSectionAction = React.useCallback(() => {\n if (!sectionAction || sectionAction.disabled) return\n sectionAction.onClick()\n }, [sectionAction])\n\n const tabEmptyStates = React.useMemo<Record<string, { title: string; description?: string }>>(\n () => ({\n items: {\n title: t('sales.documents.detail.empty.items.title', 'No items yet.'),\n description: t('sales.documents.detail.empty.items.description', 'Line items editor is coming in the next iteration.'),\n },\n shipments: {\n title: t('sales.documents.detail.empty.shipments.title', 'No shipments yet.'),\n description: t(\n 'sales.documents.shipments.empty.description',\n 'Add shipments for this document to let the user track the order.'\n ),\n },\n payments: {\n title: t('sales.documents.detail.empty.payments.title', 'No payments yet.'),\n description: t('sales.documents.detail.empty.payments.description', 'Payments are work in progress.'),\n },\n adjustments: {\n title: t('sales.documents.detail.empty.adjustments.title', 'No adjustments yet.'),\n description: t(\n 'sales.documents.detail.empty.adjustments.description',\n 'Add discounts, surcharges, taxes, or shipping to refine totals.'\n ),\n },\n }),\n [t]\n )\n\n const renderTabContent = () => {\n const injectedRenderer = injectedTabMap.get(activeTab)\n if (injectedRenderer) {\n return injectedRenderer()\n }\n if (activeTab === 'comments') {\n return (\n <NotesSection\n entityId={record.id}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n viewerUserId={null}\n viewerName={notesViewerLabel}\n addActionLabel={commentEmptyState.actionLabel}\n emptyState={{\n title: commentEmptyState.title,\n description: commentEmptyState.description,\n actionLabel: commentEmptyState.actionLabel,\n }}\n translator={t}\n dataAdapter={salesNotesAdapter}\n onActionChange={handleSectionActionChange}\n renderIcon={renderDictionaryIcon}\n renderColor={renderDictionaryColor}\n iconSuggestions={ICON_SUGGESTIONS}\n readMarkdownPreference={readMarkdownPreferenceCookie}\n writeMarkdownPreference={writeMarkdownPreferenceCookie}\n />\n )\n }\n if (activeTab === 'addresses') {\n return (\n <SalesDocumentAddressesSection\n documentId={record.id}\n kind={kind}\n customerId={record.customerEntityId ?? null}\n shippingAddressId={record.shippingAddressId ?? null}\n billingAddressId={record.billingAddressId ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n billingAddressSnapshot={billingSnapshot ?? null}\n lockedReason={addressGuardMessage}\n onUpdated={(patch) => setRecord((prev) => (prev ? { ...prev, ...patch } : prev))}\n />\n )\n }\n if (activeTab === 'items') {\n return (\n <SalesDocumentItemsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onItemsChange={(items) => setHasItems(items.length > 0)}\n />\n )\n }\n if (activeTab === 'shipments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.shipments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesShipmentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n onActionChange={handleSectionActionChange}\n onAddComment={appendShipmentComment}\n />\n )\n }\n if (activeTab === 'adjustments') {\n return (\n <SalesDocumentAdjustmentsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onRowsChange={setAdjustmentRows}\n />\n )\n }\n if (activeTab === 'payments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.payments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesDocumentPaymentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onPaymentsChange={(payments) => setHasPayments(payments.length > 0)}\n onTotalsChange={() => {\n void refreshDocumentTotals()\n }}\n />\n )\n }\n const placeholder =\n tabEmptyStates[activeTab] ??\n {\n title: t('sales.documents.detail.empty.generic', 'Nothing to show here yet.'),\n description: undefined,\n }\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n\n const customFieldValues = React.useMemo(() => {\n const merged: Record<string, unknown> = {}\n if (record?.customValues && typeof record.customValues === 'object' && !Array.isArray(record.customValues)) {\n Object.assign(merged, record.customValues as Record<string, unknown>)\n }\n const rawFields = record?.customFields\n if (Array.isArray(rawFields)) {\n rawFields.forEach((entry) => {\n const key = entry && typeof entry === 'object' && 'key' in entry ? (entry as any).key : null\n const value = entry && typeof entry === 'object' && 'value' in entry ? (entry as any).value : undefined\n if (typeof key === 'string' && key.trim()) merged[key] = value\n })\n } else if (rawFields && typeof rawFields === 'object') {\n Object.assign(merged, rawFields as Record<string, unknown>)\n }\n return prefixCustomFieldValues(merged)\n }, [record?.customFields, record?.customValues])\n\n const handleCustomFieldsSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.inlineError', 'Unable to update document.'))\n }\n const customPayload = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n accept: (fieldId) => !fieldId.startsWith('cf_'),\n })\n if (!Object.keys(customPayload).length) {\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n return\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n try {\n await runMutationWithContext(async () => {\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, customFields: customPayload }),\n },\n { errorMessage: t('sales.documents.detail.inlineError', 'Unable to update document.') },\n )\n }, { id: record.id, customFields: customPayload })\n } catch (err) {\n const { message: helperMessage, fieldErrors } = mapCrudServerErrorToFormErrors(err)\n const mappedErrors = fieldErrors\n ? Object.entries(fieldErrors).reduce<Record<string, string>>((acc, [key, value]) => {\n const formKey = key.startsWith('cf_') ? key : `cf_${key}`\n acc[formKey] = value\n return acc\n }, {})\n : undefined\n const error = new Error(helperMessage ?? t('sales.documents.detail.inlineError', 'Unable to update document.')) as Error & {\n fieldErrors?: Record<string, string>\n }\n if (mappedErrors && Object.keys(mappedErrors).length) error.fieldErrors = mappedErrors\n throw error\n }\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customFields: customPayload,\n customValues: customPayload,\n }\n : prev,\n )\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n },\n [kind, record, runMutationWithContext, t],\n )\n\n const loadTagOptions = React.useCallback(\n async (query?: string): Promise<TagOption[]> => {\n const params = new URLSearchParams({ pageSize: '100' })\n if (query) params.set('search', query)\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/tags?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.tags.loadError', 'Failed to load tags.') },\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items\n .map((item: unknown): TagOption | null => {\n if (!item || typeof item !== 'object') return null\n const raw = item as { id?: unknown; tagId?: unknown; label?: unknown; slug?: unknown; color?: unknown }\n const rawId =\n typeof raw.id === 'string'\n ? raw.id\n : typeof raw.tagId === 'string'\n ? raw.tagId\n : null\n if (!rawId) return null\n const labelValue =\n (typeof raw.label === 'string' && raw.label.trim().length && raw.label.trim()) ||\n (typeof raw.slug === 'string' && raw.slug.trim().length && raw.slug.trim()) ||\n rawId\n const color = typeof raw.color === 'string' && raw.color.trim().length ? raw.color.trim() : null\n return { id: rawId, label: labelValue, color }\n })\n .filter((entry): entry is TagOption => entry !== null)\n },\n [t],\n )\n\n const createTag = React.useCallback(\n async (label: string): Promise<TagOption> => {\n const trimmed = label.trim()\n if (!trimmed.length) {\n throw new Error(t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/tags',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ label: trimmed }),\n },\n { errorMessage: t('sales.documents.detail.tags.createError', 'Failed to create tag.') },\n )\n const payload = response.result ?? {}\n const id =\n typeof payload?.id === 'string'\n ? payload.id\n : typeof (payload as any)?.tagId === 'string'\n ? (payload as any).tagId\n : ''\n if (!id) throw new Error(t('sales.documents.detail.tags.createError', 'Failed to create tag.'))\n const color = typeof (payload as any)?.color === 'string' && (payload as any).color.trim().length\n ? (payload as any).color.trim()\n : null\n return { id, label: trimmed, color }\n },\n [t],\n )\n\n const handleTagsSave = React.useCallback(\n async ({ next }: { next: TagOption[] }) => {\n if (!record) return\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const tagIds = Array.from(new Set(next.map((tag) => tag.id)))\n await runMutationWithContext(async () => {\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, tags: tagIds }),\n },\n { errorMessage: t('sales.documents.detail.tags.updateError', 'Failed to update tags.') },\n )\n }, { id: record.id, tags: tagIds })\n setRecord((prev) => (prev ? { ...prev, tags: next } : prev))\n setTags(next)\n flash(t('sales.documents.detail.tags.success', 'Tags updated.'), 'success')\n },\n [kind, record, runMutationWithContext, t],\n )\n\n if (loading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] items-center justify-center\">\n <LoadingMessage\n label={t('sales.documents.detail.loading', 'Loading document\u2026')}\n className=\"min-w-[280px] justify-center border-0 bg-transparent text-base shadow-none\"\n />\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error}\n action={\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" onClick={() => handleRetry()}>\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => router.push('/backend/sales/documents/create')}\n >\n {t('sales.documents.detail.backToCreate', 'Create a new document')}\n </Button>\n </div>\n }\n />\n </PageBody>\n </Page>\n )\n }\n\n if (!record) return null\n\n return (\n <Page>\n <PageBody className=\"space-y-6\">\n <FormHeader\n mode=\"detail\"\n backHref={kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'}\n backLabel={t('sales.documents.detail.back', 'Back to documents')}\n utilityActions={record ? (\n <>\n <SendObjectMessageDialog\n object={{\n entityModule: 'sales',\n entityType: kind,\n entityId: record.id,\n sourceEntityType: kind === 'order' ? 'sales.order' : 'sales.quote',\n sourceEntityId: record.id,\n previewData: {\n title: number,\n status: statusDisplay?.label ?? record?.status ?? undefined,\n metadata: Object.keys(messagePreviewMetadata).length > 0 ? messagePreviewMetadata : undefined,\n },\n }}\n viewHref={`/backend/sales/${kind === 'order' ? 'orders' : 'quotes'}/${record.id}`}\n defaultValues={{\n sourceEntityType: kind === 'order' ? 'sales.order' : 'sales.quote',\n sourceEntityId: record.id,\n }}\n />\n <VersionHistoryAction\n config={{\n resourceKind: kind === 'order' ? 'sales.order' : 'sales.quote',\n resourceId: record.id,\n }}\n t={t}\n />\n </>\n ) : null}\n entityTypeLabel={kind === 'order'\n ? t('sales.documents.detail.order', 'Sales order')\n : t('sales.documents.detail.quote', 'Sales quote')}\n title={\n canEditNumber ? (\n <InlineTextEditor\n key={numberEditorKey}\n label={t('sales.documents.detail.number', 'Document number')}\n value={number}\n emptyLabel={t('sales.documents.detail.numberEmpty', 'No number yet')}\n onSave={handleUpdateNumber}\n variant=\"plain\"\n activateOnClick\n hideLabel\n triggerClassName=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 mt-1\"\n containerClassName=\"max-w-full w-full flex-1 sm:min-w-[28rem] lg:min-w-[36rem] xl:min-w-[44rem]\"\n renderDisplay={({ value: displayValue, emptyLabel }) =>\n displayValue && displayValue.length ? (\n <span className=\"text-2xl font-semibold leading-tight whitespace-nowrap\">{displayValue}</span>\n ) : (\n <span className=\"text-muted-foreground\">{emptyLabel}</span>\n )\n }\n onEditingChange={setNumberEditing}\n renderActions={\n numberEditing ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => void handleGenerateNumber()}\n disabled={generating}\n className=\"h-9 w-9\"\n >\n {generating ? <Spinner className=\"h-4 w-4 animate-spin\" /> : <Wand2 className=\"h-4 w-4\" />}\n <span className=\"sr-only\">{t('sales.documents.detail.generateNumber', 'Generate number')}</span>\n </Button>\n ) : null\n }\n />\n ) : (\n <div className=\"flex items-center gap-2\">\n {number && number.length ? (\n <span className=\"text-2xl font-semibold leading-tight whitespace-nowrap\">{number}</span>\n ) : (\n <span className=\"text-muted-foreground\">\n {t('sales.documents.detail.numberEmpty', 'No number yet')}\n </span>\n )}\n </div>\n )\n }\n statusBadge={record.status ? (\n <Badge variant=\"secondary\" className=\"inline-flex items-center gap-2\">\n {statusDisplay?.icon ? renderDictionaryIcon(statusDisplay.icon, 'h-4 w-4') : null}\n <span className=\"inline-flex items-center gap-1\">\n {statusDisplay?.color\n ? renderDictionaryColor(statusDisplay.color, 'h-2.5 w-2.5 rounded-full border border-border/60')\n : <span className=\"h-2.5 w-2.5 rounded-full bg-primary\" />}\n </span>\n <span>{statusDisplay?.label ?? record.status}</span>\n </Badge>\n ) : undefined}\n menuActions={kind === 'quote' ? ([\n { id: 'convert', label: t('sales.documents.detail.convertToOrder', 'Convert to order'), icon: ArrowRightLeft, onSelect: () => void handleConvert(), disabled: converting, loading: converting },\n { id: 'send', label: t('sales.quotes.send.action', 'Send to customer'), icon: Send, onSelect: () => setSendOpen(true), disabled: !contactEmail || sending, loading: sending },\n ] satisfies ActionItem[]) : undefined}\n onDelete={() => void handleDelete()}\n isDeleting={deleting}\n deleteLabel={t('sales.documents.detail.delete', 'Delete')}\n />\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"md:col-span-3\">\n <CustomerInlineEditor\n label={t('sales.documents.detail.customer', 'Customer')}\n customerId={record.customerEntityId ?? null}\n customerName={customerName}\n customerEmail={contactEmail ?? null}\n customerSnapshot={customerSnapshot}\n customers={customerOptions}\n customerLoading={customerLoading}\n onLoadCustomers={loadCustomers}\n fetchCustomerEmail={fetchCustomerEmail}\n onSave={handleUpdateCustomer}\n onSaveSnapshot={handleUpdateCustomerSnapshot}\n saving={customerSaving}\n error={customerError}\n guardMessage={customerGuardMessage}\n onClearError={clearCustomerError}\n />\n </div>\n <InlineTextEditor\n key=\"date\"\n label={t('sales.documents.detail.date', 'Date')}\n value={\n record?.placedAt\n ? new Date(record.placedAt).toISOString().slice(0, 10)\n : record?.createdAt\n ? new Date(record.createdAt).toISOString().slice(0, 10)\n : null\n }\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdatePlacedAt}\n inputType=\"date\"\n activateOnClick\n containerClassName=\"h-full\"\n saveLabel={t('customers.people.detail.inline.saveShortcut')}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-muted-foreground\">\n {new Date(value).toLocaleDateString()}\n </span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {summaryCards.map((card) => {\n if (card.key === 'email') {\n return (\n <ContactEmailInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n placeholder={card.placeholder}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdateContactEmail}\n renderDisplay={renderEmailDisplay}\n recordId={contactRecordId}\n />\n )\n }\n if (card.key === 'channel') {\n return (\n <ChannelInlineEditor\n key={card.key}\n label={card.title}\n value={record?.channelId ?? null}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={channelOptions}\n loading={channelLoading}\n onLoadOptions={loadChannels}\n onSave={handleUpdateChannel}\n saveLabel={saveShortcutLabel}\n />\n )\n }\n if (card.key === 'status') {\n return (\n <StatusInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={statusOptionsForEditor}\n onSave={handleUpdateStatus}\n onLoadOptions={loadStatuses}\n labels={statusLabels}\n manageHref=\"/backend/config/sales\"\n loading={statusLoading}\n saveLabel={saveShortcutLabel}\n dictionaryMap={statusDictionaryMap}\n />\n )\n }\n if (card.key === 'date') {\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType=\"date\"\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-foreground\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n )\n }\n if (card.key === 'currency') {\n return (\n <CurrencyInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={currencyOptions}\n labels={currencyLabels}\n error={currencyError}\n onClearError={() => setCurrencyError(null)}\n locked={currencyLocked}\n onLocked={() => {\n if (currencyLockMessage) {\n flash(currencyLockMessage, 'error')\n }\n }}\n onSave={async (next) => {\n setCurrencyError(null)\n try {\n await handleUpdateCurrency(next)\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCurrencyError(message)\n throw err\n }\n }}\n />\n )\n }\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n placeholder={card.placeholder}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType={card.type === 'email' ? 'email' : 'text'}\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={(params) =>\n card.key === 'email'\n ? renderEmailDisplay(params)\n : params.value && params.value.length\n ? <span className=\"text-base font-medium\">{params.value}</span>\n : <span className=\"text-sm text-muted-foreground\">{params.emptyLabel}</span>\n }\n />\n )\n })}\n </div>\n\n <div>\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-2 pb-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {tabButtons.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={cn(\n 'px-3 py-2 text-sm font-medium transition-colors',\n activeTab === tab.id\n ? 'border-b-2 border-primary text-primary'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => setActiveTab(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {sectionAction ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleSectionAction}\n disabled={sectionAction.disabled}\n >\n {sectionAction.icon ?? <Plus className=\"mr-2 h-4 w-4\" />}\n {sectionAction.label}\n </Button>\n ) : null}\n </div>\n {renderTabContent()}\n </div>\n\n <DocumentTotals\n title={t('sales.documents.detail.totals.title', 'Totals')}\n currency={record.currencyCode ?? null}\n items={totalsItems}\n />\n\n <div className=\"space-y-4\" ref={detailSectionRef}>\n <p className=\"text-sm font-semibold\">{t('sales.documents.detail.details', 'Details')}</p>\n <DetailFieldsSection fields={detailFields} />\n <InjectionSpot\n spotId={detailsInjectionSpotId}\n context={detailInjectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n </div>\n\n <div className=\"space-y-4\">\n <CustomDataSection\n title={t('sales.documents.detail.customData', 'Custom data')}\n entityIds={[kind === 'order' ? E.sales.sales_order : E.sales.sales_quote]}\n values={customFieldValues}\n onSubmit={handleCustomFieldsSubmit}\n labels={customDataLabels}\n />\n <TagsSection\n title={t('sales.documents.detail.tags', 'Tags')}\n tags={tags}\n onChange={setTags}\n isSubmitting={false}\n canEdit\n loadOptions={loadTagOptions}\n createTag={createTag}\n onSave={({ next }) => handleTagsSave({ next })}\n labels={tagLabels}\n />\n </div>\n </PageBody>\n\n <Dialog open={sendOpen} onOpenChange={setSendOpen}>\n <DialogContent\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setSendOpen(false)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!sending) void handleSendQuote()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{t('sales.quotes.send.title', 'Send quote to customer')}</DialogTitle>\n <DialogDescription>\n {t('sales.quotes.send.description', 'Email will be sent to:')} {contactEmail ?? t('sales.quotes.send.noEmail', 'No email')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('sales.quotes.send.validForDays', 'Valid for (days)')}</label>\n <Input\n type=\"number\"\n min={1}\n max={365}\n value={validForDays}\n onChange={(e) => setValidForDays(Number(e.target.value || 14))}\n disabled={sending}\n />\n </div>\n <DialogFooter>\n <Button variant=\"secondary\" onClick={() => setSendOpen(false)} disabled={sending}>\n {t('sales.quotes.send.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void handleSendQuote()} disabled={sending || !contactEmail}>\n {sending ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.quotes.send.submit', 'Send quote')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </Page>\n )\n}"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// @ts-nocheck\n\n\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams, useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport {\n CustomDataSection,\n DetailFieldsSection,\n ErrorMessage,\n InlineTextEditor,\n LoadingMessage,\n TabEmptyState,\n TagsSection,\n type TagOption,\n} from '@open-mercato/ui/backend/detail'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { ArrowRightLeft, Building2, CreditCard, Mail, Pencil, Plus, Send, Store, Truck, UserRound, Wand2, X } from 'lucide-react'\nimport { FormHeader, type ActionItem } from '@open-mercato/ui/backend/forms'\nimport { VersionHistoryAction } from '@open-mercato/ui/backend/version-history'\nimport { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'\nimport Link from 'next/link'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { DocumentCustomerCard } from '@open-mercato/core/modules/sales/components/DocumentCustomerCard'\nimport { SalesDocumentAddressesSection } from '@open-mercato/core/modules/sales/components/documents/AddressesSection'\nimport { SalesDocumentItemsSection } from '@open-mercato/core/modules/sales/components/documents/ItemsSection'\nimport { SalesDocumentPaymentsSection } from '@open-mercato/core/modules/sales/components/documents/PaymentsSection'\nimport { SalesDocumentAdjustmentsSection } from '@open-mercato/core/modules/sales/components/documents/AdjustmentsSection'\nimport type { AdjustmentRowData } from '@open-mercato/core/modules/sales/components/documents/AdjustmentDialog'\nimport { SalesShipmentsSection } from '@open-mercato/core/modules/sales/components/documents/ShipmentsSection'\nimport { SalesReturnsSection } from '@open-mercato/core/modules/sales/components/documents/ReturnsSection'\nimport { DocumentTotals } from '@open-mercato/core/modules/sales/components/documents/DocumentTotals'\nimport { E } from '#generated/entities.ids.generated'\nimport type { DictionarySelectLabels } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport type { SalesAdjustmentKind } from '@open-mercato/core/modules/sales/data/entities'\nimport { DictionaryValue, createDictionaryMap, renderDictionaryColor, renderDictionaryIcon, type DictionaryMap } from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\nimport { DictionaryEntrySelect } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { NotesSection, mapCommentSummary, type NotesDataAdapter } from '@open-mercato/ui/backend/detail'\nimport {\n emitSalesDocumentTotalsRefresh,\n subscribeSalesDocumentTotalsRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport {\n subscribeSalesDocumentDataRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentDataEvents'\nimport type { CommentSummary, SectionAction } from '@open-mercato/ui/backend/detail'\nimport { ICON_SUGGESTIONS } from '@open-mercato/core/modules/customers/lib/dictionaries'\nimport { readMarkdownPreferenceCookie, writeMarkdownPreferenceCookie } from '@open-mercato/core/modules/customers/lib/markdownPreference'\nimport { InjectionSpot, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\n\nfunction formatMessageAmount(amount: number | null | undefined, currency: string | null | undefined): string | null {\n if (typeof amount !== 'number' || !Number.isFinite(amount)) return null\n if (!currency) return amount.toLocaleString()\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(amount)\n } catch {\n return `${amount.toLocaleString()} ${currency}`\n }\n}\n\nfunction CurrencyInlineEditor({\n label,\n value,\n options,\n labels,\n emptyLabel,\n onSave,\n error,\n onClearError,\n locked,\n onLocked,\n}: {\n label: string\n value: string | null | undefined\n options: { value: string; label: string; color?: string | null; icon?: string | null }[]\n labels: DictionarySelectLabels\n emptyLabel: string\n onSave: (next: string | null) => Promise<void>\n error: string | null\n onClearError: () => void\n locked?: boolean\n onLocked?: () => void\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const normalizedValue = React.useMemo(() => (typeof value === 'string' ? value.toUpperCase() : undefined), [value])\n const [draft, setDraft] = React.useState<string | undefined>(normalizedValue)\n const [saving, setSaving] = React.useState(false)\n const appearanceMap = React.useMemo(\n () =>\n createDictionaryMap(\n options.map((option) => ({\n value: option.value.toUpperCase(),\n label: option.label,\n color: option.color ?? undefined,\n icon: option.icon ?? undefined,\n }))\n ),\n [options]\n )\n\n React.useEffect(() => {\n if (!editing) setDraft(normalizedValue)\n }, [editing, normalizedValue])\n\n React.useEffect(() => {\n if (locked && editing) {\n setEditing(false)\n }\n }, [editing, locked])\n\n const fetchOptions = React.useCallback(async () => options, [options])\n\n const handleLocked = React.useCallback(() => {\n if (onLocked) onLocked()\n }, [onLocked])\n\n const handleActivate = React.useCallback(() => {\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (!editing) {\n setEditing(true)\n }\n }, [editing, handleLocked, locked, onClearError])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n try {\n onClearError()\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n console.error('sales.documents.currency.save', err)\n } finally {\n setSaving(false)\n }\n }, [draft, onClearError, onSave])\n\n return (\n <div\n className={cn(\n 'group rounded-lg border bg-card p-4',\n !editing ? 'cursor-pointer' : null,\n locked ? 'cursor-not-allowed opacity-80' : null\n )}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n onClearError()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) {\n void handleSave()\n }\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ? next.toUpperCase() : undefined)}\n fetchOptions={fetchOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={labels}\n />\n <DictionaryValue\n value={draft ?? normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n onClearError()\n setEditing(false)\n setDraft(value ?? undefined)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <DictionaryValue\n value={normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"mt-1 inline-flex items-center gap-2 text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (editing) {\n onClearError()\n setDraft(value ?? undefined)\n }\n setEditing((prev) => !prev)\n }}\n aria-disabled={locked ? true : undefined}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype SnapshotDraft = {\n displayName: string\n kind: 'company' | 'person'\n primaryEmail: string\n primaryPhone: string\n firstName: string\n lastName: string\n legalName: string\n}\n\nfunction createSnapshotDraft(\n snapshot: CustomerSnapshot | null,\n fallbackName: string | null,\n fallbackEmail: string | null,\n): SnapshotDraft {\n const customer = snapshot?.customer ?? null\n const personProfile = customer?.personProfile ?? snapshot?.contact ?? null\n const companyProfile = customer?.companyProfile ?? null\n const resolvedKind: 'company' | 'person' =\n customer?.kind === 'person' || snapshot?.contact ? 'person' : 'company'\n return {\n displayName:\n (customer?.displayName && customer.displayName.trim()) ||\n (fallbackName && fallbackName.trim()) ||\n '',\n kind: resolvedKind,\n primaryEmail:\n (customer?.primaryEmail && customer.primaryEmail.trim()) ||\n (fallbackEmail && fallbackEmail.trim()) ||\n '',\n primaryPhone: (customer?.primaryPhone && customer.primaryPhone.trim()) || '',\n firstName: (personProfile?.firstName && personProfile.firstName.trim()) || '',\n lastName: (personProfile?.lastName && personProfile.lastName.trim()) || '',\n legalName: (companyProfile?.legalName && companyProfile.legalName.trim()) || '',\n }\n}\n\nfunction CustomerInlineEditor({\n label,\n customerId,\n customerName,\n customerEmail,\n customerSnapshot,\n customers,\n customerLoading,\n onLoadCustomers,\n fetchCustomerEmail,\n onSave,\n onSaveSnapshot,\n saving,\n error,\n guardMessage,\n onClearError,\n}: {\n label: string\n customerId: string | null\n customerName: string | null\n customerEmail: string | null | undefined\n customerSnapshot: CustomerSnapshot | null\n customers: CustomerOption[]\n customerLoading: boolean\n onLoadCustomers: (query?: string) => Promise<CustomerOption[]>\n fetchCustomerEmail: (id: string, kindHint?: 'person' | 'company') => Promise<string | null>\n onSave: (id: string | null, email: string | null) => Promise<void>\n onSaveSnapshot: (snapshot: CustomerSnapshot) => Promise<void>\n saving: boolean\n error: string | null\n guardMessage?: string | null\n onClearError: () => void\n}) {\n const t = useT()\n const [mode, setMode] = React.useState<'select' | 'snapshot' | null>(null)\n const [draftId, setDraftId] = React.useState<string | null>(customerId)\n const [draftEmail, setDraftEmail] = React.useState<string | null>(customerEmail ?? null)\n const [snapshotDraft, setSnapshotDraft] = React.useState<SnapshotDraft>(() =>\n createSnapshotDraft(customerSnapshot, customerName, customerEmail ?? null),\n )\n const selectedRef = React.useRef<string | null>(customerId)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n\n const currentLabel = React.useMemo(() => {\n if (customerName && customerName.trim().length) return customerName\n const match = customers.find((entry) => entry.id === customerId)\n return match?.label ?? null\n }, [customerId, customerName, customers])\n\n React.useEffect(() => {\n selectedRef.current = draftId\n }, [draftId])\n\n React.useEffect(() => {\n if (mode !== 'select') {\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n onClearError()\n }\n }, [customerEmail, customerId, mode, onClearError])\n\n React.useEffect(() => {\n if (mode !== 'snapshot') {\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }\n }, [customerEmail, customerSnapshot, currentLabel, mode])\n\n React.useEffect(() => {\n if (mode !== 'select') return\n const labelValue = currentLabel\n if (labelValue && customerQuerySetter.current) {\n customerQuerySetter.current(labelValue)\n }\n void onLoadCustomers(labelValue ?? undefined)\n }, [currentLabel, mode, onLoadCustomers])\n\n const handleSelectActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('select')\n void onLoadCustomers()\n }, [guardMessage, onClearError, onLoadCustomers])\n\n const handleSnapshotActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('snapshot')\n }, [guardMessage, onClearError])\n\n const handleCancel = React.useCallback(() => {\n onClearError()\n setMode(null)\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }, [customerEmail, customerId, customerSnapshot, currentLabel, onClearError])\n\n const buildSnapshotPayload = React.useCallback((): CustomerSnapshot => {\n const kind = snapshotDraft.kind\n const displayNameRaw = snapshotDraft.displayName.trim()\n const primaryEmailRaw = snapshotDraft.primaryEmail.trim()\n const primaryPhoneRaw = snapshotDraft.primaryPhone.trim()\n const firstNameRaw = snapshotDraft.firstName.trim()\n const lastNameRaw = snapshotDraft.lastName.trim()\n const legalNameRaw = snapshotDraft.legalName.trim()\n const nameFromParts =\n kind === 'person'\n ? [firstNameRaw, lastNameRaw].filter((value) => value.length).join(' ').trim()\n : legalNameRaw\n const resolvedDisplayName = displayNameRaw || nameFromParts || null\n const baseCustomer = customerSnapshot?.customer ?? {}\n const nextPersonProfile =\n kind === 'person'\n ? {\n ...(baseCustomer.personProfile ?? customerSnapshot?.contact ?? {}),\n firstName: firstNameRaw || null,\n lastName: lastNameRaw || null,\n }\n : null\n const nextCompanyProfile =\n kind === 'company'\n ? { ...(baseCustomer.companyProfile ?? {}), legalName: legalNameRaw || null }\n : null\n return {\n ...(customerSnapshot ?? {}),\n customer: {\n ...baseCustomer,\n kind,\n displayName: resolvedDisplayName,\n primaryEmail: primaryEmailRaw || null,\n primaryPhone: primaryPhoneRaw || null,\n personProfile: nextPersonProfile,\n companyProfile: nextCompanyProfile,\n },\n contact: customerSnapshot?.contact ?? null,\n }\n }, [customerSnapshot, snapshotDraft])\n\n const handleSaveSelection = React.useCallback(async () => {\n try {\n onClearError()\n await onSave(draftId, draftEmail)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.save', err)\n }\n }, [draftEmail, draftId, onClearError, onSave])\n\n const handleSaveSnapshot = React.useCallback(async () => {\n try {\n onClearError()\n const payload = buildSnapshotPayload()\n await onSaveSnapshot(payload)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.snapshot.save', err)\n }\n }, [buildSnapshotPayload, onClearError, onSaveSnapshot])\n\n if (mode === 'select') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSelection()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0 space-y-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <LookupSelect\n value={draftId}\n onChange={(next) => {\n setDraftId(next)\n setDraftEmail(null)\n selectedRef.current = next\n if (!next) return\n const match = customers.find((entry) => entry.id === next)\n if (match?.primaryEmail) {\n setDraftEmail(match.primaryEmail)\n } else {\n const selectedId = next\n fetchCustomerEmail(selectedId, match?.kind)\n .then((resolved) => {\n if (resolved && selectedRef.current === selectedId) setDraftEmail(resolved)\n })\n .catch(() => {})\n }\n }}\n fetchItems={async (query) => {\n const options = await onLoadCustomers(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 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) =>\n t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })\n }\n />\n {customerLoading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n </p>\n ) : null}\n {draftEmail ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" aria-hidden />\n <span className=\"truncate\">{draftEmail}</span>\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSelection()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )\n }\n\n if (mode === 'snapshot') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSnapshot()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.detail.customerSnapshot.hint', 'Edit the snapshot stored on this document.')}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"mt-3 space-y-3\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.displayName.label', 'Display name')}\n </label>\n <Input\n value={snapshotDraft.displayName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, displayName: event.target.value }))}\n placeholder={t('customers.people.form.displayName.placeholder', 'Enter display name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('sales.documents.detail.customerSnapshot.kind', 'Customer type')}\n </label>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'company' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'company' }))}\n >\n {t('customers.widgets.newCustomers.kind.company', 'Company')}\n </Button>\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'person' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'person' }))}\n >\n {t('customers.widgets.newCustomers.kind.person', 'Person')}\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryEmail', 'Primary email')}\n </label>\n <Input\n type=\"email\"\n value={snapshotDraft.primaryEmail}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryEmail: event.target.value }))}\n placeholder={t('customers.people.form.primaryEmailPlaceholder', 'name@example.com')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryPhone', 'Primary phone')}\n </label>\n <Input\n type=\"tel\"\n value={snapshotDraft.primaryPhone}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryPhone: event.target.value }))}\n placeholder={t('customers.people.form.primaryPhonePlaceholder', '+00 000 000 000')}\n />\n </div>\n </div>\n\n {snapshotDraft.kind === 'person' ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.firstName', 'First name')}\n </label>\n <Input\n value={snapshotDraft.firstName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, firstName: event.target.value }))}\n placeholder={t('customers.people.form.firstName', 'First name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.lastName', 'Last name')}\n </label>\n <Input\n value={snapshotDraft.lastName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, lastName: event.target.value }))}\n placeholder={t('customers.people.form.lastName', 'Last name')}\n />\n </div>\n </div>\n ) : (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.companies.detail.fields.legalName', 'Legal name')}\n </label>\n <Input\n value={snapshotDraft.legalName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, legalName: event.target.value }))}\n placeholder={t('customers.companies.detail.fields.legalNamePlaceholder', 'Add legal name')}\n />\n </div>\n )}\n\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSnapshot()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <DocumentCustomerCard\n label={label}\n name={customerName ?? null}\n email={customerEmail ?? undefined}\n kind={customerSnapshot?.customer?.kind === 'person' ? 'person' : 'company'}\n className=\"h-full\"\n onEditSnapshot={handleSnapshotActivate}\n onSelectCustomer={handleSelectActivate}\n />\n )\n}\n\ntype CustomerSnapshot = {\n customer?: {\n id?: string | null\n kind?: 'person' | 'company' | null\n displayName?: string | null\n primaryEmail?: string | null\n primaryPhone?: string | null\n personProfile?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n companyProfile?: {\n id?: string | null\n legalName?: string | null\n brandName?: string | null\n domain?: string | null\n websiteUrl?: string | null\n } | null\n } | null\n contact?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n}\n\ntype AddressSnapshot = {\n name?: string | null\n companyName?: string | null\n addressLine1?: string | null\n addressLine2?: string | null\n city?: string | null\n region?: string | null\n postalCode?: string | null\n country?: string | null\n}\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 = {\n id: string\n label: string\n}\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n carrierCode?: string | null\n serviceLevel?: string | null\n estimatedTransitDays?: number | null\n currencyCode?: string | null\n baseRateNet?: string | null\n baseRateGross?: string | null\n providerKey?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype PaymentMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n providerKey?: string | null\n terms?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\ntype DocumentRecord = {\n id: string\n orderNumber?: string | null\n quoteNumber?: string | null\n status?: string | null\n statusEntryId?: string | null\n currencyCode?: string | null\n customerEntityId?: string | null\n billingAddressId?: string | null\n shippingAddressId?: string | null\n customerReference?: string | null\n externalReference?: string | null\n channelId?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n customerSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n channelCode?: string | null\n comment?: string | null\n subtotalNetAmount?: number | null\n subtotalGrossAmount?: number | null\n discountTotalAmount?: number | null\n taxTotalAmount?: number | null\n shippingNetAmount?: number | null\n shippingGrossAmount?: number | null\n surchargeTotalAmount?: number | null\n grandTotalNetAmount?: number | null\n grandTotalGrossAmount?: number | null\n paidTotalAmount?: number | null\n refundedTotalAmount?: number | null\n outstandingAmount?: number | null\n createdAt?: string\n updatedAt?: string\n metadata?: Record<string, unknown> | null\n customFields?: Record<string, unknown> | null\n tags?: TagOption[] | null\n}\n\ntype DocumentUpdateResult = {\n orderNumber?: string | null\n quoteNumber?: string | null\n externalReference?: string | null\n customerReference?: string | null\n comment?: string | null\n currencyCode?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n statusEntryId?: string | null\n status?: string | null\n channelId?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerEntityId?: string | null\n customerSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n metadata?: Record<string, unknown> | null\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.filter((entry) => entry !== undefined)\n }\n if (value === undefined) return null\n return value\n}\n\nconst prefixCustomFieldValues = (input: Record<string, unknown> | null | undefined): Record<string, unknown> => {\n if (!input || typeof input !== 'object') return {}\n return Object.entries(input).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const normalized = key.startsWith('cf_') ? key : `cf_${key}`\n acc[normalized] = value\n return acc\n }, {})\n}\n\nconst resolveLineItemCount = (record: unknown): number | null => {\n if (!record || typeof record !== 'object') return null\n const current = (record as any).lineItemCount ?? (record as any).line_item_count\n if (typeof current !== 'number') return null\n return Number.isFinite(current) ? current : null\n}\n\nasync function fetchDocument(id: string, kind: 'order' | 'quote', errorMessage: string): Promise<DocumentRecord | null> {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\n const payload = await readApiResultOrThrow<{ items?: DocumentRecord[] }>(\n `/api/sales/${kind === 'order' ? 'orders' : 'quotes'}?${params.toString()}`,\n undefined,\n { errorMessage }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.length ? (items[0] as DocumentRecord) : null\n}\n\nfunction resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {\n if (!snapshot) return fallback ?? null\n const displayName =\n typeof snapshot.customer?.displayName === 'string' && snapshot.customer.displayName.trim().length\n ? snapshot.customer.displayName.trim()\n : null\n if (displayName) return displayName\n const contact = snapshot.contact ?? null\n const personProfile = snapshot.customer?.personProfile ?? null\n const preferred =\n (contact?.preferredName && contact.preferredName.trim()) ||\n (personProfile?.preferredName && personProfile.preferredName.trim()) ||\n null\n const firstName =\n (contact?.firstName && contact.firstName.trim()) ||\n (personProfile?.firstName && personProfile.firstName.trim()) ||\n null\n const lastName =\n (contact?.lastName && contact.lastName.trim()) ||\n (personProfile?.lastName && personProfile.lastName.trim()) ||\n null\n const parts = [preferred ?? firstName, lastName].filter((part) => part && part.length)\n if (parts.length) return parts.join(' ')\n const legalName =\n (snapshot.customer?.companyProfile?.legalName &&\n snapshot.customer.companyProfile.legalName.trim()) ||\n null\n if (legalName) return legalName\n return fallback ?? null\n}\n\nfunction resolveCustomerEmail(snapshot: CustomerSnapshot | null | undefined) {\n if (!snapshot) return null\n const primary =\n (snapshot.customer?.primaryEmail && snapshot.customer.primaryEmail.trim()) ||\n null\n if (primary) return primary\n return null\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction SectionCard({\n title,\n action,\n children,\n muted,\n}: {\n title: string\n action?: React.ReactNode\n children: React.ReactNode\n muted?: boolean\n}) {\n return (\n <div className={cn('rounded border p-4', muted ? 'bg-muted/30' : 'bg-card')}>\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{title}</p>\n {action}\n </div>\n {children}\n </div>\n )\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction ContactEmailInlineEditor({\n label,\n value,\n placeholder,\n emptyLabel,\n onSave,\n renderDisplay,\n recordId,\n}: {\n label: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel: string\n renderDisplay: (params: { value: string | null | undefined; emptyLabel: string }) => React.ReactNode\n onSave: (next: string | null) => Promise<void>\n recordId?: string | null\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState(value ?? '')\n const [error, setError] = React.useState<string | null>(null)\n const [saving, setSaving] = React.useState(false)\n const trimmedDraft = React.useMemo(() => draft.trim(), [draft])\n const isValidEmail = React.useMemo(() => {\n if (!trimmedDraft.length) return true\n return EMAIL_REGEX.test(trimmedDraft)\n }, [trimmedDraft])\n const { duplicate, checking } = useEmailDuplicateCheck(draft, {\n recordId: typeof recordId === 'string' ? recordId : null,\n disabled: !editing || !!error || saving || !trimmedDraft.length || !isValidEmail,\n matchMode: 'prefix',\n })\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? '')\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const normalized = trimmedDraft.length ? trimmedDraft : ''\n if (normalized.length && !EMAIL_REGEX.test(normalized)) {\n setError(t('customers.people.detail.inline.emailInvalid', 'Enter a valid email address.'))\n return\n }\n setError(null)\n setSaving(true)\n try {\n await onSave(normalized.length ? normalized : null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('customers.people.detail.inline.error', 'Failed to save value.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [onSave, t, trimmedDraft])\n\n const interactiveProps =\n !editing && !saving\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: () => setEditing(true),\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n }\n },\n }\n : {}\n\n return (\n <div className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\" {...interactiveProps}>\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <form\n className=\"mt-2 space-y-2\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!saving) void handleSave()\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n className=\"w-full rounded-md border pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n value={draft}\n onChange={(event) => {\n if (error) setError(null)\n setDraft(event.target.value)\n }}\n placeholder={placeholder}\n type=\"email\"\n autoFocus\n spellCheck={false}\n />\n </div>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n {!error && duplicate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('customers.people.detail.inline.emailDuplicate', undefined, { name: duplicate.displayName })}{' '}\n <Link\n className=\"font-medium text-primary underline underline-offset-2\"\n href={`/backend/customers/people/${duplicate.id}`}\n >\n {t('customers.people.detail.inline.emailDuplicateLink')}\n </Link>\n </p>\n ) : null}\n {!error && !duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.detail.inline.emailChecking')}</p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? '')\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"mt-1\">{renderDisplay({ value, emptyLabel })}</div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? '')\n setError(null)\n }\n setEditing((prev) => !prev)\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n disabled={saving}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction ChannelInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: ChannelOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<ChannelOption[]>\n onSave: (next: string | null) => Promise<void>\n saveLabel: string\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const current = React.useMemo(\n () => (draft ?? value ? options.find((opt) => opt.id === (draft ?? value)) ?? null : null),\n [draft, options, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n const query = current?.label ?? value ?? ''\n setSearchQueryRef.current(query)\n }, [current?.label, editing, value])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleActivate = React.useCallback(() => {\n if (!editing) {\n setEditing(true)\n prefillSearch()\n void onLoadOptions()\n }\n }, [editing, onLoadOptions, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\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 {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm text-foreground\">\n {current ? (\n <span className=\"text-sm\">{current.label}</span>\n ) : value ? (\n <span className=\"text-sm\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype MethodOption = ShippingMethodOption | PaymentMethodOption\n\nfunction MethodInlineEditor({\n label,\n value,\n snapshot,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n placeholder,\n loadingLabel,\n emptyResultsLabel,\n selectedHint,\n icon,\n allowClear = true,\n}: {\n label: string\n value: string | null | undefined\n snapshot: Record<string, unknown> | null\n emptyLabel: string\n options: MethodOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<MethodOption[]>\n onSave: (nextId: string | null) => Promise<void>\n saveLabel: string\n placeholder: string\n loadingLabel: string\n emptyResultsLabel: string\n selectedHint: (id: string) => string\n icon: React.ReactNode\n allowClear?: boolean\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const resolveDisplay = React.useCallback(\n (id: string | null | undefined): { label: string | null; description: string | null } => {\n if (!id) return { label: null, description: null }\n const option = options.find((entry) => entry.id === id)\n if (option) {\n return {\n label: option.name ?? option.code,\n description: option.description ?? null,\n }\n }\n const snapName =\n snapshot && typeof (snapshot as any)?.name === 'string' ? (snapshot as any).name : null\n const snapCode =\n snapshot && typeof (snapshot as any)?.code === 'string' ? (snapshot as any).code : null\n const snapDescription =\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null\n return {\n label: snapName ?? snapCode ?? id,\n description: snapDescription,\n }\n },\n [options, snapshot]\n )\n\n const currentDisplay = React.useMemo(\n () => resolveDisplay(draft ?? value ?? null),\n [draft, resolveDisplay, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n setSearchQueryRef.current('')\n }, [editing])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={containerClasses}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (editing) return\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.name ?? item.code,\n subtitle: item.code,\n icon: icon,\n }))\n }}\n minQuery={0}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\n }}\n searchPlaceholder={placeholder}\n loadingLabel={loadingLabel}\n emptyLabel={emptyResultsLabel}\n selectedHintLabel={(id) => selectedHint(id)}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n {allowClear ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => setDraft(null)}\n disabled={saving}\n >\n {t('ui.actions.clear', 'Clear')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n {currentDisplay.label ? (\n <div className=\"space-y-1\">\n <span className=\"text-sm\">{currentDisplay.label}</span>\n {currentDisplay.description ? (\n <p className=\"text-xs text-muted-foreground\">{currentDisplay.description}</p>\n ) : null}\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={triggerClasses}\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions('')\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction StatusInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n onSave,\n onLoadOptions,\n labels,\n manageHref,\n loading,\n saveLabel,\n dictionaryMap,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: StatusOption[]\n onSave: (entryId: string | null, value: string | null) => Promise<void>\n onLoadOptions: () => Promise<StatusOption[]>\n labels: DictionarySelectLabels\n manageHref?: string\n loading: boolean\n saveLabel: string\n dictionaryMap: DictionaryMap\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | undefined>(value ?? undefined)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const fetchStatusOptions = React.useCallback(\n async () =>\n (await onLoadOptions()).map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n })),\n [onLoadOptions]\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? undefined)\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const selected = draft ? options.find((opt) => opt.value === draft) ?? null : null\n if (draft && !selected) {\n setError(t('sales.documents.detail.statusInvalid', 'Selected status could not be found.'))\n return\n }\n setSaving(true)\n setError(null)\n try {\n await onSave(selected?.id ?? null, draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, options, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (!editing) {\n setEditing(true)\n void onLoadOptions()\n }\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n void onLoadOptions()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ?? undefined)}\n fetchOptions={fetchStatusOptions}\n allowInlineCreate={false}\n allowAppearance\n manageHref={manageHref}\n labels={labels}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {labels.loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n <DictionaryValue\n value={value}\n map={dictionaryMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm\"\n iconWrapperClassName=\"inline-flex h-6 w-6 items-center justify-center rounded border border-border bg-card\"\n iconClassName=\"h-4 w-4\"\n colorClassName=\"h-3 w-3 rounded-full\"\n />\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(normalizedValue)\n setError(null)\n }\n setEditing((prev) => !prev)\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nexport default function SalesDocumentDetailPage({\n params,\n initialKind,\n includeAmountInMessageMetadata,\n}: {\n params: { id: string }\n initialKind?: 'order' | 'quote'\n includeAmountInMessageMetadata?: boolean\n}) {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [loading, setLoading] = React.useState(true)\n const [record, setRecord] = React.useState<DocumentRecord | null>(null)\n const [tags, setTags] = React.useState<TagOption[]>([])\n const [kind, setKind] = React.useState<'order' | 'quote'>('quote')\n const [error, setError] = React.useState<string | null>(null)\n const [reloadKey, setReloadKey] = React.useState(0)\n const [activeTab, setActiveTab] = React.useState<string>('comments')\n const [sectionAction, setSectionAction] = React.useState<SectionAction | null>(null)\n const detailSectionRef = React.useRef<HTMLDivElement | null>(null)\n const [generating, setGenerating] = React.useState(false)\n const [converting, setConverting] = React.useState(false)\n const [deleting, setDeleting] = React.useState(false)\n const [sending, setSending] = React.useState(false)\n const [sendOpen, setSendOpen] = React.useState(false)\n const [validForDays, setValidForDays] = React.useState(14)\n const [numberEditing, setNumberEditing] = React.useState(false)\n const [canEditNumber, setCanEditNumber] = React.useState(false)\n const [currencyError, setCurrencyError] = React.useState<string | null>(null)\n const [hasItems, setHasItems] = React.useState(false)\n const [hasPayments, setHasPayments] = React.useState(false)\n const [customerOptions, setCustomerOptions] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [customerSaving, setCustomerSaving] = React.useState(false)\n const [customerError, setCustomerError] = React.useState<string | null>(null)\n const [editingGuards, setEditingGuards] = React.useState<{\n customer: string[] | null\n addresses: string[] | null\n } | null>(null)\n const [channelOptions, setChannelOptions] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const channelOptionsRef = React.useRef<Map<string, ChannelOption>>(new Map())\n const [shippingMethodOptions, setShippingMethodOptions] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const shippingMethodOptionsRef = React.useRef<Map<string, ShippingMethodOption>>(new Map())\n const [paymentMethodOptions, setPaymentMethodOptions] = React.useState<PaymentMethodOption[]>([])\n const [paymentMethodLoading, setPaymentMethodLoading] = React.useState(false)\n const paymentMethodOptionsRef = React.useRef<Map<string, PaymentMethodOption>>(new Map())\n const [statusOptions, setStatusOptions] = React.useState<StatusOption[]>([])\n const [statusLoading, setStatusLoading] = React.useState(false)\n const statusOptionsRef = React.useRef<Map<string, StatusOption>>(new Map())\n const [adjustmentRows, setAdjustmentRows] = React.useState<AdjustmentRowData[]>([])\n const mutationContextId = React.useMemo(\n () => (record?.id ? `sales-document:${kind}:${record.id}` : `sales-document:${kind}:pending`),\n [kind, record?.id],\n )\n const detailsInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:details`, [kind])\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n kind: SalesDocumentKind\n record: DocumentRecord | null\n formId: string\n resourceKind: string\n resourceId?: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const detailInjectionContext = React.useMemo(\n () => ({\n kind,\n record,\n formId: mutationContextId,\n resourceKind: `sales.${kind}`,\n resourceId: record?.id ?? undefined,\n retryLastMutation,\n }),\n [kind, mutationContextId, record, retryLastMutation],\n )\n const runMutationWithContext = React.useCallback(\n async <T,>(operation: () => Promise<T>, mutationPayload?: Record<string, unknown>): Promise<T> => {\n return runMutation({\n operation,\n mutationPayload,\n context: detailInjectionContext,\n })\n },\n [detailInjectionContext, runMutation],\n )\n const clearCustomerError = React.useCallback(() => setCustomerError(null), [])\n const { data: currencyDictionary } = useCurrencyDictionary()\n const scopeVersion = useOrganizationScopeVersion()\n const parseNumber = React.useCallback((value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return NaN\n }, [])\n\n const loadErrorMessage = React.useMemo(\n () => t('sales.documents.detail.error', 'Document not found or inaccessible.'),\n [t]\n )\n\n React.useEffect(() => {\n let active = true\n async function loadNumberPermission() {\n try {\n const call = await apiCall<{ granted?: unknown[] }>(\n '/api/auth/feature-check',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ features: ['sales.documents.number.edit'] }),\n }\n )\n if (!active) return\n const granted = Array.isArray(call.result?.granted)\n ? call.result?.granted.map((item) => String(item))\n : []\n const has = granted.some((feature) => {\n if (feature === '*') return true\n if (feature === 'sales.documents.number.edit') return true\n if (feature.endsWith('.*')) {\n const prefix = feature.slice(0, -2)\n return 'sales.documents.number.edit' === prefix || 'sales.documents.number.edit'.startsWith(`${prefix}.`)\n }\n return false\n })\n setCanEditNumber(Boolean(call.ok && has))\n } catch {\n if (active) setCanEditNumber(false)\n }\n }\n loadNumberPermission().catch(() => {})\n return () => {\n active = false\n }\n }, [scopeVersion])\n const saveShortcutLabel = React.useMemo(\n () => t('sales.documents.detail.inline.save', 'Save \u2318\u23CE / Ctrl+Enter'),\n [t]\n )\n const customDataLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.customDataLoading', 'Loading custom data\u2026'),\n emptyValue: t('sales.documents.detail.empty', 'Not set'),\n noFields: t('entities.customFields.empty'),\n defineFields: t('sales.documents.detail.customDataDefine', 'Define custom fields first.'),\n saveShortcut: saveShortcutLabel,\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [saveShortcutLabel, t],\n )\n const tagLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.tags.loading', 'Loading tags\u2026'),\n placeholder: t('sales.documents.detail.tags.placeholder', 'Type to add tags'),\n empty: t('sales.documents.detail.tags.placeholder', 'No tags yet. Add labels to keep documents organized.'),\n loadError: t('sales.documents.detail.tags.loadError', 'Failed to load tags.'),\n createError: t('sales.documents.detail.tags.createError', 'Failed to create tag.'),\n updateError: t('sales.documents.detail.tags.updateError', 'Failed to update tags.'),\n labelRequired: t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'),\n saveShortcut: t('sales.documents.detail.tags.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter'),\n cancelShortcut: t('sales.documents.detail.tags.cancelShortcut', 'Cancel (Esc)'),\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [t],\n )\n\n const upsertChannelOptions = React.useCallback((options: ChannelOption[]) => {\n setChannelOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n channelOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertShippingMethodOptions = React.useCallback((options: ShippingMethodOption[]) => {\n setShippingMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n shippingMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertPaymentMethodOptions = React.useCallback((options: PaymentMethodOption[]) => {\n setPaymentMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n paymentMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertStatusOptions = React.useCallback((options: StatusOption[]) => {\n setStatusOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.value, opt]))\n options.forEach((opt) => map.set(opt.value, opt))\n statusOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const loadCustomers = React.useCallback(\n 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 setCustomerOptions((prev) => {\n const combined = [...prev]\n merged.forEach((entry) => {\n if (!combined.some((item) => item.id === entry.id)) {\n combined.push(entry)\n }\n })\n return combined\n })\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n },\n [t]\n )\n\n const loadChannels = React.useCallback(\n 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) upsertChannelOptions(options)\n return options\n }\n if (!query) upsertChannelOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n if (!query) {\n flash(t('sales.channels.offers.filters.channelsLoadError', 'Failed to load channels'), 'error')\n }\n return []\n } finally {\n setChannelLoading(false)\n }\n },\n [t, upsertChannelOptions]\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string) => {\n setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${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 const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n carrierCode: typeof (item as any)?.carrierCode === 'string' ? (item as any).carrierCode : null,\n serviceLevel: typeof (item as any)?.serviceLevel === 'string' ? (item as any).serviceLevel : null,\n estimatedTransitDays:\n typeof (item as any)?.estimatedTransitDays === 'number'\n ? (item as any).estimatedTransitDays\n : null,\n currencyCode: typeof item?.currencyCode === 'string' ? item.currencyCode : null,\n baseRateNet:\n typeof (item as any)?.baseRateNet === 'string'\n ? (item as any).baseRateNet\n : typeof (item as any)?.baseRateNet === 'number'\n ? (item as any).baseRateNet.toString()\n : null,\n baseRateGross:\n typeof (item as any)?.baseRateGross === 'string'\n ? (item as any).baseRateGross\n : typeof (item as any)?.baseRateGross === 'number'\n ? (item as any).baseRateGross.toString()\n : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) upsertShippingMethodOptions(options)\n return options\n }\n if (!query) upsertShippingMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadShippingMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.shippingMethodLoadError', 'Failed to load shipping methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setShippingMethodLoading(false)\n }\n },\n [t, upsertShippingMethodOptions]\n )\n\n const loadPaymentMethods = React.useCallback(\n async (query?: string) => {\n setPaymentMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-methods?${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 const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n terms: typeof (item as any)?.terms === 'string' ? (item as any).terms : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is PaymentMethodOption => !!entry)\n if (!query) upsertPaymentMethodOptions(options)\n return options\n }\n if (!query) upsertPaymentMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadPaymentMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.paymentMethodLoadError', 'Failed to load payment methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setPaymentMethodLoading(false)\n }\n },\n [t, upsertPaymentMethodOptions]\n )\n\n const refreshPaymentPresence = React.useCallback(async () => {\n if (!record?.id || kind !== 'order') {\n setHasPayments(false)\n return\n }\n const params = new URLSearchParams({ page: '1', pageSize: '1', orderId: record.id })\n try {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payments?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n setHasPayments(items.some((item) => item && typeof (item as any).id === 'string'))\n } catch (err) {\n console.error('sales.documents.currency.paymentsGuard', err)\n }\n }, [kind, record?.id])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customerOptions.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 setCustomerOptions((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customerOptions],\n )\n\n const ensureChannelOption = React.useCallback(\n async (id: string | null | undefined) => {\n if (!id) return null\n const existing = channelOptionsRef.current.get(id)\n if (existing) return existing\n try {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\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) && call.result.items.length) {\n const item = call.result.items[0]\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 const option: ChannelOption = { id, label: code ? `${label} (${code})` : label }\n upsertChannelOptions([option])\n return option\n }\n } catch (err) {\n console.error('sales.documents.channel.ensure', err)\n }\n return null\n },\n [upsertChannelOptions]\n )\n\n const ensureShippingMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = shippingMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: ShippingMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n carrierCode:\n snapshot && typeof (snapshot as any)?.carrierCode === 'string'\n ? (snapshot as any).carrierCode\n : null,\n serviceLevel:\n snapshot && typeof (snapshot as any)?.serviceLevel === 'string'\n ? (snapshot as any).serviceLevel\n : null,\n estimatedTransitDays:\n snapshot && typeof (snapshot as any)?.estimatedTransitDays === 'number'\n ? (snapshot as any).estimatedTransitDays\n : null,\n currencyCode:\n snapshot && typeof (snapshot as any)?.currencyCode === 'string'\n ? (snapshot as any).currencyCode\n : null,\n }\n upsertShippingMethodOptions([option])\n return option\n },\n [upsertShippingMethodOptions]\n )\n\n const ensurePaymentMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = paymentMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: PaymentMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n providerKey:\n snapshot && typeof (snapshot as any)?.providerKey === 'string'\n ? (snapshot as any).providerKey\n : null,\n terms:\n snapshot && typeof (snapshot as any)?.terms === 'string' ? (snapshot as any).terms : null,\n }\n upsertPaymentMethodOptions([option])\n return option\n },\n [upsertPaymentMethodOptions]\n )\n\n const loadStatuses = React.useCallback(async () => {\n setStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const call = await apiCall<{ items?: Array<{ id?: string; value?: string; label?: string | null; color?: string | null; icon?: string | null }> }>(\n `/api/sales/order-statuses?${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 const value = typeof item?.value === 'string' ? item.value : null\n if (!id || !value) return null\n const label = typeof item?.label === 'string' && item.label.trim().length ? item.label : value\n const color = typeof item?.color === 'string' && item.color.trim().length ? item.color : null\n const icon = typeof item?.icon === 'string' && item.icon.trim().length ? item.icon : null\n return { id, value, label, color, icon }\n })\n .filter((opt): opt is StatusOption => !!opt)\n upsertStatusOptions(options)\n return options\n }\n upsertStatusOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadStatuses', err)\n flash(t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'), 'error')\n return []\n } finally {\n setStatusLoading(false)\n }\n }, [t, upsertStatusOptions])\n\n const ensureStatusOption = React.useCallback(\n (value: string | null | undefined, entryId: string | null | undefined) => {\n if (!value) return\n if (statusOptionsRef.current.has(value)) return\n upsertStatusOptions([\n {\n id: entryId ?? value,\n value,\n label: value,\n color: null,\n icon: null,\n },\n ])\n },\n [upsertStatusOptions]\n )\n\n const fetchDocumentByKind = React.useCallback(\n async (documentId: string, candidateKind: 'order' | 'quote') => {\n return fetchDocument(documentId, candidateKind, loadErrorMessage)\n },\n [loadErrorMessage]\n )\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setLoading(true)\n setError(null)\n const requestedKind = searchParams.get('kind')\n const preferredKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : initialKind ?? null\n const kindsToTry: Array<'order' | 'quote'> = preferredKind\n ? [preferredKind, preferredKind === 'order' ? 'quote' : 'order']\n : ['quote', 'order']\n let lastError: string | null = null\n for (const candidate of kindsToTry) {\n try {\n const entry = await fetchDocumentByKind(params.id, candidate)\n if (entry && !cancelled) {\n setRecord(entry)\n setKind(candidate)\n setLoading(false)\n return\n }\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n lastError = message\n }\n }\n if (!cancelled) {\n setLoading(false)\n setError(lastError ?? loadErrorMessage)\n }\n }\n load().catch((err) => {\n if (cancelled) return\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n setError(message)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [fetchDocumentByKind, initialKind, loadErrorMessage, params.id, reloadKey, searchParams])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n }, [loadCustomers])\n\n React.useEffect(() => {\n setTags(Array.isArray(record?.tags) ? record.tags : [])\n }, [record?.tags])\n\n React.useEffect(() => {\n if (!record) {\n setHasItems(false)\n return\n }\n const lineItemCount = resolveLineItemCount(record)\n if (lineItemCount !== null) {\n setHasItems(lineItemCount > 0)\n }\n }, [record])\n\n React.useEffect(() => {\n loadChannels().catch(() => {})\n loadStatuses().catch(() => {})\n loadShippingMethods().catch(() => {})\n loadPaymentMethods().catch(() => {})\n }, [loadChannels, loadPaymentMethods, loadShippingMethods, loadStatuses, scopeVersion])\n\n React.useEffect(() => {\n void refreshPaymentPresence()\n }, [refreshPaymentPresence])\n\n const normalizeGuardList = React.useCallback((value: unknown): string[] | null => {\n if (value === null) return null\n if (!Array.isArray(value)) return []\n const set = new Set<string>()\n value.forEach((entry) => {\n if (typeof entry === 'string' && entry.trim().length) set.add(entry.trim())\n })\n return Array.from(set)\n }, [])\n\n React.useEffect(() => {\n if (kind !== 'order') {\n setEditingGuards(null)\n return\n }\n let cancelled = false\n async function loadGuards() {\n try {\n const call = await apiCall<{\n orderCustomerEditableStatuses?: unknown\n orderAddressEditableStatuses?: unknown\n }>('/api/sales/settings/order-editing')\n if (!call.ok || cancelled) return\n setEditingGuards({\n customer: normalizeGuardList(call.result?.orderCustomerEditableStatuses ?? null),\n addresses: normalizeGuardList(call.result?.orderAddressEditableStatuses ?? null),\n })\n } catch (err) {\n console.error('sales.documents.loadGuards', err)\n }\n }\n void loadGuards()\n return () => {\n cancelled = true\n }\n }, [kind, normalizeGuardList, scopeVersion])\n\n React.useEffect(() => {\n if (!record?.channelId) return\n void ensureChannelOption(record.channelId)\n }, [ensureChannelOption, record?.channelId])\n\n React.useEffect(() => {\n if (kind !== 'order') return\n ensureShippingMethodOption(record?.shippingMethodId ?? null, record?.shippingMethodSnapshot ?? null)\n const paymentMethodSnapshotOrCode =\n record?.paymentMethodSnapshot ??\n (record?.paymentMethodCode ? { code: record.paymentMethodCode } : null)\n ensurePaymentMethodOption(record?.paymentMethodId ?? null, paymentMethodSnapshotOrCode)\n }, [\n ensurePaymentMethodOption,\n ensureShippingMethodOption,\n kind,\n record?.paymentMethodCode,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n ])\n\n React.useEffect(() => {\n ensureStatusOption(record?.status ?? null, record?.statusEntryId ?? null)\n }, [ensureStatusOption, record?.status, record?.statusEntryId])\n\n const handleRetry = React.useCallback(() => {\n setReloadKey((prev) => prev + 1)\n }, [])\n\n const loadAdjustmentsForTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', [kind === 'order' ? 'orderId' : 'quoteId']: record.id })\n const resourcePath = kind === 'order' ? '/api/sales/order-adjustments' : '/api/sales/quote-adjustments'\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `${resourcePath}?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped: AdjustmentRowData[] = items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const amountNet = parseNumber(\n (item as any).amount_net ?? (item as any).amountNet ?? (item as any).amount_net_amount\n )\n const amountGross = parseNumber(\n (item as any).amount_gross ?? (item as any).amountGross ?? (item as any).amount_gross_amount\n )\n const rateRaw = parseNumber((item as any).rate)\n const kindValue =\n typeof item.kind === 'string' && item.kind.trim().length\n ? (item.kind.trim() as SalesAdjustmentKind)\n : 'custom'\n const currency =\n typeof (item as any).currency_code === 'string'\n ? (item as any).currency_code\n : typeof (item as any).currencyCode === 'string'\n ? (item as any).currencyCode\n : record?.currencyCode ?? null\n return {\n id,\n label: typeof item.label === 'string' ? item.label : null,\n code: typeof item.code === 'string' ? item.code : null,\n kind: kindValue,\n calculatorKey:\n typeof (item as any).calculator_key === 'string'\n ? (item as any).calculator_key\n : typeof (item as any).calculatorKey === 'string'\n ? (item as any).calculatorKey\n : null,\n rate: Number.isFinite(rateRaw) ? rateRaw : null,\n amountNet: Number.isFinite(amountNet) ? amountNet : null,\n amountGross: Number.isFinite(amountGross) ? amountGross : null,\n currencyCode: currency,\n position:\n typeof item.position === 'number'\n ? item.position\n : typeof (item as any).position === 'string'\n ? Number((item as any).position)\n : 0,\n customFields: null,\n customFieldSetId:\n typeof (item as any).custom_field_set_id === 'string'\n ? (item as any).custom_field_set_id\n : typeof (item as any).customFieldSetId === 'string'\n ? (item as any).customFieldSetId\n : null,\n }\n })\n .filter((entry): entry is AdjustmentRowData => Boolean(entry))\n const ordered = [...mapped].sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n setAdjustmentRows(ordered)\n } catch (err) {\n console.error('sales.documents.adjustments.totals.load', err)\n }\n }, [kind, parseNumber, record?.currencyCode, record?.id])\n\n React.useEffect(() => {\n void loadAdjustmentsForTotals()\n }, [loadAdjustmentsForTotals])\n\n const refreshDocumentTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const updated = await fetchDocumentByKind(record.id, kind)\n if (updated) {\n setRecord(updated)\n }\n await loadAdjustmentsForTotals()\n } catch (err) {\n console.error('sales.documents.totals.refresh', err)\n }\n }, [fetchDocumentByKind, kind, loadAdjustmentsForTotals, record?.id])\n\n React.useEffect(\n () =>\n subscribeSalesDocumentTotalsRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n void refreshDocumentTotals()\n }),\n [kind, record?.id, refreshDocumentTotals],\n )\n\n // Subscribe to document data refresh events (e.g., from workflow status updates)\n React.useEffect(\n () =>\n subscribeSalesDocumentDataRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n // Increment reloadKey to trigger a full document reload\n setReloadKey((prev) => prev + 1)\n }),\n [kind, record?.id],\n )\n\n const statusDictionaryMap = React.useMemo(\n () =>\n createDictionaryMap(\n statusOptions.map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n }))\n ),\n [statusOptions]\n )\n const statusOptionsForEditor = React.useMemo(() => {\n if (kind === 'order') {\n return statusOptions.filter((option) => option.value !== 'sent')\n }\n return statusOptions\n }, [kind, statusOptions])\n const number = record?.orderNumber ?? record?.quoteNumber ?? record?.id\n const numberEditorKey = `${record?.id ?? 'unknown'}:${number ?? ''}`\n const customerSnapshot = (record?.customerSnapshot ?? null) as CustomerSnapshot | null\n const billingSnapshot = (record?.billingAddressSnapshot ?? null) as AddressSnapshot | null\n const shippingSnapshot = (record?.shippingAddressSnapshot ?? null) as AddressSnapshot | null\n const customerName = resolveCustomerName(customerSnapshot, record?.customerName ?? record?.customerEntityId ?? null)\n const metadataEmail =\n record?.metadata && typeof (record.metadata as Record<string, unknown>).customerEmail === 'string'\n ? (record.metadata as Record<string, unknown>).customerEmail\n : null\n const contactEmail = resolveCustomerEmail(customerSnapshot) ?? metadataEmail ?? record?.contactEmail ?? null\n const statusDisplay = record?.status ? statusDictionaryMap[record.status] ?? null : null\n const previewAmount = formatMessageAmount(record?.grandTotalGrossAmount ?? null, record?.currencyCode ?? null)\n const messagePreviewMetadata: Record<string, string> = {}\n if (includeAmountInMessageMetadata && previewAmount) {\n messagePreviewMetadata[t('sales.documents.detail.totals.grandTotalGross')] = previewAmount\n }\n const contactRecordId = customerSnapshot?.contact?.id ?? customerSnapshot?.customer?.id ?? record?.customerEntityId ?? null\n const resolveAdjustmentLabel = React.useCallback(\n (row: AdjustmentRowData) => {\n const base = (row.label ?? '').trim()\n const fallback = t(`sales.documents.adjustments.kindLabels.${row.kind}`, row.kind)\n const label = base.length ? base : fallback\n const hasRate = Number.isFinite(row.rate) && row.rate !== null\n const suffix = hasRate ? ` (${row.rate}%)` : ''\n return `${label}${suffix}`\n },\n [t]\n )\n const totalsItems = React.useMemo(() => {\n if (!record) return []\n const items: { key: string; label: string; amount: number | null | undefined; emphasize?: boolean }[] = [\n {\n key: 'subtotalNetAmount',\n label: t('sales.documents.detail.totals.subtotalNet', 'Subtotal (net)'),\n amount: record.subtotalNetAmount ?? null,\n },\n {\n key: 'subtotalGrossAmount',\n label: t('sales.documents.detail.totals.subtotalGross', 'Subtotal (gross)'),\n amount: record.subtotalGrossAmount ?? null,\n },\n {\n key: 'discountTotalAmount',\n label: t('sales.documents.detail.totals.discountTotal', 'Discounts'),\n amount: record.discountTotalAmount ?? null,\n },\n {\n key: 'taxTotalAmount',\n label: t('sales.documents.detail.totals.taxTotal', 'Tax total'),\n amount: record.taxTotalAmount ?? null,\n },\n ]\n if (kind === 'order') {\n items.push(\n {\n key: 'shippingNetAmount',\n label: t('sales.documents.detail.totals.shippingNet', 'Shipping (net)'),\n amount: record.shippingNetAmount ?? null,\n },\n {\n key: 'shippingGrossAmount',\n label: t('sales.documents.detail.totals.shippingGross', 'Shipping (gross)'),\n amount: record.shippingGrossAmount ?? null,\n },\n {\n key: 'surchargeTotalAmount',\n label: t('sales.documents.detail.totals.surchargeTotal', 'Surcharges'),\n amount: record.surchargeTotalAmount ?? null,\n }\n )\n }\n if (adjustmentRows.length) {\n adjustmentRows.forEach((adj) => {\n items.push({\n key: `adjustment-${adj.id}`,\n label: resolveAdjustmentLabel(adj),\n amount: adj.amountGross ?? adj.amountNet ?? null,\n })\n })\n }\n items.push(\n {\n key: 'grandTotalNetAmount',\n label: t('sales.documents.detail.totals.grandTotalNet', 'Grand total (net)'),\n amount: record.grandTotalNetAmount ?? null,\n emphasize: true,\n },\n {\n key: 'grandTotalGrossAmount',\n label: t('sales.documents.detail.totals.grandTotalGross', 'Grand total (gross)'),\n amount: record.grandTotalGrossAmount ?? null,\n emphasize: true,\n }\n )\n if (kind === 'order') {\n items.push(\n {\n key: 'paidTotalAmount',\n label: t('sales.documents.detail.totals.paidTotal', 'Paid'),\n amount: record.paidTotalAmount ?? null,\n },\n {\n key: 'refundedTotalAmount',\n label: t('sales.documents.detail.totals.refundedTotal', 'Refunded'),\n amount: record.refundedTotalAmount ?? null,\n },\n {\n key: 'outstandingAmount',\n label: t('sales.documents.detail.totals.outstandingTotal', 'Outstanding'),\n amount: record.outstandingAmount ?? null,\n emphasize: true,\n }\n )\n }\n return items\n }, [\n kind,\n record,\n record?.discountTotalAmount,\n record?.grandTotalGrossAmount,\n record?.grandTotalNetAmount,\n record?.outstandingAmount,\n record?.paidTotalAmount,\n record?.refundedTotalAmount,\n record?.shippingGrossAmount,\n record?.shippingNetAmount,\n record?.surchargeTotalAmount,\n record?.subtotalGrossAmount,\n record?.subtotalNetAmount,\n record?.taxTotalAmount,\n adjustmentRows,\n resolveAdjustmentLabel,\n t,\n ])\n const guardAllows = (list: string[] | null | undefined, status: string | null | undefined) => {\n if (list === null || list === undefined) return true\n if (list.length === 0) return false\n if (!status) return false\n return list.includes(status)\n }\n const customerGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.customer ?? null, record?.status ?? null)\n const addressGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.addresses ?? null, record?.status ?? null)\n const customerGuardMessage = customerGuardBlocked\n ? t('sales.documents.detail.customerBlocked', 'Customer cannot be changed for the current status.')\n : null\n const addressGuardMessage = addressGuardBlocked\n ? t('sales.documents.detail.addresses.blocked', 'Addresses cannot be changed for the current status.')\n : null\n React.useEffect(() => {\n const id = record?.customerEntityId ?? null\n if (!id) return\n const label = customerName ?? id\n setCustomerOptions((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: contactEmail ?? null,\n kind: 'company',\n primaryEmail: contactEmail ?? null,\n }\n return [next, ...prev]\n })\n }, [contactEmail, customerName, record?.customerEntityId])\n const currencyEntries = React.useMemo(() => {\n const entries = Array.isArray(currencyDictionary?.entries) ? currencyDictionary.entries : []\n return entries.map((entry) => ({\n value: entry.value.toUpperCase(),\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }, [currencyDictionary?.entries])\n const currencyOptions = React.useMemo(() => {\n const set = new Map<string, { value: string; label: string; color: string | null; icon: string | null }>()\n currencyEntries.forEach((entry) => {\n set.set(entry.value, { value: entry.value, label: entry.label, color: entry.color ?? null, icon: entry.icon ?? null })\n })\n const currentCode = typeof record?.currencyCode === 'string' ? record.currencyCode.toUpperCase() : null\n if (currentCode && !set.has(currentCode)) {\n set.set(currentCode, { value: currentCode, label: currentCode, color: null, icon: null })\n }\n return Array.from(set.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n }, [currencyEntries, record?.currencyCode])\n const currencyLabels = React.useMemo(\n () => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\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 }),\n [t]\n )\n const currencyLocked = React.useMemo(\n () => hasItems || (kind === 'order' && hasPayments),\n [hasItems, hasPayments, kind]\n )\n const currencyLockMessage = React.useMemo(\n () =>\n currencyLocked\n ? t(\n 'sales.documents.detail.currencyLocked',\n 'Currency cannot be changed after adding items or payments.'\n )\n : null,\n [currencyLocked, t]\n )\n const statusLabels = React.useMemo<DictionarySelectLabels>(\n () => ({\n placeholder: t('sales.documents.detail.status.placeholder', 'Select status'),\n addLabel: t('sales.config.statuses.actions.add', 'Add status'),\n dialogTitle: t('sales.documents.detail.status.dialogTitle', 'Add status'),\n valueLabel: t('sales.documents.detail.status.valueLabel', 'Value'),\n valuePlaceholder: t('sales.documents.detail.status.valuePlaceholder', 'e.g. confirmed'),\n labelLabel: t('sales.documents.detail.status.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.detail.status.labelPlaceholder', 'Display label'),\n emptyError: t('sales.documents.detail.status.emptyError', 'Status value is required.'),\n cancelLabel: t('sales.documents.detail.status.cancel', 'Cancel'),\n saveLabel: t('sales.documents.detail.status.save', 'Save'),\n saveShortcutHint: 'Ctrl/Cmd + Enter',\n successCreateLabel: t('sales.documents.detail.status.created', 'Status saved.'),\n errorLoad: t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'),\n errorSave: t('sales.documents.detail.status.errorSave', 'Failed to save status.'),\n loadingLabel: t('sales.documents.detail.status.loading', 'Loading statuses\u2026'),\n manageTitle: t('sales.documents.detail.status.manage', 'Manage statuses'),\n }),\n [t]\n )\n\n const updateDocument = React.useCallback(\n async (patch: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const mutation = { id: record.id, ...patch }\n return runMutationWithContext(\n () =>\n apiCallOrThrow<DocumentUpdateResult>(\n endpoint,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(mutation),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n ),\n mutation,\n )\n },\n [kind, record, runMutationWithContext, t]\n )\n\n const handleUpdateCurrency = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (currencyLocked) {\n const message =\n currencyLockMessage ??\n t('sales.documents.detail.currencyLocked', 'Currency cannot be changed after adding items or payments.')\n flash(message, 'error')\n throw new Error(message)\n }\n const normalized = typeof next === 'string' ? next.trim().toUpperCase() : ''\n if (!/^[A-Z]{3}$/.test(normalized)) {\n const message = t('sales.documents.detail.currencyInvalid', 'Currency code must be 3 letters.')\n flash(message, 'error')\n throw new Error(message)\n }\n try {\n const call = await updateDocument({ currencyCode: normalized })\n const savedCode = call.result?.currencyCode ?? normalized\n setRecord((prev) => (prev ? { ...prev, currencyCode: savedCode } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n return savedCode\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [currencyLockMessage, currencyLocked, record, t, updateDocument]\n )\n\n const handleUpdatePlacedAt = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { placedAt: string | null } = { placedAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.placedAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedPlacedAt =\n typeof call.result?.placedAt === 'string' ? call.result.placedAt : payload.placedAt\n setRecord((prev) => (prev ? { ...prev, placedAt: savedPlacedAt } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExpectedDeliveryAt = React.useCallback(\n async (next: string | null) => {\n if (!record || kind !== 'order') return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { expectedDeliveryAt: string | null } = { expectedDeliveryAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.expectedDeliveryAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedExpectedDelivery =\n typeof call.result?.expectedDeliveryAt === 'string'\n ? call.result.expectedDeliveryAt\n : payload.expectedDeliveryAt\n setRecord((prev) => (prev ? { ...prev, expectedDeliveryAt: savedExpectedDelivery } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [canEditNumber, kind, record, t, updateDocument]\n )\n\n const handleUpdateComment = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ comment: normalized.length ? normalized : null })\n const savedComment =\n typeof call.result?.comment === 'string'\n ? call.result.comment\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, comment: savedComment } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExternalReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ externalReference: normalized.length ? normalized : null })\n const savedExternalReference =\n typeof call.result?.externalReference === 'string'\n ? call.result.externalReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, externalReference: savedExternalReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateCustomerReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ customerReference: normalized.length ? normalized : null })\n const savedCustomerReference =\n typeof call.result?.customerReference === 'string'\n ? call.result.customerReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, customerReference: savedCustomerReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateContactEmail = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (customerGuardMessage) {\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n const baseMetadata = (record.metadata ?? {}) as Record<string, unknown>\n const trimmed = typeof next === 'string' ? next.trim() : ''\n const nextValue = trimmed.length ? trimmed : null\n const updatedMetadata =\n nextValue === null\n ? Object.fromEntries(Object.entries(baseMetadata).filter(([key]) => key !== 'customerEmail'))\n : { ...baseMetadata, customerEmail: nextValue }\n const metadataPayload = Object.keys(updatedMetadata).length ? updatedMetadata : null\n const snapshotBase = (record.customerSnapshot ?? null) as CustomerSnapshot | null\n const nextSnapshot =\n snapshotBase || nextValue !== null\n ? {\n ...(snapshotBase ?? {}),\n customer: {\n ...(snapshotBase?.customer ?? {}),\n primaryEmail: nextValue,\n },\n }\n : null\n try {\n const call = await updateDocument({ metadata: metadataPayload, customerSnapshot: nextSnapshot })\n const savedMetadata =\n (call.result?.metadata as Record<string, unknown> | null | undefined) ?? metadataPayload ?? null\n const snapshotFromResult = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot = hasSnapshotInResponse ? snapshotFromResult : nextSnapshot\n const savedEmail =\n resolveCustomerEmail(savedSnapshot ?? null) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : undefined) ??\n (typeof savedMetadata?.customerEmail === 'string' ? (savedMetadata.customerEmail as string) : undefined) ??\n nextValue\n setRecord((prev) => {\n if (!prev) return prev\n const resolvedEmail = savedEmail === undefined ? prev.contactEmail ?? null : savedEmail ?? null\n return {\n ...prev,\n metadata: savedMetadata ?? null,\n customerSnapshot: savedSnapshot ?? prev.customerSnapshot ?? null,\n contactEmail: resolvedEmail,\n }\n })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw new Error(message)\n }\n },\n [customerGuardMessage, record, t, updateDocument]\n )\n\n const handleUpdateChannel = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ channelId: nextId })\n const savedChannelId =\n typeof call.result?.channelId === 'string' ? call.result.channelId : nextId ?? null\n setRecord((prev) => (prev ? { ...prev, channelId: savedChannelId } : prev))\n if (savedChannelId) {\n void ensureChannelOption(savedChannelId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureChannelOption, record, t, updateDocument]\n )\n\n const handleUpdateShippingMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? shippingMethodOptionsRef.current.get(nextId) ??\n shippingMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n shippingMethodId: nextId,\n shippingMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.shippingMethodId === 'string' ? call.result.shippingMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.shippingMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.shippingMethodCode === 'string'\n ? call.result.shippingMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n shippingMethodId: savedId,\n shippingMethodCode: savedCode,\n shippingMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensureShippingMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensureShippingMethodOption,\n record,\n kind,\n shippingMethodOptions,\n shippingMethodOptionsRef,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdatePaymentMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? paymentMethodOptionsRef.current.get(nextId) ??\n paymentMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n paymentMethodId: nextId,\n paymentMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.paymentMethodId === 'string' ? call.result.paymentMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.paymentMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.paymentMethodCode === 'string'\n ? call.result.paymentMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n paymentMethodId: savedId,\n paymentMethodCode: savedCode,\n paymentMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensurePaymentMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensurePaymentMethodOption,\n kind,\n paymentMethodOptions,\n paymentMethodOptionsRef,\n record,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdateStatus = React.useCallback(\n async (entryId: string | null, value: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ statusEntryId: entryId })\n const savedStatusEntryId =\n typeof call.result?.statusEntryId === 'string' ? call.result.statusEntryId : entryId ?? null\n const savedStatus =\n typeof call.result?.status === 'string'\n ? call.result.status\n : value\n setRecord((prev) => (prev ? { ...prev, statusEntryId: savedStatusEntryId, status: savedStatus ?? null } : prev))\n if (savedStatus) {\n ensureStatusOption(savedStatus, savedStatusEntryId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureStatusOption, record, t, updateDocument]\n )\n\n const handleUpdateCustomer = React.useCallback(\n async (nextId: string | null, email: string | null) => {\n if (!record) return\n const changedCustomer = nextId !== record.customerEntityId\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n if (changedCustomer) {\n const hasAddresses =\n !!record.shippingAddressId ||\n !!record.billingAddressId ||\n !!record.shippingAddressSnapshot ||\n !!record.billingAddressSnapshot\n if (hasAddresses) {\n const confirmed = await confirm({\n title: t(\n 'sales.documents.detail.customerChangeConfirm',\n 'Change the customer? Existing shipping and billing addresses will be unassigned.'\n ),\n variant: 'default',\n })\n if (!confirmed) return\n }\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const payload: Record<string, unknown> = { customerEntityId: nextId }\n if (email && email.trim().length) {\n payload.metadata = { customerEmail: email.trim() }\n }\n const call = await updateDocument(payload)\n const snapshot = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const selected = customerOptions.find((entry) => entry.id === nextId) ?? null\n const resolvedName =\n (call.result?.customerName as string | undefined) ??\n resolveCustomerName(snapshot, selected?.label ?? record.customerName ?? record.customerEntityId ?? null)\n const resolvedEmail =\n resolveCustomerEmail(snapshot) ??\n (call.result?.contactEmail as string | undefined | null) ??\n email ??\n selected?.primaryEmail ??\n null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerEntityId: nextId ?? null,\n customerName: nextId ? resolvedName ?? prev.customerName : resolvedName ?? null,\n contactEmail: resolvedEmail ?? (nextId ? prev.contactEmail ?? null : null),\n customerSnapshot:\n hasSnapshotInResponse || changedCustomer\n ? snapshot\n : prev.customerSnapshot ?? null,\n shippingAddressId: changedCustomer ? null : prev.shippingAddressId ?? null,\n billingAddressId: changedCustomer ? null : prev.billingAddressId ?? null,\n shippingAddressSnapshot: changedCustomer ? null : prev.shippingAddressSnapshot ?? null,\n billingAddressSnapshot: changedCustomer ? null : prev.billingAddressSnapshot ?? null,\n }\n : prev\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerOptions, record, t, updateDocument]\n )\n\n const handleUpdateCustomerSnapshot = React.useCallback(\n async (snapshot: CustomerSnapshot) => {\n if (!record) return\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const call = await updateDocument({ customerSnapshot: snapshot })\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot =\n (hasSnapshotInResponse ? (call.result?.customerSnapshot ?? null) : snapshot) as CustomerSnapshot | null\n const resolvedName = resolveCustomerName(\n savedSnapshot,\n record.customerName ?? record.customerEntityId ?? null,\n )\n const resolvedEmail =\n resolveCustomerEmail(savedSnapshot) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : record.contactEmail ?? null)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerSnapshot: savedSnapshot ?? null,\n customerName: resolvedName,\n contactEmail: resolvedEmail ?? null,\n }\n : prev,\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerGuardMessage, record, t, updateDocument],\n )\n\n const handleGenerateNumber = React.useCallback(async () => {\n if (!canEditNumber) {\n const message = t('sales.documents.detail.numberEditForbidden', 'You cannot edit document numbers.')\n flash(message, 'error')\n throw new Error(message)\n }\n setGenerating(true)\n try {\n const call = await apiCall<{ number?: 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 throw new Error(t('sales.documents.detail.numberGenerateError', 'Could not generate number.'))\n }\n const payload = kind === 'order' ? { orderNumber: nextNumber } : { quoteNumber: nextNumber }\n const update = await updateDocument(payload)\n const savedNumber =\n kind === 'order'\n ? (typeof update.result?.orderNumber === 'string' ? update.result.orderNumber : nextNumber)\n : (typeof update.result?.quoteNumber === 'string' ? update.result.quoteNumber : nextNumber)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n orderNumber: kind === 'order' ? savedNumber : prev.orderNumber,\n quoteNumber: kind === 'quote' ? savedNumber : prev.quoteNumber,\n }\n : prev\n )\n setNumberEditing(false)\n flash(t('sales.documents.detail.numberGenerated', 'New number generated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.numberGenerateError', 'Could not generate number.')\n flash(message, 'error')\n throw err\n } finally {\n setGenerating(false)\n }\n }, [canEditNumber, kind, t, updateDocument])\n\n const handleUpdateNumber = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (!canEditNumber) {\n const message = t('sales.documents.detail.numberEditForbidden', 'You cannot edit document numbers.')\n flash(message, 'error')\n throw new Error(message)\n }\n const normalized = typeof next === 'string' ? next.trim() : ''\n if (!normalized.length) {\n const message = t('sales.documents.detail.numberRequired', 'Document number is required.')\n flash(message, 'error')\n throw new Error(message)\n }\n try {\n const payload = kind === 'order' ? { orderNumber: normalized } : { quoteNumber: normalized }\n const call = await updateDocument(payload)\n const savedNumber =\n kind === 'order'\n ? (typeof call.result?.orderNumber === 'string' ? call.result.orderNumber : normalized)\n : (typeof call.result?.quoteNumber === 'string' ? call.result.quoteNumber : normalized)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n orderNumber: kind === 'order' ? savedNumber : prev.orderNumber,\n quoteNumber: kind === 'quote' ? savedNumber : prev.quoteNumber,\n }\n : prev\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [canEditNumber, kind, record, t, updateDocument]\n )\n\n const handleConvert = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setConverting(true)\n try {\n await runMutationWithContext(async () => {\n const call = await apiCallOrThrow<{ orderId?: string }>(\n '/api/sales/quotes/convert',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id }),\n },\n { errorMessage: t('sales.documents.detail.convertError', 'Failed to convert quote.') },\n )\n const orderId = call.result?.orderId ?? record.id\n flash(t('sales.documents.detail.convertSuccess', 'Quote converted to order.'), 'success')\n router.replace(`/backend/sales/orders/${orderId}`)\n }, { quoteId: record.id })\n } catch (err) {\n console.error('sales.documents.convert', err)\n flash(t('sales.documents.detail.convertError', 'Failed to convert quote.'), 'error')\n } finally {\n setConverting(false)\n }\n }, [kind, record, router, runMutationWithContext, t])\n\n const handleSendQuote = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setSending(true)\n try {\n await runMutationWithContext(async () => {\n await apiCallOrThrow('/api/sales/quotes/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id, validForDays }),\n })\n flash(t('sales.quotes.send.success', 'Quote sent.'), 'success')\n setSendOpen(false)\n const updated = await fetchDocumentByKind(record.id, 'quote')\n if (updated) setRecord(updated)\n }, { quoteId: record.id, validForDays })\n } catch (err) {\n console.error('sales.quotes.send', err)\n flash(t('sales.quotes.send.failed', 'Failed to send quote.'), 'error')\n } finally {\n setSending(false)\n }\n }, [fetchDocumentByKind, kind, record, runMutationWithContext, t, validForDays])\n\n const handleDelete = React.useCallback(async () => {\n if (!record) return\n const ok = await confirm({\n title: t('sales.documents.detail.deleteConfirm', 'Delete this document? This cannot be undone.'),\n variant: 'default',\n })\n if (!ok) return\n setDeleting(true)\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n try {\n await runMutationWithContext(async () => {\n await apiCallOrThrow(endpoint, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: record.id }),\n }, {\n errorMessage: t('sales.documents.detail.deleteFailed', 'Could not delete document.'),\n })\n }, { id: record.id })\n flash(t('sales.documents.detail.deleted', 'Document deleted.'), 'success')\n const listPath = kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n router.push(listPath)\n } catch (err) {\n console.error('sales.documents.delete', err)\n flash(t('sales.documents.detail.deleteFailed', 'Could not delete document.'), 'error')\n }\n setDeleting(false)\n }, [kind, record, router, runMutationWithContext, t])\n\n const detailFields = React.useMemo(() => {\n const fields: DetailFieldConfig[] = [\n {\n key: 'shippingMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.shippingMethod.label', 'Shipping method')}\n value={record?.shippingMethodId ?? null}\n snapshot={(record?.shippingMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={shippingMethodOptions}\n loading={shippingMethodLoading}\n onLoadOptions={loadShippingMethods}\n onSave={handleUpdateShippingMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.shippingMethod.placeholder', 'Select shipping method')}\n loadingLabel={t('sales.documents.detail.shippingMethod.loading', 'Loading shipping methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.shippingMethod.empty', 'No shipping methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.shippingMethod.selected', 'Selected shipping method: {{id}}', { id })\n }\n icon={<Truck className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n {\n key: 'paymentMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.paymentMethod.label', 'Payment method')}\n value={record?.paymentMethodId ?? null}\n snapshot={(record?.paymentMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={paymentMethodOptions}\n loading={paymentMethodLoading}\n onLoadOptions={loadPaymentMethods}\n onSave={handleUpdatePaymentMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.paymentMethod.placeholder', 'Select payment method')}\n loadingLabel={t('sales.documents.detail.paymentMethod.loading', 'Loading payment methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.paymentMethod.empty', 'No payment methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.paymentMethod.selected', 'Selected payment method: {{id}}', { id })\n }\n icon={<CreditCard className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n ]\n if (kind === 'order') {\n fields.push({\n key: 'expectedDeliveryAt',\n kind: 'text',\n label: t('sales.documents.detail.expectedDeliveryAt.label', 'Expected delivery'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.expectedDeliveryAt.placeholder', 'Add expected delivery date'),\n value: record?.expectedDeliveryAt\n ? new Date(record.expectedDeliveryAt).toISOString().slice(0, 10)\n : null,\n onSave: handleUpdateExpectedDeliveryAt,\n inputType: 'date',\n renderDisplay: (params) => {\n const { value, emptyLabel } = params\n if (value && value.length) {\n return <span className=\"text-sm text-muted-foreground\">{new Date(value).toLocaleDateString()}</span>\n }\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n },\n })\n }\n fields.push(\n {\n key: 'externalRef',\n kind: 'text',\n label: t('sales.documents.detail.externalRef', 'External reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.externalRef.placeholder', 'Add external reference'),\n value: record?.externalReference ?? null,\n onSave: handleUpdateExternalReference,\n },\n {\n key: 'customerRef',\n kind: 'text',\n label: t('sales.documents.detail.customerRef', 'Customer reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.customerRef.placeholder', 'Customer PO or note'),\n value: record?.customerReference ?? null,\n onSave: handleUpdateCustomerReference,\n },\n {\n key: 'comment',\n kind: 'multiline',\n label: t('sales.documents.detail.comment', 'Comment'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.comment.placeholder', 'Add comment'),\n value: record?.comment ?? null,\n onSave: handleUpdateComment,\n gridClassName: 'sm:col-span-2 xl:col-span-3',\n },\n {\n key: 'timestamps',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <SectionCard title={t('sales.documents.detail.timestamps', 'Timestamps')} muted>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.created', 'Created')}: {record?.createdAt ?? '\u2014'}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.updated', 'Updated')}: {record?.updatedAt ?? '\u2014'}\n </p>\n </SectionCard>\n ),\n }\n )\n return fields\n }, [\n handleUpdateComment,\n handleUpdateCustomerReference,\n handleUpdateExpectedDeliveryAt,\n handleUpdateExternalReference,\n handleUpdatePaymentMethod,\n handleUpdateShippingMethod,\n loadPaymentMethods,\n loadShippingMethods,\n paymentMethodLoading,\n paymentMethodOptions,\n record?.comment,\n record?.createdAt,\n record?.customerReference,\n record?.expectedDeliveryAt,\n record?.externalReference,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n record?.updatedAt,\n shippingMethodLoading,\n shippingMethodOptions,\n t,\n kind,\n saveShortcutLabel,\n ])\n\n const summaryCards: Array<{\n key: 'email' | 'channel' | 'status' | 'currency'\n title: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel?: string\n type?: 'email'\n containerClassName?: string\n }> = [\n {\n key: 'email',\n title: t('sales.documents.detail.email', 'Primary email'),\n value: contactEmail,\n placeholder: t('sales.documents.detail.email.placeholder', 'Add email'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n type: 'email' as const,\n },\n {\n key: 'channel',\n title: t('sales.documents.detail.channel', 'Channel'),\n value: record?.channelId ?? null,\n },\n {\n key: 'status',\n title: t('sales.documents.detail.status', 'Status'),\n value: record?.status ?? null,\n },\n {\n key: 'currency',\n title: t('sales.documents.detail.currency', 'Currency'),\n value: record?.currencyCode ?? null,\n containerClassName: 'md:col-start-4 md:row-start-1',\n },\n ]\n\n const renderEmailDisplay = React.useCallback(\n ({ value, emptyLabel }: { value: string | null | undefined; emptyLabel: string }) => {\n const emailValue = typeof value === 'string' ? value.trim() : ''\n if (!emailValue.length) {\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n }\n return (\n <a\n className=\"inline-flex items-center gap-2 text-sm text-primary hover:text-primary/80 hover:underline\"\n href={`mailto:${emailValue}`}\n >\n <Mail className=\"h-4 w-4\" aria-hidden />\n <span className=\"truncate\">{emailValue}</span>\n </a>\n )\n },\n []\n )\n\n const tabInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:tabs`, [kind])\n const { widgets: injectedTabWidgets } = useInjectionWidgets(tabInjectionSpotId, {\n context: detailInjectionContext,\n triggerOnLoad: true,\n })\n const injectedTabs = React.useMemo(\n () =>\n (injectedTabWidgets ?? [])\n .filter((widget) => (widget.placement?.kind ?? 'tab') === 'tab')\n .map((widget) => {\n const id = widget.placement?.groupId ?? widget.widgetId\n const label = widget.placement?.groupLabel\n ? t(widget.placement.groupLabel, widget.module.metadata.title)\n : widget.module.metadata.title\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const render = () => (\n <widget.module.Widget\n context={detailInjectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n )\n return { id, label, priority, render }\n })\n .sort((a, b) => b.priority - a.priority),\n [detailInjectionContext, injectedTabWidgets, record, setRecord],\n )\n const injectedTabMap = React.useMemo(() => new Map(injectedTabs.map((tab) => [tab.id, tab.render])), [injectedTabs])\n\n const tabButtons = React.useMemo<Array<{ id: string; label: string }>>(\n () => {\n const tabs: Array<{ id: string; label: string }> = [\n { id: 'comments', label: t('sales.documents.detail.tabs.comments', 'Comments') },\n { id: 'addresses', label: t('sales.documents.detail.tabs.addresses', 'Addresses') },\n { id: 'items', label: t('sales.documents.detail.tabs.items', 'Items') },\n ]\n if (kind === 'order') {\n tabs.push(\n { id: 'shipments', label: t('sales.documents.detail.tabs.shipments', 'Shipments') },\n { id: 'payments', label: t('sales.documents.detail.tabs.payments', 'Payments') },\n { id: 'returns', label: t('sales.documents.detail.tabs.returns', 'Returns') },\n )\n }\n tabs.push({ id: 'adjustments', label: t('sales.documents.detail.tabs.adjustments', 'Adjustments') })\n injectedTabs.forEach((tab) => {\n tabs.push({ id: tab.id, label: tab.label })\n })\n return tabs\n },\n [injectedTabs, kind, t],\n )\n\n React.useEffect(() => {\n if (tabButtons.some((tab) => tab.id === activeTab)) return\n const fallbackTab = tabButtons[0]?.id ?? 'comments'\n if (activeTab !== fallbackTab) {\n setActiveTab(fallbackTab)\n }\n }, [activeTab, tabButtons])\n\n const notesViewerLabel = React.useMemo(() => t('customers.people.detail.notes.you', 'You'), [t])\n\n const salesNotesAdapter = React.useMemo<NotesDataAdapter>(\n () => ({\n list: async ({ entityId }) => {\n if (!record || !entityId || record.id !== entityId) return []\n const params = new URLSearchParams({ contextType: kind, contextId: entityId })\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/notes?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.map(mapCommentSummary)\n },\n create: async ({ entityId, body, appearanceIcon, appearanceColor }) => {\n if (!record || record.id !== entityId) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/notes',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n contextType: kind,\n contextId: entityId,\n body,\n appearanceIcon: appearanceIcon ?? undefined,\n appearanceColor: appearanceColor ?? undefined,\n }),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n return response.result ?? {}\n },\n update: async ({ id, patch }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n const payload: Record<string, unknown> = { id }\n if (patch.body !== undefined) payload.body = patch.body\n if (patch.appearanceIcon !== undefined) payload.appearanceIcon = patch.appearanceIcon\n if (patch.appearanceColor !== undefined) payload.appearanceColor = patch.appearanceColor\n await apiCallOrThrow(\n '/api/sales/notes',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n delete: async ({ id }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n await apiCallOrThrow(\n `/api/sales/notes?id=${encodeURIComponent(id)}`,\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n }),\n [kind, record, t],\n )\n\n const appendShipmentComment = React.useCallback(\n async (body: string) => {\n if (!record) return\n try {\n await salesNotesAdapter.create?.({\n entityId: record.id,\n body,\n appearanceIcon: 'lucide:truck',\n appearanceColor: '#0ea5e9',\n })\n } catch (err) {\n console.error('sales.shipments.comment', err)\n }\n },\n [record, salesNotesAdapter],\n )\n\n const commentEmptyState = React.useMemo(\n () => ({\n title: t('sales.documents.detail.empty.comments.title', 'No comments yet.'),\n description: t('sales.documents.detail.empty.comments.description', 'Notes from teammates will appear here.'),\n actionLabel: t('sales.documents.detail.comments.add', 'Add comment'),\n }),\n [t]\n )\n\n const handleSectionActionChange = React.useCallback((action: SectionAction | null) => {\n setSectionAction(action)\n }, [])\n\n const handleSectionAction = React.useCallback(() => {\n if (!sectionAction || sectionAction.disabled) return\n sectionAction.onClick()\n }, [sectionAction])\n\n const tabEmptyStates = React.useMemo<Record<string, { title: string; description?: string }>>(\n () => ({\n items: {\n title: t('sales.documents.detail.empty.items.title', 'No items yet.'),\n description: t('sales.documents.detail.empty.items.description', 'Line items editor is coming in the next iteration.'),\n },\n shipments: {\n title: t('sales.documents.detail.empty.shipments.title', 'No shipments yet.'),\n description: t(\n 'sales.documents.shipments.empty.description',\n 'Add shipments for this document to let the user track the order.'\n ),\n },\n payments: {\n title: t('sales.documents.detail.empty.payments.title', 'No payments yet.'),\n description: t('sales.documents.detail.empty.payments.description', 'Payments are work in progress.'),\n },\n returns: {\n title: t('sales.returns.empty.title', 'No returns yet.'),\n description: t('sales.returns.empty.description', 'Create a return to generate credit adjustments for returned items.'),\n },\n adjustments: {\n title: t('sales.documents.detail.empty.adjustments.title', 'No adjustments yet.'),\n description: t(\n 'sales.documents.detail.empty.adjustments.description',\n 'Add discounts, surcharges, taxes, or shipping to refine totals.'\n ),\n },\n }),\n [t]\n )\n\n const renderTabContent = () => {\n const injectedRenderer = injectedTabMap.get(activeTab)\n if (injectedRenderer) {\n return injectedRenderer()\n }\n if (activeTab === 'comments') {\n return (\n <NotesSection\n entityId={record.id}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n viewerUserId={null}\n viewerName={notesViewerLabel}\n addActionLabel={commentEmptyState.actionLabel}\n emptyState={{\n title: commentEmptyState.title,\n description: commentEmptyState.description,\n actionLabel: commentEmptyState.actionLabel,\n }}\n translator={t}\n dataAdapter={salesNotesAdapter}\n onActionChange={handleSectionActionChange}\n renderIcon={renderDictionaryIcon}\n renderColor={renderDictionaryColor}\n iconSuggestions={ICON_SUGGESTIONS}\n readMarkdownPreference={readMarkdownPreferenceCookie}\n writeMarkdownPreference={writeMarkdownPreferenceCookie}\n />\n )\n }\n if (activeTab === 'addresses') {\n return (\n <SalesDocumentAddressesSection\n documentId={record.id}\n kind={kind}\n customerId={record.customerEntityId ?? null}\n shippingAddressId={record.shippingAddressId ?? null}\n billingAddressId={record.billingAddressId ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n billingAddressSnapshot={billingSnapshot ?? null}\n lockedReason={addressGuardMessage}\n onUpdated={(patch) => setRecord((prev) => (prev ? { ...prev, ...patch } : prev))}\n />\n )\n }\n if (activeTab === 'items') {\n return (\n <SalesDocumentItemsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onItemsChange={(items) => setHasItems(items.length > 0)}\n />\n )\n }\n if (activeTab === 'shipments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.shipments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesShipmentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n onActionChange={handleSectionActionChange}\n onAddComment={appendShipmentComment}\n />\n )\n }\n if (activeTab === 'returns') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.returns\n return <TabEmptyState title={placeholder.title} description={placeholder.description} />\n }\n return (\n <SalesReturnsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n />\n )\n }\n if (activeTab === 'adjustments') {\n return (\n <SalesDocumentAdjustmentsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onRowsChange={setAdjustmentRows}\n />\n )\n }\n if (activeTab === 'payments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.payments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesDocumentPaymentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onPaymentsChange={(payments) => setHasPayments(payments.length > 0)}\n onTotalsChange={() => {\n void refreshDocumentTotals()\n }}\n />\n )\n }\n const placeholder =\n tabEmptyStates[activeTab] ??\n {\n title: t('sales.documents.detail.empty.generic', 'Nothing to show here yet.'),\n description: undefined,\n }\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n\n const customFieldValues = React.useMemo(() => {\n const merged: Record<string, unknown> = {}\n if (record?.customValues && typeof record.customValues === 'object' && !Array.isArray(record.customValues)) {\n Object.assign(merged, record.customValues as Record<string, unknown>)\n }\n const rawFields = record?.customFields\n if (Array.isArray(rawFields)) {\n rawFields.forEach((entry) => {\n const key = entry && typeof entry === 'object' && 'key' in entry ? (entry as any).key : null\n const value = entry && typeof entry === 'object' && 'value' in entry ? (entry as any).value : undefined\n if (typeof key === 'string' && key.trim()) merged[key] = value\n })\n } else if (rawFields && typeof rawFields === 'object') {\n Object.assign(merged, rawFields as Record<string, unknown>)\n }\n return prefixCustomFieldValues(merged)\n }, [record?.customFields, record?.customValues])\n\n const handleCustomFieldsSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.inlineError', 'Unable to update document.'))\n }\n const customPayload = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n accept: (fieldId) => !fieldId.startsWith('cf_'),\n })\n if (!Object.keys(customPayload).length) {\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n return\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n try {\n await runMutationWithContext(async () => {\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, customFields: customPayload }),\n },\n { errorMessage: t('sales.documents.detail.inlineError', 'Unable to update document.') },\n )\n }, { id: record.id, customFields: customPayload })\n } catch (err) {\n const { message: helperMessage, fieldErrors } = mapCrudServerErrorToFormErrors(err)\n const mappedErrors = fieldErrors\n ? Object.entries(fieldErrors).reduce<Record<string, string>>((acc, [key, value]) => {\n const formKey = key.startsWith('cf_') ? key : `cf_${key}`\n acc[formKey] = value\n return acc\n }, {})\n : undefined\n const error = new Error(helperMessage ?? t('sales.documents.detail.inlineError', 'Unable to update document.')) as Error & {\n fieldErrors?: Record<string, string>\n }\n if (mappedErrors && Object.keys(mappedErrors).length) error.fieldErrors = mappedErrors\n throw error\n }\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customFields: customPayload,\n customValues: customPayload,\n }\n : prev,\n )\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n },\n [kind, record, runMutationWithContext, t],\n )\n\n const loadTagOptions = React.useCallback(\n async (query?: string): Promise<TagOption[]> => {\n const params = new URLSearchParams({ pageSize: '100' })\n if (query) params.set('search', query)\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/tags?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.tags.loadError', 'Failed to load tags.') },\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items\n .map((item: unknown): TagOption | null => {\n if (!item || typeof item !== 'object') return null\n const raw = item as { id?: unknown; tagId?: unknown; label?: unknown; slug?: unknown; color?: unknown }\n const rawId =\n typeof raw.id === 'string'\n ? raw.id\n : typeof raw.tagId === 'string'\n ? raw.tagId\n : null\n if (!rawId) return null\n const labelValue =\n (typeof raw.label === 'string' && raw.label.trim().length && raw.label.trim()) ||\n (typeof raw.slug === 'string' && raw.slug.trim().length && raw.slug.trim()) ||\n rawId\n const color = typeof raw.color === 'string' && raw.color.trim().length ? raw.color.trim() : null\n return { id: rawId, label: labelValue, color }\n })\n .filter((entry): entry is TagOption => entry !== null)\n },\n [t],\n )\n\n const createTag = React.useCallback(\n async (label: string): Promise<TagOption> => {\n const trimmed = label.trim()\n if (!trimmed.length) {\n throw new Error(t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/tags',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ label: trimmed }),\n },\n { errorMessage: t('sales.documents.detail.tags.createError', 'Failed to create tag.') },\n )\n const payload = response.result ?? {}\n const id =\n typeof payload?.id === 'string'\n ? payload.id\n : typeof (payload as any)?.tagId === 'string'\n ? (payload as any).tagId\n : ''\n if (!id) throw new Error(t('sales.documents.detail.tags.createError', 'Failed to create tag.'))\n const color = typeof (payload as any)?.color === 'string' && (payload as any).color.trim().length\n ? (payload as any).color.trim()\n : null\n return { id, label: trimmed, color }\n },\n [t],\n )\n\n const handleTagsSave = React.useCallback(\n async ({ next }: { next: TagOption[] }) => {\n if (!record) return\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const tagIds = Array.from(new Set(next.map((tag) => tag.id)))\n await runMutationWithContext(async () => {\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, tags: tagIds }),\n },\n { errorMessage: t('sales.documents.detail.tags.updateError', 'Failed to update tags.') },\n )\n }, { id: record.id, tags: tagIds })\n setRecord((prev) => (prev ? { ...prev, tags: next } : prev))\n setTags(next)\n flash(t('sales.documents.detail.tags.success', 'Tags updated.'), 'success')\n },\n [kind, record, runMutationWithContext, t],\n )\n\n if (loading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] items-center justify-center\">\n <LoadingMessage\n label={t('sales.documents.detail.loading', 'Loading document\u2026')}\n className=\"min-w-[280px] justify-center border-0 bg-transparent text-base shadow-none\"\n />\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error}\n action={\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" onClick={() => handleRetry()}>\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => router.push('/backend/sales/documents/create')}\n >\n {t('sales.documents.detail.backToCreate', 'Create a new document')}\n </Button>\n </div>\n }\n />\n </PageBody>\n </Page>\n )\n }\n\n if (!record) return null\n\n return (\n <Page>\n <PageBody className=\"space-y-6\">\n <FormHeader\n mode=\"detail\"\n backHref={kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'}\n backLabel={t('sales.documents.detail.back', 'Back to documents')}\n utilityActions={record ? (\n <>\n <SendObjectMessageDialog\n object={{\n entityModule: 'sales',\n entityType: kind,\n entityId: record.id,\n sourceEntityType: kind === 'order' ? 'sales.order' : 'sales.quote',\n sourceEntityId: record.id,\n previewData: {\n title: number,\n status: statusDisplay?.label ?? record?.status ?? undefined,\n metadata: Object.keys(messagePreviewMetadata).length > 0 ? messagePreviewMetadata : undefined,\n },\n }}\n viewHref={`/backend/sales/${kind === 'order' ? 'orders' : 'quotes'}/${record.id}`}\n defaultValues={{\n sourceEntityType: kind === 'order' ? 'sales.order' : 'sales.quote',\n sourceEntityId: record.id,\n }}\n />\n <VersionHistoryAction\n config={{\n resourceKind: kind === 'order' ? 'sales.order' : 'sales.quote',\n resourceId: record.id,\n }}\n t={t}\n />\n </>\n ) : null}\n entityTypeLabel={kind === 'order'\n ? t('sales.documents.detail.order', 'Sales order')\n : t('sales.documents.detail.quote', 'Sales quote')}\n title={\n canEditNumber ? (\n <InlineTextEditor\n key={numberEditorKey}\n label={t('sales.documents.detail.number', 'Document number')}\n value={number}\n emptyLabel={t('sales.documents.detail.numberEmpty', 'No number yet')}\n onSave={handleUpdateNumber}\n variant=\"plain\"\n activateOnClick\n hideLabel\n triggerClassName=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 mt-1\"\n containerClassName=\"max-w-full w-full flex-1 sm:min-w-[28rem] lg:min-w-[36rem] xl:min-w-[44rem]\"\n renderDisplay={({ value: displayValue, emptyLabel }) =>\n displayValue && displayValue.length ? (\n <span className=\"text-2xl font-semibold leading-tight whitespace-nowrap\">{displayValue}</span>\n ) : (\n <span className=\"text-muted-foreground\">{emptyLabel}</span>\n )\n }\n onEditingChange={setNumberEditing}\n renderActions={\n numberEditing ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => void handleGenerateNumber()}\n disabled={generating}\n className=\"h-9 w-9\"\n >\n {generating ? <Spinner className=\"h-4 w-4 animate-spin\" /> : <Wand2 className=\"h-4 w-4\" />}\n <span className=\"sr-only\">{t('sales.documents.detail.generateNumber', 'Generate number')}</span>\n </Button>\n ) : null\n }\n />\n ) : (\n <div className=\"flex items-center gap-2\">\n {number && number.length ? (\n <span className=\"text-2xl font-semibold leading-tight whitespace-nowrap\">{number}</span>\n ) : (\n <span className=\"text-muted-foreground\">\n {t('sales.documents.detail.numberEmpty', 'No number yet')}\n </span>\n )}\n </div>\n )\n }\n statusBadge={record.status ? (\n <Badge variant=\"secondary\" className=\"inline-flex items-center gap-2\">\n {statusDisplay?.icon ? renderDictionaryIcon(statusDisplay.icon, 'h-4 w-4') : null}\n <span className=\"inline-flex items-center gap-1\">\n {statusDisplay?.color\n ? renderDictionaryColor(statusDisplay.color, 'h-2.5 w-2.5 rounded-full border border-border/60')\n : <span className=\"h-2.5 w-2.5 rounded-full bg-primary\" />}\n </span>\n <span>{statusDisplay?.label ?? record.status}</span>\n </Badge>\n ) : undefined}\n menuActions={kind === 'quote' ? ([\n { id: 'convert', label: t('sales.documents.detail.convertToOrder', 'Convert to order'), icon: ArrowRightLeft, onSelect: () => void handleConvert(), disabled: converting, loading: converting },\n { id: 'send', label: t('sales.quotes.send.action', 'Send to customer'), icon: Send, onSelect: () => setSendOpen(true), disabled: !contactEmail || sending, loading: sending },\n ] satisfies ActionItem[]) : undefined}\n onDelete={() => void handleDelete()}\n isDeleting={deleting}\n deleteLabel={t('sales.documents.detail.delete', 'Delete')}\n />\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"md:col-span-3\">\n <CustomerInlineEditor\n label={t('sales.documents.detail.customer', 'Customer')}\n customerId={record.customerEntityId ?? null}\n customerName={customerName}\n customerEmail={contactEmail ?? null}\n customerSnapshot={customerSnapshot}\n customers={customerOptions}\n customerLoading={customerLoading}\n onLoadCustomers={loadCustomers}\n fetchCustomerEmail={fetchCustomerEmail}\n onSave={handleUpdateCustomer}\n onSaveSnapshot={handleUpdateCustomerSnapshot}\n saving={customerSaving}\n error={customerError}\n guardMessage={customerGuardMessage}\n onClearError={clearCustomerError}\n />\n </div>\n <InlineTextEditor\n key=\"date\"\n label={t('sales.documents.detail.date', 'Date')}\n value={\n record?.placedAt\n ? new Date(record.placedAt).toISOString().slice(0, 10)\n : record?.createdAt\n ? new Date(record.createdAt).toISOString().slice(0, 10)\n : null\n }\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdatePlacedAt}\n inputType=\"date\"\n activateOnClick\n containerClassName=\"h-full\"\n saveLabel={t('customers.people.detail.inline.saveShortcut')}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-muted-foreground\">\n {new Date(value).toLocaleDateString()}\n </span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {summaryCards.map((card) => {\n if (card.key === 'email') {\n return (\n <ContactEmailInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n placeholder={card.placeholder}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdateContactEmail}\n renderDisplay={renderEmailDisplay}\n recordId={contactRecordId}\n />\n )\n }\n if (card.key === 'channel') {\n return (\n <ChannelInlineEditor\n key={card.key}\n label={card.title}\n value={record?.channelId ?? null}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={channelOptions}\n loading={channelLoading}\n onLoadOptions={loadChannels}\n onSave={handleUpdateChannel}\n saveLabel={saveShortcutLabel}\n />\n )\n }\n if (card.key === 'status') {\n return (\n <StatusInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={statusOptionsForEditor}\n onSave={handleUpdateStatus}\n onLoadOptions={loadStatuses}\n labels={statusLabels}\n manageHref=\"/backend/config/sales\"\n loading={statusLoading}\n saveLabel={saveShortcutLabel}\n dictionaryMap={statusDictionaryMap}\n />\n )\n }\n if (card.key === 'date') {\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType=\"date\"\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-foreground\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n )\n }\n if (card.key === 'currency') {\n return (\n <CurrencyInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={currencyOptions}\n labels={currencyLabels}\n error={currencyError}\n onClearError={() => setCurrencyError(null)}\n locked={currencyLocked}\n onLocked={() => {\n if (currencyLockMessage) {\n flash(currencyLockMessage, 'error')\n }\n }}\n onSave={async (next) => {\n setCurrencyError(null)\n try {\n await handleUpdateCurrency(next)\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCurrencyError(message)\n throw err\n }\n }}\n />\n )\n }\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n placeholder={card.placeholder}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType={card.type === 'email' ? 'email' : 'text'}\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={(params) =>\n card.key === 'email'\n ? renderEmailDisplay(params)\n : params.value && params.value.length\n ? <span className=\"text-base font-medium\">{params.value}</span>\n : <span className=\"text-sm text-muted-foreground\">{params.emptyLabel}</span>\n }\n />\n )\n })}\n </div>\n\n <div>\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-2 pb-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {tabButtons.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={cn(\n 'px-3 py-2 text-sm font-medium transition-colors',\n activeTab === tab.id\n ? 'border-b-2 border-primary text-primary'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => setActiveTab(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {sectionAction ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleSectionAction}\n disabled={sectionAction.disabled}\n >\n {sectionAction.icon ?? <Plus className=\"mr-2 h-4 w-4\" />}\n {sectionAction.label}\n </Button>\n ) : null}\n </div>\n {renderTabContent()}\n </div>\n\n <DocumentTotals\n title={t('sales.documents.detail.totals.title', 'Totals')}\n currency={record.currencyCode ?? null}\n items={totalsItems}\n />\n\n <div className=\"space-y-4\" ref={detailSectionRef}>\n <p className=\"text-sm font-semibold\">{t('sales.documents.detail.details', 'Details')}</p>\n <DetailFieldsSection fields={detailFields} />\n <InjectionSpot\n spotId={detailsInjectionSpotId}\n context={detailInjectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n </div>\n\n <div className=\"space-y-4\">\n <CustomDataSection\n title={t('sales.documents.detail.customData', 'Custom data')}\n entityIds={[kind === 'order' ? E.sales.sales_order : E.sales.sales_quote]}\n values={customFieldValues}\n onSubmit={handleCustomFieldsSubmit}\n labels={customDataLabels}\n />\n <TagsSection\n title={t('sales.documents.detail.tags', 'Tags')}\n tags={tags}\n onChange={setTags}\n isSubmitting={false}\n canEdit\n loadOptions={loadTagOptions}\n createTag={createTag}\n onSave={({ next }) => handleTagsSave({ next })}\n labels={tagLabels}\n />\n </div>\n </PageBody>\n\n <Dialog open={sendOpen} onOpenChange={setSendOpen}>\n <DialogContent\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setSendOpen(false)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!sending) void handleSendQuote()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{t('sales.quotes.send.title', 'Send quote to customer')}</DialogTitle>\n <DialogDescription>\n {t('sales.quotes.send.description', 'Email will be sent to:')} {contactEmail ?? t('sales.quotes.send.noEmail', 'No email')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('sales.quotes.send.validForDays', 'Valid for (days)')}</label>\n <Input\n type=\"number\"\n min={1}\n max={365}\n value={validForDays}\n onChange={(e) => setValidForDays(Number(e.target.value || 14))}\n disabled={sending}\n />\n </div>\n <DialogFooter>\n <Button variant=\"secondary\" onClick={() => setSendOpen(false)} disabled={sending}>\n {t('sales.quotes.send.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void handleSendQuote()} disabled={sending || !contactEmail}>\n {sending ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.quotes.send.submit', 'Send quote')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </Page>\n )\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["normalizedValue", "params", "kind", "item", "placeholder", "error"]
|
|
7
7
|
}
|