@open-mercato/core 0.6.8-develop.7057.1.61440fc3bc → 0.6.8-develop.7063.1.664341cf65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +1 -1
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +1 -1
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +37 -15
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +76 -12
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +1 -0
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +1 -1
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/package.json +7 -7
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/customers/backend/customers/companies/page.tsx +1 -1
- package/src/modules/customers/backend/customers/people/page.tsx +1 -1
- package/src/modules/sales/components/documents/ItemsSection.tsx +48 -17
- package/src/modules/sales/components/documents/LineItemDialog.tsx +129 -13
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +1 -0
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +1 -1
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/i18n/de.json +3 -0
- package/src/modules/sales/i18n/en.json +3 -0
- package/src/modules/sales/i18n/es.json +3 -0
- package/src/modules/sales/i18n/ko.json +3 -0
- package/src/modules/sales/i18n/pl.json +3 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/components/documents/LineItemDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport {\n LookupSelect,\n type LookupSelectItem,\n} from \"@open-mercato/ui/backend/inputs\";\nimport {\n CrudForm,\n type CrudField,\n type CrudFormGroup,\n type CrudCustomFieldRenderProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { collectCustomFieldValues } from \"@open-mercato/ui/backend/utils/customFieldValues\";\nimport { apiCall, withScopedApiRequestHeaders } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { buildOptimisticLockHeader } from \"@open-mercato/ui/backend/utils/optimisticLock\";\nimport { createCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { handleSectionMutationError } from \"./optimisticLock\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@open-mercato/ui/primitives/dialog\";\nimport { useDialogKeyHandler } from \"@open-mercato/ui/hooks/useDialogKeyHandler\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from \"@open-mercato/ui/primitives/alert\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@open-mercato/ui/primitives/select\";\nimport { DollarSign, Settings } from \"lucide-react\";\nimport { normalizeCustomFieldValues } from \"@open-mercato/shared/lib/custom-fields/normalize\";\nimport {\n DictionaryValue,\n renderDictionaryIcon,\n renderDictionaryColor,\n} from \"@open-mercato/core/modules/dictionaries/components/dictionaryAppearance\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { useOrganizationScopeDetail } from \"@open-mercato/shared/lib/frontend/useOrganizationScope\";\nimport { formatMoney, normalizeNumber } from \"./lineItemUtils\";\nimport type { SalesLineRecord } from \"./lineItemTypes\";\nimport {\n normalizeCustomFieldSubmitValue,\n extractCustomFieldValues,\n} from \"./customFieldHelpers\";\nimport { canonicalizeUnitCode } from \"@open-mercato/shared/lib/units/unitCodes\";\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('sales')\n\ntype ProductOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n defaultUnit?: string | null;\n defaultSalesUnit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n};\n\ntype VariantOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n};\n\ntype PriceOption = {\n id: string;\n amountNet: number | null;\n amountGross: number | null;\n currencyCode: string | null;\n displayMode: \"including-tax\" | \"excluding-tax\" | null;\n taxRate: number | null;\n label: string;\n priceKindId?: string | null;\n priceKindTitle?: string | null;\n priceKindCode?: string | null;\n scopeReason?: string | null;\n scopeTags?: string[];\n};\n\ntype TaxRateOption = {\n id: string;\n name: string;\n code: string | null;\n rate: number | null;\n isDefault: boolean;\n};\n\nfunction mapTaxRateOption(item: Record<string, unknown>): TaxRateOption | null {\n const id = typeof item.id === \"string\" ? item.id : null;\n const name =\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name.trim()\n : typeof item.code === \"string\"\n ? item.code\n : null;\n if (!id || !name) return null;\n const rate = normalizeNumber((item as ApiTaxRateItem).rate);\n const code =\n typeof (item as ApiTaxRateItem).code === \"string\" &&\n (item as ApiTaxRateItem).code?.trim().length\n ? (item as ApiTaxRateItem).code?.trim() ?? null\n : null;\n const isDefault = Boolean(\n (item as ApiTaxRateItem).isDefault ?? (item as ApiTaxRateItem).is_default,\n );\n return {\n id,\n name,\n code,\n rate: Number.isFinite(rate) ? rate : null,\n isDefault,\n };\n}\n\nfunction mergeTaxRateOptions(\n options: TaxRateOption[],\n selected: TaxRateOption | null,\n): TaxRateOption[] {\n if (!selected) return options;\n if (options.some((option) => option.id === selected.id)) return options;\n return [selected, ...options];\n}\n\ntype StatusOption = {\n id: string;\n value: string;\n label: string;\n color: string | null;\n icon: string | null;\n};\n\ntype UnitOption = {\n code: string;\n toBaseFactor: number | null;\n isBase: boolean;\n};\n\ntype LineFormState = {\n lineMode: \"catalog\" | \"custom\";\n productId: string | null;\n variantId: string | null;\n quantity: string;\n quantityUnit: string | null;\n priceId: string | null;\n priceMode: \"net\" | \"gross\";\n unitPrice: string;\n taxRate: number | null;\n taxRateId: string | null;\n name: string;\n currencyCode: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n customFieldSetId?: string | null;\n statusEntryId?: string | null;\n};\n\ntype FieldRenderProps = CrudCustomFieldRenderProps;\n\ntype ApiPriceKind = {\n title?: string | null;\n name?: string | null;\n code?: string | null;\n};\n\ntype ApiPriceItem = Record<string, unknown> & {\n unit_price_net?: number | null;\n unit_price_gross?: number | null;\n currency_code?: string | null;\n currencyCode?: string | null;\n display_mode?: string | null;\n displayMode?: string | null;\n tax_rate?: number | null;\n price_kind_id?: string | null;\n priceKindId?: string | null;\n price_kind_title?: string | null;\n priceKindTitle?: string | null;\n price_kind_code?: string | null;\n priceKindCode?: string | null;\n price_kind?: ApiPriceKind | null;\n kind?: string | null;\n};\n\ntype ApiTaxRateItem = Record<string, unknown> & {\n rate?: number | null;\n code?: string | null;\n isDefault?: boolean;\n is_default?: boolean;\n min_quantity?: number | null;\n max_quantity?: number | null;\n starts_at?: string | null;\n ends_at?: string | null;\n};\n\ntype ApiProductItem = Record<string, unknown> & {\n name?: string;\n sku?: string;\n default_media_url?: string;\n defaultMediaUrl?: string;\n pricing?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiVariantItem = Record<string, unknown> & {\n sku?: string;\n default_media_url?: string;\n thumbnailUrl?: string;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiPricingMetadata = {\n tax_rate_id?: string;\n taxRateId?: string;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype LineMetadataRecord = {\n lineMode?: string;\n customLine?: boolean | null;\n priceMode?: string;\n taxRateId?: string;\n priceId?: string;\n productTitle?: string;\n productSku?: string;\n productThumbnail?: string;\n variantTitle?: string;\n variantSku?: string;\n variantThumbnail?: string;\n};\n\ntype CatalogSnapshotRecord = Record<string, unknown> & {\n product?: Record<string, unknown> | null;\n variant?: Record<string, unknown> | null;\n};\n\ntype SnapshotEntity = {\n defaultUnit?: string | null;\n default_unit?: string | null;\n defaultSalesUnit?: string | null;\n default_sales_unit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n default_sales_unit_quantity?: number | null;\n title?: string;\n sku?: string;\n thumbnailUrl?: string;\n thumbnail_url?: string;\n taxRate?: number | null;\n taxRateId?: string;\n};\n\ntype SalesLineDialogProps = {\n open: boolean;\n kind: \"order\" | \"quote\";\n documentId?: string;\n currencyCode: string | null | undefined;\n documentUpdatedAt?: string | null;\n organizationId: string | null;\n tenantId: string | null;\n initialLine?: SalesLineRecord | null;\n shippedQuantity?: number;\n onOpenChange: (open: boolean) => void;\n onSaved?: () => Promise<void> | void;\n onDraftSaved?: (payload: Record<string, unknown>, lineId: string | null) => Promise<void> | void;\n};\n\nconst defaultForm = (currencyCode?: string | null): LineFormState => ({\n lineMode: \"catalog\",\n productId: null,\n variantId: null,\n quantity: \"1\",\n quantityUnit: null,\n priceId: null,\n priceMode: \"gross\",\n unitPrice: \"\",\n taxRate: null,\n taxRateId: null,\n name: \"\",\n currencyCode: currencyCode ?? null,\n catalogSnapshot: null,\n customFieldSetId: null,\n statusEntryId: null,\n});\n\nconst UNIT_PRICE_INPUT_SCALE = 4;\n\nfunction buildPriceScopeReason(\n item: Record<string, unknown>,\n t: (k: string, f: string) => string,\n): {\n reason: string | null;\n tags: string[];\n} {\n const tags: string[] = [];\n const add = (key: string) => tags.push(key);\n if (item.channel_id || item.channelId)\n add(t(\"sales.documents.items.priceScope.channel\", \"Channel\"));\n if (item.offer_id || item.offerId)\n add(t(\"sales.documents.items.priceScope.offer\", \"Offer\"));\n if (item.variant_id || item.variantId)\n add(t(\"sales.documents.items.priceScope.variant\", \"Variant\"));\n if (item.customer_group_id || item.customerGroupId)\n add(t(\"sales.documents.items.priceScope.customerGroup\", \"Customer group\"));\n if (item.customer_id || item.customerId)\n add(t(\"sales.documents.items.priceScope.customer\", \"Customer\"));\n if (item.user_group_id || item.userGroupId)\n add(t(\"sales.documents.items.priceScope.userGroup\", \"User group\"));\n if (item.user_id || item.userId)\n add(t(\"sales.documents.items.priceScope.user\", \"User\"));\n const minQty = normalizeNumber((item as ApiPriceItem).min_quantity, Number.NaN);\n const maxQty = normalizeNumber((item as ApiPriceItem).max_quantity, Number.NaN);\n if (Number.isFinite(minQty) || Number.isFinite(maxQty)) {\n add(t(\"sales.documents.items.priceScope.quantity\", \"Quantity\"));\n }\n if ((item as ApiPriceItem).starts_at || (item as ApiPriceItem).ends_at) {\n add(t(\"sales.documents.items.priceScope.schedule\", \"Scheduled\"));\n }\n if (tags.length === 0) return { reason: null, tags };\n return { reason: tags.join(\" \u2022 \"), tags };\n}\n\nfunction buildPlaceholder(label?: string | null) {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded border bg-muted text-xs uppercase text-muted-foreground\">\n {(label ?? \"\").slice(0, 2) || \"\u2022\"}\n </div>\n );\n}\n\nfunction normalizeUnitCode(value: unknown): string | null {\n return canonicalizeUnitCode(value);\n}\n\nfunction getRecordBoolean(\n record: Record<string, unknown>,\n fallback: boolean,\n ...keys: string[]\n): boolean {\n for (const key of keys) {\n const val = record[key];\n if (typeof val === \"boolean\") return val;\n }\n return fallback;\n}\n\nfunction getUomProductFields(item: Record<string, unknown>) {\n return {\n defaultUnit: normalizeUnitCode(item.default_unit ?? item.defaultUnit),\n defaultSalesUnit: normalizeUnitCode(\n item.default_sales_unit ?? item.defaultSalesUnit,\n ),\n defaultSalesUnitQuantity: normalizeNumber(\n item.default_sales_unit_quantity ?? item.defaultSalesUnitQuantity,\n Number.NaN,\n ),\n };\n}\n\nfunction getUomConversionFields(row: Record<string, unknown>) {\n return {\n unitCode: normalizeUnitCode(row.unit_code ?? row.unitCode),\n isActive: getRecordBoolean(row, true, \"is_active\", \"isActive\"),\n toBaseFactor: normalizeNumber(\n row.to_base_factor ?? row.toBaseFactor,\n Number.NaN,\n ),\n };\n}\n\nfunction normalizeQuantityPreview(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * 1_000_000) / 1_000_000;\n}\n\nfunction normalizeUnitPriceInputValue(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n const factor = 10 ** UNIT_PRICE_INPUT_SCALE;\n const rounded = Math.round((value + Number.EPSILON) * factor) / factor;\n if (!Number.isFinite(rounded)) return \"\";\n return rounded.toString();\n}\n\nfunction mapProductOption(item: Record<string, unknown>): ProductOption | null {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const productItem = item as ApiProductItem;\n const title =\n typeof item.title === \"string\"\n ? item.title\n : typeof productItem.name === \"string\"\n ? productItem.name\n : id;\n const sku = typeof productItem.sku === \"string\" ? productItem.sku : null;\n const thumbnail =\n typeof productItem.default_media_url === \"string\"\n ? productItem.default_media_url\n : typeof productItem.defaultMediaUrl === \"string\"\n ? productItem.defaultMediaUrl\n : null;\n const pricing =\n typeof productItem.pricing === \"object\" && productItem.pricing\n ? productItem.pricing\n : null;\n const metadata =\n typeof productItem.metadata === \"object\" && productItem.metadata\n ? productItem.metadata\n : null;\n const pricingMeta = pricing as ApiPricingMetadata | null;\n const metaMeta = metadata as ApiPricingMetadata | null;\n const pricingTaxRateId =\n typeof pricingMeta?.tax_rate_id === \"string\" &&\n pricingMeta.tax_rate_id.trim().length\n ? pricingMeta.tax_rate_id.trim()\n : typeof pricingMeta?.taxRateId === \"string\" &&\n pricingMeta.taxRateId.trim().length\n ? pricingMeta.taxRateId.trim()\n : null;\n const metaTaxRateId =\n typeof metaMeta?.taxRateId === \"string\" && metaMeta.taxRateId.trim().length\n ? metaMeta.taxRateId.trim()\n : typeof metaMeta?.tax_rate_id === \"string\" &&\n metaMeta.tax_rate_id.trim().length\n ? metaMeta.tax_rate_id.trim()\n : null;\n const taxRateValue = normalizeNumber(\n pricingMeta?.tax_rate ??\n pricingMeta?.taxRate ??\n productItem.tax_rate ??\n productItem.taxRate,\n Number.NaN,\n );\n const uomFields = getUomProductFields(item);\n return {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: pricingTaxRateId ?? metaTaxRateId ?? null,\n taxRate: Number.isFinite(taxRateValue) ? taxRateValue : null,\n defaultUnit: uomFields.defaultUnit,\n defaultSalesUnit: uomFields.defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(uomFields.defaultSalesUnitQuantity)\n ? uomFields.defaultSalesUnitQuantity\n : null,\n };\n}\n\nexport function LineItemDialog({\n open,\n kind,\n documentId,\n currencyCode,\n documentUpdatedAt,\n organizationId,\n tenantId,\n initialLine,\n shippedQuantity = 0,\n onOpenChange,\n onSaved,\n onDraftSaved,\n}: SalesLineDialogProps) {\n const t = useT();\n const scope = useOrganizationScopeDetail();\n const resolvedOrganizationId = organizationId ?? scope.organizationId ?? null;\n const resolvedTenantId = tenantId ?? scope.tenantId ?? null;\n const [initialValues, setInitialValues] = React.useState<LineFormState>(() =>\n defaultForm(currencyCode),\n );\n const [lineMode, setLineMode] = React.useState<\"catalog\" | \"custom\">(\n defaultForm(currencyCode).lineMode,\n );\n const [productOption, setProductOption] =\n React.useState<ProductOption | null>(null);\n const [variantOption, setVariantOption] =\n React.useState<VariantOption | null>(null);\n const [priceOptions, setPriceOptions] = React.useState<PriceOption[]>([]);\n const [priceLoading, setPriceLoading] = React.useState(false);\n const [formResetKey, setFormResetKey] = React.useState(0);\n const [editingId, setEditingId] = React.useState<string | null>(null);\n const [taxRates, setTaxRates] = React.useState<TaxRateOption[]>([]);\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([]);\n const [unitOptions, setUnitOptions] = React.useState<UnitOption[]>([]);\n const [deletedCatalogReference, setDeletedCatalogReference] =\n React.useState(false);\n const [, setLineStatusLoading] = React.useState(false);\n const productOptionsRef = React.useRef<Map<string, ProductOption>>(new Map());\n const variantOptionsRef = React.useRef<Map<string, VariantOption>>(new Map());\n const taxRatesRef = React.useRef<TaxRateOption[]>([]);\n const defaultTaxRateRef = React.useRef<TaxRateOption | null>(null);\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null);\n\n const resourcePath = React.useMemo(\n () => (kind === \"order\" ? \"sales/order-lines\" : \"sales/quote-lines\"),\n [kind],\n );\n const documentKey = kind === \"order\" ? \"orderId\" : \"quoteId\";\n const customFieldEntityId =\n kind === \"order\" ? E.sales.sales_order_line : E.sales.sales_quote_line;\n\n const taxRateMap = React.useMemo(\n () =>\n taxRates.reduce<Map<string, TaxRateOption>>((acc, rate) => {\n acc.set(rate.id, rate);\n return acc;\n }, new Map()),\n [taxRates],\n );\n\n const findTaxRateIdByValue = React.useCallback(\n (value: number | null | undefined): string | null => {\n const numeric = normalizeNumber(value, Number.NaN);\n if (!Number.isFinite(numeric)) return null;\n const match = taxRatesRef.current.find(\n (rate) =>\n Number.isFinite(rate.rate) &&\n Math.abs((rate.rate as number) - numeric) < 0.0001,\n );\n return match?.id ?? null;\n },\n [],\n );\n\n const resolveTaxSelection = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n const taxRateId =\n typeof source?.taxRateId === \"string\" && source.taxRateId.trim().length\n ? source.taxRateId.trim()\n : null;\n const rateFromId = taxRateId\n ? normalizeNumber(taxRateMap.get(taxRateId)?.rate, Number.NaN)\n : Number.NaN;\n const numericRate = normalizeNumber(source?.taxRate, Number.NaN);\n const resolvedRateId =\n taxRateId ??\n (Number.isFinite(numericRate)\n ? findTaxRateIdByValue(numericRate)\n : null);\n const resolvedRate = Number.isFinite(rateFromId)\n ? rateFromId\n : Number.isFinite(numericRate)\n ? numericRate\n : null;\n return { taxRateId: resolvedRateId, taxRate: resolvedRate };\n },\n [findTaxRateIdByValue, taxRateMap],\n );\n\n const hasTaxMetadata = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n if (!source) return false;\n const id =\n typeof source.taxRateId === \"string\" ? source.taxRateId.trim() : \"\";\n if (id.length) return true;\n const numericRate = normalizeNumber(source.taxRate, Number.NaN);\n return Number.isFinite(numericRate);\n },\n [],\n );\n\n const resetForm = React.useCallback(\n (next?: Partial<LineFormState>) => {\n const base = { ...defaultForm(currencyCode), ...next };\n const defaultRate = defaultTaxRateRef.current;\n if (!base.taxRateId && defaultRate) {\n base.taxRateId = defaultRate.id;\n base.taxRate = Number.isFinite(defaultRate.rate ?? null)\n ? (defaultRate.rate as number)\n : base.taxRate;\n }\n setInitialValues(base);\n setLineMode(base.lineMode);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setDeletedCatalogReference(false);\n setEditingId(null);\n setFormResetKey((prev) => prev + 1);\n },\n [currencyCode],\n );\n\n const closeDialog = React.useCallback(() => {\n onOpenChange(false);\n resetForm();\n }, [onOpenChange, resetForm]);\n\n const loadTaxRates = React.useCallback(async () => {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const parsed = items\n .map<TaxRateOption | null>((item) => mapTaxRateOption(item))\n .filter((entry): entry is TaxRateOption => Boolean(entry));\n taxRatesRef.current = parsed;\n defaultTaxRateRef.current = parsed.find((rate) => rate.isDefault) ?? null;\n setTaxRates(parsed);\n return parsed;\n } catch (err) {\n logger.error('sales.tax-rates.fetch', { err });\n taxRatesRef.current = [];\n defaultTaxRateRef.current = null;\n setTaxRates([]);\n return [];\n }\n }, []);\n\n const loadTaxRateById = React.useCallback(\n async (taxRateId: string): Promise<TaxRateOption | null> => {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/sales/tax-rates?id=${encodeURIComponent(taxRateId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n return (\n items\n .map<TaxRateOption | null>((item) => mapTaxRateOption(item))\n .find((entry): entry is TaxRateOption => entry?.id === taxRateId) ??\n null\n );\n },\n [],\n );\n\n React.useEffect(() => {\n const selectedId =\n typeof initialValues.taxRateId === \"string\" && initialValues.taxRateId.trim().length\n ? initialValues.taxRateId.trim()\n : null;\n if (!selectedId || taxRates.some((rate) => rate.id === selectedId)) return;\n loadTaxRateById(selectedId)\n .then((selected) => {\n taxRatesRef.current = mergeTaxRateOptions(taxRatesRef.current, selected);\n setTaxRates((current) => mergeTaxRateOptions(current, selected));\n })\n .catch(() => {});\n }, [initialValues.taxRateId, loadTaxRateById, taxRates]);\n\n const loadProductOptionById = React.useCallback(\n async (productId: string): Promise<ProductOption | null> => {\n if (!productId) return null;\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const matched =\n items.find((entry) => entry.id === productId) ?? items[0] ?? null;\n if (!matched) return null;\n const option = mapProductOption(matched);\n if (option) productOptionsRef.current.set(option.id, option);\n return option;\n },\n [],\n );\n\n const loadProductOptions = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const params = new URLSearchParams({ pageSize: \"8\" });\n if (query && query.trim().length) {\n params.set(\"search\", query.trim());\n } else {\n params.set(\"sortField\", \"title\");\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/products?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? (response.result?.items ?? [])\n : [];\n const mapped = items\n .map((item) => {\n const option = mapProductOption(item);\n if (!option) return null;\n return {\n id: option.id,\n title: option.title,\n subtitle: option.sku ?? undefined,\n icon: option.thumbnailUrl ? (\n <img\n src={option.thumbnailUrl}\n alt={option.title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(option.title)\n ),\n option,\n } as LookupSelectItem & { option: ProductOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: ProductOption } =>\n Boolean(entry),\n );\n return mapped.map((entry) => {\n productOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadVariantOptions = React.useCallback(\n async (\n productId: string,\n fallbackThumbnail?: string | null,\n ): Promise<LookupSelectItem[]> => {\n if (!productId) return [];\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/variants?productId=${encodeURIComponent(productId)}&pageSize=50`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n return items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const title = typeof item.name === \"string\" ? item.name : id;\n const variantItem = item as ApiVariantItem;\n const sku =\n typeof variantItem.sku === \"string\" ? variantItem.sku : null;\n const metadata =\n typeof variantItem.metadata === \"object\" && variantItem.metadata\n ? variantItem.metadata\n : null;\n const variantMeta = metadata as ApiPricingMetadata | null;\n const variantTaxRateId =\n typeof variantMeta?.taxRateId === \"string\" &&\n variantMeta.taxRateId.trim().length\n ? variantMeta.taxRateId.trim()\n : typeof variantMeta?.tax_rate_id === \"string\" &&\n variantMeta.tax_rate_id.trim().length\n ? variantMeta.tax_rate_id.trim()\n : null;\n const variantTaxRate = normalizeNumber(\n variantItem.tax_rate ??\n variantItem.taxRate ??\n variantMeta?.tax_rate ??\n variantMeta?.taxRate,\n Number.NaN,\n );\n const thumbnail =\n typeof variantItem.default_media_url === \"string\"\n ? variantItem.default_media_url\n : typeof variantItem.thumbnailUrl === \"string\"\n ? variantItem.thumbnailUrl\n : (fallbackThumbnail ?? null);\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail ? (\n <img\n src={thumbnail}\n alt={title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(title)\n ),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: variantTaxRateId,\n taxRate: Number.isFinite(variantTaxRate) ? variantTaxRate : null,\n } satisfies VariantOption,\n } as LookupSelectItem & { option: VariantOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: VariantOption } =>\n Boolean(entry),\n )\n .map((entry) => {\n variantOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadProductUnits = React.useCallback(\n async (\n productId: string | null,\n option: ProductOption | null,\n ): Promise<UnitOption[]> => {\n if (!productId) {\n setUnitOptions([]);\n return [];\n }\n const map = new Map<string, UnitOption>();\n let baseUnit = normalizeUnitCode(option?.defaultUnit);\n let defaultSalesUnit = normalizeUnitCode(option?.defaultSalesUnit);\n if (!baseUnit || !defaultSalesUnit) {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const records = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const matched =\n records.find((entry) => entry.id === productId) ??\n records[0] ??\n null;\n if (matched) {\n const matchedUom = getUomProductFields(matched);\n baseUnit = baseUnit ?? matchedUom.defaultUnit;\n defaultSalesUnit = defaultSalesUnit ?? matchedUom.defaultSalesUnit;\n }\n } catch (err) {\n logger.error('sales.document.items.loadProductUnits.hydration', { err });\n }\n }\n if (baseUnit) {\n map.set(baseUnit, { code: baseUnit, toBaseFactor: 1, isBase: true });\n }\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/product-unit-conversions?productId=${encodeURIComponent(productId)}&pageSize=100`,\n undefined,\n { fallback: { items: [] } },\n );\n const rows = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n for (const row of rows) {\n const conv = getUomConversionFields(row);\n if (!conv.unitCode) continue;\n if (!conv.isActive) continue;\n map.set(conv.unitCode, {\n code: conv.unitCode,\n toBaseFactor:\n Number.isFinite(conv.toBaseFactor) && conv.toBaseFactor > 0\n ? conv.toBaseFactor\n : null,\n isBase: baseUnit ? conv.unitCode === baseUnit : false,\n });\n }\n } catch (err) {\n logger.error('sales.document.items.loadUnits', { err });\n }\n if (defaultSalesUnit && !map.has(defaultSalesUnit)) {\n map.set(defaultSalesUnit, {\n code: defaultSalesUnit,\n toBaseFactor: baseUnit && defaultSalesUnit === baseUnit ? 1 : null,\n isBase: baseUnit ? defaultSalesUnit === baseUnit : false,\n });\n }\n const nextOptions = Array.from(map.values()).sort((left, right) =>\n left.code.localeCompare(right.code),\n );\n setUnitOptions(nextOptions);\n return nextOptions;\n },\n [],\n );\n\n const loadPrices = React.useCallback(\n async (\n productId: string | null,\n variantId: string | null,\n quantity?: string | number | null,\n quantityUnit?: string | null,\n ) => {\n if (!productId) {\n setPriceOptions([]);\n return [];\n }\n setPriceLoading(true);\n try {\n const params = new URLSearchParams({ productId, pageSize: \"20\" });\n if (variantId) params.set(\"variantId\", variantId);\n const quantityValue = normalizeNumber(quantity, Number.NaN);\n if (Number.isFinite(quantityValue) && quantityValue > 0) {\n params.set(\"quantity\", String(quantityValue));\n }\n const quantityUnitCode = normalizeUnitCode(quantityUnit);\n if (quantityUnitCode) {\n params.set(\"quantityUnit\", quantityUnitCode);\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/prices?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped: PriceOption[] = items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const amountNetRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_net,\n Number.NaN,\n );\n const amountGrossRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_gross,\n Number.NaN,\n );\n const amountNet = Number.isFinite(amountNetRaw)\n ? amountNetRaw\n : null;\n const amountGross = Number.isFinite(amountGrossRaw)\n ? amountGrossRaw\n : null;\n const currency =\n typeof (item as ApiPriceItem).currency_code === \"string\"\n ? (item as ApiPriceItem).currency_code\n : typeof (item as ApiPriceItem).currencyCode === \"string\"\n ? (item as ApiPriceItem).currencyCode\n : null;\n const displayMode =\n (item as ApiPriceItem).display_mode === \"including-tax\" ||\n (item as ApiPriceItem).display_mode === \"excluding-tax\"\n ? (item as ApiPriceItem).display_mode\n : (item as ApiPriceItem).displayMode === \"including-tax\" ||\n (item as ApiPriceItem).displayMode === \"excluding-tax\"\n ? (item as ApiPriceItem).displayMode\n : null;\n const taxRateRaw = normalizeNumber(\n (item as ApiPriceItem).tax_rate,\n Number.NaN,\n );\n const taxRate = Number.isFinite(taxRateRaw) ? taxRateRaw : null;\n const priceKindId =\n typeof (item as ApiPriceItem).price_kind_id === \"string\"\n ? (item as ApiPriceItem).price_kind_id\n : typeof (item as ApiPriceItem).priceKindId === \"string\"\n ? (item as ApiPriceItem).priceKindId\n : null;\n const priceKindTitle =\n typeof (item as ApiPriceItem).price_kind_title === \"string\"\n ? (item as ApiPriceItem).price_kind_title\n : typeof (item as ApiPriceItem).priceKindTitle === \"string\"\n ? (item as ApiPriceItem).priceKindTitle\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.title === \"string\"\n ? (item as ApiPriceItem).price_kind!.title\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.name === \"string\"\n ? (item as ApiPriceItem).price_kind!.name\n : null;\n const priceKindCode =\n typeof (item as ApiPriceItem).price_kind_code === \"string\"\n ? (item as ApiPriceItem).price_kind_code\n : typeof (item as ApiPriceItem).priceKindCode === \"string\"\n ? (item as ApiPriceItem).priceKindCode\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.code === \"string\"\n ? (item as ApiPriceItem).price_kind!.code\n : null;\n const resolvedPriceKindTitle =\n priceKindTitle ??\n priceKindCode ??\n (typeof (item as ApiPriceItem).kind === \"string\"\n ? (item as ApiPriceItem).kind\n : null);\n const labelParts = [\n displayMode === \"including-tax\" &&\n amountGross !== null &&\n currency\n ? formatMoney(amountGross, currency)\n : null,\n displayMode === \"excluding-tax\" && amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : null,\n displayMode\n ? displayMode === \"including-tax\"\n ? t(\"sales.documents.items.priceGross\", \"Gross\")\n : t(\"sales.documents.items.priceNet\", \"Net\")\n : null,\n ].filter(Boolean);\n const { reason, tags } = buildPriceScopeReason(\n item,\n (key, fallback) => t(key, fallback),\n );\n const label =\n labelParts.length > 0\n ? labelParts.join(\" \u2022 \")\n : amountGross !== null && currency\n ? formatMoney(amountGross, currency)\n : amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : id;\n return {\n id,\n amountNet: amountNet ?? null,\n amountGross: amountGross ?? null,\n currencyCode: currency,\n displayMode: displayMode as PriceOption[\"displayMode\"],\n taxRate: Number.isFinite(taxRate) ? taxRate : null,\n label,\n priceKindId,\n priceKindTitle: resolvedPriceKindTitle ?? null,\n priceKindCode: priceKindCode ?? null,\n scopeReason: reason,\n scopeTags: tags,\n } as PriceOption;\n })\n .filter((entry): entry is PriceOption => Boolean(entry));\n setPriceOptions(mapped);\n return mapped;\n } catch (err) {\n logger.error('sales.document.items.loadPrices', { err });\n return [];\n } finally {\n setPriceLoading(false);\n }\n },\n [t],\n );\n\n const selectPriceAfterRefresh = React.useCallback(\n (\n prices: PriceOption[],\n currentPriceId: string | null,\n currentPriceKindId: string | null,\n ): PriceOption | null => {\n if (!prices.length) return null;\n if (currentPriceId) {\n const sameId = prices.find((entry) => entry.id === currentPriceId);\n if (sameId) return sameId;\n }\n if (currentPriceKindId) {\n const sameKind = prices.find(\n (entry) => entry.priceKindId === currentPriceKindId,\n );\n if (sameKind) return sameKind;\n }\n return prices[0] ?? null;\n },\n [],\n );\n\n const resolveUnitPriceFactor = React.useCallback(\n (quantityUnit: string | null | undefined): number => {\n const normalized = normalizeUnitCode(quantityUnit);\n if (!normalized) return 1;\n const unit = unitOptions.find((entry) => entry.code === normalized) ?? null;\n const factor = normalizeNumber(unit?.toBaseFactor, Number.NaN);\n if (!Number.isFinite(factor) || factor <= 0) return 1;\n return factor;\n },\n [unitOptions],\n );\n\n const convertUnitPriceForUnitChange = React.useCallback(\n (\n rawUnitPrice: unknown,\n fromUnit: string | null | undefined,\n toUnit: string | null | undefined,\n ): string | null => {\n const amount = normalizeNumber(rawUnitPrice, Number.NaN);\n if (!Number.isFinite(amount) || amount <= 0) return null;\n const fromCode = normalizeUnitCode(fromUnit);\n const toCode = normalizeUnitCode(toUnit);\n if (!fromCode || !toCode || fromCode === toCode) return null;\n const fromFactor = resolveUnitPriceFactor(fromCode);\n const toFactor = resolveUnitPriceFactor(toCode);\n if (\n !Number.isFinite(fromFactor) ||\n !Number.isFinite(toFactor) ||\n fromFactor <= 0 ||\n toFactor <= 0\n ) {\n return null;\n }\n const baseAmount = amount / fromFactor;\n const convertedAmount = baseAmount * toFactor;\n if (!Number.isFinite(convertedAmount) || convertedAmount <= 0) return null;\n return normalizeUnitPriceInputValue(convertedAmount);\n },\n [resolveUnitPriceFactor],\n );\n\n const applyPriceSelection = React.useCallback(\n (\n selected: PriceOption | null,\n setFormValue: ((id: string, value: unknown) => void) | undefined,\n options?: {\n fallbackTaxSource?: { taxRateId?: string | null; taxRate?: number | null } | null;\n quantityUnit?: string | null;\n },\n ) => {\n if (!setFormValue) return;\n if (selected) {\n const mode =\n selected.displayMode === \"excluding-tax\" ? \"net\" : \"gross\";\n const amountPerBaseUnit =\n mode === \"net\"\n ? (selected.amountNet ?? selected.amountGross ?? 0)\n : (selected.amountGross ?? selected.amountNet ?? 0);\n const factor = resolveUnitPriceFactor(options?.quantityUnit ?? null);\n const amount = Number.isFinite(amountPerBaseUnit * factor)\n ? amountPerBaseUnit * factor\n : amountPerBaseUnit;\n setFormValue(\"priceId\", selected.id);\n setFormValue(\"priceMode\", mode);\n setFormValue(\"unitPrice\", normalizeUnitPriceInputValue(amount));\n setFormValue(\"taxRate\", selected.taxRate ?? null);\n setFormValue(\"taxRateId\", findTaxRateIdByValue(selected.taxRate));\n setFormValue(\n \"currencyCode\",\n selected.currencyCode ?? currencyCode ?? null,\n );\n return;\n }\n const fallbackTax = resolveTaxSelection(options?.fallbackTaxSource ?? null);\n setFormValue(\"taxRate\", fallbackTax.taxRate ?? null);\n setFormValue(\"taxRateId\", fallbackTax.taxRateId ?? null);\n },\n [currencyCode, findTaxRateIdByValue, resolveTaxSelection, resolveUnitPriceFactor],\n );\n\n const loadLineStatuses = React.useCallback(async (): Promise<\n StatusOption[]\n > => {\n setLineStatusLoading(true);\n try {\n const params = new URLSearchParams({ page: \"1\", pageSize: \"100\" });\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/sales/order-line-statuses?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === \"string\" ? entry.id : null;\n const value = typeof entry.value === \"string\" ? entry.value : null;\n if (!id || !value) return null;\n const label =\n typeof entry.label === \"string\" && entry.label.trim().length\n ? entry.label\n : value;\n const color =\n typeof entry.color === \"string\" && entry.color.trim().length\n ? entry.color\n : null;\n const icon =\n typeof entry.icon === \"string\" && entry.icon.trim().length\n ? entry.icon\n : null;\n return { id, value, label, color, icon };\n })\n .filter((entry): entry is StatusOption => Boolean(entry));\n setLineStatuses(mapped);\n return mapped;\n } catch (err) {\n logger.error('sales.lines.statuses.load', { err });\n setLineStatuses([]);\n return [];\n } finally {\n setLineStatusLoading(false);\n }\n }, []);\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n lineStatuses.length && !query ? lineStatuses : await loadLineStatuses();\n const term = query?.trim().toLowerCase() ?? \"\";\n const currentMap = options.reduce<\n Record<\n string,\n {\n value: string;\n label: string;\n color?: string | null;\n icon?: string | null;\n }\n >\n >((acc, entry) => {\n acc[entry.value] = {\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon ?? null,\n };\n return acc;\n }, {});\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.label !== option.value ? option.value : undefined,\n icon:\n renderDictionaryIcon(option.icon, \"h-4 w-4\") ??\n renderDictionaryColor(option.color, \"h-4 w-4 rounded-full\"),\n }));\n },\n [lineStatuses, loadLineStatuses],\n );\n\n React.useEffect(() => {\n if (!open) return;\n loadTaxRates().catch(() => {});\n loadLineStatuses().catch(() => {});\n }, [loadLineStatuses, loadTaxRates, open]);\n\n const handleFormSubmit = React.useCallback(\n async (values: LineFormState & Record<string, unknown>) => {\n // Resolve required scope and ids\n const resolvedDocumentId =\n typeof documentId === \"string\" && documentId.trim().length\n ? documentId\n : null;\n const resolvedOrg = resolvedOrganizationId;\n const resolvedTenant = resolvedTenantId;\n\n if (!onDraftSaved && (!resolvedOrg || !resolvedTenant || !resolvedDocumentId)) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorScope\",\n \"Organization and tenant are required.\",\n ),\n );\n }\n const lineMode = values.lineMode === \"custom\" ? \"custom\" : \"catalog\";\n const isCustomLine = lineMode === \"custom\";\n\n if (!isCustomLine && !values.productId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n {\n productId: t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n },\n );\n }\n if (!isCustomLine && !values.variantId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n {\n variantId: t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n },\n );\n }\n\n const qtyNumber = Number(values.quantity ?? 0);\n if (!Number.isFinite(qtyNumber) || qtyNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n {\n quantity: t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n },\n );\n }\n if (shippedQuantity > 0 && qtyNumber < shippedQuantity) {\n const message = t(\n \"sales.documents.items.errorQuantityBelowShipped\",\n \"You cannot lower the quantity below the {{shipped}} already shipped.\",\n { shipped: shippedQuantity },\n );\n throw createCrudFormError(message, { quantity: message });\n }\n const resolvedQuantityUnit = (() => {\n const entered = normalizeUnitCode(values.quantityUnit);\n if (isCustomLine) return entered;\n return (\n entered ??\n normalizeUnitCode(productOption?.defaultSalesUnit) ??\n normalizeUnitCode(productOption?.defaultUnit)\n );\n })();\n\n const unitPriceNumber = Number(values.unitPrice ?? 0);\n if (!Number.isFinite(unitPriceNumber) || unitPriceNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n {\n unitPrice: t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n },\n );\n }\n\n const selectedPrice =\n !isCustomLine && values.priceId\n ? (priceOptions.find((price) => price.id === values.priceId) ?? null)\n : null;\n const resolvedCurrency =\n (values.currencyCode as string | null | undefined) ??\n selectedPrice?.currencyCode ??\n currencyCode ??\n null;\n if (!resolvedCurrency) {\n throw createCrudFormError(\n t(\"sales.documents.items.errorCurrency\", \"Currency is required.\"),\n {\n priceId: t(\n \"sales.documents.items.errorCurrency\",\n \"Currency is required.\",\n ),\n },\n );\n }\n\n const resolvedNameRaw = (values.name ?? \"\").toString().trim();\n const resolvedName = isCustomLine\n ? resolvedNameRaw\n : resolvedNameRaw ||\n variantOption?.title ||\n productOption?.title ||\n undefined;\n if (isCustomLine && !resolvedName) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n {\n name: t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n },\n );\n }\n const resolvedPriceMode = values.priceMode === \"net\" ? \"net\" : \"gross\";\n const catalogSnapshot =\n !isCustomLine &&\n typeof values.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? values.catalogSnapshot\n : null;\n const selectedTaxRateId =\n typeof values.taxRateId === \"string\" && values.taxRateId.trim().length\n ? values.taxRateId\n : null;\n const resolvedTaxRate = Number.isFinite(values.taxRate)\n ? (values.taxRate as number)\n : normalizeNumber(values.taxRate);\n const normalizedTaxRate = Number.isFinite(resolvedTaxRate)\n ? resolvedTaxRate\n : 0;\n const unitPriceNetValue =\n resolvedPriceMode === \"net\"\n ? unitPriceNumber\n : unitPriceNumber / (1 + normalizedTaxRate / 100);\n const unitPriceGrossValue =\n resolvedPriceMode === \"gross\"\n ? unitPriceNumber\n : unitPriceNumber * (1 + normalizedTaxRate / 100);\n const safeUnitPriceNet = Number.isFinite(unitPriceNetValue)\n ? unitPriceNetValue\n : unitPriceNumber;\n const safeUnitPriceGross = Number.isFinite(unitPriceGrossValue)\n ? unitPriceGrossValue\n : unitPriceNumber;\n const totalNetAmount = safeUnitPriceNet * qtyNumber;\n const totalGrossAmount = safeUnitPriceGross * qtyNumber;\n\n const metadata = {\n ...(catalogSnapshot ?? {}),\n ...(!isCustomLine && values.priceId ? { priceId: values.priceId } : {}),\n priceMode: resolvedPriceMode,\n ...(selectedTaxRateId ? { taxRateId: selectedTaxRateId } : {}),\n ...(!isCustomLine && productOption\n ? {\n productTitle: productOption.title,\n productSku: productOption.sku ?? null,\n productThumbnail: productOption.thumbnailUrl ?? null,\n }\n : {}),\n ...(!isCustomLine && variantOption\n ? {\n variantTitle: variantOption.title,\n variantSku: variantOption.sku ?? null,\n variantThumbnail:\n variantOption.thumbnailUrl ??\n productOption?.thumbnailUrl ??\n null,\n }\n : {}),\n ...(isCustomLine ? { customLine: true } : {}),\n lineMode,\n ...(resolvedQuantityUnit ? { quantityUnit: resolvedQuantityUnit } : {}),\n };\n\n const payload: Record<string, unknown> = {\n ...(resolvedDocumentId ? { [documentKey]: resolvedDocumentId } : {}),\n ...(resolvedOrg ? { organizationId: resolvedOrg } : {}),\n ...(resolvedTenant ? { tenantId: resolvedTenant } : {}),\n productId: isCustomLine\n ? undefined\n : values.productId\n ? String(values.productId)\n : undefined,\n productVariantId: isCustomLine\n ? undefined\n : values.variantId\n ? String(values.variantId)\n : undefined,\n quantity: qtyNumber,\n quantityUnit: resolvedQuantityUnit ?? undefined,\n currencyCode: String(resolvedCurrency),\n priceId:\n !isCustomLine && values.priceId ? String(values.priceId) : undefined,\n priceMode: resolvedPriceMode,\n taxRate: Number.isFinite(resolvedTaxRate) ? resolvedTaxRate : undefined,\n unitPriceNet: safeUnitPriceNet,\n unitPriceGross: safeUnitPriceGross,\n totalNetAmount,\n totalGrossAmount,\n ...(catalogSnapshot ? { catalogSnapshot } : {}),\n metadata,\n customFieldSetId: values.customFieldSetId ?? undefined,\n ...(typeof values.statusEntryId === \"string\" &&\n values.statusEntryId.trim().length\n ? { statusEntryId: values.statusEntryId.trim() }\n : {}),\n };\n\n const customFields = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n });\n if (Object.keys(customFields).length) {\n payload.customFields = normalizeCustomFieldValues(customFields);\n }\n if (resolvedName) payload.name = resolvedName;\n\n try {\n if (onDraftSaved) {\n await onDraftSaved(payload, editingId);\n closeDialog();\n return;\n }\n const action = editingId ? updateCrud : createCrud;\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(documentUpdatedAt),\n () =>\n action(\n resourcePath,\n editingId ? { id: editingId, ...payload } : payload,\n {\n errorMessage: t(\n \"sales.documents.items.errorSave\",\n \"Failed to save line.\",\n ),\n },\n ),\n );\n if (result.ok) {\n if (onSaved) await onSaved();\n closeDialog();\n }\n } catch (err) {\n if (\n handleSectionMutationError(err, t, () => {\n if (onSaved) void onSaved();\n })\n ) {\n closeDialog();\n return;\n }\n throw err;\n }\n },\n [\n currencyCode,\n documentId,\n documentKey,\n documentUpdatedAt,\n editingId,\n onDraftSaved,\n priceOptions,\n productOption,\n resourcePath,\n t,\n variantOption,\n onSaved,\n closeDialog,\n resolvedOrganizationId,\n resolvedTenantId,\n ],\n );\n\n const fields = React.useMemo<CrudField[]>(() => {\n const isCustomLine = lineMode === \"custom\";\n return [\n {\n id: \"lineMode\",\n label: t(\"sales.documents.items.lineMode.label\", \"Line type\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ value, setValue, setFormValue }: FieldRenderProps) => {\n const mode = value === \"custom\" ? \"custom\" : \"catalog\";\n const switchMode = (next: \"catalog\" | \"custom\") => {\n if (next === mode) return;\n setValue(next);\n setLineMode(next);\n if (next === \"custom\") {\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setFormValue?.(\"productId\", null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"catalogSnapshot\", null);\n setFormValue?.(\"quantityUnit\", null);\n } else {\n if (deletedCatalogReference) {\n setDeletedCatalogReference(false);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setFormValue?.(\"productId\", null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"catalogSnapshot\", null);\n setFormValue?.(\"quantityUnit\", null);\n }\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n }\n };\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"inline-flex w-fit gap-1 rounded-md border bg-muted/50 p-1\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"catalog\" ? \"default\" : \"ghost\"}\n onClick={() => switchMode(\"catalog\")}\n >\n {t(\"sales.documents.items.lineMode.catalog\", \"Catalog item\")}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"custom\" ? \"default\" : \"ghost\"}\n onClick={() => switchMode(\"custom\")}\n >\n {t(\"sales.documents.items.lineMode.custom\", \"Custom line\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.lineMode.helper\",\n \"Use catalog products or create a freeform line with your own price.\",\n )}\n </p>\n </div>\n );\n },\n } satisfies CrudField,\n ...(deletedCatalogReference\n ? [\n {\n id: \"deletedCatalogReference\",\n label: t(\n \"sales.documents.items.deletedCatalogReference.label\",\n \"Deleted catalog item\",\n ),\n type: \"custom\",\n layout: \"full\",\n component: () => (\n <Alert status=\"information\" style=\"lighter\">\n <AlertTitle>\n {t(\n \"sales.documents.items.deletedCatalogReference.title\",\n \"This catalog item was deleted\",\n )}\n </AlertTitle>\n <AlertDescription>\n {t(\n \"sales.documents.items.deletedCatalogReference.description\",\n \"The saved line data is kept and the line is shown as a custom line. Switch to Catalog item to replace it with an existing product.\",\n )}\n </AlertDescription>\n </Alert>\n ),\n } satisfies CrudField,\n ]\n : []),\n ...(!isCustomLine\n ? [\n {\n id: \"productId\",\n label: t(\"sales.documents.items.product\", \"Product\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (productOptionsRef.current.get(next) ?? null)\n : null;\n if (next) setDeletedCatalogReference(false);\n setProductOption(selectedOption);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setValue(next ?? null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n const defaultQuantityUnit =\n selectedOption?.defaultSalesUnit ??\n selectedOption?.defaultUnit ??\n null;\n setFormValue?.(\"quantityUnit\", defaultQuantityUnit);\n if (\n typeof selectedOption?.defaultSalesUnitQuantity ===\n \"number\" &&\n Number.isFinite(\n selectedOption.defaultSalesUnitQuantity,\n ) &&\n selectedOption.defaultSalesUnitQuantity > 0\n ) {\n setFormValue?.(\n \"quantity\",\n String(selectedOption.defaultSalesUnitQuantity),\n );\n }\n const taxSelection = selectedOption\n ? resolveTaxSelection(selectedOption)\n : { taxRate: null, taxRateId: null };\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\"taxRateId\", taxSelection.taxRateId ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim() && selectedOption?.title) {\n setFormValue?.(\"name\", selectedOption.title);\n }\n setFormValue?.(\n \"catalogSnapshot\",\n next\n ? {\n product: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl:\n selectedOption?.thumbnailUrl ?? null,\n defaultUnit: selectedOption?.defaultUnit ?? null,\n defaultSalesUnit:\n selectedOption?.defaultSalesUnit ?? null,\n },\n }\n : null,\n );\n if (next) {\n void loadProductUnits(next, selectedOption);\n void loadPrices(\n next,\n null,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n defaultQuantityUnit,\n );\n }\n }}\n fetchItems={loadProductOptions}\n options={\n productOption\n ? [\n {\n id: productOption.id,\n title: productOption.title || productOption.id,\n subtitle: productOption.sku ?? undefined,\n icon: productOption.thumbnailUrl ? (\n <img\n src={productOption.thumbnailUrl}\n alt={productOption.title ?? productOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n productOption.title || productOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n minQuery={1}\n searchPlaceholder={t(\n \"sales.documents.items.productSearch\",\n \"Search product\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedProduct\",\n \"Selected {{id}}\",\n {\n id: productOption?.title ?? id,\n },\n )\n }\n />\n ),\n } satisfies CrudField,\n {\n id: \"variantId\",\n label: t(\"sales.documents.items.variant\", \"Variant\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n return (\n <LookupSelect\n key={productId ?? \"no-product\"}\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (variantOptionsRef.current.get(next) ?? null)\n : null;\n setVariantOption(selectedOption);\n setValue(next ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim()) {\n setFormValue?.(\n \"name\",\n selectedOption?.title ??\n productOption?.title ??\n existingName,\n );\n }\n const taxSource = hasTaxMetadata(selectedOption)\n ? selectedOption\n : hasTaxMetadata(productOption)\n ? productOption\n : null;\n if (taxSource) {\n const taxSelection = resolveTaxSelection(taxSource);\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\n \"taxRateId\",\n taxSelection.taxRateId ?? null,\n );\n }\n const prevSnapshot =\n typeof values?.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? (values.catalogSnapshot as Record<string, unknown>)\n : null;\n if (next) {\n setFormValue?.(\"catalogSnapshot\", {\n ...(prevSnapshot ?? {}),\n variant: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl: selectedOption?.thumbnailUrl ?? null,\n },\n });\n } else if (prevSnapshot) {\n const snapshot = { ...prevSnapshot };\n if (\"variant\" in snapshot)\n delete (snapshot as CatalogSnapshotRecord).variant;\n setFormValue?.(\n \"catalogSnapshot\",\n Object.keys(snapshot).length ? snapshot : null,\n );\n } else {\n setFormValue?.(\"catalogSnapshot\", null);\n }\n if (productId) {\n const currentQuantity =\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1;\n const currentQuantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n void loadPrices(\n productId,\n next,\n currentQuantity,\n currentQuantityUnit,\n );\n }\n }}\n fetchItems={async (query) => {\n if (!productId) return [];\n const productThumb = productId\n ? productOptionsRef.current.get(productId)?.thumbnailUrl\n : null;\n const options = await loadVariantOptions(\n productId,\n productThumb,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return needle.length\n ? options.filter((option) =>\n option.title.toLowerCase().includes(needle),\n )\n : options;\n }}\n searchPlaceholder={t(\n \"sales.documents.items.variantSearch\",\n \"Search variant\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n options={\n variantOption\n ? [\n {\n id: variantOption.id,\n title: variantOption.title || variantOption.id,\n subtitle: variantOption.sku ?? undefined,\n icon: variantOption.thumbnailUrl ? (\n <img\n src={variantOption.thumbnailUrl}\n alt={variantOption.title ?? variantOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n variantOption.title || variantOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedVariant\",\n \"Selected {{id}}\",\n {\n id: variantOption?.title ?? id,\n },\n )\n }\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n {\n id: \"priceId\",\n label: t(\"sales.documents.items.price\", \"Price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n const variantId =\n typeof values?.variantId === \"string\"\n ? values.variantId\n : null;\n return (\n <LookupSelect\n key={\n productId\n ? `${productId}-${variantId ?? \"no-variant\"}`\n : \"price\"\n }\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n setValue(next ?? null);\n const selected = next\n ? (priceOptions.find((entry) => entry.id === next) ??\n null)\n : null;\n applyPriceSelection(\n selected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit:\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n },\n );\n }}\n fetchItems={async (query) => {\n const prices = await loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return prices\n .filter((price) => {\n if (!needle.length) return true;\n const haystack = [\n price.label,\n price.priceKindTitle,\n price.priceKindCode,\n price.currencyCode,\n ...(price.scopeTags ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n })\n .map<LookupSelectItem>((price) => ({\n id: price.id,\n title: price.label,\n subtitle:\n price.priceKindTitle ??\n price.priceKindCode ??\n undefined,\n description: price.scopeReason ?? undefined,\n rightLabel: price.currencyCode ?? undefined,\n icon: (\n <DollarSign className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }));\n }}\n minQuery={0}\n loading={priceLoading}\n searchPlaceholder={t(\n \"sales.documents.items.priceSearch\",\n \"Select price\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n ]\n : []),\n {\n id: \"unitPrice\",\n label: t(\"sales.documents.items.unitPrice\", \"Unit price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const mode = values?.priceMode === \"net\" ? \"net\" : \"gross\";\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPrice = selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId) ?? null)\n : null;\n const selectedCurrency =\n selectedPrice?.currencyCode ??\n (typeof values?.currencyCode === \"string\" ? values.currencyCode : null);\n const quantityUnitCode = normalizeUnitCode(values?.quantityUnit);\n const baseUnitCode =\n unitOptions.find((option) => option.isBase)?.code ?? null;\n const selectedUnitOption = quantityUnitCode\n ? (unitOptions.find((option) => option.code === quantityUnitCode) ?? null)\n : null;\n const unitFactor = (() => {\n if (!quantityUnitCode) return null;\n if (baseUnitCode && quantityUnitCode === baseUnitCode) return 1;\n const value = normalizeNumber(selectedUnitOption?.toBaseFactor, Number.NaN);\n return Number.isFinite(value) && value > 0 ? value : null;\n })();\n const selectedBaseAmount = selectedPrice\n ? mode === \"net\"\n ? (selectedPrice.amountNet ?? selectedPrice.amountGross ?? null)\n : (selectedPrice.amountGross ?? selectedPrice.amountNet ?? null)\n : null;\n const convertedAmount =\n selectedBaseAmount !== null &&\n unitFactor !== null &&\n Number.isFinite(selectedBaseAmount * unitFactor)\n ? selectedBaseAmount * unitFactor\n : null;\n const isCatalogLine = lineMode !== \"custom\";\n return (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n />\n <Select\n value={mode}\n onValueChange={(value) => {\n const nextMode = value === \"net\" ? \"net\" : \"gross\";\n setFormValue?.(\"priceMode\", nextMode);\n }}\n >\n <SelectTrigger className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"gross\">\n {t(\"sales.documents.items.priceGross\", \"Gross\")}\n </SelectItem>\n <SelectItem value=\"net\">\n {t(\"sales.documents.items.priceNet\", \"Net\")}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n {isCatalogLine && selectedPrice && quantityUnitCode && baseUnitCode ? (\n unitFactor !== null && convertedAmount !== null ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisTemplate\",\n \"Catalog price basis: {{baseAmount}} / {{baseUnit}}. Converted for {{unit}}: {{baseAmount}} \u00D7 {{factor}} = {{convertedAmount}}.\",\n {\n baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency),\n baseUnit: baseUnitCode,\n unit: quantityUnitCode,\n factor: unitFactor,\n convertedAmount: formatMoney(convertedAmount, selectedCurrency),\n },\n )}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisMissingConversion\",\n \"Catalog price basis is base unit, but conversion for selected unit is missing.\",\n )}\n </p>\n )\n ) : null}\n {isCatalogLine && !selectedPrice ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisManual\",\n \"Manual unit price mode. Price will not auto-convert until you select a catalog price.\",\n )}\n </p>\n ) : null}\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"taxRateId\",\n label: t(\"sales.documents.items.taxRate\", \"Tax class\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const resolvedValue =\n typeof value === \"string\" && value.trim().length\n ? value\n : findTaxRateIdByValue((values as Record<string, unknown>)?.taxRate as number | null | undefined);\n const selectedTaxRate = resolvedValue\n ? taxRateMap.get(resolvedValue) ?? null\n : null;\n const handleChange = (\n event: React.ChangeEvent<HTMLSelectElement>,\n ) => {\n const nextId = event.target.value || null;\n const option = nextId ? (taxRateMap.get(nextId) ?? null) : null;\n setValue(nextId);\n const rate = normalizeNumber(option?.rate);\n setFormValue?.(\"taxRate\", Number.isFinite(rate) ? rate : null);\n };\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={resolvedValue || undefined}\n onValueChange={(value) => handleChange({ target: { value } } as React.ChangeEvent<HTMLSelectElement>)}\n disabled={!taxRates.length}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n taxRates.length\n ? t(\n \"sales.documents.items.taxRate.none\",\n \"No tax class selected\",\n )\n : t(\n \"sales.documents.items.taxRate.empty\",\n \"No tax classes available\",\n )\n }\n >\n {selectedTaxRate\n ? `${selectedTaxRate.name}${selectedTaxRate.code ? ` \u2022 ${selectedTaxRate.code.toUpperCase()}` : \"\"}${Number.isFinite(selectedTaxRate.rate) ? ` \u2022 ${selectedTaxRate.rate}%` : \"\"}`\n : undefined}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {taxRates.map((rate) => (\n <SelectItem key={rate.id} value={rate.id}>\n {rate.name}\n {rate.code ? ` \u2022 ${rate.code.toUpperCase()}` : \"\"}\n {Number.isFinite(rate.rate) ? ` \u2022 ${rate.rate}%` : \"\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantityUnit\",\n label: t(\"sales.documents.items.quantityUnit\", \"Unit\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n if (isCustomLine) {\n return (\n <Input\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => setValue(event.target.value || null)}\n placeholder={t(\n \"sales.documents.items.quantityUnitPlaceholder\",\n \"e.g. pc\",\n )}\n />\n );\n }\n return (\n <Select\n value={typeof value === \"string\" && value ? value : undefined}\n onValueChange={(next) => {\n const nextValue = next || null;\n const nextUnitPrice = convertUnitPriceForUnitChange(\n values?.unitPrice,\n typeof value === \"string\" ? value : null,\n nextValue,\n );\n setValue(nextValue);\n if (nextUnitPrice) {\n setFormValue?.(\"unitPrice\", nextUnitPrice);\n }\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find(\n (entry) => entry.id === selectedPriceId,\n )?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\" ? values.quantity : 1,\n nextValue,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit: nextValue,\n },\n );\n });\n }\n }}\n disabled={!productId}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={t(\"sales.documents.items.quantityUnitSelect\", \"Select unit\")}\n />\n </SelectTrigger>\n <SelectContent>\n {unitOptions.map((option) => (\n <SelectItem key={option.code} value={option.code}>\n {option.isBase\n ? `${option.code} (${t(\"sales.documents.items.baseUnitTag\", \"base\")})`\n : option.code}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantity\",\n label: t(\"sales.documents.items.quantity\", \"Quantity\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => (\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => {\n const nextQuantity = event.target.value;\n setValue(nextQuantity);\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n const quantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId)\n ?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n nextQuantity,\n quantityUnit,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit,\n },\n );\n });\n }\n }}\n placeholder=\"1\"\n />\n ),\n } satisfies CrudField,\n {\n id: \"uomPreview\",\n label: t(\"sales.documents.items.uomPreview\", \"Normalized quantity\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ values }: FieldRenderProps) => {\n if (isCustomLine) return null;\n const quantity = normalizeNumber(values?.quantity, Number.NaN);\n const enteredUnit = normalizeUnitCode(values?.quantityUnit);\n if (!Number.isFinite(quantity) || quantity <= 0 || !enteredUnit) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewEmpty\",\n \"Select unit and quantity to preview normalization.\",\n )}\n </p>\n );\n }\n const selectedOption =\n unitOptions.find((option) => option.code === enteredUnit) ?? null;\n const baseOption =\n unitOptions.find((option) => option.isBase) ?? null;\n const factor = selectedOption?.toBaseFactor;\n if (!Number.isFinite(factor) || !factor || !baseOption) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewUnavailable\",\n \"Missing conversion to base unit.\",\n )}\n </p>\n );\n }\n const normalized = normalizeQuantityPreview(quantity * factor);\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewTemplate\",\n \"{{quantity}} {{unit}} \u2192 {{normalized}} {{baseUnit}}\",\n {\n quantity,\n unit: enteredUnit,\n normalized,\n baseUnit: baseOption.code,\n },\n )}\n </p>\n );\n },\n } satisfies CrudField,\n {\n id: \"statusEntryId\",\n label: t(\"sales.documents.items.status\", \"Status\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => setValue(next ?? null)}\n placeholder={t(\n \"sales.documents.items.statusPlaceholder\",\n \"Select status\",\n )}\n emptyLabel={t(\"sales.documents.items.statusEmpty\", \"No status\")}\n fetchItems={fetchLineStatusItems}\n loadingLabel={t(\n \"sales.documents.items.statusLoading\",\n \"Loading statuses\u2026\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\"ui.lookupSelect.clearSelection\", \"Clear selection\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n />\n ),\n } satisfies CrudField,\n {\n id: \"name\",\n label: t(\"sales.documents.items.name\", \"Name\"),\n type: \"text\",\n placeholder: t(\n \"sales.documents.items.namePlaceholder\",\n \"Optional line name\",\n ),\n layout: \"full\",\n required: isCustomLine,\n } satisfies CrudField,\n ];\n }, [\n applyPriceSelection,\n convertUnitPriceForUnitChange,\n currencyCode,\n findTaxRateIdByValue,\n loadPrices,\n loadProductUnits,\n loadProductOptions,\n loadVariantOptions,\n fetchLineStatusItems,\n deletedCatalogReference,\n priceLoading,\n priceOptions,\n productOption,\n unitOptions,\n lineMode,\n variantOption,\n t,\n taxRateMap,\n taxRates,\n resolveTaxSelection,\n selectPriceAfterRefresh,\n hasTaxMetadata,\n ]);\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n return [\n { id: \"line-core\", fields },\n {\n id: \"line-custom\",\n column: 2,\n title: t(\"entities.customFields.title\", \"Custom fields\"),\n kind: \"customFields\",\n },\n ];\n }, [fields, t]);\n\n React.useEffect(() => {\n if (!open) return;\n if (!initialLine) {\n resetForm();\n return;\n }\n let cancelled = false;\n setDeletedCatalogReference(false);\n setEditingId(initialLine.id);\n const nextForm = defaultForm(initialLine.currencyCode ?? currencyCode);\n const meta = initialLine.metadata ?? {};\n const snapshot =\n (initialLine.catalogSnapshot as\n | Record<string, unknown>\n | null\n | undefined) ?? null;\n const snapshotProduct =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).product === \"object\" &&\n (snapshot as CatalogSnapshotRecord).product\n ? ((snapshot as CatalogSnapshotRecord).product as Record<string, unknown>)\n : null;\n const snapshotVariant =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).variant === \"object\" &&\n (snapshot as CatalogSnapshotRecord).variant\n ? ((snapshot as CatalogSnapshotRecord).variant as Record<string, unknown>)\n : null;\n const metaRec = (typeof meta === \"object\" && meta ? meta : null) as LineMetadataRecord | null;\n const metaLineMode =\n typeof metaRec?.lineMode === \"string\" &&\n (metaRec.lineMode === \"custom\" || metaRec.lineMode === \"catalog\")\n ? (metaRec.lineMode as \"custom\" | \"catalog\")\n : metaRec?.customLine\n ? \"custom\"\n : undefined;\n nextForm.productId = initialLine.productId;\n nextForm.variantId = initialLine.productVariantId;\n nextForm.quantity = initialLine.quantity.toString();\n nextForm.quantityUnit = normalizeUnitCode(initialLine.quantityUnit) ?? null;\n const metaMode = metaRec?.priceMode;\n const resolvedPriceMode =\n metaMode === \"net\" || metaMode === \"gross\"\n ? metaMode\n : (initialLine.priceMode ?? \"gross\");\n nextForm.unitPrice =\n resolvedPriceMode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n nextForm.priceMode = resolvedPriceMode;\n nextForm.taxRate = Number.isFinite(initialLine.taxRate)\n ? initialLine.taxRate\n : null;\n nextForm.name = initialLine.name ?? \"\";\n nextForm.catalogSnapshot = snapshot ?? null;\n nextForm.customFieldSetId = initialLine.customFieldSetId ?? null;\n nextForm.statusEntryId = initialLine.statusEntryId ?? null;\n nextForm.lineMode =\n metaLineMode ??\n (initialLine.productId || initialLine.productVariantId\n ? \"catalog\"\n : \"custom\");\n const metaTaxRateId =\n typeof metaRec?.taxRateId === \"string\"\n ? metaRec.taxRateId\n : null;\n const fallbackTaxRateId = findTaxRateIdByValue(nextForm.taxRate);\n nextForm.taxRateId =\n metaTaxRateId ??\n fallbackTaxRateId ??\n (defaultTaxRateRef.current ? defaultTaxRateRef.current.id : null);\n if (!Number.isFinite(nextForm.taxRate) && nextForm.taxRateId) {\n const matched = taxRatesRef.current.find(\n (rate) => rate.id === nextForm.taxRateId,\n );\n const numericRate = normalizeNumber(matched?.rate);\n if (Number.isFinite(numericRate)) {\n nextForm.taxRate = numericRate;\n }\n }\n let resolvedProductOption: ProductOption | null = null;\n let resolvedVariantOption: VariantOption | null = null;\n if (metaRec) {\n const metaRecord = metaRec;\n const mode = metaRecord.priceMode;\n if (mode === \"net\" || mode === \"gross\") {\n nextForm.priceMode = mode;\n nextForm.unitPrice =\n mode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n }\n nextForm.priceId =\n typeof metaRecord.priceId === \"string\"\n ? metaRecord.priceId\n : null;\n const productTitle =\n typeof metaRecord.productTitle === \"string\"\n ? metaRecord.productTitle\n : initialLine.name;\n const productSku =\n typeof metaRecord.productSku === \"string\"\n ? metaRecord.productSku\n : null;\n const productThumbnail =\n typeof metaRecord.productThumbnail === \"string\"\n ? metaRecord.productThumbnail\n : null;\n if (productTitle && initialLine.productId) {\n const snapshotUom = snapshotProduct\n ? getUomProductFields(snapshotProduct)\n : { defaultUnit: null, defaultSalesUnit: null, defaultSalesUnitQuantity: Number.NaN };\n const option: ProductOption = {\n id: initialLine.productId,\n title: productTitle,\n sku: productSku,\n thumbnailUrl: productThumbnail,\n defaultUnit: snapshotUom.defaultUnit,\n defaultSalesUnit: snapshotUom.defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(snapshotUom.defaultSalesUnitQuantity)\n ? snapshotUom.defaultSalesUnitQuantity\n : null,\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n const variantTitle =\n typeof metaRecord.variantTitle === \"string\"\n ? metaRecord.variantTitle\n : null;\n const variantSku =\n typeof metaRecord.variantSku === \"string\"\n ? metaRecord.variantSku\n : null;\n const variantThumb =\n typeof metaRecord.variantThumbnail === \"string\"\n ? metaRecord.variantThumbnail\n : productThumbnail;\n if (variantTitle && initialLine.productVariantId) {\n const option = {\n id: initialLine.productVariantId,\n title: variantTitle,\n sku: variantSku,\n thumbnailUrl: variantThumb ?? null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n }\n if (!resolvedProductOption && initialLine.productId && snapshotProduct) {\n const sp = snapshotProduct as SnapshotEntity;\n const snapshotTitle =\n typeof sp.title === \"string\" && sp.title.trim().length\n ? sp.title\n : (initialLine.name ?? initialLine.productId);\n const snapshotSku =\n typeof sp.sku === \"string\" && sp.sku.trim().length\n ? sp.sku\n : null;\n const snapshotThumb =\n typeof sp.thumbnailUrl === \"string\"\n ? sp.thumbnailUrl\n : typeof sp.thumbnail_url === \"string\"\n ? sp.thumbnail_url\n : null;\n const snapshotTaxRate = normalizeNumber(sp.taxRate, Number.NaN);\n const option: ProductOption = {\n id: initialLine.productId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sp.taxRateId === \"string\" ? sp.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n defaultUnit: normalizeUnitCode(sp.defaultUnit ?? sp.default_unit),\n defaultSalesUnit: normalizeUnitCode(sp.defaultSalesUnit ?? sp.default_sales_unit),\n defaultSalesUnitQuantity: (() => {\n const raw = normalizeNumber(sp.defaultSalesUnitQuantity ?? sp.default_sales_unit_quantity, Number.NaN);\n return Number.isFinite(raw) ? raw : null;\n })(),\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n if (\n !resolvedVariantOption &&\n initialLine.productVariantId &&\n snapshotVariant\n ) {\n const sv = snapshotVariant as SnapshotEntity;\n const snapshotTitle =\n typeof sv.title === \"string\" && sv.title.trim().length\n ? sv.title\n : (initialLine.name ?? initialLine.productVariantId);\n const snapshotSku =\n typeof sv.sku === \"string\" && sv.sku.trim().length\n ? sv.sku\n : null;\n const snapshotThumb =\n typeof sv.thumbnailUrl === \"string\"\n ? sv.thumbnailUrl\n : typeof sv.thumbnail_url === \"string\"\n ? sv.thumbnail_url\n : (resolvedProductOption?.thumbnailUrl ??\n productOptionsRef.current.get(initialLine.productId ?? \"\")\n ?.thumbnailUrl ??\n null);\n const snapshotTaxRate = normalizeNumber(sv.taxRate, Number.NaN);\n const option: VariantOption = {\n id: initialLine.productVariantId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sv.taxRateId === \"string\" ? sv.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n if (resolvedProductOption) {\n setProductOption(resolvedProductOption);\n } else {\n setProductOption(null);\n }\n if (resolvedVariantOption) {\n setVariantOption(resolvedVariantOption);\n } else {\n setVariantOption(null);\n }\n const customValues = extractCustomFieldValues(\n initialLine as Record<string, unknown>,\n );\n const merged = { ...nextForm, ...customValues };\n const markDeletedCatalogReference = () => {\n if (cancelled) return;\n const nextMerged = { ...merged, lineMode: \"custom\" as const };\n setDeletedCatalogReference(true);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setInitialValues(nextMerged);\n setLineMode(\"custom\");\n setFormResetKey((prev) => prev + 1);\n };\n setInitialValues(merged);\n setLineMode(merged.lineMode);\n setFormResetKey((prev) => prev + 1);\n if (initialLine.productId) {\n void (async () => {\n try {\n const currentProduct = await loadProductOptionById(\n initialLine.productId as string,\n );\n if (cancelled) return;\n if (!currentProduct) {\n markDeletedCatalogReference();\n return;\n }\n if (merged.lineMode !== \"custom\") {\n setProductOption(currentProduct);\n }\n if (initialLine.productVariantId) {\n await loadVariantOptions(\n initialLine.productId as string,\n currentProduct.thumbnailUrl,\n );\n if (cancelled) return;\n const currentVariant =\n variantOptionsRef.current.get(initialLine.productVariantId) ??\n null;\n if (!currentVariant) {\n markDeletedCatalogReference();\n return;\n }\n if (merged.lineMode !== \"custom\") {\n setVariantOption(currentVariant);\n }\n }\n setDeletedCatalogReference(false);\n } catch (err) {\n logger.error('sales.document.items.verifyCatalogReference', { err });\n }\n })();\n void loadProductUnits(initialLine.productId, resolvedProductOption).then(\n (options) => {\n if (cancelled) return;\n const requestedUnit = normalizeUnitCode(nextForm.quantityUnit);\n if (\n requestedUnit &&\n !options.some((entry) => entry.code === requestedUnit)\n ) {\n setUnitOptions((prev) => [\n ...prev,\n { code: requestedUnit, toBaseFactor: null, isBase: false },\n ]);\n }\n },\n );\n void loadPrices(\n initialLine.productId,\n initialLine.productVariantId,\n nextForm.quantity,\n nextForm.quantityUnit,\n );\n } else {\n setPriceOptions([]);\n setUnitOptions([]);\n }\n return () => {\n cancelled = true;\n };\n }, [\n currencyCode,\n findTaxRateIdByValue,\n initialLine,\n loadProductOptionById,\n loadPrices,\n loadProductUnits,\n loadVariantOptions,\n open,\n resetForm,\n ]);\n\n const handleSubmitForm = React.useCallback(\n () => dialogContentRef.current?.querySelector(\"form\")?.requestSubmit(),\n [],\n )\n const handleKeyDown = useDialogKeyHandler({\n onConfirm: handleSubmitForm,\n onCancel: closeDialog,\n })\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => (next ? onOpenChange(true) : closeDialog())}\n >\n <DialogContent\n className=\"sm:max-w-5xl\"\n ref={dialogContentRef}\n onKeyDown={handleKeyDown}\n >\n <DialogHeader>\n <DialogTitle>\n {editingId\n ? t(\"sales.documents.items.editTitle\", \"Edit line\")\n : t(\"sales.documents.items.addTitle\", \"Add line\")}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<LineFormState>\n key={formResetKey}\n embedded\n fields={fields}\n groups={groups}\n entityId={customFieldEntityId}\n initialValues={initialValues}\n submitLabel={\n editingId\n ? t(\"sales.documents.items.save\", \"Save changes\")\n : t(\"sales.documents.items.addLine\", \"Add item\")\n }\n onSubmit={handleFormSubmit}\n loadingMessage={t(\"sales.documents.items.loading\", \"Loading items\u2026\")}\n />\n </DialogContent>\n </Dialog>\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport {\n LookupSelect,\n type LookupSelectItem,\n} from \"@open-mercato/ui/backend/inputs\";\nimport {\n CrudForm,\n type CrudField,\n type CrudFormGroup,\n type CrudCustomFieldRenderProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { collectCustomFieldValues } from \"@open-mercato/ui/backend/utils/customFieldValues\";\nimport { apiCall, withScopedApiRequestHeaders } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { buildOptimisticLockHeader } from \"@open-mercato/ui/backend/utils/optimisticLock\";\nimport { createCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { handleSectionMutationError } from \"./optimisticLock\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@open-mercato/ui/primitives/dialog\";\nimport { useDialogKeyHandler } from \"@open-mercato/ui/hooks/useDialogKeyHandler\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from \"@open-mercato/ui/primitives/alert\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@open-mercato/ui/primitives/select\";\nimport { DollarSign, Settings } from \"lucide-react\";\nimport { normalizeCustomFieldValues } from \"@open-mercato/shared/lib/custom-fields/normalize\";\nimport {\n DictionaryValue,\n renderDictionaryIcon,\n renderDictionaryColor,\n} from \"@open-mercato/core/modules/dictionaries/components/dictionaryAppearance\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { useOrganizationScopeDetail } from \"@open-mercato/shared/lib/frontend/useOrganizationScope\";\nimport { formatMoney, normalizeNumber } from \"./lineItemUtils\";\nimport type { SalesLineRecord } from \"./lineItemTypes\";\nimport { prepareShippedLineUpdatePayload } from \"./lineItemShipmentLock\";\nimport {\n normalizeCustomFieldSubmitValue,\n extractCustomFieldValues,\n} from \"./customFieldHelpers\";\nimport { canonicalizeUnitCode } from \"@open-mercato/shared/lib/units/unitCodes\";\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('sales')\n\ntype ProductOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n defaultUnit?: string | null;\n defaultSalesUnit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n};\n\ntype VariantOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n};\n\ntype PriceOption = {\n id: string;\n amountNet: number | null;\n amountGross: number | null;\n currencyCode: string | null;\n displayMode: \"including-tax\" | \"excluding-tax\" | null;\n taxRate: number | null;\n label: string;\n priceKindId?: string | null;\n priceKindTitle?: string | null;\n priceKindCode?: string | null;\n scopeReason?: string | null;\n scopeTags?: string[];\n};\n\ntype TaxRateOption = {\n id: string;\n name: string;\n code: string | null;\n rate: number | null;\n isDefault: boolean;\n};\n\nfunction mapTaxRateOption(item: Record<string, unknown>): TaxRateOption | null {\n const id = typeof item.id === \"string\" ? item.id : null;\n const name =\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name.trim()\n : typeof item.code === \"string\"\n ? item.code\n : null;\n if (!id || !name) return null;\n const rate = normalizeNumber((item as ApiTaxRateItem).rate);\n const code =\n typeof (item as ApiTaxRateItem).code === \"string\" &&\n (item as ApiTaxRateItem).code?.trim().length\n ? (item as ApiTaxRateItem).code?.trim() ?? null\n : null;\n const isDefault = Boolean(\n (item as ApiTaxRateItem).isDefault ?? (item as ApiTaxRateItem).is_default,\n );\n return {\n id,\n name,\n code,\n rate: Number.isFinite(rate) ? rate : null,\n isDefault,\n };\n}\n\nfunction mergeTaxRateOptions(\n options: TaxRateOption[],\n selected: TaxRateOption | null,\n): TaxRateOption[] {\n if (!selected) return options;\n if (options.some((option) => option.id === selected.id)) return options;\n return [selected, ...options];\n}\n\ntype StatusOption = {\n id: string;\n value: string;\n label: string;\n color: string | null;\n icon: string | null;\n};\n\ntype UnitOption = {\n code: string;\n toBaseFactor: number | null;\n isBase: boolean;\n};\n\ntype LineFormState = {\n lineMode: \"catalog\" | \"custom\";\n productId: string | null;\n variantId: string | null;\n quantity: string;\n quantityUnit: string | null;\n priceId: string | null;\n priceMode: \"net\" | \"gross\";\n unitPrice: string;\n taxRate: number | null;\n taxRateId: string | null;\n name: string;\n currencyCode: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n customFieldSetId?: string | null;\n statusEntryId?: string | null;\n};\n\ntype FieldRenderProps = CrudCustomFieldRenderProps;\n\ntype ApiPriceKind = {\n title?: string | null;\n name?: string | null;\n code?: string | null;\n};\n\ntype ApiPriceItem = Record<string, unknown> & {\n unit_price_net?: number | null;\n unit_price_gross?: number | null;\n currency_code?: string | null;\n currencyCode?: string | null;\n display_mode?: string | null;\n displayMode?: string | null;\n tax_rate?: number | null;\n price_kind_id?: string | null;\n priceKindId?: string | null;\n price_kind_title?: string | null;\n priceKindTitle?: string | null;\n price_kind_code?: string | null;\n priceKindCode?: string | null;\n price_kind?: ApiPriceKind | null;\n kind?: string | null;\n};\n\ntype ApiTaxRateItem = Record<string, unknown> & {\n rate?: number | null;\n code?: string | null;\n isDefault?: boolean;\n is_default?: boolean;\n min_quantity?: number | null;\n max_quantity?: number | null;\n starts_at?: string | null;\n ends_at?: string | null;\n};\n\ntype ApiProductItem = Record<string, unknown> & {\n name?: string;\n sku?: string;\n default_media_url?: string;\n defaultMediaUrl?: string;\n pricing?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiVariantItem = Record<string, unknown> & {\n sku?: string;\n default_media_url?: string;\n thumbnailUrl?: string;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiPricingMetadata = {\n tax_rate_id?: string;\n taxRateId?: string;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype LineMetadataRecord = {\n lineMode?: string;\n customLine?: boolean | null;\n priceMode?: string;\n taxRateId?: string;\n priceId?: string;\n productTitle?: string;\n productSku?: string;\n productThumbnail?: string;\n variantTitle?: string;\n variantSku?: string;\n variantThumbnail?: string;\n};\n\ntype CatalogSnapshotRecord = Record<string, unknown> & {\n product?: Record<string, unknown> | null;\n variant?: Record<string, unknown> | null;\n};\n\ntype SnapshotEntity = {\n defaultUnit?: string | null;\n default_unit?: string | null;\n defaultSalesUnit?: string | null;\n default_sales_unit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n default_sales_unit_quantity?: number | null;\n title?: string;\n sku?: string;\n thumbnailUrl?: string;\n thumbnail_url?: string;\n taxRate?: number | null;\n taxRateId?: string;\n};\n\ntype SalesLineDialogProps = {\n open: boolean;\n kind: \"order\" | \"quote\";\n documentId?: string;\n currencyCode: string | null | undefined;\n documentUpdatedAt?: string | null;\n organizationId: string | null;\n tenantId: string | null;\n initialLine?: SalesLineRecord | null;\n shippedQuantity?: number;\n /**\n * Whether `shippedQuantity` reflects a fully resolved shipment state. Defaults\n * to `true` so callers that genuinely know the value keep working; pass `false`\n * while the host is still loading shipments or after the load failed, and the\n * dialog locks pricing instead of assuming the line is unshipped.\n */\n shippedQuantityResolved?: boolean;\n onOpenChange: (open: boolean) => void;\n onSaved?: () => Promise<void> | void;\n onDraftSaved?: (payload: Record<string, unknown>, lineId: string | null) => Promise<void> | void;\n};\n\nconst defaultForm = (currencyCode?: string | null): LineFormState => ({\n lineMode: \"catalog\",\n productId: null,\n variantId: null,\n quantity: \"1\",\n quantityUnit: null,\n priceId: null,\n priceMode: \"gross\",\n unitPrice: \"\",\n taxRate: null,\n taxRateId: null,\n name: \"\",\n currencyCode: currencyCode ?? null,\n catalogSnapshot: null,\n customFieldSetId: null,\n statusEntryId: null,\n});\n\nconst UNIT_PRICE_INPUT_SCALE = 4;\n\nfunction buildPriceScopeReason(\n item: Record<string, unknown>,\n t: (k: string, f: string) => string,\n): {\n reason: string | null;\n tags: string[];\n} {\n const tags: string[] = [];\n const add = (key: string) => tags.push(key);\n if (item.channel_id || item.channelId)\n add(t(\"sales.documents.items.priceScope.channel\", \"Channel\"));\n if (item.offer_id || item.offerId)\n add(t(\"sales.documents.items.priceScope.offer\", \"Offer\"));\n if (item.variant_id || item.variantId)\n add(t(\"sales.documents.items.priceScope.variant\", \"Variant\"));\n if (item.customer_group_id || item.customerGroupId)\n add(t(\"sales.documents.items.priceScope.customerGroup\", \"Customer group\"));\n if (item.customer_id || item.customerId)\n add(t(\"sales.documents.items.priceScope.customer\", \"Customer\"));\n if (item.user_group_id || item.userGroupId)\n add(t(\"sales.documents.items.priceScope.userGroup\", \"User group\"));\n if (item.user_id || item.userId)\n add(t(\"sales.documents.items.priceScope.user\", \"User\"));\n const minQty = normalizeNumber((item as ApiPriceItem).min_quantity, Number.NaN);\n const maxQty = normalizeNumber((item as ApiPriceItem).max_quantity, Number.NaN);\n if (Number.isFinite(minQty) || Number.isFinite(maxQty)) {\n add(t(\"sales.documents.items.priceScope.quantity\", \"Quantity\"));\n }\n if ((item as ApiPriceItem).starts_at || (item as ApiPriceItem).ends_at) {\n add(t(\"sales.documents.items.priceScope.schedule\", \"Scheduled\"));\n }\n if (tags.length === 0) return { reason: null, tags };\n return { reason: tags.join(\" \u2022 \"), tags };\n}\n\nfunction buildPlaceholder(label?: string | null) {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded border bg-muted text-xs uppercase text-muted-foreground\">\n {(label ?? \"\").slice(0, 2) || \"\u2022\"}\n </div>\n );\n}\n\nfunction normalizeUnitCode(value: unknown): string | null {\n return canonicalizeUnitCode(value);\n}\n\nfunction getRecordBoolean(\n record: Record<string, unknown>,\n fallback: boolean,\n ...keys: string[]\n): boolean {\n for (const key of keys) {\n const val = record[key];\n if (typeof val === \"boolean\") return val;\n }\n return fallback;\n}\n\nfunction getUomProductFields(item: Record<string, unknown>) {\n return {\n defaultUnit: normalizeUnitCode(item.default_unit ?? item.defaultUnit),\n defaultSalesUnit: normalizeUnitCode(\n item.default_sales_unit ?? item.defaultSalesUnit,\n ),\n defaultSalesUnitQuantity: normalizeNumber(\n item.default_sales_unit_quantity ?? item.defaultSalesUnitQuantity,\n Number.NaN,\n ),\n };\n}\n\nfunction getUomConversionFields(row: Record<string, unknown>) {\n return {\n unitCode: normalizeUnitCode(row.unit_code ?? row.unitCode),\n isActive: getRecordBoolean(row, true, \"is_active\", \"isActive\"),\n toBaseFactor: normalizeNumber(\n row.to_base_factor ?? row.toBaseFactor,\n Number.NaN,\n ),\n };\n}\n\nfunction normalizeQuantityPreview(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * 1_000_000) / 1_000_000;\n}\n\nfunction normalizeUnitPriceInputValue(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n const factor = 10 ** UNIT_PRICE_INPUT_SCALE;\n const rounded = Math.round((value + Number.EPSILON) * factor) / factor;\n if (!Number.isFinite(rounded)) return \"\";\n return rounded.toString();\n}\n\nfunction mapProductOption(item: Record<string, unknown>): ProductOption | null {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const productItem = item as ApiProductItem;\n const title =\n typeof item.title === \"string\"\n ? item.title\n : typeof productItem.name === \"string\"\n ? productItem.name\n : id;\n const sku = typeof productItem.sku === \"string\" ? productItem.sku : null;\n const thumbnail =\n typeof productItem.default_media_url === \"string\"\n ? productItem.default_media_url\n : typeof productItem.defaultMediaUrl === \"string\"\n ? productItem.defaultMediaUrl\n : null;\n const pricing =\n typeof productItem.pricing === \"object\" && productItem.pricing\n ? productItem.pricing\n : null;\n const metadata =\n typeof productItem.metadata === \"object\" && productItem.metadata\n ? productItem.metadata\n : null;\n const pricingMeta = pricing as ApiPricingMetadata | null;\n const metaMeta = metadata as ApiPricingMetadata | null;\n const pricingTaxRateId =\n typeof pricingMeta?.tax_rate_id === \"string\" &&\n pricingMeta.tax_rate_id.trim().length\n ? pricingMeta.tax_rate_id.trim()\n : typeof pricingMeta?.taxRateId === \"string\" &&\n pricingMeta.taxRateId.trim().length\n ? pricingMeta.taxRateId.trim()\n : null;\n const metaTaxRateId =\n typeof metaMeta?.taxRateId === \"string\" && metaMeta.taxRateId.trim().length\n ? metaMeta.taxRateId.trim()\n : typeof metaMeta?.tax_rate_id === \"string\" &&\n metaMeta.tax_rate_id.trim().length\n ? metaMeta.tax_rate_id.trim()\n : null;\n const taxRateValue = normalizeNumber(\n pricingMeta?.tax_rate ??\n pricingMeta?.taxRate ??\n productItem.tax_rate ??\n productItem.taxRate,\n Number.NaN,\n );\n const uomFields = getUomProductFields(item);\n return {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: pricingTaxRateId ?? metaTaxRateId ?? null,\n taxRate: Number.isFinite(taxRateValue) ? taxRateValue : null,\n defaultUnit: uomFields.defaultUnit,\n defaultSalesUnit: uomFields.defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(uomFields.defaultSalesUnitQuantity)\n ? uomFields.defaultSalesUnitQuantity\n : null,\n };\n}\n\nexport function LineItemDialog({\n open,\n kind,\n documentId,\n currencyCode,\n documentUpdatedAt,\n organizationId,\n tenantId,\n initialLine,\n shippedQuantity = 0,\n shippedQuantityResolved = true,\n onOpenChange,\n onSaved,\n onDraftSaved,\n}: SalesLineDialogProps) {\n const t = useT();\n const scope = useOrganizationScopeDetail();\n const resolvedOrganizationId = organizationId ?? scope.organizationId ?? null;\n const resolvedTenantId = tenantId ?? scope.tenantId ?? null;\n const [initialValues, setInitialValues] = React.useState<LineFormState>(() =>\n defaultForm(currencyCode),\n );\n const [lineMode, setLineMode] = React.useState<\"catalog\" | \"custom\">(\n defaultForm(currencyCode).lineMode,\n );\n const [productOption, setProductOption] =\n React.useState<ProductOption | null>(null);\n const [variantOption, setVariantOption] =\n React.useState<VariantOption | null>(null);\n const [priceOptions, setPriceOptions] = React.useState<PriceOption[]>([]);\n const [priceLoading, setPriceLoading] = React.useState(false);\n const [formResetKey, setFormResetKey] = React.useState(0);\n const [editingId, setEditingId] = React.useState<string | null>(null);\n const [taxRates, setTaxRates] = React.useState<TaxRateOption[]>([]);\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([]);\n const [unitOptions, setUnitOptions] = React.useState<UnitOption[]>([]);\n const [deletedCatalogReference, setDeletedCatalogReference] =\n React.useState(false);\n const [, setLineStatusLoading] = React.useState(false);\n const productOptionsRef = React.useRef<Map<string, ProductOption>>(new Map());\n const variantOptionsRef = React.useRef<Map<string, VariantOption>>(new Map());\n const taxRatesRef = React.useRef<TaxRateOption[]>([]);\n const defaultTaxRateRef = React.useRef<TaxRateOption | null>(null);\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null);\n\n const resourcePath = React.useMemo(\n () => (kind === \"order\" ? \"sales/order-lines\" : \"sales/quote-lines\"),\n [kind],\n );\n // A line the caller has not resolved shipment state for is treated as shipped:\n // the server rejects pricing changes on shipped lines, so guessing \"unshipped\"\n // from a pending or failed shipments load hands the user an edit that cannot\n // be saved. A brand-new line has no shipments by construction.\n const hasExistingLine = Boolean(initialLine);\n const shipmentStateUnknown = kind === \"order\" && hasExistingLine && !shippedQuantityResolved;\n const isShippedOrderLine =\n kind === \"order\" &&\n hasExistingLine &&\n (shipmentStateUnknown || shippedQuantity > 0);\n // While the shipments read is unresolved the shipped quantity is unknown, so the\n // only safe floor for a quantity edit is the quantity already stored on the line:\n // whatever turns out to be shipped can never exceed it. Raising stays allowed,\n // exactly as it is once the state resolves.\n const storedQuantity = Number(initialLine?.quantity ?? 0);\n const safeStoredQuantity = Number.isFinite(storedQuantity) ? storedQuantity : 0;\n const quantityFloor = shipmentStateUnknown ? safeStoredQuantity : shippedQuantity;\n const documentKey = kind === \"order\" ? \"orderId\" : \"quoteId\";\n const customFieldEntityId =\n kind === \"order\" ? E.sales.sales_order_line : E.sales.sales_quote_line;\n\n const taxRateMap = React.useMemo(\n () =>\n taxRates.reduce<Map<string, TaxRateOption>>((acc, rate) => {\n acc.set(rate.id, rate);\n return acc;\n }, new Map()),\n [taxRates],\n );\n\n const findTaxRateIdByValue = React.useCallback(\n (value: number | null | undefined): string | null => {\n const numeric = normalizeNumber(value, Number.NaN);\n if (!Number.isFinite(numeric)) return null;\n const match = taxRatesRef.current.find(\n (rate) =>\n Number.isFinite(rate.rate) &&\n Math.abs((rate.rate as number) - numeric) < 0.0001,\n );\n return match?.id ?? null;\n },\n [],\n );\n\n const resolveTaxSelection = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n const taxRateId =\n typeof source?.taxRateId === \"string\" && source.taxRateId.trim().length\n ? source.taxRateId.trim()\n : null;\n const rateFromId = taxRateId\n ? normalizeNumber(taxRateMap.get(taxRateId)?.rate, Number.NaN)\n : Number.NaN;\n const numericRate = normalizeNumber(source?.taxRate, Number.NaN);\n const resolvedRateId =\n taxRateId ??\n (Number.isFinite(numericRate)\n ? findTaxRateIdByValue(numericRate)\n : null);\n const resolvedRate = Number.isFinite(rateFromId)\n ? rateFromId\n : Number.isFinite(numericRate)\n ? numericRate\n : null;\n return { taxRateId: resolvedRateId, taxRate: resolvedRate };\n },\n [findTaxRateIdByValue, taxRateMap],\n );\n\n const hasTaxMetadata = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n if (!source) return false;\n const id =\n typeof source.taxRateId === \"string\" ? source.taxRateId.trim() : \"\";\n if (id.length) return true;\n const numericRate = normalizeNumber(source.taxRate, Number.NaN);\n return Number.isFinite(numericRate);\n },\n [],\n );\n\n const resetForm = React.useCallback(\n (next?: Partial<LineFormState>) => {\n const base = { ...defaultForm(currencyCode), ...next };\n const defaultRate = defaultTaxRateRef.current;\n if (!base.taxRateId && defaultRate) {\n base.taxRateId = defaultRate.id;\n base.taxRate = Number.isFinite(defaultRate.rate ?? null)\n ? (defaultRate.rate as number)\n : base.taxRate;\n }\n setInitialValues(base);\n setLineMode(base.lineMode);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setDeletedCatalogReference(false);\n setEditingId(null);\n setFormResetKey((prev) => prev + 1);\n },\n [currencyCode],\n );\n\n const closeDialog = React.useCallback(() => {\n onOpenChange(false);\n resetForm();\n }, [onOpenChange, resetForm]);\n\n const loadTaxRates = React.useCallback(async () => {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const parsed = items\n .map<TaxRateOption | null>((item) => mapTaxRateOption(item))\n .filter((entry): entry is TaxRateOption => Boolean(entry));\n taxRatesRef.current = parsed;\n defaultTaxRateRef.current = parsed.find((rate) => rate.isDefault) ?? null;\n setTaxRates(parsed);\n return parsed;\n } catch (err) {\n logger.error('sales.tax-rates.fetch', { err });\n taxRatesRef.current = [];\n defaultTaxRateRef.current = null;\n setTaxRates([]);\n return [];\n }\n }, []);\n\n const loadTaxRateById = React.useCallback(\n async (taxRateId: string): Promise<TaxRateOption | null> => {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/sales/tax-rates?id=${encodeURIComponent(taxRateId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n return (\n items\n .map<TaxRateOption | null>((item) => mapTaxRateOption(item))\n .find((entry): entry is TaxRateOption => entry?.id === taxRateId) ??\n null\n );\n },\n [],\n );\n\n React.useEffect(() => {\n const selectedId =\n typeof initialValues.taxRateId === \"string\" && initialValues.taxRateId.trim().length\n ? initialValues.taxRateId.trim()\n : null;\n if (!selectedId || taxRates.some((rate) => rate.id === selectedId)) return;\n loadTaxRateById(selectedId)\n .then((selected) => {\n taxRatesRef.current = mergeTaxRateOptions(taxRatesRef.current, selected);\n setTaxRates((current) => mergeTaxRateOptions(current, selected));\n })\n .catch(() => {});\n }, [initialValues.taxRateId, loadTaxRateById, taxRates]);\n\n const loadProductOptionById = React.useCallback(\n async (productId: string): Promise<ProductOption | null> => {\n if (!productId) return null;\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const matched =\n items.find((entry) => entry.id === productId) ?? items[0] ?? null;\n if (!matched) return null;\n const option = mapProductOption(matched);\n if (option) productOptionsRef.current.set(option.id, option);\n return option;\n },\n [],\n );\n\n const loadProductOptions = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const params = new URLSearchParams({ pageSize: \"8\" });\n if (query && query.trim().length) {\n params.set(\"search\", query.trim());\n } else {\n params.set(\"sortField\", \"title\");\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/products?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? (response.result?.items ?? [])\n : [];\n const mapped = items\n .map((item) => {\n const option = mapProductOption(item);\n if (!option) return null;\n return {\n id: option.id,\n title: option.title,\n subtitle: option.sku ?? undefined,\n icon: option.thumbnailUrl ? (\n <img\n src={option.thumbnailUrl}\n alt={option.title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(option.title)\n ),\n option,\n } as LookupSelectItem & { option: ProductOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: ProductOption } =>\n Boolean(entry),\n );\n return mapped.map((entry) => {\n productOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadVariantOptions = React.useCallback(\n async (\n productId: string,\n fallbackThumbnail?: string | null,\n ): Promise<LookupSelectItem[]> => {\n if (!productId) return [];\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/variants?productId=${encodeURIComponent(productId)}&pageSize=50`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n return items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const title = typeof item.name === \"string\" ? item.name : id;\n const variantItem = item as ApiVariantItem;\n const sku =\n typeof variantItem.sku === \"string\" ? variantItem.sku : null;\n const metadata =\n typeof variantItem.metadata === \"object\" && variantItem.metadata\n ? variantItem.metadata\n : null;\n const variantMeta = metadata as ApiPricingMetadata | null;\n const variantTaxRateId =\n typeof variantMeta?.taxRateId === \"string\" &&\n variantMeta.taxRateId.trim().length\n ? variantMeta.taxRateId.trim()\n : typeof variantMeta?.tax_rate_id === \"string\" &&\n variantMeta.tax_rate_id.trim().length\n ? variantMeta.tax_rate_id.trim()\n : null;\n const variantTaxRate = normalizeNumber(\n variantItem.tax_rate ??\n variantItem.taxRate ??\n variantMeta?.tax_rate ??\n variantMeta?.taxRate,\n Number.NaN,\n );\n const thumbnail =\n typeof variantItem.default_media_url === \"string\"\n ? variantItem.default_media_url\n : typeof variantItem.thumbnailUrl === \"string\"\n ? variantItem.thumbnailUrl\n : (fallbackThumbnail ?? null);\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail ? (\n <img\n src={thumbnail}\n alt={title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(title)\n ),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: variantTaxRateId,\n taxRate: Number.isFinite(variantTaxRate) ? variantTaxRate : null,\n } satisfies VariantOption,\n } as LookupSelectItem & { option: VariantOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: VariantOption } =>\n Boolean(entry),\n )\n .map((entry) => {\n variantOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadProductUnits = React.useCallback(\n async (\n productId: string | null,\n option: ProductOption | null,\n ): Promise<UnitOption[]> => {\n if (!productId) {\n setUnitOptions([]);\n return [];\n }\n const map = new Map<string, UnitOption>();\n let baseUnit = normalizeUnitCode(option?.defaultUnit);\n let defaultSalesUnit = normalizeUnitCode(option?.defaultSalesUnit);\n if (!baseUnit || !defaultSalesUnit) {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const records = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const matched =\n records.find((entry) => entry.id === productId) ??\n records[0] ??\n null;\n if (matched) {\n const matchedUom = getUomProductFields(matched);\n baseUnit = baseUnit ?? matchedUom.defaultUnit;\n defaultSalesUnit = defaultSalesUnit ?? matchedUom.defaultSalesUnit;\n }\n } catch (err) {\n logger.error('sales.document.items.loadProductUnits.hydration', { err });\n }\n }\n if (baseUnit) {\n map.set(baseUnit, { code: baseUnit, toBaseFactor: 1, isBase: true });\n }\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/product-unit-conversions?productId=${encodeURIComponent(productId)}&pageSize=100`,\n undefined,\n { fallback: { items: [] } },\n );\n const rows = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n for (const row of rows) {\n const conv = getUomConversionFields(row);\n if (!conv.unitCode) continue;\n if (!conv.isActive) continue;\n map.set(conv.unitCode, {\n code: conv.unitCode,\n toBaseFactor:\n Number.isFinite(conv.toBaseFactor) && conv.toBaseFactor > 0\n ? conv.toBaseFactor\n : null,\n isBase: baseUnit ? conv.unitCode === baseUnit : false,\n });\n }\n } catch (err) {\n logger.error('sales.document.items.loadUnits', { err });\n }\n if (defaultSalesUnit && !map.has(defaultSalesUnit)) {\n map.set(defaultSalesUnit, {\n code: defaultSalesUnit,\n toBaseFactor: baseUnit && defaultSalesUnit === baseUnit ? 1 : null,\n isBase: baseUnit ? defaultSalesUnit === baseUnit : false,\n });\n }\n const nextOptions = Array.from(map.values()).sort((left, right) =>\n left.code.localeCompare(right.code),\n );\n setUnitOptions(nextOptions);\n return nextOptions;\n },\n [],\n );\n\n const loadPrices = React.useCallback(\n async (\n productId: string | null,\n variantId: string | null,\n quantity?: string | number | null,\n quantityUnit?: string | null,\n ) => {\n if (!productId) {\n setPriceOptions([]);\n return [];\n }\n setPriceLoading(true);\n try {\n const params = new URLSearchParams({ productId, pageSize: \"20\" });\n if (variantId) params.set(\"variantId\", variantId);\n const quantityValue = normalizeNumber(quantity, Number.NaN);\n if (Number.isFinite(quantityValue) && quantityValue > 0) {\n params.set(\"quantity\", String(quantityValue));\n }\n const quantityUnitCode = normalizeUnitCode(quantityUnit);\n if (quantityUnitCode) {\n params.set(\"quantityUnit\", quantityUnitCode);\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/prices?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped: PriceOption[] = items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const amountNetRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_net,\n Number.NaN,\n );\n const amountGrossRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_gross,\n Number.NaN,\n );\n const amountNet = Number.isFinite(amountNetRaw)\n ? amountNetRaw\n : null;\n const amountGross = Number.isFinite(amountGrossRaw)\n ? amountGrossRaw\n : null;\n const currency =\n typeof (item as ApiPriceItem).currency_code === \"string\"\n ? (item as ApiPriceItem).currency_code\n : typeof (item as ApiPriceItem).currencyCode === \"string\"\n ? (item as ApiPriceItem).currencyCode\n : null;\n const displayMode =\n (item as ApiPriceItem).display_mode === \"including-tax\" ||\n (item as ApiPriceItem).display_mode === \"excluding-tax\"\n ? (item as ApiPriceItem).display_mode\n : (item as ApiPriceItem).displayMode === \"including-tax\" ||\n (item as ApiPriceItem).displayMode === \"excluding-tax\"\n ? (item as ApiPriceItem).displayMode\n : null;\n const taxRateRaw = normalizeNumber(\n (item as ApiPriceItem).tax_rate,\n Number.NaN,\n );\n const taxRate = Number.isFinite(taxRateRaw) ? taxRateRaw : null;\n const priceKindId =\n typeof (item as ApiPriceItem).price_kind_id === \"string\"\n ? (item as ApiPriceItem).price_kind_id\n : typeof (item as ApiPriceItem).priceKindId === \"string\"\n ? (item as ApiPriceItem).priceKindId\n : null;\n const priceKindTitle =\n typeof (item as ApiPriceItem).price_kind_title === \"string\"\n ? (item as ApiPriceItem).price_kind_title\n : typeof (item as ApiPriceItem).priceKindTitle === \"string\"\n ? (item as ApiPriceItem).priceKindTitle\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.title === \"string\"\n ? (item as ApiPriceItem).price_kind!.title\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.name === \"string\"\n ? (item as ApiPriceItem).price_kind!.name\n : null;\n const priceKindCode =\n typeof (item as ApiPriceItem).price_kind_code === \"string\"\n ? (item as ApiPriceItem).price_kind_code\n : typeof (item as ApiPriceItem).priceKindCode === \"string\"\n ? (item as ApiPriceItem).priceKindCode\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.code === \"string\"\n ? (item as ApiPriceItem).price_kind!.code\n : null;\n const resolvedPriceKindTitle =\n priceKindTitle ??\n priceKindCode ??\n (typeof (item as ApiPriceItem).kind === \"string\"\n ? (item as ApiPriceItem).kind\n : null);\n const labelParts = [\n displayMode === \"including-tax\" &&\n amountGross !== null &&\n currency\n ? formatMoney(amountGross, currency)\n : null,\n displayMode === \"excluding-tax\" && amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : null,\n displayMode\n ? displayMode === \"including-tax\"\n ? t(\"sales.documents.items.priceGross\", \"Gross\")\n : t(\"sales.documents.items.priceNet\", \"Net\")\n : null,\n ].filter(Boolean);\n const { reason, tags } = buildPriceScopeReason(\n item,\n (key, fallback) => t(key, fallback),\n );\n const label =\n labelParts.length > 0\n ? labelParts.join(\" \u2022 \")\n : amountGross !== null && currency\n ? formatMoney(amountGross, currency)\n : amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : id;\n return {\n id,\n amountNet: amountNet ?? null,\n amountGross: amountGross ?? null,\n currencyCode: currency,\n displayMode: displayMode as PriceOption[\"displayMode\"],\n taxRate: Number.isFinite(taxRate) ? taxRate : null,\n label,\n priceKindId,\n priceKindTitle: resolvedPriceKindTitle ?? null,\n priceKindCode: priceKindCode ?? null,\n scopeReason: reason,\n scopeTags: tags,\n } as PriceOption;\n })\n .filter((entry): entry is PriceOption => Boolean(entry));\n setPriceOptions(mapped);\n return mapped;\n } catch (err) {\n logger.error('sales.document.items.loadPrices', { err });\n return [];\n } finally {\n setPriceLoading(false);\n }\n },\n [t],\n );\n\n const selectPriceAfterRefresh = React.useCallback(\n (\n prices: PriceOption[],\n currentPriceId: string | null,\n currentPriceKindId: string | null,\n ): PriceOption | null => {\n if (!prices.length) return null;\n if (currentPriceId) {\n const sameId = prices.find((entry) => entry.id === currentPriceId);\n if (sameId) return sameId;\n }\n if (currentPriceKindId) {\n const sameKind = prices.find(\n (entry) => entry.priceKindId === currentPriceKindId,\n );\n if (sameKind) return sameKind;\n }\n return prices[0] ?? null;\n },\n [],\n );\n\n const resolveUnitPriceFactor = React.useCallback(\n (quantityUnit: string | null | undefined): number => {\n const normalized = normalizeUnitCode(quantityUnit);\n if (!normalized) return 1;\n const unit = unitOptions.find((entry) => entry.code === normalized) ?? null;\n const factor = normalizeNumber(unit?.toBaseFactor, Number.NaN);\n if (!Number.isFinite(factor) || factor <= 0) return 1;\n return factor;\n },\n [unitOptions],\n );\n\n const convertUnitPriceForUnitChange = React.useCallback(\n (\n rawUnitPrice: unknown,\n fromUnit: string | null | undefined,\n toUnit: string | null | undefined,\n ): string | null => {\n const amount = normalizeNumber(rawUnitPrice, Number.NaN);\n if (!Number.isFinite(amount) || amount <= 0) return null;\n const fromCode = normalizeUnitCode(fromUnit);\n const toCode = normalizeUnitCode(toUnit);\n if (!fromCode || !toCode || fromCode === toCode) return null;\n const fromFactor = resolveUnitPriceFactor(fromCode);\n const toFactor = resolveUnitPriceFactor(toCode);\n if (\n !Number.isFinite(fromFactor) ||\n !Number.isFinite(toFactor) ||\n fromFactor <= 0 ||\n toFactor <= 0\n ) {\n return null;\n }\n const baseAmount = amount / fromFactor;\n const convertedAmount = baseAmount * toFactor;\n if (!Number.isFinite(convertedAmount) || convertedAmount <= 0) return null;\n return normalizeUnitPriceInputValue(convertedAmount);\n },\n [resolveUnitPriceFactor],\n );\n\n const applyPriceSelection = React.useCallback(\n (\n selected: PriceOption | null,\n setFormValue: ((id: string, value: unknown) => void) | undefined,\n options?: {\n fallbackTaxSource?: { taxRateId?: string | null; taxRate?: number | null } | null;\n quantityUnit?: string | null;\n },\n ) => {\n if (!setFormValue) return;\n if (selected) {\n const mode =\n selected.displayMode === \"excluding-tax\" ? \"net\" : \"gross\";\n const amountPerBaseUnit =\n mode === \"net\"\n ? (selected.amountNet ?? selected.amountGross ?? 0)\n : (selected.amountGross ?? selected.amountNet ?? 0);\n const factor = resolveUnitPriceFactor(options?.quantityUnit ?? null);\n const amount = Number.isFinite(amountPerBaseUnit * factor)\n ? amountPerBaseUnit * factor\n : amountPerBaseUnit;\n setFormValue(\"priceId\", selected.id);\n setFormValue(\"priceMode\", mode);\n setFormValue(\"unitPrice\", normalizeUnitPriceInputValue(amount));\n setFormValue(\"taxRate\", selected.taxRate ?? null);\n setFormValue(\"taxRateId\", findTaxRateIdByValue(selected.taxRate));\n setFormValue(\n \"currencyCode\",\n selected.currencyCode ?? currencyCode ?? null,\n );\n return;\n }\n const fallbackTax = resolveTaxSelection(options?.fallbackTaxSource ?? null);\n setFormValue(\"taxRate\", fallbackTax.taxRate ?? null);\n setFormValue(\"taxRateId\", fallbackTax.taxRateId ?? null);\n },\n [currencyCode, findTaxRateIdByValue, resolveTaxSelection, resolveUnitPriceFactor],\n );\n\n const loadLineStatuses = React.useCallback(async (): Promise<\n StatusOption[]\n > => {\n setLineStatusLoading(true);\n try {\n const params = new URLSearchParams({ page: \"1\", pageSize: \"100\" });\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/sales/order-line-statuses?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === \"string\" ? entry.id : null;\n const value = typeof entry.value === \"string\" ? entry.value : null;\n if (!id || !value) return null;\n const label =\n typeof entry.label === \"string\" && entry.label.trim().length\n ? entry.label\n : value;\n const color =\n typeof entry.color === \"string\" && entry.color.trim().length\n ? entry.color\n : null;\n const icon =\n typeof entry.icon === \"string\" && entry.icon.trim().length\n ? entry.icon\n : null;\n return { id, value, label, color, icon };\n })\n .filter((entry): entry is StatusOption => Boolean(entry));\n setLineStatuses(mapped);\n return mapped;\n } catch (err) {\n logger.error('sales.lines.statuses.load', { err });\n setLineStatuses([]);\n return [];\n } finally {\n setLineStatusLoading(false);\n }\n }, []);\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n lineStatuses.length && !query ? lineStatuses : await loadLineStatuses();\n const term = query?.trim().toLowerCase() ?? \"\";\n const currentMap = options.reduce<\n Record<\n string,\n {\n value: string;\n label: string;\n color?: string | null;\n icon?: string | null;\n }\n >\n >((acc, entry) => {\n acc[entry.value] = {\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon ?? null,\n };\n return acc;\n }, {});\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.label !== option.value ? option.value : undefined,\n icon:\n renderDictionaryIcon(option.icon, \"h-4 w-4\") ??\n renderDictionaryColor(option.color, \"h-4 w-4 rounded-full\"),\n }));\n },\n [lineStatuses, loadLineStatuses],\n );\n\n React.useEffect(() => {\n if (!open) return;\n loadTaxRates().catch(() => {});\n loadLineStatuses().catch(() => {});\n }, [loadLineStatuses, loadTaxRates, open]);\n\n const handleFormSubmit = React.useCallback(\n async (values: LineFormState & Record<string, unknown>) => {\n // Resolve required scope and ids\n const resolvedDocumentId =\n typeof documentId === \"string\" && documentId.trim().length\n ? documentId\n : null;\n const resolvedOrg = resolvedOrganizationId;\n const resolvedTenant = resolvedTenantId;\n\n if (!onDraftSaved && (!resolvedOrg || !resolvedTenant || !resolvedDocumentId)) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorScope\",\n \"Organization and tenant are required.\",\n ),\n );\n }\n const lineMode = values.lineMode === \"custom\" ? \"custom\" : \"catalog\";\n const isCustomLine = lineMode === \"custom\";\n\n if (!isCustomLine && !values.productId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n {\n productId: t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n },\n );\n }\n if (!isCustomLine && !values.variantId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n {\n variantId: t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n },\n );\n }\n\n const qtyNumber = Number(values.quantity ?? 0);\n if (!Number.isFinite(qtyNumber) || qtyNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n {\n quantity: t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n },\n );\n }\n if (quantityFloor > 0 && qtyNumber < quantityFloor) {\n const message = shipmentStateUnknown\n ? t(\n \"sales.documents.items.errorQuantityShipmentsUnknown\",\n \"The quantity cannot be lowered until this order's shipments have been read. Reopen the order to try again.\",\n )\n : t(\n \"sales.documents.items.errorQuantityBelowShipped\",\n \"You cannot lower the quantity below the {{shipped}} already shipped.\",\n { shipped: shippedQuantity },\n );\n throw createCrudFormError(message, { quantity: message });\n }\n const resolvedQuantityUnit = (() => {\n const entered = normalizeUnitCode(values.quantityUnit);\n if (isCustomLine) return entered;\n return (\n entered ??\n normalizeUnitCode(productOption?.defaultSalesUnit) ??\n normalizeUnitCode(productOption?.defaultUnit)\n );\n })();\n\n const unitPriceNumber = Number(values.unitPrice ?? 0);\n if (!Number.isFinite(unitPriceNumber) || unitPriceNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n {\n unitPrice: t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n },\n );\n }\n\n const selectedPrice =\n !isCustomLine && values.priceId\n ? (priceOptions.find((price) => price.id === values.priceId) ?? null)\n : null;\n const resolvedCurrency =\n (values.currencyCode as string | null | undefined) ??\n selectedPrice?.currencyCode ??\n currencyCode ??\n null;\n if (!resolvedCurrency) {\n throw createCrudFormError(\n t(\"sales.documents.items.errorCurrency\", \"Currency is required.\"),\n {\n priceId: t(\n \"sales.documents.items.errorCurrency\",\n \"Currency is required.\",\n ),\n },\n );\n }\n\n const resolvedNameRaw = (values.name ?? \"\").toString().trim();\n const resolvedName = isCustomLine\n ? resolvedNameRaw\n : resolvedNameRaw ||\n variantOption?.title ||\n productOption?.title ||\n undefined;\n if (isCustomLine && !resolvedName) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n {\n name: t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n },\n );\n }\n const resolvedPriceMode = values.priceMode === \"net\" ? \"net\" : \"gross\";\n const catalogSnapshot =\n !isCustomLine &&\n typeof values.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? values.catalogSnapshot\n : null;\n const selectedTaxRateId =\n typeof values.taxRateId === \"string\" && values.taxRateId.trim().length\n ? values.taxRateId\n : null;\n const resolvedTaxRate = Number.isFinite(values.taxRate)\n ? (values.taxRate as number)\n : normalizeNumber(values.taxRate);\n const normalizedTaxRate = Number.isFinite(resolvedTaxRate)\n ? resolvedTaxRate\n : 0;\n const unitPriceNetValue =\n resolvedPriceMode === \"net\"\n ? unitPriceNumber\n : unitPriceNumber / (1 + normalizedTaxRate / 100);\n const unitPriceGrossValue =\n resolvedPriceMode === \"gross\"\n ? unitPriceNumber\n : unitPriceNumber * (1 + normalizedTaxRate / 100);\n const safeUnitPriceNet = Number.isFinite(unitPriceNetValue)\n ? unitPriceNetValue\n : unitPriceNumber;\n const safeUnitPriceGross = Number.isFinite(unitPriceGrossValue)\n ? unitPriceGrossValue\n : unitPriceNumber;\n const totalNetAmount = safeUnitPriceNet * qtyNumber;\n const totalGrossAmount = safeUnitPriceGross * qtyNumber;\n\n const metadata = {\n ...(catalogSnapshot ?? {}),\n ...(!isCustomLine && values.priceId ? { priceId: values.priceId } : {}),\n priceMode: resolvedPriceMode,\n ...(selectedTaxRateId ? { taxRateId: selectedTaxRateId } : {}),\n ...(!isCustomLine && productOption\n ? {\n productTitle: productOption.title,\n productSku: productOption.sku ?? null,\n productThumbnail: productOption.thumbnailUrl ?? null,\n }\n : {}),\n ...(!isCustomLine && variantOption\n ? {\n variantTitle: variantOption.title,\n variantSku: variantOption.sku ?? null,\n variantThumbnail:\n variantOption.thumbnailUrl ??\n productOption?.thumbnailUrl ??\n null,\n }\n : {}),\n ...(isCustomLine ? { customLine: true } : {}),\n lineMode,\n ...(resolvedQuantityUnit ? { quantityUnit: resolvedQuantityUnit } : {}),\n };\n\n const payload: Record<string, unknown> = {\n ...(resolvedDocumentId ? { [documentKey]: resolvedDocumentId } : {}),\n ...(resolvedOrg ? { organizationId: resolvedOrg } : {}),\n ...(resolvedTenant ? { tenantId: resolvedTenant } : {}),\n productId: isCustomLine\n ? undefined\n : values.productId\n ? String(values.productId)\n : undefined,\n productVariantId: isCustomLine\n ? undefined\n : values.variantId\n ? String(values.variantId)\n : undefined,\n quantity: qtyNumber,\n quantityUnit: resolvedQuantityUnit ?? undefined,\n currencyCode: String(resolvedCurrency),\n priceId:\n !isCustomLine && values.priceId ? String(values.priceId) : undefined,\n priceMode: resolvedPriceMode,\n taxRate: Number.isFinite(resolvedTaxRate) ? resolvedTaxRate : undefined,\n unitPriceNet: safeUnitPriceNet,\n unitPriceGross: safeUnitPriceGross,\n totalNetAmount,\n totalGrossAmount,\n ...(catalogSnapshot ? { catalogSnapshot } : {}),\n metadata,\n customFieldSetId: values.customFieldSetId ?? undefined,\n ...(typeof values.statusEntryId === \"string\" &&\n values.statusEntryId.trim().length\n ? { statusEntryId: values.statusEntryId.trim() }\n : {}),\n };\n\n const customFields = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n });\n if (Object.keys(customFields).length) {\n payload.customFields = normalizeCustomFieldValues(customFields);\n }\n if (resolvedName) payload.name = resolvedName;\n\n const submittedPayload = prepareShippedLineUpdatePayload(\n payload,\n isShippedOrderLine && initialLine\n ? {\n quantity: initialLine.quantity,\n totalNetAmount: initialLine.totalNet,\n totalGrossAmount: initialLine.totalGross,\n }\n : null,\n );\n\n try {\n if (onDraftSaved) {\n await onDraftSaved(submittedPayload, editingId);\n closeDialog();\n return;\n }\n const action = editingId ? updateCrud : createCrud;\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(documentUpdatedAt),\n () =>\n action(\n resourcePath,\n editingId\n ? { id: editingId, ...submittedPayload }\n : submittedPayload,\n {\n errorMessage: t(\n \"sales.documents.items.errorSave\",\n \"Failed to save line.\",\n ),\n },\n ),\n );\n if (result.ok) {\n if (onSaved) await onSaved();\n closeDialog();\n }\n } catch (err) {\n if (\n handleSectionMutationError(err, t, () => {\n if (onSaved) void onSaved();\n })\n ) {\n closeDialog();\n return;\n }\n throw err;\n }\n },\n [\n currencyCode,\n documentId,\n documentKey,\n documentUpdatedAt,\n editingId,\n initialLine,\n isShippedOrderLine,\n onDraftSaved,\n priceOptions,\n productOption,\n quantityFloor,\n resourcePath,\n shipmentStateUnknown,\n shippedQuantity,\n t,\n variantOption,\n onSaved,\n closeDialog,\n resolvedOrganizationId,\n resolvedTenantId,\n ],\n );\n\n const fields = React.useMemo<CrudField[]>(() => {\n const isCustomLine = lineMode === \"custom\";\n return [\n {\n id: \"lineMode\",\n label: t(\"sales.documents.items.lineMode.label\", \"Line type\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ value, setValue, setFormValue }: FieldRenderProps) => {\n const mode = value === \"custom\" ? \"custom\" : \"catalog\";\n const switchMode = (next: \"catalog\" | \"custom\") => {\n if (next === mode) return;\n setValue(next);\n setLineMode(next);\n if (next === \"custom\") {\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setFormValue?.(\"productId\", null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"catalogSnapshot\", null);\n setFormValue?.(\"quantityUnit\", null);\n } else {\n if (deletedCatalogReference) {\n setDeletedCatalogReference(false);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setFormValue?.(\"productId\", null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"catalogSnapshot\", null);\n setFormValue?.(\"quantityUnit\", null);\n }\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n }\n };\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"inline-flex w-fit gap-1 rounded-md border bg-muted/50 p-1\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"catalog\" ? \"default\" : \"ghost\"}\n disabled={isShippedOrderLine}\n onClick={() => switchMode(\"catalog\")}\n >\n {t(\"sales.documents.items.lineMode.catalog\", \"Catalog item\")}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"custom\" ? \"default\" : \"ghost\"}\n disabled={isShippedOrderLine}\n onClick={() => switchMode(\"custom\")}\n >\n {t(\"sales.documents.items.lineMode.custom\", \"Custom line\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.lineMode.helper\",\n \"Use catalog products or create a freeform line with your own price.\",\n )}\n </p>\n </div>\n );\n },\n } satisfies CrudField,\n ...(deletedCatalogReference\n ? [\n {\n id: \"deletedCatalogReference\",\n label: t(\n \"sales.documents.items.deletedCatalogReference.label\",\n \"Deleted catalog item\",\n ),\n type: \"custom\",\n layout: \"full\",\n component: () => (\n <Alert status=\"information\" style=\"lighter\">\n <AlertTitle>\n {t(\n \"sales.documents.items.deletedCatalogReference.title\",\n \"This catalog item was deleted\",\n )}\n </AlertTitle>\n <AlertDescription>\n {t(\n \"sales.documents.items.deletedCatalogReference.description\",\n \"The saved line data is kept and the line is shown as a custom line. Switch to Catalog item to replace it with an existing product.\",\n )}\n </AlertDescription>\n </Alert>\n ),\n } satisfies CrudField,\n ]\n : []),\n ...(!isCustomLine\n ? [\n {\n id: \"productId\",\n label: t(\"sales.documents.items.product\", \"Product\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (productOptionsRef.current.get(next) ?? null)\n : null;\n if (next) setDeletedCatalogReference(false);\n setProductOption(selectedOption);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setValue(next ?? null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n const defaultQuantityUnit =\n selectedOption?.defaultSalesUnit ??\n selectedOption?.defaultUnit ??\n null;\n setFormValue?.(\"quantityUnit\", defaultQuantityUnit);\n if (\n typeof selectedOption?.defaultSalesUnitQuantity ===\n \"number\" &&\n Number.isFinite(\n selectedOption.defaultSalesUnitQuantity,\n ) &&\n selectedOption.defaultSalesUnitQuantity > 0\n ) {\n setFormValue?.(\n \"quantity\",\n String(selectedOption.defaultSalesUnitQuantity),\n );\n }\n const taxSelection = selectedOption\n ? resolveTaxSelection(selectedOption)\n : { taxRate: null, taxRateId: null };\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\"taxRateId\", taxSelection.taxRateId ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim() && selectedOption?.title) {\n setFormValue?.(\"name\", selectedOption.title);\n }\n setFormValue?.(\n \"catalogSnapshot\",\n next\n ? {\n product: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl:\n selectedOption?.thumbnailUrl ?? null,\n defaultUnit: selectedOption?.defaultUnit ?? null,\n defaultSalesUnit:\n selectedOption?.defaultSalesUnit ?? null,\n },\n }\n : null,\n );\n if (next) {\n void loadProductUnits(next, selectedOption);\n void loadPrices(\n next,\n null,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n defaultQuantityUnit,\n );\n }\n }}\n fetchItems={loadProductOptions}\n options={\n productOption\n ? [\n {\n id: productOption.id,\n title: productOption.title || productOption.id,\n subtitle: productOption.sku ?? undefined,\n icon: productOption.thumbnailUrl ? (\n <img\n src={productOption.thumbnailUrl}\n alt={productOption.title ?? productOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n productOption.title || productOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n minQuery={1}\n searchPlaceholder={t(\n \"sales.documents.items.productSearch\",\n \"Search product\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedProduct\",\n \"Selected {{id}}\",\n {\n id: productOption?.title ?? id,\n },\n )\n }\n disabled={isShippedOrderLine}\n />\n ),\n } satisfies CrudField,\n {\n id: \"variantId\",\n label: t(\"sales.documents.items.variant\", \"Variant\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n return (\n <LookupSelect\n key={productId ?? \"no-product\"}\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (variantOptionsRef.current.get(next) ?? null)\n : null;\n setVariantOption(selectedOption);\n setValue(next ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim()) {\n setFormValue?.(\n \"name\",\n selectedOption?.title ??\n productOption?.title ??\n existingName,\n );\n }\n const taxSource = hasTaxMetadata(selectedOption)\n ? selectedOption\n : hasTaxMetadata(productOption)\n ? productOption\n : null;\n if (taxSource) {\n const taxSelection = resolveTaxSelection(taxSource);\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\n \"taxRateId\",\n taxSelection.taxRateId ?? null,\n );\n }\n const prevSnapshot =\n typeof values?.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? (values.catalogSnapshot as Record<string, unknown>)\n : null;\n if (next) {\n setFormValue?.(\"catalogSnapshot\", {\n ...(prevSnapshot ?? {}),\n variant: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl: selectedOption?.thumbnailUrl ?? null,\n },\n });\n } else if (prevSnapshot) {\n const snapshot = { ...prevSnapshot };\n if (\"variant\" in snapshot)\n delete (snapshot as CatalogSnapshotRecord).variant;\n setFormValue?.(\n \"catalogSnapshot\",\n Object.keys(snapshot).length ? snapshot : null,\n );\n } else {\n setFormValue?.(\"catalogSnapshot\", null);\n }\n if (productId) {\n const currentQuantity =\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1;\n const currentQuantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n void loadPrices(\n productId,\n next,\n currentQuantity,\n currentQuantityUnit,\n );\n }\n }}\n fetchItems={async (query) => {\n if (!productId) return [];\n const productThumb = productId\n ? productOptionsRef.current.get(productId)?.thumbnailUrl\n : null;\n const options = await loadVariantOptions(\n productId,\n productThumb,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return needle.length\n ? options.filter((option) =>\n option.title.toLowerCase().includes(needle),\n )\n : options;\n }}\n searchPlaceholder={t(\n \"sales.documents.items.variantSearch\",\n \"Search variant\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n options={\n variantOption\n ? [\n {\n id: variantOption.id,\n title: variantOption.title || variantOption.id,\n subtitle: variantOption.sku ?? undefined,\n icon: variantOption.thumbnailUrl ? (\n <img\n src={variantOption.thumbnailUrl}\n alt={variantOption.title ?? variantOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n variantOption.title || variantOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedVariant\",\n \"Selected {{id}}\",\n {\n id: variantOption?.title ?? id,\n },\n )\n }\n disabled={isShippedOrderLine || !productId}\n />\n );\n },\n } satisfies CrudField,\n {\n id: \"priceId\",\n label: t(\"sales.documents.items.price\", \"Price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n const variantId =\n typeof values?.variantId === \"string\"\n ? values.variantId\n : null;\n const selectedPriceId =\n typeof value === \"string\" ? value : null;\n const selectedPrice = selectedPriceId\n ? (priceOptions.find(\n (entry) => entry.id === selectedPriceId,\n ) ?? null)\n : null;\n if (isShippedOrderLine) {\n const lockedAmount = normalizeNumber(\n values?.unitPrice,\n Number.NaN,\n );\n const lockedCurrency =\n selectedPrice?.currencyCode ??\n (typeof values?.currencyCode === \"string\"\n ? values.currencyCode\n : currencyCode) ??\n undefined;\n const lockedModeLabel =\n values?.priceMode === \"net\"\n ? t(\"sales.documents.items.priceNet\", \"Net\")\n : t(\"sales.documents.items.priceGross\", \"Gross\");\n const lockedAmountLabel = Number.isFinite(lockedAmount)\n ? `${formatMoney(lockedAmount, lockedCurrency)} \u2014 ${lockedModeLabel}`\n : lockedModeLabel;\n const lockedPriceDetail =\n selectedPrice?.priceKindTitle ??\n selectedPrice?.priceKindCode ??\n null;\n return (\n <div className=\"space-y-2\">\n <Input\n readOnly\n disabled\n value={lockedAmountLabel}\n aria-label={t(\"sales.documents.items.price\", \"Price\")}\n />\n {lockedPriceDetail ? (\n <p className=\"text-xs text-muted-foreground\">\n {lockedPriceDetail}\n </p>\n ) : null}\n </div>\n );\n }\n return (\n <LookupSelect\n key={\n productId\n ? `${productId}-${variantId ?? \"no-variant\"}`\n : \"price\"\n }\n value={selectedPriceId}\n onChange={(next) => {\n setValue(next ?? null);\n const selected = next\n ? (priceOptions.find((entry) => entry.id === next) ??\n null)\n : null;\n applyPriceSelection(\n selected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit:\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n },\n );\n }}\n fetchItems={async (query) => {\n const prices = await loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return prices\n .filter((price) => {\n if (!needle.length) return true;\n const haystack = [\n price.label,\n price.priceKindTitle,\n price.priceKindCode,\n price.currencyCode,\n ...(price.scopeTags ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n })\n .map<LookupSelectItem>((price) => ({\n id: price.id,\n title: price.label,\n subtitle:\n price.priceKindTitle ??\n price.priceKindCode ??\n undefined,\n description: price.scopeReason ?? undefined,\n rightLabel: price.currencyCode ?? undefined,\n icon: (\n <DollarSign className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }));\n }}\n minQuery={0}\n loading={priceLoading}\n searchPlaceholder={t(\n \"sales.documents.items.priceSearch\",\n \"Select price\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n ]\n : []),\n {\n id: \"unitPrice\",\n label: t(\"sales.documents.items.unitPrice\", \"Unit price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const mode = values?.priceMode === \"net\" ? \"net\" : \"gross\";\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPrice = selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId) ?? null)\n : null;\n const selectedCurrency =\n selectedPrice?.currencyCode ??\n (typeof values?.currencyCode === \"string\" ? values.currencyCode : null);\n const quantityUnitCode = normalizeUnitCode(values?.quantityUnit);\n const baseUnitCode =\n unitOptions.find((option) => option.isBase)?.code ?? null;\n const selectedUnitOption = quantityUnitCode\n ? (unitOptions.find((option) => option.code === quantityUnitCode) ?? null)\n : null;\n const unitFactor = (() => {\n if (!quantityUnitCode) return null;\n if (baseUnitCode && quantityUnitCode === baseUnitCode) return 1;\n const value = normalizeNumber(selectedUnitOption?.toBaseFactor, Number.NaN);\n return Number.isFinite(value) && value > 0 ? value : null;\n })();\n const selectedBaseAmount = selectedPrice\n ? mode === \"net\"\n ? (selectedPrice.amountNet ?? selectedPrice.amountGross ?? null)\n : (selectedPrice.amountGross ?? selectedPrice.amountNet ?? null)\n : null;\n const convertedAmount =\n selectedBaseAmount !== null &&\n unitFactor !== null &&\n Number.isFinite(selectedBaseAmount * unitFactor)\n ? selectedBaseAmount * unitFactor\n : null;\n const isCatalogLine = lineMode !== \"custom\";\n return (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n disabled={isShippedOrderLine}\n />\n <Select\n value={mode}\n disabled={isShippedOrderLine}\n onValueChange={(value) => {\n const nextMode = value === \"net\" ? \"net\" : \"gross\";\n setFormValue?.(\"priceMode\", nextMode);\n }}\n >\n <SelectTrigger className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"gross\">\n {t(\"sales.documents.items.priceGross\", \"Gross\")}\n </SelectItem>\n <SelectItem value=\"net\">\n {t(\"sales.documents.items.priceNet\", \"Net\")}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n {isCatalogLine && selectedPrice && quantityUnitCode && baseUnitCode ? (\n unitFactor !== null && convertedAmount !== null ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisTemplate\",\n \"Catalog price basis: {{baseAmount}} / {{baseUnit}}. Converted for {{unit}}: {{baseAmount}} \u00D7 {{factor}} = {{convertedAmount}}.\",\n {\n baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency),\n baseUnit: baseUnitCode,\n unit: quantityUnitCode,\n factor: unitFactor,\n convertedAmount: formatMoney(convertedAmount, selectedCurrency),\n },\n )}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisMissingConversion\",\n \"Catalog price basis is base unit, but conversion for selected unit is missing.\",\n )}\n </p>\n )\n ) : null}\n {isCatalogLine && !selectedPrice ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisManual\",\n \"Manual unit price mode. Price will not auto-convert until you select a catalog price.\",\n )}\n </p>\n ) : null}\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"taxRateId\",\n label: t(\"sales.documents.items.taxRate\", \"Tax class\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const resolvedValue =\n typeof value === \"string\" && value.trim().length\n ? value\n : findTaxRateIdByValue((values as Record<string, unknown>)?.taxRate as number | null | undefined);\n const selectedTaxRate = resolvedValue\n ? taxRateMap.get(resolvedValue) ?? null\n : null;\n const handleChange = (\n event: React.ChangeEvent<HTMLSelectElement>,\n ) => {\n const nextId = event.target.value || null;\n const option = nextId ? (taxRateMap.get(nextId) ?? null) : null;\n setValue(nextId);\n const rate = normalizeNumber(option?.rate);\n setFormValue?.(\"taxRate\", Number.isFinite(rate) ? rate : null);\n };\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={resolvedValue || undefined}\n onValueChange={(value) => handleChange({ target: { value } } as React.ChangeEvent<HTMLSelectElement>)}\n disabled={isShippedOrderLine || !taxRates.length}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n taxRates.length\n ? t(\n \"sales.documents.items.taxRate.none\",\n \"No tax class selected\",\n )\n : t(\n \"sales.documents.items.taxRate.empty\",\n \"No tax classes available\",\n )\n }\n >\n {selectedTaxRate\n ? `${selectedTaxRate.name}${selectedTaxRate.code ? ` \u2022 ${selectedTaxRate.code.toUpperCase()}` : \"\"}${Number.isFinite(selectedTaxRate.rate) ? ` \u2022 ${selectedTaxRate.rate}%` : \"\"}`\n : undefined}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {taxRates.map((rate) => (\n <SelectItem key={rate.id} value={rate.id}>\n {rate.name}\n {rate.code ? ` \u2022 ${rate.code.toUpperCase()}` : \"\"}\n {Number.isFinite(rate.rate) ? ` \u2022 ${rate.rate}%` : \"\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantityUnit\",\n label: t(\"sales.documents.items.quantityUnit\", \"Unit\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n if (isCustomLine) {\n return (\n <Input\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => setValue(event.target.value || null)}\n disabled={isShippedOrderLine}\n placeholder={t(\n \"sales.documents.items.quantityUnitPlaceholder\",\n \"e.g. pc\",\n )}\n />\n );\n }\n return (\n <Select\n value={typeof value === \"string\" && value ? value : undefined}\n onValueChange={(next) => {\n const nextValue = next || null;\n const nextUnitPrice = convertUnitPriceForUnitChange(\n values?.unitPrice,\n typeof value === \"string\" ? value : null,\n nextValue,\n );\n setValue(nextValue);\n if (nextUnitPrice) {\n setFormValue?.(\"unitPrice\", nextUnitPrice);\n }\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find(\n (entry) => entry.id === selectedPriceId,\n )?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\" ? values.quantity : 1,\n nextValue,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit: nextValue,\n },\n );\n });\n }\n }}\n disabled={isShippedOrderLine || !productId}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={t(\"sales.documents.items.quantityUnitSelect\", \"Select unit\")}\n />\n </SelectTrigger>\n <SelectContent>\n {unitOptions.map((option) => (\n <SelectItem key={option.code} value={option.code}>\n {option.isBase\n ? `${option.code} (${t(\"sales.documents.items.baseUnitTag\", \"base\")})`\n : option.code}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantity\",\n label: t(\"sales.documents.items.quantity\", \"Quantity\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => (\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => {\n const nextQuantity = event.target.value;\n setValue(nextQuantity);\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n const quantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n if (productId && !isShippedOrderLine) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId)\n ?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n nextQuantity,\n quantityUnit,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit,\n },\n );\n });\n }\n }}\n placeholder=\"1\"\n />\n ),\n } satisfies CrudField,\n {\n id: \"uomPreview\",\n label: t(\"sales.documents.items.uomPreview\", \"Normalized quantity\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ values }: FieldRenderProps) => {\n if (isCustomLine) return null;\n const quantity = normalizeNumber(values?.quantity, Number.NaN);\n const enteredUnit = normalizeUnitCode(values?.quantityUnit);\n if (!Number.isFinite(quantity) || quantity <= 0 || !enteredUnit) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewEmpty\",\n \"Select unit and quantity to preview normalization.\",\n )}\n </p>\n );\n }\n const selectedOption =\n unitOptions.find((option) => option.code === enteredUnit) ?? null;\n const baseOption =\n unitOptions.find((option) => option.isBase) ?? null;\n const factor = selectedOption?.toBaseFactor;\n if (!Number.isFinite(factor) || !factor || !baseOption) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewUnavailable\",\n \"Missing conversion to base unit.\",\n )}\n </p>\n );\n }\n const normalized = normalizeQuantityPreview(quantity * factor);\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewTemplate\",\n \"{{quantity}} {{unit}} \u2192 {{normalized}} {{baseUnit}}\",\n {\n quantity,\n unit: enteredUnit,\n normalized,\n baseUnit: baseOption.code,\n },\n )}\n </p>\n );\n },\n } satisfies CrudField,\n {\n id: \"statusEntryId\",\n label: t(\"sales.documents.items.status\", \"Status\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => setValue(next ?? null)}\n placeholder={t(\n \"sales.documents.items.statusPlaceholder\",\n \"Select status\",\n )}\n emptyLabel={t(\"sales.documents.items.statusEmpty\", \"No status\")}\n fetchItems={fetchLineStatusItems}\n loadingLabel={t(\n \"sales.documents.items.statusLoading\",\n \"Loading statuses\u2026\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\"ui.lookupSelect.clearSelection\", \"Clear selection\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n />\n ),\n } satisfies CrudField,\n {\n id: \"name\",\n label: t(\"sales.documents.items.name\", \"Name\"),\n type: \"text\",\n placeholder: t(\n \"sales.documents.items.namePlaceholder\",\n \"Optional line name\",\n ),\n layout: \"full\",\n required: isCustomLine,\n } satisfies CrudField,\n ];\n }, [\n applyPriceSelection,\n convertUnitPriceForUnitChange,\n currencyCode,\n findTaxRateIdByValue,\n loadPrices,\n loadProductUnits,\n loadProductOptions,\n loadVariantOptions,\n fetchLineStatusItems,\n deletedCatalogReference,\n priceLoading,\n priceOptions,\n productOption,\n unitOptions,\n lineMode,\n variantOption,\n t,\n taxRateMap,\n taxRates,\n resolveTaxSelection,\n selectPriceAfterRefresh,\n hasTaxMetadata,\n isShippedOrderLine,\n ]);\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n return [\n { id: \"line-core\", fields },\n {\n id: \"line-custom\",\n column: 2,\n title: t(\"entities.customFields.title\", \"Custom fields\"),\n kind: \"customFields\",\n },\n ];\n }, [fields, t]);\n\n React.useEffect(() => {\n if (!open) return;\n if (!initialLine) {\n resetForm();\n return;\n }\n let cancelled = false;\n setDeletedCatalogReference(false);\n setEditingId(initialLine.id);\n const nextForm = defaultForm(initialLine.currencyCode ?? currencyCode);\n const meta = initialLine.metadata ?? {};\n const snapshot =\n (initialLine.catalogSnapshot as\n | Record<string, unknown>\n | null\n | undefined) ?? null;\n const snapshotProduct =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).product === \"object\" &&\n (snapshot as CatalogSnapshotRecord).product\n ? ((snapshot as CatalogSnapshotRecord).product as Record<string, unknown>)\n : null;\n const snapshotVariant =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).variant === \"object\" &&\n (snapshot as CatalogSnapshotRecord).variant\n ? ((snapshot as CatalogSnapshotRecord).variant as Record<string, unknown>)\n : null;\n const metaRec = (typeof meta === \"object\" && meta ? meta : null) as LineMetadataRecord | null;\n const metaLineMode =\n typeof metaRec?.lineMode === \"string\" &&\n (metaRec.lineMode === \"custom\" || metaRec.lineMode === \"catalog\")\n ? (metaRec.lineMode as \"custom\" | \"catalog\")\n : metaRec?.customLine\n ? \"custom\"\n : undefined;\n nextForm.productId = initialLine.productId;\n nextForm.variantId = initialLine.productVariantId;\n nextForm.quantity = initialLine.quantity.toString();\n nextForm.quantityUnit = normalizeUnitCode(initialLine.quantityUnit) ?? null;\n const metaMode = metaRec?.priceMode;\n const resolvedPriceMode =\n metaMode === \"net\" || metaMode === \"gross\"\n ? metaMode\n : (initialLine.priceMode ?? \"gross\");\n nextForm.unitPrice =\n resolvedPriceMode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n nextForm.priceMode = resolvedPriceMode;\n nextForm.taxRate = Number.isFinite(initialLine.taxRate)\n ? initialLine.taxRate\n : null;\n nextForm.name = initialLine.name ?? \"\";\n nextForm.catalogSnapshot = snapshot ?? null;\n nextForm.customFieldSetId = initialLine.customFieldSetId ?? null;\n nextForm.statusEntryId = initialLine.statusEntryId ?? null;\n nextForm.lineMode =\n metaLineMode ??\n (initialLine.productId || initialLine.productVariantId\n ? \"catalog\"\n : \"custom\");\n const metaTaxRateId =\n typeof metaRec?.taxRateId === \"string\"\n ? metaRec.taxRateId\n : null;\n const fallbackTaxRateId = findTaxRateIdByValue(nextForm.taxRate);\n nextForm.taxRateId =\n metaTaxRateId ??\n fallbackTaxRateId ??\n (defaultTaxRateRef.current ? defaultTaxRateRef.current.id : null);\n if (!Number.isFinite(nextForm.taxRate) && nextForm.taxRateId) {\n const matched = taxRatesRef.current.find(\n (rate) => rate.id === nextForm.taxRateId,\n );\n const numericRate = normalizeNumber(matched?.rate);\n if (Number.isFinite(numericRate)) {\n nextForm.taxRate = numericRate;\n }\n }\n let resolvedProductOption: ProductOption | null = null;\n let resolvedVariantOption: VariantOption | null = null;\n if (metaRec) {\n const metaRecord = metaRec;\n const mode = metaRecord.priceMode;\n if (mode === \"net\" || mode === \"gross\") {\n nextForm.priceMode = mode;\n nextForm.unitPrice =\n mode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n }\n nextForm.priceId =\n typeof metaRecord.priceId === \"string\"\n ? metaRecord.priceId\n : null;\n const productTitle =\n typeof metaRecord.productTitle === \"string\"\n ? metaRecord.productTitle\n : initialLine.name;\n const productSku =\n typeof metaRecord.productSku === \"string\"\n ? metaRecord.productSku\n : null;\n const productThumbnail =\n typeof metaRecord.productThumbnail === \"string\"\n ? metaRecord.productThumbnail\n : null;\n if (productTitle && initialLine.productId) {\n const snapshotUom = snapshotProduct\n ? getUomProductFields(snapshotProduct)\n : { defaultUnit: null, defaultSalesUnit: null, defaultSalesUnitQuantity: Number.NaN };\n const option: ProductOption = {\n id: initialLine.productId,\n title: productTitle,\n sku: productSku,\n thumbnailUrl: productThumbnail,\n defaultUnit: snapshotUom.defaultUnit,\n defaultSalesUnit: snapshotUom.defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(snapshotUom.defaultSalesUnitQuantity)\n ? snapshotUom.defaultSalesUnitQuantity\n : null,\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n const variantTitle =\n typeof metaRecord.variantTitle === \"string\"\n ? metaRecord.variantTitle\n : null;\n const variantSku =\n typeof metaRecord.variantSku === \"string\"\n ? metaRecord.variantSku\n : null;\n const variantThumb =\n typeof metaRecord.variantThumbnail === \"string\"\n ? metaRecord.variantThumbnail\n : productThumbnail;\n if (variantTitle && initialLine.productVariantId) {\n const option = {\n id: initialLine.productVariantId,\n title: variantTitle,\n sku: variantSku,\n thumbnailUrl: variantThumb ?? null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n }\n if (!resolvedProductOption && initialLine.productId && snapshotProduct) {\n const sp = snapshotProduct as SnapshotEntity;\n const snapshotTitle =\n typeof sp.title === \"string\" && sp.title.trim().length\n ? sp.title\n : (initialLine.name ?? initialLine.productId);\n const snapshotSku =\n typeof sp.sku === \"string\" && sp.sku.trim().length\n ? sp.sku\n : null;\n const snapshotThumb =\n typeof sp.thumbnailUrl === \"string\"\n ? sp.thumbnailUrl\n : typeof sp.thumbnail_url === \"string\"\n ? sp.thumbnail_url\n : null;\n const snapshotTaxRate = normalizeNumber(sp.taxRate, Number.NaN);\n const option: ProductOption = {\n id: initialLine.productId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sp.taxRateId === \"string\" ? sp.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n defaultUnit: normalizeUnitCode(sp.defaultUnit ?? sp.default_unit),\n defaultSalesUnit: normalizeUnitCode(sp.defaultSalesUnit ?? sp.default_sales_unit),\n defaultSalesUnitQuantity: (() => {\n const raw = normalizeNumber(sp.defaultSalesUnitQuantity ?? sp.default_sales_unit_quantity, Number.NaN);\n return Number.isFinite(raw) ? raw : null;\n })(),\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n if (\n !resolvedVariantOption &&\n initialLine.productVariantId &&\n snapshotVariant\n ) {\n const sv = snapshotVariant as SnapshotEntity;\n const snapshotTitle =\n typeof sv.title === \"string\" && sv.title.trim().length\n ? sv.title\n : (initialLine.name ?? initialLine.productVariantId);\n const snapshotSku =\n typeof sv.sku === \"string\" && sv.sku.trim().length\n ? sv.sku\n : null;\n const snapshotThumb =\n typeof sv.thumbnailUrl === \"string\"\n ? sv.thumbnailUrl\n : typeof sv.thumbnail_url === \"string\"\n ? sv.thumbnail_url\n : (resolvedProductOption?.thumbnailUrl ??\n productOptionsRef.current.get(initialLine.productId ?? \"\")\n ?.thumbnailUrl ??\n null);\n const snapshotTaxRate = normalizeNumber(sv.taxRate, Number.NaN);\n const option: VariantOption = {\n id: initialLine.productVariantId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sv.taxRateId === \"string\" ? sv.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n if (resolvedProductOption) {\n setProductOption(resolvedProductOption);\n } else {\n setProductOption(null);\n }\n if (resolvedVariantOption) {\n setVariantOption(resolvedVariantOption);\n } else {\n setVariantOption(null);\n }\n const customValues = extractCustomFieldValues(\n initialLine as Record<string, unknown>,\n );\n const merged = { ...nextForm, ...customValues };\n const markDeletedCatalogReference = () => {\n if (cancelled) return;\n const nextMerged = { ...merged, lineMode: \"custom\" as const };\n setDeletedCatalogReference(true);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setInitialValues(nextMerged);\n setLineMode(\"custom\");\n setFormResetKey((prev) => prev + 1);\n };\n setInitialValues(merged);\n setLineMode(merged.lineMode);\n setFormResetKey((prev) => prev + 1);\n if (initialLine.productId) {\n void (async () => {\n try {\n const currentProduct = await loadProductOptionById(\n initialLine.productId as string,\n );\n if (cancelled) return;\n if (!currentProduct) {\n markDeletedCatalogReference();\n return;\n }\n if (merged.lineMode !== \"custom\") {\n setProductOption(currentProduct);\n }\n if (initialLine.productVariantId) {\n await loadVariantOptions(\n initialLine.productId as string,\n currentProduct.thumbnailUrl,\n );\n if (cancelled) return;\n const currentVariant =\n variantOptionsRef.current.get(initialLine.productVariantId) ??\n null;\n if (!currentVariant) {\n markDeletedCatalogReference();\n return;\n }\n if (merged.lineMode !== \"custom\") {\n setVariantOption(currentVariant);\n }\n }\n setDeletedCatalogReference(false);\n } catch (err) {\n logger.error('sales.document.items.verifyCatalogReference', { err });\n }\n })();\n void loadProductUnits(initialLine.productId, resolvedProductOption).then(\n (options) => {\n if (cancelled) return;\n const requestedUnit = normalizeUnitCode(nextForm.quantityUnit);\n if (\n requestedUnit &&\n !options.some((entry) => entry.code === requestedUnit)\n ) {\n setUnitOptions((prev) => [\n ...prev,\n { code: requestedUnit, toBaseFactor: null, isBase: false },\n ]);\n }\n },\n );\n void loadPrices(\n initialLine.productId,\n initialLine.productVariantId,\n nextForm.quantity,\n nextForm.quantityUnit,\n );\n } else {\n setPriceOptions([]);\n setUnitOptions([]);\n }\n return () => {\n cancelled = true;\n };\n }, [\n currencyCode,\n findTaxRateIdByValue,\n initialLine,\n loadProductOptionById,\n loadPrices,\n loadProductUnits,\n loadVariantOptions,\n open,\n resetForm,\n ]);\n\n const handleSubmitForm = React.useCallback(\n () => dialogContentRef.current?.querySelector(\"form\")?.requestSubmit(),\n [],\n )\n const handleKeyDown = useDialogKeyHandler({\n onConfirm: handleSubmitForm,\n onCancel: closeDialog,\n })\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => (next ? onOpenChange(true) : closeDialog())}\n >\n <DialogContent\n className=\"sm:max-w-5xl\"\n ref={dialogContentRef}\n onKeyDown={handleKeyDown}\n >\n <DialogHeader>\n <DialogTitle>\n {editingId\n ? t(\"sales.documents.items.editTitle\", \"Edit line\")\n : t(\"sales.documents.items.addTitle\", \"Add line\")}\n </DialogTitle>\n </DialogHeader>\n {isShippedOrderLine ? (\n <Alert status=\"information\" style=\"lighter\">\n <AlertDescription>\n {shipmentStateUnknown\n ? t(\n \"sales.documents.items.shippedLineLockPending\",\n \"Pricing is locked until this order's shipments have been read. Reopen the order to try again \u2014 you can still edit the name and raise the quantity.\",\n )\n : t(\n \"sales.documents.items.shippedLineLocked\",\n \"Pricing is locked on this line because it already has shipped items. You can still edit the name and quantity.\",\n )}\n </AlertDescription>\n </Alert>\n ) : null}\n <CrudForm<LineFormState>\n key={formResetKey}\n embedded\n fields={fields}\n groups={groups}\n entityId={customFieldEntityId}\n initialValues={initialValues}\n submitLabel={\n editingId\n ? t(\"sales.documents.items.save\", \"Save changes\")\n : t(\"sales.documents.items.addLine\", \"Add item\")\n }\n onSubmit={handleFormSubmit}\n loadingMessage={t(\"sales.documents.items.loading\", \"Loading items\u2026\")}\n />\n </DialogContent>\n </Dialog>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["lineMode", "value"]
|
|
7
7
|
}
|