@open-mercato/core 0.4.5-develop-f4858e0ef3 → 0.4.5-develop-4849712ccb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/entities/catalog_product/index.js +16 -0
- package/dist/generated/entities/catalog_product/index.js.map +2 -2
- package/dist/generated/entities/catalog_product_unit_conversion/index.js +27 -0
- package/dist/generated/entities/catalog_product_unit_conversion/index.js.map +7 -0
- package/dist/generated/entities/sales_credit_memo_line/index.js +7 -1
- package/dist/generated/entities/sales_credit_memo_line/index.js.map +2 -2
- package/dist/generated/entities/sales_invoice_line/index.js +7 -1
- package/dist/generated/entities/sales_invoice_line/index.js.map +2 -2
- package/dist/generated/entities/sales_order_line/index.js +6 -0
- package/dist/generated/entities/sales_order_line/index.js.map +2 -2
- package/dist/generated/entities/sales_quote_line/index.js +6 -0
- package/dist/generated/entities/sales_quote_line/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +1 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/catalog/api/prices/route.js +123 -8
- package/dist/modules/catalog/api/prices/route.js.map +2 -2
- package/dist/modules/catalog/api/product-unit-conversions/route.js +194 -0
- package/dist/modules/catalog/api/product-unit-conversions/route.js.map +7 -0
- package/dist/modules/catalog/api/products/route.js +351 -201
- package/dist/modules/catalog/api/products/route.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +1267 -497
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +733 -210
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/commands/index.js +1 -0
- package/dist/modules/catalog/commands/index.js.map +2 -2
- package/dist/modules/catalog/commands/productUnitConversions.js +503 -0
- package/dist/modules/catalog/commands/productUnitConversions.js.map +7 -0
- package/dist/modules/catalog/commands/products.js +355 -73
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/shared.js +18 -4
- package/dist/modules/catalog/commands/shared.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductUomSection.js +591 -0
- package/dist/modules/catalog/components/products/ProductUomSection.js.map +7 -0
- package/dist/modules/catalog/components/products/productForm.js +66 -5
- package/dist/modules/catalog/components/products/productForm.js.map +2 -2
- package/dist/modules/catalog/components/products/productFormUtils.js +68 -0
- package/dist/modules/catalog/components/products/productFormUtils.js.map +7 -0
- package/dist/modules/catalog/data/entities.js +86 -0
- package/dist/modules/catalog/data/entities.js.map +2 -2
- package/dist/modules/catalog/data/validators.js +65 -3
- package/dist/modules/catalog/data/validators.js.map +2 -2
- package/dist/modules/catalog/events.js +3 -0
- package/dist/modules/catalog/events.js.map +2 -2
- package/dist/modules/catalog/lib/unitCodes.js +7 -0
- package/dist/modules/catalog/lib/unitCodes.js.map +7 -0
- package/dist/modules/catalog/lib/unitResolution.js +53 -0
- package/dist/modules/catalog/lib/unitResolution.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20260218225422.js +19 -0
- package/dist/modules/catalog/migrations/Migration20260218225422.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20260219084500.js +27 -0
- package/dist/modules/catalog/migrations/Migration20260219084500.js.map +7 -0
- package/dist/modules/catalog/search.js +69 -1
- package/dist/modules/catalog/search.js.map +2 -2
- package/dist/modules/catalog/seed/examples.js +91 -42
- package/dist/modules/catalog/seed/examples.js.map +2 -2
- package/dist/modules/dashboards/seed/analytics.js +3 -0
- package/dist/modules/dashboards/seed/analytics.js.map +2 -2
- package/dist/modules/sales/api/order-lines/route.js +98 -15
- package/dist/modules/sales/api/order-lines/route.js.map +2 -2
- package/dist/modules/sales/api/quote-lines/route.js +101 -14
- package/dist/modules/sales/api/quote-lines/route.js.map +2 -2
- package/dist/modules/sales/api/quotes/public/[token]/route.js +87 -12
- package/dist/modules/sales/api/quotes/public/[token]/route.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +1424 -260
- package/dist/modules/sales/commands/documents.js.map +3 -3
- package/dist/modules/sales/commands/shared.js +6 -2
- package/dist/modules/sales/commands/shared.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +216 -86
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +913 -241
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +3 -3
- package/dist/modules/sales/components/documents/ShipmentsSection.js +15 -3
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/data/entities.js +59 -3
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/data/validators.js +35 -0
- package/dist/modules/sales/data/validators.js.map +2 -2
- package/dist/modules/sales/frontend/quote/[token]/page.js +15 -1
- package/dist/modules/sales/frontend/quote/[token]/page.js.map +2 -2
- package/dist/modules/sales/migrations/Migration20260218225423.js +31 -0
- package/dist/modules/sales/migrations/Migration20260218225423.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260219084501.js +71 -0
- package/dist/modules/sales/migrations/Migration20260219084501.js.map +7 -0
- package/dist/modules/sales/search.js +28 -0
- package/dist/modules/sales/search.js.map +2 -2
- package/dist/modules/sales/seed/examples.js +14 -1
- package/dist/modules/sales/seed/examples.js.map +2 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +1 -1
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/generated/entities/catalog_product/index.ts +8 -0
- package/generated/entities/catalog_product_unit_conversion/index.ts +12 -0
- package/generated/entities/sales_credit_memo_line/index.ts +3 -0
- package/generated/entities/sales_invoice_line/index.ts +3 -0
- package/generated/entities/sales_order_line/index.ts +3 -0
- package/generated/entities/sales_quote_line/index.ts +3 -0
- package/generated/entities.ids.generated.ts +1 -0
- package/generated/entity-fields-registry.ts +2 -0
- package/package.json +2 -2
- package/src/modules/auth/i18n/de.json +1 -1
- package/src/modules/auth/i18n/en.json +1 -1
- package/src/modules/auth/i18n/es.json +1 -1
- package/src/modules/auth/i18n/pl.json +1 -1
- package/src/modules/catalog/api/prices/route.ts +213 -81
- package/src/modules/catalog/api/product-unit-conversions/route.ts +195 -0
- package/src/modules/catalog/api/products/route.ts +638 -402
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +2085 -1072
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +1288 -593
- package/src/modules/catalog/commands/index.ts +1 -0
- package/src/modules/catalog/commands/productUnitConversions.ts +626 -0
- package/src/modules/catalog/commands/products.ts +1151 -693
- package/src/modules/catalog/commands/shared.ts +19 -5
- package/src/modules/catalog/components/products/ProductUomSection.tsx +745 -0
- package/src/modules/catalog/components/products/productForm.ts +369 -256
- package/src/modules/catalog/components/products/productFormUtils.ts +82 -0
- package/src/modules/catalog/data/entities.ts +82 -1
- package/src/modules/catalog/data/validators.ts +118 -34
- package/src/modules/catalog/events.ts +3 -0
- package/src/modules/catalog/i18n/de.json +56 -0
- package/src/modules/catalog/i18n/en.json +56 -0
- package/src/modules/catalog/i18n/es.json +56 -0
- package/src/modules/catalog/i18n/pl.json +56 -0
- package/src/modules/catalog/lib/unitCodes.ts +1 -0
- package/src/modules/catalog/lib/unitResolution.ts +62 -0
- package/src/modules/catalog/migrations/.snapshot-open-mercato.json +245 -0
- package/src/modules/catalog/migrations/Migration20260218225422.ts +21 -0
- package/src/modules/catalog/migrations/Migration20260219084500.ts +26 -0
- package/src/modules/catalog/search.ts +73 -1
- package/src/modules/catalog/seed/examples.ts +552 -479
- package/src/modules/dashboards/i18n/de.json +1 -1
- package/src/modules/dashboards/i18n/en.json +1 -1
- package/src/modules/dashboards/i18n/es.json +1 -1
- package/src/modules/dashboards/i18n/pl.json +1 -1
- package/src/modules/dashboards/seed/analytics.ts +3 -0
- package/src/modules/sales/api/order-lines/route.ts +158 -68
- package/src/modules/sales/api/quote-lines/route.ts +161 -67
- package/src/modules/sales/api/quotes/public/[token]/route.ts +122 -36
- package/src/modules/sales/commands/documents.ts +4250 -2424
- package/src/modules/sales/commands/shared.ts +7 -2
- package/src/modules/sales/components/documents/ItemsSection.tsx +580 -310
- package/src/modules/sales/components/documents/LineItemDialog.tsx +1988 -833
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +17 -3
- package/src/modules/sales/components/documents/lineItemTypes.ts +6 -0
- package/src/modules/sales/data/entities.ts +53 -0
- package/src/modules/sales/data/validators.ts +36 -0
- package/src/modules/sales/frontend/quote/[token]/page.tsx +25 -1
- package/src/modules/sales/i18n/de.json +23 -3
- package/src/modules/sales/i18n/en.json +23 -3
- package/src/modules/sales/i18n/es.json +23 -3
- package/src/modules/sales/i18n/pl.json +23 -3
- package/src/modules/sales/lib/types.ts +30 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +172 -0
- package/src/modules/sales/migrations/Migration20260218225423.ts +37 -0
- package/src/modules/sales/migrations/Migration20260219084501.ts +73 -0
- package/src/modules/sales/search.ts +28 -0
- package/src/modules/sales/seed/examples.ts +20 -1
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +1 -1
- package/src/modules/workflows/i18n/de.json +4 -4
- package/src/modules/workflows/i18n/en.json +4 -4
- package/src/modules/workflows/i18n/es.json +4 -4
- package/src/modules/workflows/i18n/pl.json +4 -4
|
@@ -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 { LookupSelect, type LookupSelectItem } 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 } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\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 { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\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}\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\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\ntype LineFormState = {\n lineMode: 'catalog' | 'custom'\n productId: string | null\n variantId: string | null\n quantity: string\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 SalesLineDialogProps = {\n open: boolean\n kind: 'order' | 'quote'\n documentId: string\n currencyCode: string | null | undefined\n organizationId: string | null\n tenantId: string | null\n initialLine?: SalesLineRecord | null\n onOpenChange: (open: boolean) => void\n onSaved?: () => Promise<void> | void\n}\n\nconst defaultForm = (currencyCode?: string | null): LineFormState => ({\n lineMode: 'catalog',\n productId: null,\n variantId: null,\n quantity: '1',\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\nfunction buildPriceScopeReason(item: Record<string, unknown>, t: (k: string, f: string) => string): {\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) add(t('sales.documents.items.priceScope.channel', 'Channel'))\n if (item.offer_id || item.offerId) add(t('sales.documents.items.priceScope.offer', 'Offer'))\n if (item.variant_id || item.variantId) add(t('sales.documents.items.priceScope.variant', 'Variant'))\n if (item.customer_group_id || item.customerGroupId) add(t('sales.documents.items.priceScope.customerGroup', 'Customer group'))\n if (item.customer_id || item.customerId) add(t('sales.documents.items.priceScope.customer', 'Customer'))\n if (item.user_group_id || item.userGroupId) add(t('sales.documents.items.priceScope.userGroup', 'User group'))\n if (item.user_id || item.userId) add(t('sales.documents.items.priceScope.user', 'User'))\n const minQty = normalizeNumber((item as any).min_quantity, Number.NaN)\n const maxQty = normalizeNumber((item as any).max_quantity, Number.NaN)\n if (Number.isFinite(minQty) || Number.isFinite(maxQty)) {\n add(\n t(\n 'sales.documents.items.priceScope.quantity',\n 'Quantity',\n ),\n )\n }\n if ((item as any).starts_at || (item as any).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-[10px] uppercase text-muted-foreground\">\n {(label ?? '').slice(0, 2) || '\u2022'}\n </div>\n )\n}\n\nexport function LineItemDialog({\n open,\n kind,\n documentId,\n currencyCode,\n organizationId,\n tenantId,\n initialLine,\n onOpenChange,\n onSaved,\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>(() => defaultForm(currencyCode))\n const [lineMode, setLineMode] = React.useState<'catalog' | 'custom'>(defaultForm(currencyCode).lineMode)\n const [productOption, setProductOption] = React.useState<ProductOption | null>(null)\n const [variantOption, setVariantOption] = 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 [, 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 = 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) => Number.isFinite(rate.rate) && 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 (source?: { taxRateId?: string | null; taxRate?: number | null } | null) => {\n const taxRateId =\n typeof source?.taxRateId === 'string' && source.taxRateId.trim().length ? source.taxRateId.trim() : null\n const rateFromId = taxRateId ? normalizeNumber(taxRateMap.get(taxRateId)?.rate, Number.NaN) : Number.NaN\n const numericRate = normalizeNumber(source?.taxRate, Number.NaN)\n const resolvedRateId =\n taxRateId ??\n (Number.isFinite(numericRate) ? findTaxRateIdByValue(numericRate) : 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 (source?: { taxRateId?: string | null; taxRate?: number | null } | null) => {\n if (!source) return false\n const id = 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 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<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/tax-rates?pageSize=200',\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const parsed = items\n .map<TaxRateOption | null>((item) => {\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 any).rate)\n const code =\n typeof (item as any).code === 'string' && (item as any).code.trim().length\n ? (item as any).code.trim()\n : null\n const isDefault = Boolean((item as any).isDefault ?? (item as any).is_default)\n return { id, name, code, rate: Number.isFinite(rate) ? rate : null, isDefault }\n })\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 console.error('sales.tax-rates.fetch', err)\n taxRatesRef.current = []\n defaultTaxRateRef.current = null\n setTaxRates([])\n return []\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) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/catalog/products?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result?.items ?? [] : []\n const needle = query?.trim().toLowerCase() ?? ''\n return items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const title =\n typeof item.title === 'string'\n ? item.title\n : typeof (item as any).name === 'string'\n ? (item as any).name\n : id\n const sku = typeof (item as any).sku === 'string' ? (item as any).sku : null\n const thumbnail =\n typeof (item as any).default_media_url === 'string'\n ? (item as any).default_media_url\n : typeof (item as any).defaultMediaUrl === 'string'\n ? (item as any).defaultMediaUrl\n : null\n const pricing = typeof (item as any).pricing === 'object' && (item as any).pricing ? (item as any).pricing : null\n const metadata = typeof (item as any).metadata === 'object' && (item as any).metadata ? (item as any).metadata : null\n const pricingTaxRateId =\n typeof (pricing as any)?.tax_rate_id === 'string' && (pricing as any).tax_rate_id.trim().length\n ? (pricing as any).tax_rate_id.trim()\n : typeof (pricing as any)?.taxRateId === 'string' && (pricing as any).taxRateId.trim().length\n ? (pricing as any).taxRateId.trim()\n : null\n const metaTaxRateId =\n typeof (metadata as any)?.taxRateId === 'string' && (metadata as any).taxRateId.trim().length\n ? (metadata as any).taxRateId.trim()\n : typeof (metadata as any)?.tax_rate_id === 'string' && (metadata as any).tax_rate_id.trim().length\n ? (metadata as any).tax_rate_id.trim()\n : null\n const taxRateValue = normalizeNumber(\n (pricing as any)?.tax_rate ?? (pricing as any)?.taxRate ?? (item as any).tax_rate ?? (item as any).taxRate,\n Number.NaN\n )\n const matches =\n !needle ||\n title.toLowerCase().includes(needle) ||\n (sku ? sku.toLowerCase().includes(needle) : false)\n if (!matches) return null\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail\n ? <img src={thumbnail} alt={title} className=\"h-8 w-8 rounded object-cover\" />\n : buildPlaceholder(title),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: pricingTaxRateId ?? metaTaxRateId ?? null,\n taxRate: Number.isFinite(taxRateValue) ? taxRateValue : null,\n } satisfies ProductOption,\n } as LookupSelectItem & { option: ProductOption }\n })\n .filter((entry): entry is LookupSelectItem & { option: ProductOption } => Boolean(entry))\n .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 (productId: string, fallbackThumbnail?: string | null): Promise<LookupSelectItem[]> => {\n if (!productId) return []\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/catalog/variants?productId=${encodeURIComponent(productId)}&pageSize=50`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\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 sku = typeof (item as any).sku === 'string' ? (item as any).sku : null\n const metadata = typeof (item as any).metadata === 'object' && (item as any).metadata ? (item as any).metadata : null\n const variantTaxRateId =\n typeof (metadata as any)?.taxRateId === 'string' && (metadata as any).taxRateId.trim().length\n ? (metadata as any).taxRateId.trim()\n : typeof (metadata as any)?.tax_rate_id === 'string' && (metadata as any).tax_rate_id.trim().length\n ? (metadata as any).tax_rate_id.trim()\n : null\n const variantTaxRate = normalizeNumber(\n (item as any).tax_rate ?? (item as any).taxRate ?? (metadata as any)?.tax_rate ?? (metadata as any)?.taxRate,\n Number.NaN\n )\n const thumbnail =\n typeof (item as any).default_media_url === 'string'\n ? (item as any).default_media_url\n : typeof (item as any).thumbnailUrl === 'string'\n ? (item as any).thumbnailUrl\n : fallbackThumbnail ?? null\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail\n ? <img src={thumbnail} alt={title} className=\"h-8 w-8 rounded object-cover\" />\n : buildPlaceholder(title),\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((entry): entry is LookupSelectItem & { option: VariantOption } => Boolean(entry))\n .map((entry) => {\n variantOptionsRef.current.set(entry.option.id, entry.option)\n return entry\n })\n },\n [],\n )\n\n const loadPrices = React.useCallback(\n async (productId: string | null, variantId: string | null) => {\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 response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/catalog/prices?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\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 amountNet = normalizeNumber((item as any).unit_price_net, null as any)\n const amountGross = normalizeNumber((item as any).unit_price_gross, null as any)\n const currency =\n typeof (item as any).currency_code === 'string'\n ? (item as any).currency_code\n : typeof (item as any).currencyCode === 'string'\n ? (item as any).currencyCode\n : null\n const displayMode =\n (item as any).display_mode === 'including-tax' || (item as any).display_mode === 'excluding-tax'\n ? (item as any).display_mode\n : (item as any).displayMode === 'including-tax' || (item as any).displayMode === 'excluding-tax'\n ? (item as any).displayMode\n : null\n const taxRate = normalizeNumber((item as any).tax_rate, null as any)\n const priceKindId =\n typeof (item as any).price_kind_id === 'string'\n ? (item as any).price_kind_id\n : typeof (item as any).priceKindId === 'string'\n ? (item as any).priceKindId\n : null\n const priceKindTitle =\n typeof (item as any).price_kind_title === 'string'\n ? (item as any).price_kind_title\n : typeof (item as any).priceKindTitle === 'string'\n ? (item as any).priceKindTitle\n : typeof (item as any).price_kind === 'object' &&\n item &&\n typeof (item as any).price_kind?.title === 'string'\n ? (item as any).price_kind.title\n : typeof (item as any).price_kind === 'object' &&\n item &&\n typeof (item as any).price_kind?.name === 'string'\n ? (item as any).price_kind.name\n : null\n const priceKindCode =\n typeof (item as any).price_kind_code === 'string'\n ? (item as any).price_kind_code\n : typeof (item as any).priceKindCode === 'string'\n ? (item as any).priceKindCode\n : typeof (item as any).price_kind === 'object' &&\n item &&\n typeof (item as any).price_kind?.code === 'string'\n ? (item as any).price_kind.code\n : null\n const resolvedPriceKindTitle =\n priceKindTitle ??\n priceKindCode ??\n (typeof (item as any).kind === 'string' ? (item as any).kind : null)\n const labelParts = [\n displayMode === 'including-tax' && amountGross !== null && 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(item, (key, fallback) => t(key, fallback))\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 console.error('sales.document.items.loadPrices', err)\n return []\n } finally {\n setPriceLoading(false)\n }\n },\n [t],\n )\n\n const loadLineStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setLineStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-line-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\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 ? entry.color : null\n const icon =\n typeof entry.icon === 'string' && entry.icon.trim().length ? entry.icon : 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 console.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<Record<string, { value: string; label: string; color?: string | null; icon?: string | null }>>(\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 {},\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: renderDictionaryIcon(option.icon, 'h-4 w-4') ?? 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 console.groupCollapsed('sales.line.submit.start')\n console.log('raw values', values)\n // Resolve required scope and ids\n const resolvedDocumentId = typeof documentId === 'string' && documentId.trim().length ? documentId : null\n const resolvedOrg = resolvedOrganizationId\n const resolvedTenant = resolvedTenantId\n\n if (!resolvedOrg || !resolvedTenant || !resolvedDocumentId) {\n throw createCrudFormError(\n t('sales.documents.items.errorScope', 'Organization and tenant are required.'),\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('sales.documents.items.errorProductRequired', 'Select a product to continue.'),\n { productId: t('sales.documents.items.errorProductRequired', 'Select a product to continue.') },\n )\n }\n if (!isCustomLine && !values.variantId) {\n throw createCrudFormError(\n t('sales.documents.items.errorVariantRequired', 'Select a variant to continue.'),\n { variantId: t('sales.documents.items.errorVariantRequired', 'Select a variant to continue.') },\n )\n }\n\n const qtyNumber = Number(values.quantity ?? values.quantity ?? 0)\n console.log('quantity raw -> parsed', { raw: values.quantity, parsed: qtyNumber })\n if (!Number.isFinite(qtyNumber) || qtyNumber <= 0) {\n throw createCrudFormError(\n t('sales.documents.items.errorQuantity', 'Quantity must be greater than 0.'),\n { quantity: t('sales.documents.items.errorQuantity', 'Quantity must be greater than 0.') },\n )\n }\n\n const unitPriceNumber = Number(values.unitPrice ?? values.unitPrice ?? 0)\n console.log('unit price raw -> parsed', { raw: values.unitPrice, parsed: unitPriceNumber })\n if (!Number.isFinite(unitPriceNumber) || unitPriceNumber <= 0) {\n throw createCrudFormError(\n t('sales.documents.items.errorUnitPrice', 'Unit price must be greater than 0.'),\n { unitPrice: t('sales.documents.items.errorUnitPrice', 'Unit price must be greater than 0.') },\n )\n }\n\n const selectedPrice = !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 { priceId: t('sales.documents.items.errorCurrency', 'Currency is required.') },\n )\n }\n\n const resolvedNameRaw = (values.name ?? '').toString().trim()\n const resolvedName = isCustomLine\n ? resolvedNameRaw\n : resolvedNameRaw || variantOption?.title || productOption?.title || undefined\n if (isCustomLine && !resolvedName) {\n throw createCrudFormError(\n t('sales.documents.items.errorNameRequired', 'Name is required for custom lines.'),\n { name: t('sales.documents.items.errorNameRequired', 'Name is required for custom lines.') },\n )\n }\n const resolvedPriceMode = values.priceMode === 'net' ? 'net' : 'gross'\n const catalogSnapshot =\n !isCustomLine && typeof values.catalogSnapshot === 'object' && values.catalogSnapshot ? values.catalogSnapshot : 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) ? resolvedTaxRate : 0\n const unitPriceNetValue =\n resolvedPriceMode === 'net' ? unitPriceNumber : unitPriceNumber / (1 + normalizedTaxRate / 100)\n const unitPriceGrossValue =\n resolvedPriceMode === 'gross' ? unitPriceNumber : unitPriceNumber * (1 + normalizedTaxRate / 100)\n const safeUnitPriceNet = Number.isFinite(unitPriceNetValue) ? unitPriceNetValue : unitPriceNumber\n const safeUnitPriceGross = Number.isFinite(unitPriceGrossValue) ? unitPriceGrossValue : 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: variantOption.thumbnailUrl ?? productOption?.thumbnailUrl ?? null,\n }\n : {}),\n ...(isCustomLine ? { customLine: true } : {}),\n lineMode,\n }\n\n const payload: Record<string, unknown> = {\n [documentKey]: String(resolvedDocumentId),\n organizationId: String(resolvedOrg),\n tenantId: String(resolvedTenant),\n productId: isCustomLine ? undefined : values.productId ? String(values.productId) : undefined,\n productVariantId: isCustomLine ? undefined : values.variantId ? String(values.variantId) : undefined,\n quantity: qtyNumber,\n currencyCode: String(resolvedCurrency),\n priceId: !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' && 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 console.debug('resolved scope', { resolvedDocumentId, resolvedOrg, resolvedTenant, resolvedCurrency })\n console.debug('parsed numbers', { qtyNumber, unitPriceNumber })\n console.log('sales.line.submit.payload', payload)\n console.log('sales.line.submit.payload.json', JSON.stringify(payload))\n console.groupEnd()\n\n try {\n const action = editingId ? updateCrud : createCrud\n const result = await action(\n resourcePath,\n editingId ? { id: editingId, ...payload } : payload,\n {\n errorMessage: t('sales.documents.items.errorSave', 'Failed to save line.'),\n },\n )\n if (result.ok) {\n if (onSaved) await onSaved()\n closeDialog()\n }\n } catch (err) {\n console.error('sales.line.submit.error', err)\n throw err\n }\n },\n [\n currencyCode,\n documentId,\n documentKey,\n editingId,\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 setFormValue?.('productId', null)\n setFormValue?.('variantId', null)\n setFormValue?.('priceId', null)\n setFormValue?.('catalogSnapshot', null)\n } else {\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 ...(!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: ({ value, setValue, setFormValue, values }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => {\n const selectedOption = next ? productOptionsRef.current.get(next) ?? null : null\n setProductOption(selectedOption)\n setVariantOption(null)\n setPriceOptions([])\n setValue(next ?? null)\n setFormValue?.('variantId', null)\n setFormValue?.('priceId', null)\n setFormValue?.('unitPrice', '')\n setFormValue?.('priceMode', 'gross')\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 = 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: selectedOption?.thumbnailUrl ?? null,\n },\n }\n : null,\n )\n if (next) {\n void loadPrices(next, null)\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 src={productOption.thumbnailUrl} alt={productOption.title ?? productOption.id} className=\"h-8 w-8 rounded object-cover\" />\n : buildPlaceholder(productOption.title || productOption.id),\n },\n ]\n : undefined\n }\n minQuery={1}\n searchPlaceholder={t('sales.documents.items.productSearch', 'Search product')}\n selectLabel={t('ui.lookupSelect.select', 'Select')}\n selectedLabel={t('ui.lookupSelect.selected', 'Selected')}\n clearLabel={t('ui.lookupSelect.clearSelection', 'Clear selection')}\n emptyLabel={t('ui.lookupSelect.noResults', 'No results')}\n loadingLabel={t('ui.lookupSelect.searching', 'Searching\u2026')}\n startTypingLabel={t('ui.lookupSelect.startTyping', 'Start typing to search.')}\n selectedHintLabel={(id) =>\n t('sales.documents.items.selectedProduct', 'Selected {{id}}', {\n id: productOption?.title ?? id,\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: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const productId = typeof values?.productId === 'string' ? values.productId : null\n return (\n <LookupSelect\n key={productId ?? 'no-product'}\n value={typeof value === 'string' ? value : null}\n onChange={(next) => {\n const selectedOption = next ? variantOptionsRef.current.get(next) ?? null : null\n setVariantOption(selectedOption)\n setValue(next ?? null)\n const existingName = typeof values?.name === 'string' ? values.name : ''\n if (!existingName.trim()) {\n setFormValue?.('name', selectedOption?.title ?? productOption?.title ?? existingName)\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?.('taxRateId', taxSelection.taxRateId ?? null)\n }\n const prevSnapshot =\n typeof values?.catalogSnapshot === 'object' && 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) delete (snapshot as any).variant\n setFormValue?.('catalogSnapshot', Object.keys(snapshot).length ? snapshot : null)\n } else {\n setFormValue?.('catalogSnapshot', null)\n }\n if (productId) {\n void loadPrices(productId, next)\n }\n }}\n fetchItems={async (query) => {\n if (!productId) return []\n const productThumb = productId ? productOptionsRef.current.get(productId)?.thumbnailUrl : null\n const options = await loadVariantOptions(productId, productThumb)\n const needle = query?.trim().toLowerCase() ?? ''\n return needle.length\n ? options.filter((option) => option.title.toLowerCase().includes(needle))\n : options\n }}\n searchPlaceholder={t('sales.documents.items.variantSearch', 'Search variant')}\n selectLabel={t('ui.lookupSelect.select', 'Select')}\n selectedLabel={t('ui.lookupSelect.selected', 'Selected')}\n clearLabel={t('ui.lookupSelect.clearSelection', 'Clear selection')}\n emptyLabel={t('ui.lookupSelect.noResults', 'No results')}\n loadingLabel={t('ui.lookupSelect.searching', 'Searching\u2026')}\n startTypingLabel={t('ui.lookupSelect.startTyping', 'Start typing to search.')}\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(variantOption.title || variantOption.id)\n ),\n },\n ]\n : undefined\n }\n selectedHintLabel={(id) =>\n t('sales.documents.items.selectedVariant', 'Selected {{id}}', {\n id: variantOption?.title ?? id,\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: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const productId = typeof values?.productId === 'string' ? values.productId : null\n const variantId = typeof values?.variantId === 'string' ? values.variantId : null\n return (\n <LookupSelect\n key={productId ? `${productId}-${variantId ?? 'no-variant'}` : 'price'}\n value={typeof value === 'string' ? value : null}\n onChange={(next) => {\n setValue(next ?? null)\n const selected = next ? priceOptions.find((entry) => entry.id === next) ?? null : null\n if (selected) {\n const mode = selected.displayMode === 'excluding-tax' ? 'net' : 'gross'\n const amount =\n mode === 'net'\n ? selected.amountNet ?? selected.amountGross ?? 0\n : selected.amountGross ?? selected.amountNet ?? 0\n setFormValue?.('priceMode', mode)\n setFormValue?.('unitPrice', amount.toString())\n setFormValue?.('taxRate', selected.taxRate ?? null)\n const matchedRateId = findTaxRateIdByValue(selected.taxRate)\n setFormValue?.('taxRateId', matchedRateId)\n setFormValue?.(\n 'currencyCode',\n selected.currencyCode ?? values?.currencyCode ?? currencyCode ?? null,\n )\n } else {\n const fallbackTax = resolveTaxSelection(variantOption ?? productOption ?? null)\n setFormValue?.('taxRate', fallbackTax.taxRate ?? null)\n setFormValue?.('taxRateId', fallbackTax.taxRateId ?? null)\n }\n }}\n fetchItems={async (query) => {\n const prices = await loadPrices(productId, variantId)\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: price.priceKindTitle ?? price.priceKindCode ?? undefined,\n description: price.scopeReason ?? undefined,\n rightLabel: price.currencyCode ?? undefined,\n icon: <DollarSign className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n minQuery={0}\n loading={priceLoading}\n searchPlaceholder={t('sales.documents.items.priceSearch', 'Select price')}\n selectLabel={t('ui.lookupSelect.select', 'Select')}\n selectedLabel={t('ui.lookupSelect.selected', 'Selected')}\n clearLabel={t('ui.lookupSelect.clearSelection', 'Clear selection')}\n emptyLabel={t('ui.lookupSelect.noResults', 'No results')}\n loadingLabel={t('ui.lookupSelect.searching', 'Searching\u2026')}\n startTypingLabel={t('ui.lookupSelect.startTyping', 'Start typing to search.')}\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: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const mode = values?.priceMode === 'net' ? 'net' : 'gross'\n return (\n <div className=\"flex gap-2\">\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n />\n <select\n className=\"w-32 rounded border px-2 text-sm\"\n value={mode}\n onChange={(event) => {\n const nextMode = event.target.value === 'net' ? 'net' : 'gross'\n setFormValue?.('priceMode', nextMode)\n }}\n >\n <option value=\"gross\">{t('sales.documents.items.priceGross', 'Gross')}</option>\n <option value=\"net\">{t('sales.documents.items.priceNet', 'Net')}</option>\n </select>\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: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const resolvedValue =\n typeof value === 'string' && value.trim().length\n ? value\n : findTaxRateIdByValue((values as any)?.taxRate)\n const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\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 className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={resolvedValue ?? ''}\n onChange={handleChange}\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t('sales.documents.items.taxRate.none', 'No tax class selected')\n : t('sales.documents.items.taxRate.empty', 'No tax classes available')}\n </option>\n {taxRates.map((rate) => (\n <option 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 </option>\n ))}\n </select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== 'undefined') {\n window.open('/backend/config/sales?section=tax-rates', '_blank', 'noopener,noreferrer')\n }\n }}\n title={t('catalog.products.create.taxRates.manage', 'Manage tax classes')}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\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 }: FieldRenderProps) => (\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"1\"\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('sales.documents.items.statusPlaceholder', 'Select status')}\n emptyLabel={t('sales.documents.items.statusEmpty', 'No status')}\n fetchItems={fetchLineStatusItems}\n loadingLabel={t('sales.documents.items.statusLoading', 'Loading statuses\u2026')}\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('ui.lookupSelect.startTyping', 'Start typing to search.')}\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('sales.documents.items.namePlaceholder', 'Optional line name'),\n layout: 'full',\n required: isCustomLine,\n } satisfies CrudField,\n ]\n }, [\n currencyCode,\n findTaxRateIdByValue,\n loadPrices,\n loadProductOptions,\n loadVariantOptions,\n fetchLineStatusItems,\n priceLoading,\n priceOptions,\n productOption,\n lineMode,\n variantOption,\n t,\n taxRateMap,\n taxRates.length,\n resolveTaxSelection,\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 setEditingId(initialLine.id)\n const nextForm = defaultForm(initialLine.currencyCode ?? currencyCode)\n const meta = initialLine.metadata ?? {}\n const snapshot = (initialLine.catalogSnapshot as Record<string, unknown> | null | undefined) ?? null\n const snapshotProduct =\n snapshot && typeof snapshot === 'object' && typeof (snapshot as any).product === 'object' && (snapshot as any).product\n ? ((snapshot as any).product as Record<string, unknown>)\n : null\n const snapshotVariant =\n snapshot && typeof snapshot === 'object' && typeof (snapshot as any).variant === 'object' && (snapshot as any).variant\n ? ((snapshot as any).variant as Record<string, unknown>)\n : null\n const metaLineMode =\n typeof (meta as any)?.lineMode === 'string' && ((meta as any).lineMode === 'custom' || (meta as any).lineMode === 'catalog')\n ? ((meta as any).lineMode as 'custom' | 'catalog')\n : (meta as any)?.customLine\n ? 'custom'\n : undefined\n nextForm.productId = initialLine.productId\n nextForm.variantId = initialLine.productVariantId\n nextForm.quantity = initialLine.quantity.toString()\n const metaMode = (meta as any)?.priceMode\n const resolvedPriceMode =\n metaMode === 'net' || metaMode === 'gross' ? metaMode : initialLine.priceMode ?? 'gross'\n nextForm.unitPrice =\n resolvedPriceMode === 'net' ? initialLine.unitPriceNet.toString() : initialLine.unitPriceGross.toString()\n nextForm.priceMode = resolvedPriceMode\n nextForm.taxRate = Number.isFinite(initialLine.taxRate) ? initialLine.taxRate : 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 ? 'catalog' : 'custom')\n const metaTaxRateId =\n typeof (meta as any).taxRateId === 'string' ? ((meta as any).taxRateId as string) : 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((rate) => rate.id === nextForm.taxRateId)\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 (typeof meta === 'object' && meta) {\n const mode = (meta as any).priceMode\n if (mode === 'net' || mode === 'gross') {\n nextForm.priceMode = mode\n nextForm.unitPrice =\n mode === 'net' ? initialLine.unitPriceNet.toString() : initialLine.unitPriceGross.toString()\n }\n nextForm.priceId =\n typeof (meta as any).priceId === 'string' ? ((meta as any).priceId as string) : null\n const productTitle = typeof (meta as any).productTitle === 'string' ? (meta as any).productTitle : initialLine.name\n const productSku = typeof (meta as any).productSku === 'string' ? (meta as any).productSku : null\n const productThumbnail =\n typeof (meta as any).productThumbnail === 'string' ? (meta as any).productThumbnail : null\n if (productTitle && initialLine.productId) {\n const option = { id: initialLine.productId, title: productTitle, sku: productSku, thumbnailUrl: productThumbnail }\n productOptionsRef.current.set(initialLine.productId, option)\n resolvedProductOption = option\n }\n const variantTitle = typeof (meta as any).variantTitle === 'string' ? (meta as any).variantTitle : null\n const variantSku = typeof (meta as any).variantSku === 'string' ? (meta as any).variantSku : null\n const variantThumb =\n typeof (meta as any).variantThumbnail === 'string' ? (meta as any).variantThumbnail : 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 snapshotTitle =\n typeof (snapshotProduct as any).title === 'string' && (snapshotProduct as any).title.trim().length\n ? (snapshotProduct as any).title\n : initialLine.name ?? initialLine.productId\n const snapshotSku =\n typeof (snapshotProduct as any).sku === 'string' && (snapshotProduct as any).sku.trim().length\n ? (snapshotProduct as any).sku\n : null\n const snapshotThumb =\n typeof (snapshotProduct as any).thumbnailUrl === 'string'\n ? (snapshotProduct as any).thumbnailUrl\n : typeof (snapshotProduct as any).thumbnail_url === 'string'\n ? (snapshotProduct as any).thumbnail_url\n : null\n const snapshotTaxRate = normalizeNumber((snapshotProduct as any).taxRate, Number.NaN)\n const option = {\n id: initialLine.productId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof (snapshotProduct as any).taxRateId === 'string' ? (snapshotProduct as any).taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n }\n productOptionsRef.current.set(initialLine.productId, option)\n resolvedProductOption = option\n }\n if (!resolvedVariantOption && initialLine.productVariantId && snapshotVariant) {\n const snapshotTitle =\n typeof (snapshotVariant as any).title === 'string' && (snapshotVariant as any).title.trim().length\n ? (snapshotVariant as any).title\n : initialLine.name ?? initialLine.productVariantId\n const snapshotSku =\n typeof (snapshotVariant as any).sku === 'string' && (snapshotVariant as any).sku.trim().length\n ? (snapshotVariant as any).sku\n : null\n const snapshotThumb =\n typeof (snapshotVariant as any).thumbnailUrl === 'string'\n ? (snapshotVariant as any).thumbnailUrl\n : typeof (snapshotVariant as any).thumbnail_url === 'string'\n ? (snapshotVariant as any).thumbnail_url\n : resolvedProductOption?.thumbnailUrl ?? productOptionsRef.current.get(initialLine.productId ?? '')?.thumbnailUrl ?? null\n const snapshotTaxRate = normalizeNumber((snapshotVariant as any).taxRate, Number.NaN)\n const option = {\n id: initialLine.productVariantId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof (snapshotVariant as any).taxRateId === 'string' ? (snapshotVariant as any).taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n }\n variantOptionsRef.current.set(initialLine.productVariantId, option)\n resolvedVariantOption = option\n }\n if (resolvedProductOption) setProductOption(resolvedProductOption)\n if (resolvedVariantOption) setVariantOption(resolvedVariantOption)\n const customValues = extractCustomFieldValues(initialLine as Record<string, unknown>)\n const merged = { ...nextForm, ...customValues }\n setInitialValues(merged)\n setLineMode(merged.lineMode)\n setFormResetKey((prev) => prev + 1)\n if (initialLine.productId) {\n void loadPrices(initialLine.productId, initialLine.productVariantId)\n } else {\n setPriceOptions([])\n }\n }, [currencyCode, findTaxRateIdByValue, initialLine, loadPrices, open, resetForm])\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : closeDialog())}>\n <DialogContent\n className=\"sm:max-w-5xl\"\n ref={dialogContentRef}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n dialogContentRef.current?.querySelector('form')?.requestSubmit()\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n closeDialog()\n }\n }}\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": ";AAgKI,cAssBU,YAtsBV;AA9JJ,YAAY,WAAW;AACvB,SAAS,oBAA2C;AACpD;AAAA,EACE;AAAA,OAIK;AACP,SAAS,gCAAgC;AACzC,SAAS,eAAe;AACxB,SAAS,YAAY,kBAAkB;AACvC,SAAS,2BAA2B;AACpC,SAAS,QAAQ,eAAe,cAAc,mBAAmB;AACjE,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,YAAY,gBAAgB;AACrC,SAAS,kCAAkC;AAC3C;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAClB,SAAS,YAAY;AACrB,SAAS,kCAAkC;AAC3C,SAAS,aAAa,uBAAuB;AAE7C,SAAS,iCAAiC,gCAAgC;AAkF1E,MAAM,cAAc,CAAC,kBAAiD;AAAA,EACpE,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,cAAc,gBAAgB;AAAA,EAC9B,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,eAAe;AACjB;AAEA,SAAS,sBAAsB,MAA+B,GAG5D;AACA,QAAM,OAAiB,CAAC;AACxB,QAAM,MAAM,CAAC,QAAgB,KAAK,KAAK,GAAG;AAC1C,MAAI,KAAK,cAAc,KAAK,UAAW,KAAI,EAAE,4CAA4C,SAAS,CAAC;AACnG,MAAI,KAAK,YAAY,KAAK,QAAS,KAAI,EAAE,0CAA0C,OAAO,CAAC;AAC3F,MAAI,KAAK,cAAc,KAAK,UAAW,KAAI,EAAE,4CAA4C,SAAS,CAAC;AACnG,MAAI,KAAK,qBAAqB,KAAK,gBAAiB,KAAI,EAAE,kDAAkD,gBAAgB,CAAC;AAC7H,MAAI,KAAK,eAAe,KAAK,WAAY,KAAI,EAAE,6CAA6C,UAAU,CAAC;AACvG,MAAI,KAAK,iBAAiB,KAAK,YAAa,KAAI,EAAE,8CAA8C,YAAY,CAAC;AAC7G,MAAI,KAAK,WAAW,KAAK,OAAQ,KAAI,EAAE,yCAAyC,MAAM,CAAC;AACvF,QAAM,SAAS,gBAAiB,KAAa,cAAc,OAAO,GAAG;AACrE,QAAM,SAAS,gBAAiB,KAAa,cAAc,OAAO,GAAG;AACrE,MAAI,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,MAAM,GAAG;AACtD;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAK,KAAa,aAAc,KAAa,SAAS;AACpD,QAAI,EAAE,6CAA6C,WAAW,CAAC;AAAA,EACjE;AACA,MAAI,KAAK,WAAW,EAAG,QAAO,EAAE,QAAQ,MAAM,KAAK;AACnD,SAAO,EAAE,QAAQ,KAAK,KAAK,UAAK,GAAG,KAAK;AAC1C;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SACE,oBAAC,SAAI,WAAU,gHACX,oBAAS,IAAI,MAAM,GAAG,CAAC,KAAK,UAChC;AAEJ;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,IAAI,KAAK;AACf,QAAM,QAAQ,2BAA2B;AACzC,QAAM,yBAAyB,kBAAkB,MAAM,kBAAkB;AACzE,QAAM,mBAAmB,YAAY,MAAM,YAAY;AACvD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAwB,MAAM,YAAY,YAAY,CAAC;AACvG,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA+B,YAAY,YAAY,EAAE,QAAQ;AACvG,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA+B,IAAI;AACnF,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA+B,IAAI;AACnF,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAwB,CAAC,CAAC;AACxE,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,CAAC;AACxD,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAwB,IAAI;AACpE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA0B,CAAC,CAAC;AAClE,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAyB,CAAC,CAAC;AACzE,QAAM,CAAC,EAAE,oBAAoB,IAAI,MAAM,SAAS,KAAK;AACrD,QAAM,oBAAoB,MAAM,OAAmC,oBAAI,IAAI,CAAC;AAC5E,QAAM,oBAAoB,MAAM,OAAmC,oBAAI,IAAI,CAAC;AAC5E,QAAM,cAAc,MAAM,OAAwB,CAAC,CAAC;AACpD,QAAM,oBAAoB,MAAM,OAA6B,IAAI;AACjE,QAAM,mBAAmB,MAAM,OAA8B,IAAI;AAEjE,QAAM,eAAe,MAAM;AAAA,IACzB,MAAO,SAAS,UAAU,sBAAsB;AAAA,IAChD,CAAC,IAAI;AAAA,EACP;AACA,QAAM,cAAc,SAAS,UAAU,YAAY;AACnD,QAAM,sBAAsB,SAAS,UAAU,EAAE,MAAM,mBAAmB,EAAE,MAAM;AAElF,QAAM,aAAa,MAAM;AAAA,IACvB,MACE,SAAS,OAAmC,CAAC,KAAK,SAAS;AACzD,UAAI,IAAI,KAAK,IAAI,IAAI;AACrB,aAAO;AAAA,IACT,GAAG,oBAAI,IAAI,CAAC;AAAA,IACd,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,uBAAuB,MAAM;AAAA,IACjC,CAAC,UAAoD;AACnD,YAAM,UAAU,gBAAgB,OAAO,OAAO,GAAG;AACjD,UAAI,CAAC,OAAO,SAAS,OAAO,EAAG,QAAO;AACtC,YAAM,QAAQ,YAAY,QAAQ;AAAA,QAChC,CAAC,SAAS,OAAO,SAAS,KAAK,IAAI,KAAK,KAAK,IAAK,KAAK,OAAkB,OAAO,IAAI;AAAA,MACtF;AACA,aAAO,OAAO,MAAM;AAAA,IACtB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,CAAC,WAA2E;AAC1E,YAAM,YACJ,OAAO,QAAQ,cAAc,YAAY,OAAO,UAAU,KAAK,EAAE,SAAS,OAAO,UAAU,KAAK,IAAI;AACtG,YAAM,aAAa,YAAY,gBAAgB,WAAW,IAAI,SAAS,GAAG,MAAM,OAAO,GAAG,IAAI,OAAO;AACrG,YAAM,cAAc,gBAAgB,QAAQ,SAAS,OAAO,GAAG;AAC/D,YAAM,iBACJ,cACC,OAAO,SAAS,WAAW,IAAI,qBAAqB,WAAW,IAAI;AACtE,YAAM,eAAe,OAAO,SAAS,UAAU,IAC3C,aACA,OAAO,SAAS,WAAW,IACzB,cACA;AACN,aAAO,EAAE,WAAW,gBAAgB,SAAS,aAAa;AAAA,IAC5D;AAAA,IACA,CAAC,sBAAsB,UAAU;AAAA,EACnC;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,WAA2E;AAC1E,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,KAAK,OAAO,OAAO,cAAc,WAAW,OAAO,UAAU,KAAK,IAAI;AAC5E,UAAI,GAAG,OAAQ,QAAO;AACtB,YAAM,cAAc,gBAAgB,OAAO,SAAS,OAAO,GAAG;AAC9D,aAAO,OAAO,SAAS,WAAW;AAAA,IACpC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,CAAC,SAAkC;AACjC,YAAM,OAAO,EAAE,GAAG,YAAY,YAAY,GAAG,GAAG,KAAK;AACrD,YAAM,cAAc,kBAAkB;AACtC,UAAI,CAAC,KAAK,aAAa,aAAa;AAClC,aAAK,YAAY,YAAY;AAC7B,aAAK,UAAU,OAAO,SAAS,YAAY,QAAQ,IAAI,IAClD,YAAY,OACb,KAAK;AAAA,MACX;AACA,uBAAiB,IAAI;AACrB,kBAAY,KAAK,QAAQ;AACzB,uBAAiB,IAAI;AACrB,uBAAiB,IAAI;AACrB,sBAAgB,CAAC,CAAC;AAClB,mBAAa,IAAI;AACjB,sBAAgB,CAAC,SAAS,OAAO,CAAC;AAAA,IACpC;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,iBAAa,KAAK;AAClB,cAAU;AAAA,EACZ,GAAG,CAAC,cAAc,SAAS,CAAC;AAE5B,QAAM,eAAe,MAAM,YAAY,YAAY;AACjD,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,YAAM,SAAS,MACZ,IAA0B,CAAC,SAAS;AACnC,cAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,cAAM,OACJ,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC9C,KAAK,KAAK,KAAK,IACf,OAAO,KAAK,SAAS,WACnB,KAAK,OACL;AACR,YAAI,CAAC,MAAM,CAAC,KAAM,QAAO;AACzB,cAAM,OAAO,gBAAiB,KAAa,IAAI;AAC/C,cAAM,OACJ,OAAQ,KAAa,SAAS,YAAa,KAAa,KAAK,KAAK,EAAE,SAC/D,KAAa,KAAK,KAAK,IACxB;AACN,cAAM,YAAY,QAAS,KAAa,aAAc,KAAa,UAAU;AAC7E,eAAO,EAAE,IAAI,MAAM,MAAM,MAAM,OAAO,SAAS,IAAI,IAAI,OAAO,MAAM,UAAU;AAAA,MAChF,CAAC,EACA,OAAO,CAAC,UAAkC,QAAQ,KAAK,CAAC;AAC3D,kBAAY,UAAU;AACtB,wBAAkB,UAAU,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK;AACrE,kBAAY,MAAM;AAClB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,MAAM,yBAAyB,GAAG;AAC1C,kBAAY,UAAU,CAAC;AACvB,wBAAkB,UAAU;AAC5B,kBAAY,CAAC,CAAC;AACd,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,UAAgD;AACrD,YAAM,SAAS,IAAI,gBAAgB,EAAE,UAAU,IAAI,CAAC;AACpD,UAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,YAAM,WAAW,MAAM;AAAA,QACrB,yBAAyB,OAAO,SAAS,CAAC;AAAA,QAC1C;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,QAAQ,SAAS,CAAC,IAAI,CAAC;AACtF,YAAM,SAAS,OAAO,KAAK,EAAE,YAAY,KAAK;AAC9C,aAAO,MACJ,IAAI,CAAC,SAAS;AACb,cAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,YAAI,CAAC,GAAI,QAAO;AAChB,cAAM,QACJ,OAAO,KAAK,UAAU,WAClB,KAAK,QACL,OAAQ,KAAa,SAAS,WAC3B,KAAa,OACd;AACR,cAAM,MAAM,OAAQ,KAAa,QAAQ,WAAY,KAAa,MAAM;AACxE,cAAM,YACJ,OAAQ,KAAa,sBAAsB,WACtC,KAAa,oBACd,OAAQ,KAAa,oBAAoB,WACtC,KAAa,kBACd;AACR,cAAM,UAAU,OAAQ,KAAa,YAAY,YAAa,KAAa,UAAW,KAAa,UAAU;AAC7G,cAAM,WAAW,OAAQ,KAAa,aAAa,YAAa,KAAa,WAAY,KAAa,WAAW;AACjH,cAAM,mBACJ,OAAQ,SAAiB,gBAAgB,YAAa,QAAgB,YAAY,KAAK,EAAE,SACpF,QAAgB,YAAY,KAAK,IAClC,OAAQ,SAAiB,cAAc,YAAa,QAAgB,UAAU,KAAK,EAAE,SAClF,QAAgB,UAAU,KAAK,IAChC;AACR,cAAM,gBACJ,OAAQ,UAAkB,cAAc,YAAa,SAAiB,UAAU,KAAK,EAAE,SAClF,SAAiB,UAAU,KAAK,IACjC,OAAQ,UAAkB,gBAAgB,YAAa,SAAiB,YAAY,KAAK,EAAE,SACxF,SAAiB,YAAY,KAAK,IACnC;AACR,cAAM,eAAe;AAAA,UAClB,SAAiB,YAAa,SAAiB,WAAY,KAAa,YAAa,KAAa;AAAA,UACnG,OAAO;AAAA,QACT;AACA,cAAM,UACJ,CAAC,UACD,MAAM,YAAY,EAAE,SAAS,MAAM,MAClC,MAAM,IAAI,YAAY,EAAE,SAAS,MAAM,IAAI;AAC9C,YAAI,CAAC,QAAS,QAAO;AACrB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU,OAAO;AAAA,UACjB,MAAM,YACF,oBAAC,SAAI,KAAK,WAAW,KAAK,OAAO,WAAU,gCAA+B,IAC1E,iBAAiB,KAAK;AAAA,UAC1B,QAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,WAAW,oBAAoB,iBAAiB;AAAA,YAChD,SAAS,OAAO,SAAS,YAAY,IAAI,eAAe;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC,EACA,OAAO,CAAC,UAAiE,QAAQ,KAAK,CAAC,EACvF,IAAI,CAAC,UAAU;AACd,0BAAkB,QAAQ,IAAI,MAAM,OAAO,IAAI,MAAM,MAAM;AAC3D,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,WAAmB,sBAAmE;AAC3F,UAAI,CAAC,UAAW,QAAO,CAAC;AACxB,YAAM,WAAW,MAAM;AAAA,QACrB,mCAAmC,mBAAmB,SAAS,CAAC;AAAA,QAChE;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,aAAO,MACJ,IAAI,CAAC,SAAS;AACb,cAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,YAAI,CAAC,GAAI,QAAO;AAChB,cAAM,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAC1D,cAAM,MAAM,OAAQ,KAAa,QAAQ,WAAY,KAAa,MAAM;AACxE,cAAM,WAAW,OAAQ,KAAa,aAAa,YAAa,KAAa,WAAY,KAAa,WAAW;AACjH,cAAM,mBACJ,OAAQ,UAAkB,cAAc,YAAa,SAAiB,UAAU,KAAK,EAAE,SAClF,SAAiB,UAAU,KAAK,IACjC,OAAQ,UAAkB,gBAAgB,YAAa,SAAiB,YAAY,KAAK,EAAE,SACxF,SAAiB,YAAY,KAAK,IACnC;AACR,cAAM,iBAAiB;AAAA,UACpB,KAAa,YAAa,KAAa,WAAY,UAAkB,YAAa,UAAkB;AAAA,UACrG,OAAO;AAAA,QACT;AACA,cAAM,YACJ,OAAQ,KAAa,sBAAsB,WACtC,KAAa,oBACd,OAAQ,KAAa,iBAAiB,WACnC,KAAa,eACd,qBAAqB;AAC7B,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU,OAAO;AAAA,UACjB,MAAM,YACF,oBAAC,SAAI,KAAK,WAAW,KAAK,OAAO,WAAU,gCAA+B,IAC1E,iBAAiB,KAAK;AAAA,UAC1B,QAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,WAAW;AAAA,YACX,SAAS,OAAO,SAAS,cAAc,IAAI,iBAAiB;AAAA,UAC9D;AAAA,QACF;AAAA,MACF,CAAC,EACA,OAAO,CAAC,UAAiE,QAAQ,KAAK,CAAC,EACvF,IAAI,CAAC,UAAU;AACd,0BAAkB,QAAQ,IAAI,MAAM,OAAO,IAAI,MAAM,MAAM;AAC3D,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,MAAM;AAAA,IACvB,OAAO,WAA0B,cAA6B;AAC5D,UAAI,CAAC,WAAW;AACd,wBAAgB,CAAC,CAAC;AAClB,eAAO,CAAC;AAAA,MACV;AACA,sBAAgB,IAAI;AACpB,UAAI;AACF,cAAM,SAAS,IAAI,gBAAgB,EAAE,WAAW,UAAU,KAAK,CAAC;AAChE,YAAI,UAAW,QAAO,IAAI,aAAa,SAAS;AAChD,cAAM,WAAW,MAAM;AAAA,UACrB,uBAAuB,OAAO,SAAS,CAAC;AAAA,UACxC;AAAA,UACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,QAC5B;AACA,cAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,cAAM,SAAwB,MAC3B,IAAI,CAAC,SAAS;AACb,gBAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,cAAI,CAAC,GAAI,QAAO;AAChB,gBAAM,YAAY,gBAAiB,KAAa,gBAAgB,IAAW;AAC3E,gBAAM,cAAc,gBAAiB,KAAa,kBAAkB,IAAW;AAC/E,gBAAM,WACJ,OAAQ,KAAa,kBAAkB,WAClC,KAAa,gBACd,OAAQ,KAAa,iBAAiB,WACnC,KAAa,eACd;AACR,gBAAM,cACH,KAAa,iBAAiB,mBAAoB,KAAa,iBAAiB,kBAC5E,KAAa,eACb,KAAa,gBAAgB,mBAAoB,KAAa,gBAAgB,kBAC5E,KAAa,cACd;AACR,gBAAM,UAAU,gBAAiB,KAAa,UAAU,IAAW;AACnE,gBAAM,cACJ,OAAQ,KAAa,kBAAkB,WAClC,KAAa,gBACd,OAAQ,KAAa,gBAAgB,WAClC,KAAa,cACd;AACR,gBAAM,iBACJ,OAAQ,KAAa,qBAAqB,WACrC,KAAa,mBACd,OAAQ,KAAa,mBAAmB,WACrC,KAAa,iBACd,OAAQ,KAAa,eAAe,YAClC,QACA,OAAQ,KAAa,YAAY,UAAU,WAC1C,KAAa,WAAW,QACzB,OAAQ,KAAa,eAAe,YAClC,QACA,OAAQ,KAAa,YAAY,SAAS,WACzC,KAAa,WAAW,OACzB;AACZ,gBAAM,gBACJ,OAAQ,KAAa,oBAAoB,WACpC,KAAa,kBACd,OAAQ,KAAa,kBAAkB,WACpC,KAAa,gBACd,OAAQ,KAAa,eAAe,YAClC,QACA,OAAQ,KAAa,YAAY,SAAS,WACzC,KAAa,WAAW,OACzB;AACV,gBAAM,yBACJ,kBACA,kBACC,OAAQ,KAAa,SAAS,WAAY,KAAa,OAAO;AACjE,gBAAM,aAAa;AAAA,YACjB,gBAAgB,mBAAmB,gBAAgB,QAAQ,WACvD,YAAY,aAAa,QAAQ,IACjC;AAAA,YACJ,gBAAgB,mBAAmB,cAAc,QAAQ,WACrD,YAAY,WAAW,QAAQ,IAC/B;AAAA,YACJ,cACI,gBAAgB,kBACd,EAAE,oCAAoC,OAAO,IAC7C,EAAE,kCAAkC,KAAK,IAC3C;AAAA,UACN,EAAE,OAAO,OAAO;AAChB,gBAAM,EAAE,QAAQ,KAAK,IAAI,sBAAsB,MAAM,CAAC,KAAK,aAAa,EAAE,KAAK,QAAQ,CAAC;AACxF,gBAAM,QACJ,WAAW,SAAS,IAChB,WAAW,KAAK,UAAK,IACrB,gBAAgB,QAAQ,WACtB,YAAY,aAAa,QAAQ,IACjC,cAAc,QAAQ,WACpB,YAAY,WAAW,QAAQ,IAC/B;AACV,iBAAO;AAAA,YACL;AAAA,YACA,WAAW,aAAa;AAAA,YACxB,aAAa,eAAe;AAAA,YAC5B,cAAc;AAAA,YACd;AAAA,YACA,SAAS,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,YAC9C;AAAA,YACA;AAAA,YACA,gBAAgB,0BAA0B;AAAA,YAC1C,eAAe,iBAAiB;AAAA,YAChC,aAAa;AAAA,YACb,WAAW;AAAA,UACb;AAAA,QACF,CAAC,EACA,OAAO,CAAC,UAAgC,QAAQ,KAAK,CAAC;AACzD,wBAAgB,MAAM;AACtB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,gBAAQ,MAAM,mCAAmC,GAAG;AACpD,eAAO,CAAC;AAAA,MACV,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,mBAAmB,MAAM,YAAY,YAAqC;AAC9E,yBAAqB,IAAI;AACzB,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACjE,YAAM,WAAW,MAAM;AAAA,QACrB,kCAAkC,OAAO,SAAS,CAAC;AAAA,QACnD;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,YAAM,SAAS,MACZ,IAAI,CAAC,UAAU;AACd,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK;AACrD,cAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,YAAI,CAAC,MAAM,CAAC,MAAO,QAAO;AAC1B,cAAM,QACJ,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,EAAE,SAClD,MAAM,QACN;AACN,cAAM,QACJ,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,EAAE,SAAS,MAAM,QAAQ;AAC/E,cAAM,OACJ,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE,SAAS,MAAM,OAAO;AAC5E,eAAO,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK;AAAA,MACzC,CAAC,EACA,OAAO,CAAC,UAAiC,QAAQ,KAAK,CAAC;AAC1D,sBAAgB,MAAM;AACtB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,MAAM,6BAA6B,GAAG;AAC9C,sBAAgB,CAAC,CAAC;AAClB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuB,MAAM;AAAA,IACjC,OAAO,UAAgD;AACrD,YAAM,UACJ,aAAa,UAAU,CAAC,QAAQ,eAAe,MAAM,iBAAiB;AACxE,YAAM,OAAO,OAAO,KAAK,EAAE,YAAY,KAAK;AAC5C,YAAM,aAAa,QAAQ;AAAA,QACzB,CAAC,KAAK,UAAU;AACd,cAAI,MAAM,KAAK,IAAI;AAAA,YACjB,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,MAAM,MAAM,QAAQ;AAAA,UACtB;AACA,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AACA,aAAO,QACJ;AAAA,QACC,CAAC,WACC,CAAC,KAAK,UACN,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,KACxC,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI;AAAA,MAC5C,EACC,IAAsB,CAAC,YAAY;AAAA,QAClC,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,QACd,UAAU,OAAO,UAAU,OAAO,QAAQ,OAAO,QAAQ;AAAA,QACzD,MAAM,qBAAqB,OAAO,MAAM,SAAS,KAAK,sBAAsB,OAAO,OAAO,sBAAsB;AAAA,MAClH,EAAE;AAAA,IACN;AAAA,IACA,CAAC,cAAc,gBAAgB;AAAA,EACjC;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC7B,qBAAiB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnC,GAAG,CAAC,kBAAkB,cAAc,IAAI,CAAC;AAEzC,QAAM,mBAAmB,MAAM;AAAA,IAC7B,OAAO,WAAoD;AACzD,cAAQ,eAAe,yBAAyB;AAChD,cAAQ,IAAI,cAAc,MAAM;AAEhC,YAAM,qBAAqB,OAAO,eAAe,YAAY,WAAW,KAAK,EAAE,SAAS,aAAa;AACrG,YAAM,cAAc;AACpB,YAAM,iBAAiB;AAEvB,UAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,oBAAoB;AAC1D,cAAM;AAAA,UACJ,EAAE,oCAAoC,uCAAuC;AAAA,QAC/E;AAAA,MACF;AACA,YAAMA,YAAW,OAAO,aAAa,WAAW,WAAW;AAC3D,YAAM,eAAeA,cAAa;AAElC,UAAI,CAAC,gBAAgB,CAAC,OAAO,WAAW;AACtC,cAAM;AAAA,UACJ,EAAE,8CAA8C,+BAA+B;AAAA,UAC/E,EAAE,WAAW,EAAE,8CAA8C,+BAA+B,EAAE;AAAA,QAChG;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB,CAAC,OAAO,WAAW;AACtC,cAAM;AAAA,UACJ,EAAE,8CAA8C,+BAA+B;AAAA,UAC/E,EAAE,WAAW,EAAE,8CAA8C,+BAA+B,EAAE;AAAA,QAChG;AAAA,MACF;AAEA,YAAM,YAAY,OAAO,OAAO,YAAY,OAAO,YAAY,CAAC;AAChE,cAAQ,IAAI,0BAA0B,EAAE,KAAK,OAAO,UAAU,QAAQ,UAAU,CAAC;AACjF,UAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,cAAM;AAAA,UACJ,EAAE,uCAAuC,kCAAkC;AAAA,UAC3E,EAAE,UAAU,EAAE,uCAAuC,kCAAkC,EAAE;AAAA,QAC3F;AAAA,MACF;AAEA,YAAM,kBAAkB,OAAO,OAAO,aAAa,OAAO,aAAa,CAAC;AACxE,cAAQ,IAAI,4BAA4B,EAAE,KAAK,OAAO,WAAW,QAAQ,gBAAgB,CAAC;AAC1F,UAAI,CAAC,OAAO,SAAS,eAAe,KAAK,mBAAmB,GAAG;AAC7D,cAAM;AAAA,UACJ,EAAE,wCAAwC,oCAAoC;AAAA,UAC9E,EAAE,WAAW,EAAE,wCAAwC,oCAAoC,EAAE;AAAA,QAC/F;AAAA,MACF;AAEA,YAAM,gBAAgB,CAAC,gBAAgB,OAAO,UAC1C,aAAa,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO,OAAO,KAAK,OAC7D;AACJ,YAAM,mBACH,OAAO,gBACR,eAAe,gBACf,gBACA;AACF,UAAI,CAAC,kBAAkB;AACrB,cAAM;AAAA,UACJ,EAAE,uCAAuC,uBAAuB;AAAA,UAChE,EAAE,SAAS,EAAE,uCAAuC,uBAAuB,EAAE;AAAA,QAC/E;AAAA,MACF;AAEA,YAAM,mBAAmB,OAAO,QAAQ,IAAI,SAAS,EAAE,KAAK;AAC5D,YAAM,eAAe,eACjB,kBACA,mBAAmB,eAAe,SAAS,eAAe,SAAS;AACvE,UAAI,gBAAgB,CAAC,cAAc;AACjC,cAAM;AAAA,UACJ,EAAE,2CAA2C,oCAAoC;AAAA,UACjF,EAAE,MAAM,EAAE,2CAA2C,oCAAoC,EAAE;AAAA,QAC7F;AAAA,MACF;AACA,YAAM,oBAAoB,OAAO,cAAc,QAAQ,QAAQ;AAC/D,YAAM,kBACJ,CAAC,gBAAgB,OAAO,OAAO,oBAAoB,YAAY,OAAO,kBAAkB,OAAO,kBAAkB;AACnH,YAAM,oBACJ,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,KAAK,EAAE,SAC5D,OAAO,YACP;AACN,YAAM,kBAAkB,OAAO,SAAS,OAAO,OAAO,IACjD,OAAO,UACR,gBAAgB,OAAO,OAAO;AAClC,YAAM,oBAAoB,OAAO,SAAS,eAAe,IAAI,kBAAkB;AAC/E,YAAM,oBACJ,sBAAsB,QAAQ,kBAAkB,mBAAmB,IAAI,oBAAoB;AAC7F,YAAM,sBACJ,sBAAsB,UAAU,kBAAkB,mBAAmB,IAAI,oBAAoB;AAC/F,YAAM,mBAAmB,OAAO,SAAS,iBAAiB,IAAI,oBAAoB;AAClF,YAAM,qBAAqB,OAAO,SAAS,mBAAmB,IAAI,sBAAsB;AACxF,YAAM,iBAAiB,mBAAmB;AAC1C,YAAM,mBAAmB,qBAAqB;AAE9C,YAAM,WAAW;AAAA,QACf,GAAI,mBAAmB,CAAC;AAAA,QACxB,GAAI,CAAC,gBAAgB,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,QACrE,WAAW;AAAA,QACX,GAAI,oBAAoB,EAAE,WAAW,kBAAkB,IAAI,CAAC;AAAA,QAC5D,GAAI,CAAC,gBAAgB,gBACjB;AAAA,UACE,cAAc,cAAc;AAAA,UAC5B,YAAY,cAAc,OAAO;AAAA,UACjC,kBAAkB,cAAc,gBAAgB;AAAA,QAClD,IACA,CAAC;AAAA,QACL,GAAI,CAAC,gBAAgB,gBACjB;AAAA,UACE,cAAc,cAAc;AAAA,UAC5B,YAAY,cAAc,OAAO;AAAA,UACjC,kBAAkB,cAAc,gBAAgB,eAAe,gBAAgB;AAAA,QACjF,IACA,CAAC;AAAA,QACL,GAAI,eAAe,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,QAC3C,UAAAA;AAAA,MACF;AAEA,YAAM,UAAmC;AAAA,QACvC,CAAC,WAAW,GAAG,OAAO,kBAAkB;AAAA,QACxC,gBAAgB,OAAO,WAAW;AAAA,QAClC,UAAU,OAAO,cAAc;AAAA,QAC/B,WAAW,eAAe,SAAY,OAAO,YAAY,OAAO,OAAO,SAAS,IAAI;AAAA,QACpF,kBAAkB,eAAe,SAAY,OAAO,YAAY,OAAO,OAAO,SAAS,IAAI;AAAA,QAC3F,UAAU;AAAA,QACV,cAAc,OAAO,gBAAgB;AAAA,QACrC,SAAS,CAAC,gBAAgB,OAAO,UAAU,OAAO,OAAO,OAAO,IAAI;AAAA,QACpE,WAAW;AAAA,QACX,SAAS,OAAO,SAAS,eAAe,IAAI,kBAAkB;AAAA,QAC9D,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,QAC7C;AAAA,QACA,kBAAkB,OAAO,oBAAoB;AAAA,QAC7C,GAAI,OAAO,OAAO,kBAAkB,YAAY,OAAO,cAAc,KAAK,EAAE,SACxE,EAAE,eAAe,OAAO,cAAc,KAAK,EAAE,IAC7C,CAAC;AAAA,MACP;AAEA,YAAM,eAAe,yBAAyB,QAAQ;AAAA,QACpD,WAAW,CAAC,UAAU,gCAAgC,KAAK;AAAA,MAC7D,CAAC;AACD,UAAI,OAAO,KAAK,YAAY,EAAE,QAAQ;AACpC,gBAAQ,eAAe,2BAA2B,YAAY;AAAA,MAChE;AACA,UAAI,aAAc,SAAQ,OAAO;AAEjC,cAAQ,MAAM,kBAAkB,EAAE,oBAAoB,aAAa,gBAAgB,iBAAiB,CAAC;AACrG,cAAQ,MAAM,kBAAkB,EAAE,WAAW,gBAAgB,CAAC;AAC9D,cAAQ,IAAI,6BAA6B,OAAO;AAChD,cAAQ,IAAI,kCAAkC,KAAK,UAAU,OAAO,CAAC;AACrE,cAAQ,SAAS;AAEjB,UAAI;AACF,cAAM,SAAS,YAAY,aAAa;AACxC,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA,YAAY,EAAE,IAAI,WAAW,GAAG,QAAQ,IAAI;AAAA,UAC5C;AAAA,YACE,cAAc,EAAE,mCAAmC,sBAAsB;AAAA,UAC3E;AAAA,QACF;AACA,YAAI,OAAO,IAAI;AACb,cAAI,QAAS,OAAM,QAAQ;AAC3B,sBAAY;AAAA,QACd;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,2BAA2B,GAAG;AAC5C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAqB,MAAM;AAC9C,UAAM,eAAe,aAAa;AAClC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,wCAAwC,WAAW;AAAA,QAC5D,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,UAAU,aAAa,MAAwB;AAClE,gBAAM,OAAO,UAAU,WAAW,WAAW;AAC7C,gBAAM,aAAa,CAAC,SAA+B;AACjD,gBAAI,SAAS,KAAM;AACnB,qBAAS,IAAI;AACb,wBAAY,IAAI;AAChB,gBAAI,SAAS,UAAU;AACrB,+BAAiB,IAAI;AACrB,+BAAiB,IAAI;AACrB,8BAAgB,CAAC,CAAC;AAClB,6BAAe,aAAa,IAAI;AAChC,6BAAe,aAAa,IAAI;AAChC,6BAAe,WAAW,IAAI;AAC9B,6BAAe,mBAAmB,IAAI;AAAA,YACxC,OAAO;AACL,6BAAe,aAAa,EAAE;AAC9B,6BAAe,aAAa,OAAO;AAAA,YACrC;AAAA,UACF;AACA,iBACE,qBAAC,SAAI,WAAU,uBACb;AAAA,iCAAC,SAAI,WAAU,6DACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS,SAAS,YAAY,YAAY;AAAA,kBAC1C,SAAS,MAAM,WAAW,SAAS;AAAA,kBAElC,YAAE,0CAA0C,cAAc;AAAA;AAAA,cAC7D;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS,SAAS,WAAW,YAAY;AAAA,kBACzC,SAAS,MAAM,WAAW,QAAQ;AAAA,kBAEjC,YAAE,yCAAyC,aAAa;AAAA;AAAA,cAC3D;AAAA,eACF;AAAA,YACA,oBAAC,OAAE,WAAU,iCACV;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,aACF;AAAA,QAEJ;AAAA,MACF;AAAA,MACA,GAAI,CAAC,eACD;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,iCAAiC,SAAS;AAAA,UACnD,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAClD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,cAC3C,UAAU,CAAC,SAAS;AAClB,sBAAM,iBAAiB,OAAO,kBAAkB,QAAQ,IAAI,IAAI,KAAK,OAAO;AAC5E,iCAAiB,cAAc;AAC/B,iCAAiB,IAAI;AACrB,gCAAgB,CAAC,CAAC;AAClB,yBAAS,QAAQ,IAAI;AACrB,+BAAe,aAAa,IAAI;AAChC,+BAAe,WAAW,IAAI;AAC9B,+BAAe,aAAa,EAAE;AAC9B,+BAAe,aAAa,OAAO;AACnC,sBAAM,eAAe,iBACjB,oBAAoB,cAAc,IAClC,EAAE,SAAS,MAAM,WAAW,KAAK;AACrC,+BAAe,WAAW,aAAa,WAAW,IAAI;AACtD,+BAAe,aAAa,aAAa,aAAa,IAAI;AAC1D,sBAAM,eAAe,OAAO,QAAQ,SAAS,WAAW,OAAO,OAAO;AACtE,oBAAI,CAAC,aAAa,KAAK,KAAK,gBAAgB,OAAO;AACjD,iCAAe,QAAQ,eAAe,KAAK;AAAA,gBAC7C;AACA;AAAA,kBACE;AAAA,kBACA,OACI;AAAA,oBACE,SAAS;AAAA,sBACP,IAAI;AAAA,sBACJ,OAAO,gBAAgB,SAAS;AAAA,sBAChC,KAAK,gBAAgB,OAAO;AAAA,sBAC5B,cAAc,gBAAgB,gBAAgB;AAAA,oBAChD;AAAA,kBACF,IACA;AAAA,gBACN;AACA,oBAAI,MAAM;AACR,uBAAK,WAAW,MAAM,IAAI;AAAA,gBAC5B;AAAA,cACF;AAAA,cACA,YAAY;AAAA,cACZ,SACE,gBACI;AAAA,gBACE;AAAA,kBACE,IAAI,cAAc;AAAA,kBAClB,OAAO,cAAc,SAAS,cAAc;AAAA,kBAC5C,UAAU,cAAc,OAAO;AAAA,kBAC/B,MAAM,cAAc,eAChB,oBAAC,SAAI,KAAK,cAAc,cAAc,KAAK,cAAc,SAAS,cAAc,IAAI,WAAU,gCAA+B,IAC7H,iBAAiB,cAAc,SAAS,cAAc,EAAE;AAAA,gBAC9D;AAAA,cACF,IACA;AAAA,cAEN,UAAU;AAAA,cACV,mBAAmB,EAAE,uCAAuC,gBAAgB;AAAA,cAC5E,aAAa,EAAE,0BAA0B,QAAQ;AAAA,cACjD,eAAe,EAAE,4BAA4B,UAAU;AAAA,cACvD,YAAY,EAAE,kCAAkC,iBAAiB;AAAA,cACjE,YAAY,EAAE,6BAA6B,YAAY;AAAA,cACvD,cAAc,EAAE,6BAA6B,iBAAY;AAAA,cACzD,kBAAkB,EAAE,+BAA+B,yBAAyB;AAAA,cAC5E,mBAAmB,CAAC,OAClB,EAAE,yCAAyC,mBAAmB;AAAA,gBAC5D,IAAI,eAAe,SAAS;AAAA,cAC9B,CAAC;AAAA;AAAA,UAEL;AAAA,QAEJ;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,iCAAiC,SAAS;AAAA,UACnD,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAAwB;AAC1E,kBAAM,YAAY,OAAO,QAAQ,cAAc,WAAW,OAAO,YAAY;AAC7E,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,gBAC3C,UAAU,CAAC,SAAS;AAClB,wBAAM,iBAAiB,OAAO,kBAAkB,QAAQ,IAAI,IAAI,KAAK,OAAO;AAC5E,mCAAiB,cAAc;AAC/B,2BAAS,QAAQ,IAAI;AACrB,wBAAM,eAAe,OAAO,QAAQ,SAAS,WAAW,OAAO,OAAO;AACtE,sBAAI,CAAC,aAAa,KAAK,GAAG;AACxB,mCAAe,QAAQ,gBAAgB,SAAS,eAAe,SAAS,YAAY;AAAA,kBACtF;AACA,wBAAM,YAAY,eAAe,cAAc,IAC3C,iBACA,eAAe,aAAa,IAC1B,gBACA;AACN,sBAAI,WAAW;AACb,0BAAM,eAAe,oBAAoB,SAAS;AAClD,mCAAe,WAAW,aAAa,WAAW,IAAI;AACtD,mCAAe,aAAa,aAAa,aAAa,IAAI;AAAA,kBAC5D;AACA,wBAAM,eACJ,OAAO,QAAQ,oBAAoB,YAAY,OAAO,kBACjD,OAAO,kBACR;AACN,sBAAI,MAAM;AACR,mCAAe,mBAAmB;AAAA,sBAChC,GAAI,gBAAgB,CAAC;AAAA,sBACrB,SAAS;AAAA,wBACP,IAAI;AAAA,wBACJ,OAAO,gBAAgB,SAAS;AAAA,wBAChC,KAAK,gBAAgB,OAAO;AAAA,wBAC5B,cAAc,gBAAgB,gBAAgB;AAAA,sBAChD;AAAA,oBACF,CAAC;AAAA,kBACH,WAAW,cAAc;AACvB,0BAAM,WAAW,EAAE,GAAG,aAAa;AACnC,wBAAI,aAAa,SAAU,QAAQ,SAAiB;AACpD,mCAAe,mBAAmB,OAAO,KAAK,QAAQ,EAAE,SAAS,WAAW,IAAI;AAAA,kBAClF,OAAO;AACL,mCAAe,mBAAmB,IAAI;AAAA,kBACxC;AACA,sBAAI,WAAW;AACb,yBAAK,WAAW,WAAW,IAAI;AAAA,kBACjC;AAAA,gBACF;AAAA,gBACA,YAAY,OAAO,UAAU;AAC3B,sBAAI,CAAC,UAAW,QAAO,CAAC;AACxB,wBAAM,eAAe,YAAY,kBAAkB,QAAQ,IAAI,SAAS,GAAG,eAAe;AAC1F,wBAAM,UAAU,MAAM,mBAAmB,WAAW,YAAY;AAChE,wBAAM,SAAS,OAAO,KAAK,EAAE,YAAY,KAAK;AAC9C,yBAAO,OAAO,SACV,QAAQ,OAAO,CAAC,WAAW,OAAO,MAAM,YAAY,EAAE,SAAS,MAAM,CAAC,IACtE;AAAA,gBACN;AAAA,gBACA,mBAAmB,EAAE,uCAAuC,gBAAgB;AAAA,gBAC5E,aAAa,EAAE,0BAA0B,QAAQ;AAAA,gBACjD,eAAe,EAAE,4BAA4B,UAAU;AAAA,gBACvD,YAAY,EAAE,kCAAkC,iBAAiB;AAAA,gBACjE,YAAY,EAAE,6BAA6B,YAAY;AAAA,gBACvD,cAAc,EAAE,6BAA6B,iBAAY;AAAA,gBACzD,kBAAkB,EAAE,+BAA+B,yBAAyB;AAAA,gBAC5E,UAAU;AAAA,gBACV,SACE,gBACI;AAAA,kBACE;AAAA,oBACE,IAAI,cAAc;AAAA,oBAClB,OAAO,cAAc,SAAS,cAAc;AAAA,oBAC5C,UAAU,cAAc,OAAO;AAAA,oBAC/B,MAAM,cAAc,eAClB;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK,cAAc;AAAA,wBACnB,KAAK,cAAc,SAAS,cAAc;AAAA,wBAC1C,WAAU;AAAA;AAAA,oBACZ,IAEA,iBAAiB,cAAc,SAAS,cAAc,EAAE;AAAA,kBAE5D;AAAA,gBACF,IACA;AAAA,gBAEN,mBAAmB,CAAC,OAClB,EAAE,yCAAyC,mBAAmB;AAAA,kBAC5D,IAAI,eAAe,SAAS;AAAA,gBAC9B,CAAC;AAAA,gBAEH,UAAU,CAAC;AAAA;AAAA,cAvFN,aAAa;AAAA,YAwFpB;AAAA,UAEJ;AAAA,QACF;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,+BAA+B,OAAO;AAAA,UAC/C,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAAwB;AAC1E,kBAAM,YAAY,OAAO,QAAQ,cAAc,WAAW,OAAO,YAAY;AAC7E,kBAAM,YAAY,OAAO,QAAQ,cAAc,WAAW,OAAO,YAAY;AAC7E,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,gBAC3C,UAAU,CAAC,SAAS;AAClB,2BAAS,QAAQ,IAAI;AACrB,wBAAM,WAAW,OAAO,aAAa,KAAK,CAAC,UAAU,MAAM,OAAO,IAAI,KAAK,OAAO;AAClF,sBAAI,UAAU;AACZ,0BAAM,OAAO,SAAS,gBAAgB,kBAAkB,QAAQ;AAChE,0BAAM,SACJ,SAAS,QACL,SAAS,aAAa,SAAS,eAAe,IAC9C,SAAS,eAAe,SAAS,aAAa;AACpD,mCAAe,aAAa,IAAI;AAChC,mCAAe,aAAa,OAAO,SAAS,CAAC;AAC7C,mCAAe,WAAW,SAAS,WAAW,IAAI;AAClD,0BAAM,gBAAgB,qBAAqB,SAAS,OAAO;AAC3D,mCAAe,aAAa,aAAa;AACzC;AAAA,sBACE;AAAA,sBACA,SAAS,gBAAgB,QAAQ,gBAAgB,gBAAgB;AAAA,oBACnE;AAAA,kBACF,OAAO;AACL,0BAAM,cAAc,oBAAoB,iBAAiB,iBAAiB,IAAI;AAC9E,mCAAe,WAAW,YAAY,WAAW,IAAI;AACrD,mCAAe,aAAa,YAAY,aAAa,IAAI;AAAA,kBAC3D;AAAA,gBACF;AAAA,gBACA,YAAY,OAAO,UAAU;AAC3B,wBAAM,SAAS,MAAM,WAAW,WAAW,SAAS;AACpD,wBAAM,SAAS,OAAO,KAAK,EAAE,YAAY,KAAK;AAC9C,yBAAO,OACJ,OAAO,CAAC,UAAU;AACjB,wBAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,0BAAM,WAAW;AAAA,sBACf,MAAM;AAAA,sBACN,MAAM;AAAA,sBACN,MAAM;AAAA,sBACN,MAAM;AAAA,sBACN,GAAI,MAAM,aAAa,CAAC;AAAA,oBAC1B,EACG,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAY;AACf,2BAAO,SAAS,SAAS,MAAM;AAAA,kBACjC,CAAC,EACA,IAAsB,CAAC,WAAW;AAAA,oBACjC,IAAI,MAAM;AAAA,oBACV,OAAO,MAAM;AAAA,oBACb,UAAU,MAAM,kBAAkB,MAAM,iBAAiB;AAAA,oBACzD,aAAa,MAAM,eAAe;AAAA,oBAClC,YAAY,MAAM,gBAAgB;AAAA,oBAClC,MAAM,oBAAC,cAAW,WAAU,iCAAgC;AAAA,kBAC9D,EAAE;AAAA,gBACN;AAAA,gBACA,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,mBAAmB,EAAE,qCAAqC,cAAc;AAAA,gBACxE,aAAa,EAAE,0BAA0B,QAAQ;AAAA,gBACjD,eAAe,EAAE,4BAA4B,UAAU;AAAA,gBACvD,YAAY,EAAE,kCAAkC,iBAAiB;AAAA,gBACjE,YAAY,EAAE,6BAA6B,YAAY;AAAA,gBACvD,cAAc,EAAE,6BAA6B,iBAAY;AAAA,gBACzD,kBAAkB,EAAE,+BAA+B,yBAAyB;AAAA,gBAC5E,UAAU,CAAC;AAAA;AAAA,cA9DN,YAAY,GAAG,SAAS,IAAI,aAAa,YAAY,KAAK;AAAA,YA+DjE;AAAA,UAEJ;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,mCAAmC,YAAY;AAAA,QACxD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAAwB;AAC1E,gBAAM,OAAO,QAAQ,cAAc,QAAQ,QAAQ;AACnD,iBACE,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,gBAC5E,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,gBAChD,aAAY;AAAA;AAAA,YACd;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBACP,UAAU,CAAC,UAAU;AACnB,wBAAM,WAAW,MAAM,OAAO,UAAU,QAAQ,QAAQ;AACxD,iCAAe,aAAa,QAAQ;AAAA,gBACtC;AAAA,gBAEA;AAAA,sCAAC,YAAO,OAAM,SAAS,YAAE,oCAAoC,OAAO,GAAE;AAAA,kBACtE,oBAAC,YAAO,OAAM,OAAO,YAAE,kCAAkC,KAAK,GAAE;AAAA;AAAA;AAAA,YAClE;AAAA,aACF;AAAA,QAEJ;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,iCAAiC,WAAW;AAAA,QACrD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAAwB;AAC1E,gBAAM,gBACJ,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SACtC,QACA,qBAAsB,QAAgB,OAAO;AACnD,gBAAM,eAAe,CAAC,UAAgD;AACpE,kBAAM,SAAS,MAAM,OAAO,SAAS;AACrC,kBAAM,SAAS,SAAS,WAAW,IAAI,MAAM,KAAK,OAAO;AACzD,qBAAS,MAAM;AACf,kBAAM,OAAO,gBAAgB,QAAQ,IAAI;AACzC,2BAAe,WAAW,OAAO,SAAS,IAAI,IAAI,OAAO,IAAI;AAAA,UAC/D;AACA,iBACE,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,iBAAiB;AAAA,gBACxB,UAAU;AAAA,gBACV,UAAU,CAAC,SAAS;AAAA,gBAEpB;AAAA,sCAAC,YAAO,OAAM,IACX,mBAAS,SACN,EAAE,sCAAsC,uBAAuB,IAC/D,EAAE,uCAAuC,0BAA0B,GACzE;AAAA,kBACC,SAAS,IAAI,CAAC,SACb,qBAAC,YAAqB,OAAO,KAAK,IAC/B;AAAA,yBAAK;AAAA,oBACL,KAAK,OAAO,WAAM,KAAK,KAAK,YAAY,CAAC,KAAK;AAAA,oBAC9C,OAAO,SAAS,KAAK,IAAI,IAAI,WAAM,KAAK,IAAI,MAAM;AAAA,uBAHxC,KAAK,EAIlB,CACD;AAAA;AAAA;AAAA,YACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,sBAAI,OAAO,WAAW,aAAa;AACjC,2BAAO,KAAK,2CAA2C,UAAU,qBAAqB;AAAA,kBACxF;AAAA,gBACF;AAAA,gBACA,OAAO,EAAE,2CAA2C,oBAAoB;AAAA,gBAExE,8BAAC,YAAS,WAAU,WAAU;AAAA;AAAA,YAChC;AAAA,aACF;AAAA,QAEJ;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,kCAAkC,UAAU;AAAA,QACrD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,SAAS,MAC5B;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,YAC5E,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,YAChD,aAAY;AAAA;AAAA,QACd;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,gCAAgC,QAAQ;AAAA,QACjD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,SAAS,MAC5B;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,YAC3C,UAAU,CAAC,SAAS,SAAS,QAAQ,IAAI;AAAA,YACzC,aAAa,EAAE,2CAA2C,eAAe;AAAA,YACzE,YAAY,EAAE,qCAAqC,WAAW;AAAA,YAC9D,YAAY;AAAA,YACZ,cAAc,EAAE,uCAAuC,wBAAmB;AAAA,YAC1E,aAAa,EAAE,0BAA0B,QAAQ;AAAA,YACjD,eAAe,EAAE,4BAA4B,UAAU;AAAA,YACvD,YAAY,EAAE,kCAAkC,iBAAiB;AAAA,YACjE,kBAAkB,EAAE,+BAA+B,yBAAyB;AAAA,YAC5E,UAAU;AAAA;AAAA,QACZ;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,8BAA8B,MAAM;AAAA,QAC7C,MAAM;AAAA,QACN,aAAa,EAAE,yCAAyC,oBAAoB;AAAA,QAC5E,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM,QAAyB,MAAM;AAClD,WAAO;AAAA,MACL,EAAE,IAAI,aAAa,OAAO;AAAA,MAC1B;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,+BAA+B,eAAe;AAAA,QACvD,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC,CAAC;AAEd,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,QAAI,CAAC,aAAa;AAChB,gBAAU;AACV;AAAA,IACF;AACA,iBAAa,YAAY,EAAE;AAC3B,UAAM,WAAW,YAAY,YAAY,gBAAgB,YAAY;AACrE,UAAM,OAAO,YAAY,YAAY,CAAC;AACtC,UAAM,WAAY,YAAY,mBAAkE;AAChG,UAAM,kBACJ,YAAY,OAAO,aAAa,YAAY,OAAQ,SAAiB,YAAY,YAAa,SAAiB,UACzG,SAAiB,UACnB;AACN,UAAM,kBACJ,YAAY,OAAO,aAAa,YAAY,OAAQ,SAAiB,YAAY,YAAa,SAAiB,UACzG,SAAiB,UACnB;AACN,UAAM,eACJ,OAAQ,MAAc,aAAa,aAAc,KAAa,aAAa,YAAa,KAAa,aAAa,aAC5G,KAAa,WACd,MAAc,aACb,WACA;AACR,aAAS,YAAY,YAAY;AACjC,aAAS,YAAY,YAAY;AACjC,aAAS,WAAW,YAAY,SAAS,SAAS;AAClD,UAAM,WAAY,MAAc;AAChC,UAAM,oBACJ,aAAa,SAAS,aAAa,UAAU,WAAW,YAAY,aAAa;AACnF,aAAS,YACP,sBAAsB,QAAQ,YAAY,aAAa,SAAS,IAAI,YAAY,eAAe,SAAS;AAC1G,aAAS,YAAY;AACrB,aAAS,UAAU,OAAO,SAAS,YAAY,OAAO,IAAI,YAAY,UAAU;AAChF,aAAS,OAAO,YAAY,QAAQ;AACpC,aAAS,kBAAkB,YAAY;AACvC,aAAS,mBAAmB,YAAY,oBAAoB;AAC5D,aAAS,gBAAgB,YAAY,iBAAiB;AACtD,aAAS,WACP,iBACC,YAAY,aAAa,YAAY,mBAAmB,YAAY;AACvE,UAAM,gBACJ,OAAQ,KAAa,cAAc,WAAa,KAAa,YAAuB;AACtF,UAAM,oBAAoB,qBAAqB,SAAS,OAAO;AAC/D,aAAS,YACP,iBACA,sBACC,kBAAkB,UAAU,kBAAkB,QAAQ,KAAK;AAC9D,QAAI,CAAC,OAAO,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW;AAC5D,YAAM,UAAU,YAAY,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS,SAAS;AACjF,YAAM,cAAc,gBAAgB,SAAS,IAAI;AACjD,UAAI,OAAO,SAAS,WAAW,GAAG;AAChC,iBAAS,UAAU;AAAA,MACrB;AAAA,IACF;AACA,QAAI,wBAA8C;AAClD,QAAI,wBAA8C;AAClD,QAAI,OAAO,SAAS,YAAY,MAAM;AACpC,YAAM,OAAQ,KAAa;AAC3B,UAAI,SAAS,SAAS,SAAS,SAAS;AACtC,iBAAS,YAAY;AACrB,iBAAS,YACP,SAAS,QAAQ,YAAY,aAAa,SAAS,IAAI,YAAY,eAAe,SAAS;AAAA,MAC/F;AACA,eAAS,UACP,OAAQ,KAAa,YAAY,WAAa,KAAa,UAAqB;AAClF,YAAM,eAAe,OAAQ,KAAa,iBAAiB,WAAY,KAAa,eAAe,YAAY;AAC/G,YAAM,aAAa,OAAQ,KAAa,eAAe,WAAY,KAAa,aAAa;AAC7F,YAAM,mBACJ,OAAQ,KAAa,qBAAqB,WAAY,KAAa,mBAAmB;AACxF,UAAI,gBAAgB,YAAY,WAAW;AACzC,cAAM,SAAS,EAAE,IAAI,YAAY,WAAW,OAAO,cAAc,KAAK,YAAY,cAAc,iBAAiB;AACjH,0BAAkB,QAAQ,IAAI,YAAY,WAAW,MAAM;AAC3D,gCAAwB;AAAA,MAC1B;AACA,YAAM,eAAe,OAAQ,KAAa,iBAAiB,WAAY,KAAa,eAAe;AACnG,YAAM,aAAa,OAAQ,KAAa,eAAe,WAAY,KAAa,aAAa;AAC7F,YAAM,eACJ,OAAQ,KAAa,qBAAqB,WAAY,KAAa,mBAAmB;AACxF,UAAI,gBAAgB,YAAY,kBAAkB;AAChD,cAAM,SAAS;AAAA,UACb,IAAI,YAAY;AAAA,UAChB,OAAO;AAAA,UACP,KAAK;AAAA,UACL,cAAc,gBAAgB;AAAA,QAChC;AACA,0BAAkB,QAAQ,IAAI,YAAY,kBAAkB,MAAM;AAClE,gCAAwB;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,CAAC,yBAAyB,YAAY,aAAa,iBAAiB;AACtE,YAAM,gBACJ,OAAQ,gBAAwB,UAAU,YAAa,gBAAwB,MAAM,KAAK,EAAE,SACvF,gBAAwB,QACzB,YAAY,QAAQ,YAAY;AACtC,YAAM,cACJ,OAAQ,gBAAwB,QAAQ,YAAa,gBAAwB,IAAI,KAAK,EAAE,SACnF,gBAAwB,MACzB;AACN,YAAM,gBACJ,OAAQ,gBAAwB,iBAAiB,WAC5C,gBAAwB,eACzB,OAAQ,gBAAwB,kBAAkB,WAC/C,gBAAwB,gBACzB;AACR,YAAM,kBAAkB,gBAAiB,gBAAwB,SAAS,OAAO,GAAG;AACpF,YAAM,SAAS;AAAA,QACb,IAAI,YAAY;AAAA,QAChB,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW,OAAQ,gBAAwB,cAAc,WAAY,gBAAwB,YAAY;AAAA,QACzG,SAAS,OAAO,SAAS,eAAe,IAAI,kBAAkB;AAAA,MAChE;AACA,wBAAkB,QAAQ,IAAI,YAAY,WAAW,MAAM;AAC3D,8BAAwB;AAAA,IAC1B;AACA,QAAI,CAAC,yBAAyB,YAAY,oBAAoB,iBAAiB;AAC7E,YAAM,gBACJ,OAAQ,gBAAwB,UAAU,YAAa,gBAAwB,MAAM,KAAK,EAAE,SACvF,gBAAwB,QACzB,YAAY,QAAQ,YAAY;AACtC,YAAM,cACJ,OAAQ,gBAAwB,QAAQ,YAAa,gBAAwB,IAAI,KAAK,EAAE,SACnF,gBAAwB,MACzB;AACN,YAAM,gBACJ,OAAQ,gBAAwB,iBAAiB,WAC5C,gBAAwB,eACzB,OAAQ,gBAAwB,kBAAkB,WAC/C,gBAAwB,gBACzB,uBAAuB,gBAAgB,kBAAkB,QAAQ,IAAI,YAAY,aAAa,EAAE,GAAG,gBAAgB;AAC3H,YAAM,kBAAkB,gBAAiB,gBAAwB,SAAS,OAAO,GAAG;AACpF,YAAM,SAAS;AAAA,QACb,IAAI,YAAY;AAAA,QAChB,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW,OAAQ,gBAAwB,cAAc,WAAY,gBAAwB,YAAY;AAAA,QACzG,SAAS,OAAO,SAAS,eAAe,IAAI,kBAAkB;AAAA,MAChE;AACA,wBAAkB,QAAQ,IAAI,YAAY,kBAAkB,MAAM;AAClE,8BAAwB;AAAA,IAC1B;AACA,QAAI,sBAAuB,kBAAiB,qBAAqB;AACjE,QAAI,sBAAuB,kBAAiB,qBAAqB;AACjE,UAAM,eAAe,yBAAyB,WAAsC;AACpF,UAAM,SAAS,EAAE,GAAG,UAAU,GAAG,aAAa;AAC9C,qBAAiB,MAAM;AACvB,gBAAY,OAAO,QAAQ;AAC3B,oBAAgB,CAAC,SAAS,OAAO,CAAC;AAClC,QAAI,YAAY,WAAW;AACzB,WAAK,WAAW,YAAY,WAAW,YAAY,gBAAgB;AAAA,IACrE,OAAO;AACL,sBAAgB,CAAC,CAAC;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,cAAc,sBAAsB,aAAa,YAAY,MAAM,SAAS,CAAC;AAEjF,SACE,oBAAC,UAAO,MAAY,cAAc,CAAC,SAAU,OAAO,aAAa,IAAI,IAAI,YAAY,GACnF;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW,CAAC,UAAU;AACpB,aAAK,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,SAAS;AAC7D,gBAAM,eAAe;AACrB,2BAAiB,SAAS,cAAc,MAAM,GAAG,cAAc;AAAA,QACjE;AACA,YAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAM,eAAe;AACrB,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,MAEA;AAAA,4BAAC,gBACC,8BAAC,eACE,sBACG,EAAE,mCAAmC,WAAW,IAChD,EAAE,kCAAkC,UAAU,GACpD,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YAEC,UAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,aACE,YACI,EAAE,8BAA8B,cAAc,IAC9C,EAAE,iCAAiC,UAAU;AAAA,YAEnD,UAAU;AAAA,YACV,gBAAgB,EAAE,iCAAiC,qBAAgB;AAAA;AAAA,UAZ9D;AAAA,QAaP;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;",
|
|
6
|
-
"names": ["lineMode"]
|
|
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 } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { createCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@open-mercato/ui/primitives/dialog\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\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\";\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\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 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 organizationId: string | null;\n tenantId: string | null;\n initialLine?: SalesLineRecord | null;\n onOpenChange: (open: boolean) => void;\n onSaved?: () => 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-[10px] 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\nexport function LineItemDialog({\n open,\n kind,\n documentId,\n currencyCode,\n organizationId,\n tenantId,\n initialLine,\n onOpenChange,\n onSaved,\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 [, 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 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) => {\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 .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 console.error(\"sales.tax-rates.fetch\", err);\n taxRatesRef.current = [];\n defaultTaxRateRef.current = null;\n setTaxRates([]);\n return [];\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) params.set(\"search\", query.trim());\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 needle = query?.trim().toLowerCase() ?? \"\";\n return items\n .map((item) => {\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 =\n 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\" &&\n 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 const defaultUnit = uomFields.defaultUnit;\n const defaultSalesUnit = uomFields.defaultSalesUnit;\n const defaultSalesUnitQuantity = uomFields.defaultSalesUnitQuantity;\n const matches =\n !needle ||\n title.toLowerCase().includes(needle) ||\n (sku ? sku.toLowerCase().includes(needle) : false);\n if (!matches) return 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: pricingTaxRateId ?? metaTaxRateId ?? null,\n taxRate: Number.isFinite(taxRateValue) ? taxRateValue : null,\n defaultUnit,\n defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(\n defaultSalesUnitQuantity,\n )\n ? defaultSalesUnitQuantity\n : null,\n } satisfies ProductOption,\n } as LookupSelectItem & { option: ProductOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: ProductOption } =>\n Boolean(entry),\n )\n .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 console.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 console.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 console.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 console.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 (!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 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 [documentKey]: String(resolvedDocumentId),\n organizationId: String(resolvedOrg),\n tenantId: String(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 const action = editingId ? updateCrud : createCrud;\n const result = await 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 if (result.ok) {\n if (onSaved) await onSaved();\n closeDialog();\n }\n } catch (err) {\n throw err;\n }\n },\n [\n currencyCode,\n documentId,\n documentKey,\n editingId,\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 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 ...(!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 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 className=\"w-32 rounded border px-2 text-sm\"\n value={mode}\n onChange={(event) => {\n const nextMode =\n event.target.value === \"net\" ? \"net\" : \"gross\";\n setFormValue?.(\"priceMode\", nextMode);\n }}\n >\n <option value=\"gross\">\n {t(\"sales.documents.items.priceGross\", \"Gross\")}\n </option>\n <option value=\"net\">\n {t(\"sales.documents.items.priceNet\", \"Net\")}\n </option>\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 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 className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={resolvedValue ?? \"\"}\n onChange={handleChange}\n disabled={!taxRates.length}\n >\n <option value=\"\">\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 </option>\n {taxRates.map((rate) => (\n <option 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 </option>\n ))}\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 className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => {\n const nextValue = event.target.value || 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 <option value=\"\">\n {t(\"sales.documents.items.quantityUnitSelect\", \"Select unit\")}\n </option>\n {unitOptions.map((option) => (\n <option key={option.code} value={option.code}>\n {option.isBase\n ? `${option.code} (${t(\"sales.documents.items.baseUnitTag\", \"base\")})`\n : option.code}\n </option>\n ))}\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 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 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 option = {\n id: initialLine.productId,\n title: productTitle,\n sku: productSku,\n thumbnailUrl: productThumbnail,\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 };\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) setProductOption(resolvedProductOption);\n if (resolvedVariantOption) setVariantOption(resolvedVariantOption);\n const customValues = extractCustomFieldValues(\n initialLine as Record<string, unknown>,\n );\n const merged = { ...nextForm, ...customValues };\n setInitialValues(merged);\n setLineMode(merged.lineMode);\n setFormResetKey((prev) => prev + 1);\n if (initialLine.productId) {\n void loadProductUnits(initialLine.productId, resolvedProductOption).then(\n (options) => {\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 }, [\n currencyCode,\n findTaxRateIdByValue,\n initialLine,\n loadPrices,\n loadProductUnits,\n open,\n resetForm,\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={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\") {\n event.preventDefault();\n dialogContentRef.current?.querySelector(\"form\")?.requestSubmit();\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeDialog();\n }\n }}\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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",
|
|
6
|
+
"names": ["lineMode", "value"]
|
|
7
7
|
}
|