@open-mercato/core 0.6.6-develop.6529.1.e1de4b3f27 → 0.6.6-develop.6530.1.6d8442bafd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/sales/components/documents/AddressesSection.js +6 -2
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +44 -0
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +59 -38
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/sales/components/documents/AddressesSection.tsx +6 -2
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +46 -0
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +65 -40
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/components/documents/ShipmentDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { useDialogKeyHandler } from '@open-mercato/ui/hooks/useDialogKeyHandler'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { handleSectionMutationError } from './optimisticLock'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { E } from '#generated/entities.ids.generated'\nimport { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatMoney, normalizeNumber } from './lineItemUtils'\nimport type { OrderLine, ShipmentRow } from './shipmentTypes'\nimport { formatAddressString, type AddressFormatStrategy, type AddressValue } from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('sales')\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n currencyCode: string | null\n baseRateNet: number | null\n baseRateGross: number | null\n minPrice: number | null\n avgPrice: number | null\n}\n\ntype ShipmentDialogProps = {\n open: boolean\n mode: 'create' | 'edit'\n shipment: ShipmentRow | null\n lines: OrderLine[]\n orderId: string\n currencyCode?: string | null\n organizationId: string | null\n tenantId: string | null\n documentUpdatedAt?: string | null\n computeAvailable: (lineId: string, excludeShipmentId?: string | null) => number\n shippingAddressSnapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null\n onClose: () => void\n onSaved: () => Promise<void>\n onAddComment?: (body: string) => Promise<void>\n}\n\ntype ShipmentAddressOption = {\n id: string\n label: string\n summary: string\n snapshot: NormalizedAddressSnapshot\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n}\n\nfunction mergeShippingMethodOptions(\n options: ShippingMethodOption[],\n selected: ShippingMethodOption | null,\n): ShippingMethodOption[] {\n if (!selected) return options\n if (options.some((option) => option.id === selected.id)) return options\n return [selected, ...options]\n}\n\nfunction mergeStatusOptions(options: StatusOption[], selected: StatusOption | null): StatusOption[] {\n if (!selected) return options\n if (options.some((option) => option.id === selected.id)) return options\n return [selected, ...options]\n}\n\nfunction mapStatusOption(entry: Record<string, unknown>): StatusOption | null {\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 return { id, value, label, color }\n}\n\nconst ADDRESS_SNAPSHOT_KEY = 'shipmentAddressSnapshot'\nconst ADDRESS_FORMAT: AddressFormatStrategy = 'line_first'\nconst SHIPPING_ADJUSTMENT_TOGGLE_ID = 'shipment-add-shipping-adjustment'\nconst SHIPPING_ADJUSTMENT_LABEL_ID = 'shipment-add-shipping-adjustment-label'\nconst SHIPPING_ADJUSTMENT_HELP_ID = 'shipment-add-shipping-adjustment-help'\n\ntype NormalizedAddressSnapshot = {\n id?: string\n documentAddressId?: string\n name?: string\n purpose?: string\n companyName?: string\n addressLine1?: string\n addressLine2?: string\n buildingNumber?: string\n flatNumber?: string\n city?: string\n region?: string\n postalCode?: string\n country?: string\n latitude?: number\n longitude?: number\n isPrimary?: boolean\n [key: string]: string | number | boolean | null | undefined\n}\n\nconst parseTrackingNumbers = (value: string | null | undefined): string[] =>\n (value ?? '')\n .split(/[\\n,]/g)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n\nconst normalizePrice = (value: unknown): number | null => {\n const parsed = normalizeNumber(value, NaN)\n if (!Number.isFinite(parsed)) return null\n if (parsed <= 0) return null\n return parsed\n}\n\nconst roundAmount = (value: number): number => Math.round((value + Number.EPSILON) * 100) / 100\n\nconst readStringField = (input: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = input[key]\n if (typeof value === 'string' && value.trim().length) return value.trim()\n }\n return null\n}\n\nconst normalizeAddressSnapshot = (\n input?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!input || typeof input !== 'object') return null\n const normalized: NormalizedAddressSnapshot = {}\n const assignString = (target: string, ...sourceKeys: string[]) => {\n const value = readStringField(input as Record<string, unknown>, sourceKeys)\n if (value) normalized[target] = value\n }\n const assignOther = (target: string, value: unknown) => {\n if (typeof value === 'boolean') {\n normalized[target] = value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n normalized[target] = value\n }\n }\n\n const id =\n readStringField(input as Record<string, unknown>, ['customerAddressId', 'customer_address_id']) ??\n readStringField(input as Record<string, unknown>, ['id'])\n if (id) normalized.id = id\n const documentAddressId = readStringField(input as Record<string, unknown>, ['documentAddressId', 'document_address_id'])\n if (documentAddressId && documentAddressId !== id) normalized.documentAddressId = documentAddressId\n\n assignString('name', 'name')\n assignString('purpose', 'purpose')\n assignString('companyName', 'companyName', 'company_name')\n assignString('addressLine1', 'addressLine1', 'address_line1')\n assignString('addressLine2', 'addressLine2', 'address_line2')\n assignString('buildingNumber', 'buildingNumber', 'building_number')\n assignString('flatNumber', 'flatNumber', 'flat_number')\n assignString('city', 'city')\n assignString('region', 'region')\n assignString('postalCode', 'postalCode', 'postal_code')\n assignString('country', 'country')\n assignOther('latitude', (input as any).latitude ?? null)\n assignOther('longitude', (input as any).longitude ?? null)\n assignOther('isPrimary', (input as any).isPrimary ?? (input as any).is_primary ?? false)\n\n return Object.keys(normalized).length ? normalized : null\n}\n\nconst mapSnapshotToAddressValue = (snapshot: NormalizedAddressSnapshot): AddressValue => ({\n addressLine1: readStringField(snapshot, ['addressLine1']),\n addressLine2: readStringField(snapshot, ['addressLine2']),\n buildingNumber: readStringField(snapshot, ['buildingNumber']),\n flatNumber: readStringField(snapshot, ['flatNumber']),\n city: readStringField(snapshot, ['city']),\n region: readStringField(snapshot, ['region']),\n postalCode: readStringField(snapshot, ['postalCode']),\n country: readStringField(snapshot, ['country']),\n companyName: readStringField(snapshot, ['companyName']),\n})\n\nconst snapshotKey = (snapshot?: NormalizedAddressSnapshot | null): string | null => {\n if (!snapshot || typeof snapshot !== 'object') return null\n const normalized: Record<string, unknown> = {}\n Object.keys(snapshot)\n .sort((a, b) => a.localeCompare(b))\n .forEach((key) => {\n normalized[key] = snapshot[key]\n })\n return JSON.stringify(normalized)\n}\n\nconst fallbackAddressId = (id?: string): string => id ?? 'address'\n\nconst buildAddressOption = (\n snapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null,\n opts?: { id?: string; label?: string },\n): ShipmentAddressOption | null => {\n const normalized = normalizeAddressSnapshot(snapshot)\n if (!normalized) return null\n const value = mapSnapshotToAddressValue(normalized)\n const summary = formatAddressString(value, ADDRESS_FORMAT)\n const label: string =\n (opts?.label ?? normalized.name ?? normalized.purpose ?? summary ?? normalized.companyName) ??\n fallbackAddressId(opts?.id)\n const normalizedId =\n (typeof normalized.documentAddressId === 'string' && normalized.documentAddressId) ||\n (typeof normalized.id === 'string' && normalized.id) ||\n null\n const id = opts?.id ?? normalizedId ?? fallbackAddressId(opts?.id)\n return {\n id,\n label: label || id,\n summary: summary || label || id,\n snapshot: normalized,\n }\n}\n\nconst dedupeAddressOptions = (options: ShipmentAddressOption[]): ShipmentAddressOption[] => {\n const seen = new Set<string>()\n return options.reduce<ShipmentAddressOption[]>((acc, option) => {\n const key = snapshotKey(option.snapshot) ?? option.id\n if (seen.has(key)) return acc\n seen.add(key)\n acc.push(option)\n return acc\n }, [])\n}\n\nconst extractShipmentAddressSnapshot = (\n metadata?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!metadata || typeof metadata !== 'object') return null\n const raw = (metadata as any)[ADDRESS_SNAPSHOT_KEY]\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null\n return normalizeAddressSnapshot(raw as Record<string, unknown>)\n}\n\nconst addressOptionsSignature = (options: ShipmentAddressOption[]): string =>\n options.map((option) => `${snapshotKey(option.snapshot) ?? ''}::${option.id}`).join('||')\n\nfunction useStableAddressOptions(options: ShipmentAddressOption[]): ShipmentAddressOption[] {\n const signature = addressOptionsSignature(options)\n const stableRef = React.useRef(options)\n const signatureRef = React.useRef(signature)\n if (signatureRef.current !== signature) {\n signatureRef.current = signature\n stableRef.current = options\n }\n return stableRef.current\n}\n\nexport function ShipmentDialog({\n open,\n mode,\n shipment,\n lines,\n orderId,\n currencyCode,\n organizationId,\n tenantId,\n documentUpdatedAt,\n computeAvailable,\n shippingAddressSnapshot,\n onClose,\n onSaved,\n onAddComment,\n}: ShipmentDialogProps) {\n const t = useT()\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [shippingMethods, setShippingMethods] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<ShipmentAddressOption[]>([])\n const [addressLoading, setAddressLoading] = React.useState(false)\n const [addressError, setAddressError] = React.useState<string | null>(null)\n const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([])\n const [shipmentStatuses, setShipmentStatuses] = React.useState<StatusOption[]>([])\n const [documentStatusLoading, setDocumentStatusLoading] = React.useState(false)\n const [lineStatusLoading, setLineStatusLoading] = React.useState(false)\n const [shipmentStatusLoading, setShipmentStatusLoading] = React.useState(false)\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const itemErrorSetterRef = React.useRef<((errors: Record<string, string | undefined>) => void) | null>(null)\n\n const baseItems = React.useMemo(\n () =>\n lines.reduce<Record<string, string>>((acc, line) => {\n acc[line.id] = ''\n return acc\n }, {}),\n [lines],\n )\n\n const shipmentAddressSnapshot = React.useMemo(\n () => extractShipmentAddressSnapshot(shipment?.metadata),\n [shipment?.metadata],\n )\n\n const normalizedShippingAddressSnapshot = React.useMemo(\n () => normalizeAddressSnapshot(shippingAddressSnapshot ?? null),\n [shippingAddressSnapshot],\n )\n\n const shippingAddressOption = React.useMemo(\n () =>\n buildAddressOption(normalizedShippingAddressSnapshot ?? null, {\n id: 'shipping-address',\n label: t('sales.documents.shipments.shippingAddressLabel', 'Shipping address'),\n }),\n [normalizedShippingAddressSnapshot, t],\n )\n\n const shipmentAddressOption = React.useMemo(\n () =>\n buildAddressOption(shipmentAddressSnapshot ?? null, {\n id: 'shipment-address',\n label: t('sales.documents.shipments.shipmentAddressLabel', 'Shipment address'),\n }),\n [shipmentAddressSnapshot, t],\n )\n\n const computedBaseAddressOptions = React.useMemo(\n () =>\n dedupeAddressOptions(\n [shippingAddressOption, shipmentAddressOption].filter(\n (entry): entry is ShipmentAddressOption => Boolean(entry),\n ),\n ),\n [shipmentAddressOption, shippingAddressOption],\n )\n const baseAddressOptions = useStableAddressOptions(computedBaseAddressOptions)\n\n const preferredAddressId = React.useMemo(() => {\n const shipmentKey = snapshotKey(shipmentAddressSnapshot)\n if (shipmentKey) {\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shipmentKey\n )\n if (match) return match.id\n }\n if (normalizedShippingAddressSnapshot) {\n const shippingKey = snapshotKey(normalizedShippingAddressSnapshot)\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shippingKey\n )\n if (match) return match.id\n }\n return baseAddressOptions[0]?.id ?? ''\n }, [baseAddressOptions, shipmentAddressSnapshot, normalizedShippingAddressSnapshot])\n\n const initialValues = React.useMemo(\n () => ({\n shipmentNumber: shipment?.shipmentNumber ?? '',\n carrierName: shipment?.carrierName ?? '',\n shippingMethodId: shipment?.shippingMethodId ?? '',\n shipmentAddressId: preferredAddressId,\n shippedAt: shipment?.shippedAt ? shipment.shippedAt.slice(0, 10) : '',\n deliveredAt: shipment?.deliveredAt ? shipment.deliveredAt.slice(0, 10) : '',\n trackingNumbers: shipment?.trackingNumbers?.join('\\n') ?? '',\n notes: shipment?.notes ?? '',\n statusEntryId: shipment?.statusEntryId ?? '',\n documentStatusEntryId: '',\n lineStatusEntryId: '',\n postComment: true,\n addShippingAdjustment: !shipment,\n items: lines.reduce<Record<string, string>>((acc, line) => {\n const found = shipment?.items.find((item) => item.orderLineId === line.id)\n acc[line.id] = found ? String(found.quantity) : ''\n return acc\n }, baseItems),\n ...extractCustomFieldValues(shipment),\n }),\n [\n baseItems,\n lines,\n mode,\n preferredAddressId,\n shipment?.carrierName,\n shipment?.customValues,\n shipment?.deliveredAt,\n shipment?.items,\n shipment?.metadata,\n shipment?.notes,\n shipment?.shipmentNumber,\n shipment?.shippedAt,\n shipment?.shippingMethodId,\n shipment?.statusEntryId,\n shipment?.trackingNumbers,\n shippingAddressSnapshot,\n shipmentAddressSnapshot,\n ],\n )\n\n const addressOptionsMap = React.useMemo(() => {\n const map = new Map<string, ShipmentAddressOption>()\n addressOptions.forEach((option) => map.set(option.id, option))\n return map\n }, [addressOptions])\n\n const registerItemErrors = React.useCallback((updater: (errors: Record<string, string | undefined>) => void) => {\n itemErrorSetterRef.current = updater\n }, [])\n\n const clearItemErrors = React.useCallback(() => {\n itemErrorSetterRef.current?.({})\n }, [])\n\n const ensureShippingMethodOption = React.useCallback(\n (option: ShippingMethodOption | null) => {\n if (!option) return\n setShippingMethods((prev) => {\n if (prev.some((entry) => entry.id === option.id)) return prev\n return [...prev, option]\n })\n },\n [],\n )\n\n const mapDocumentAddressOption = React.useCallback(\n (item: Record<string, unknown>): ShipmentAddressOption | null => {\n const snapshot = normalizeAddressSnapshot({\n documentAddressId: readStringField(item, ['id']),\n customerAddressId: readStringField(item, ['customer_address_id', 'customerAddressId']),\n name: readStringField(item, ['name']),\n purpose: readStringField(item, ['purpose']),\n companyName: readStringField(item, ['company_name', 'companyName']),\n addressLine1: readStringField(item, ['address_line1', 'addressLine1']),\n addressLine2: readStringField(item, ['address_line2', 'addressLine2']),\n buildingNumber: readStringField(item, ['building_number', 'buildingNumber']),\n flatNumber: readStringField(item, ['flat_number', 'flatNumber']),\n city: readStringField(item, ['city']),\n region: readStringField(item, ['region']),\n postalCode: readStringField(item, ['postal_code', 'postalCode']),\n country: readStringField(item, ['country']),\n })\n if (!snapshot) return null\n const label =\n snapshot.name ??\n snapshot.purpose ??\n t('sales.documents.shipments.addressFallback', 'Document address')\n const id =\n readStringField(item, ['id']) ??\n readStringField(item, ['customer_address_id', 'customerAddressId']) ??\n undefined\n return buildAddressOption(snapshot, { id, label })\n },\n [t],\n )\n\n const mergeAddressOptions = React.useCallback(\n (options: ShipmentAddressOption[]) =>\n setAddressOptions((prev) => {\n const next = dedupeAddressOptions([...prev, ...options])\n return next.length === prev.length ? prev : next\n }),\n [],\n )\n\n const loadAddressOptions = React.useCallback(async () => {\n setAddressLoading(true)\n try {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '100',\n documentId: orderId,\n documentKind: 'order',\n })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/document-addresses?${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((item) => mapDocumentAddressOption(item))\n .filter((entry): entry is ShipmentAddressOption => Boolean(entry))\n mergeAddressOptions(mapped)\n setAddressError(null)\n return mapped\n } catch (err) {\n logger.error('sales.shipments.addresses.load', { err })\n setAddressError(\n t('sales.documents.shipments.addressLoadError', 'Failed to load addresses.'),\n )\n return []\n } finally {\n setAddressLoading(false)\n }\n }, [mapDocumentAddressOption, mergeAddressOptions, orderId, t])\n\n const buildPriceSubtitle = React.useCallback(\n (option: ShippingMethodOption): string | undefined => {\n const currency = option.currencyCode ?? currencyCode ?? undefined\n const parts: string[] = []\n if (option.avgPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodAvg', 'Avg {{price}}', {\n price: formatMoney(option.avgPrice, currency ?? null),\n }),\n )\n }\n if (option.minPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodMin', 'Min {{price}}', {\n price: formatMoney(option.minPrice, currency ?? null),\n }),\n )\n }\n if (parts.length === 0) return undefined\n return parts.join(' \u00B7 ')\n },\n [currencyCode, t],\n )\n\n const mapShippingMethod = React.useCallback(\n (item: Record<string, unknown>): ShippingMethodOption | null => {\n const id = typeof item.id === 'string' ? item.id : null\n const name = typeof item.name === 'string' ? item.name : null\n const code = typeof (item as any).code === 'string' ? (item as any).code : null\n if (!id || !name) return null\n const baseRateNet = normalizePrice((item as any).baseRateNet ?? (item as any).base_rate_net)\n const baseRateGross = normalizePrice((item as any).baseRateGross ?? (item as any).base_rate_gross)\n const prices = [baseRateNet, baseRateGross].filter((value): value is number => Number.isFinite(value))\n const minPrice = prices.length ? Math.min(...prices) : null\n const avgPrice = prices.length ? prices.reduce((acc, value) => acc + value, 0) / prices.length : null\n return {\n id,\n name,\n code: code ?? id,\n currencyCode: typeof (item as any).currencyCode === 'string' ? (item as any).currencyCode : null,\n baseRateNet,\n baseRateGross,\n minPrice,\n avgPrice,\n }\n },\n [],\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string, opts?: { applyLoadingState?: boolean }): Promise<ShippingMethodOption[]> => {\n const applyLoadingState = opts?.applyLoadingState !== false\n if (applyLoadingState) setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim().length) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const options = items\n .map((item) => mapShippingMethod(item))\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) {\n setShippingMethods((current) =>\n current.reduce(\n (next, selected) => mergeShippingMethodOptions(next, selected),\n options,\n ),\n )\n }\n return options\n } catch (err) {\n logger.error('sales.shipments.shipping-methods.load', { err })\n return []\n } finally {\n if (applyLoadingState) setShippingMethodLoading(false)\n }\n },\n [mapShippingMethod],\n )\n\n const fetchShippingMethodItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!query || !query.trim()) {\n const options =\n shippingMethods.length > 0\n ? shippingMethods\n : await loadShippingMethods(undefined, { applyLoadingState: true })\n return options.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n }\n\n const options = await loadShippingMethods(query, { applyLoadingState: false })\n const needle = query?.trim().toLowerCase() ?? ''\n const filtered = options.filter(\n (opt) =>\n !needle ||\n opt.name.toLowerCase().includes(needle) ||\n opt.code.toLowerCase().includes(needle),\n )\n return filtered.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [buildPriceSubtitle, loadShippingMethods, shippingMethods],\n )\n\n const renderStatusIcon = React.useCallback(\n (color?: string | null) => (\n <span\n className=\"h-2.5 w-2.5 rounded-full border border-border/70\"\n style={color ? { backgroundColor: color, borderColor: color } : undefined}\n />\n ),\n [],\n )\n\n const shippingMethodLookupOptions = React.useMemo<LookupSelectItem[]>(\n () =>\n shippingMethods.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n })),\n [buildPriceSubtitle, shippingMethods],\n )\n\n const loadDocumentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setDocumentStatusLoading(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-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 return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setDocumentStatuses(mapped)\n return mapped\n } catch (err) {\n logger.error('sales.shipments.statuses.load', { err })\n setDocumentStatuses([])\n return []\n } finally {\n setDocumentStatusLoading(false)\n }\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 return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setLineStatuses(mapped)\n return mapped\n } catch (err) {\n logger.error('sales.shipments.line-statuses.load', { err })\n setLineStatuses([])\n return []\n } finally {\n setLineStatusLoading(false)\n }\n }, [])\n\n const loadShipmentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setShipmentStatusLoading(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/shipment-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) => mapStatusOption(entry))\n .filter((entry): entry is StatusOption => Boolean(entry))\n setShipmentStatuses((current) =>\n current.reduce(\n (next, selected) => mergeStatusOptions(next, selected),\n mapped,\n ),\n )\n return mapped\n } catch (err) {\n logger.error('sales.shipments.statuses.load', { err })\n setShipmentStatuses([])\n return []\n } finally {\n setShipmentStatusLoading(false)\n }\n }, [])\n\n const loadShipmentStatusById = React.useCallback(async (statusEntryId: string): Promise<StatusOption | null> => {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipment-statuses?id=${encodeURIComponent(statusEntryId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n return (\n items\n .map((entry) => mapStatusOption(entry))\n .find((entry): entry is StatusOption => entry?.id === statusEntryId) ?? null\n )\n }, [])\n\n const fetchDocumentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n documentStatuses.length && !query ? documentStatuses : await loadDocumentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\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.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [documentStatuses, loadDocumentStatuses, renderStatusIcon],\n )\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options = lineStatuses.length && !query ? lineStatuses : await loadLineStatuses()\n const term = query?.trim().toLowerCase() ?? ''\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.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [lineStatuses, loadLineStatuses, renderStatusIcon],\n )\n\n const fetchShipmentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n shipmentStatuses.length && !query ? shipmentStatuses : await loadShipmentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\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.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [loadShipmentStatuses, renderStatusIcon, shipmentStatuses],\n )\n\n const shipmentStatusLookupOptions = React.useMemo<LookupSelectItem[]>(\n () =>\n shipmentStatuses.map((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n })),\n [renderStatusIcon, shipmentStatuses],\n )\n\n React.useEffect(() => {\n if (!open) return\n setFormResetKey((prev) => prev + 1)\n if (!shippingMethods.length) {\n void loadShippingMethods()\n }\n setAddressOptions(baseAddressOptions)\n setAddressError(null)\n if (!addressOptions.length) {\n void loadAddressOptions()\n }\n if (!shipmentStatuses.length) {\n void loadShipmentStatuses()\n }\n if (!documentStatuses.length && mode === 'create') {\n void loadDocumentStatuses()\n }\n if (!lineStatuses.length && mode === 'create') {\n void loadLineStatuses()\n }\n }, [\n addressOptions.length,\n baseAddressOptions,\n documentStatuses.length,\n loadAddressOptions,\n loadDocumentStatuses,\n loadShipmentStatuses,\n loadLineStatuses,\n loadShippingMethods,\n mode,\n open,\n lineStatuses.length,\n shipmentStatuses.length,\n shippingMethods.length,\n ])\n\n React.useEffect(() => {\n if (shipment?.shippingMethodId) {\n ensureShippingMethodOption(\n mapShippingMethod({\n id: shipment.shippingMethodId,\n name: shipment.shippingMethodName ?? shipment.shippingMethodCode ?? shipment.shippingMethodId,\n code: shipment.shippingMethodCode ?? shipment.shippingMethodId,\n currencyCode: currencyCode ?? null,\n }),\n )\n }\n }, [\n currencyCode,\n ensureShippingMethodOption,\n mapShippingMethod,\n shipment?.shippingMethodCode,\n shipment?.shippingMethodId,\n shipment?.shippingMethodName,\n ])\n\n React.useEffect(() => {\n const statusEntryId = shipment?.statusEntryId\n if (!statusEntryId || shipmentStatuses.some((status) => status.id === statusEntryId)) return\n const fallback =\n shipment.status || shipment.statusLabel\n ? {\n id: statusEntryId,\n value: shipment.status ?? statusEntryId,\n label: shipment.statusLabel ?? shipment.status ?? statusEntryId,\n color: null,\n }\n : null\n setShipmentStatuses((current) => mergeStatusOptions(current, fallback))\n loadShipmentStatusById(statusEntryId)\n .then((selected) => {\n setShipmentStatuses((current) => mergeStatusOptions(current, selected))\n })\n .catch(() => {})\n }, [\n loadShipmentStatusById,\n shipment?.status,\n shipment?.statusEntryId,\n shipment?.statusLabel,\n shipmentStatuses,\n ])\n\n React.useEffect(() => {\n if (!open) return\n mergeAddressOptions(baseAddressOptions)\n }, [baseAddressOptions, mergeAddressOptions, open])\n\n const fetchAddressItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!addressOptions.length && !addressLoading) {\n await loadAddressOptions()\n }\n const needle = query?.trim().toLowerCase() ?? ''\n return addressOptions\n .filter((option) => {\n if (!needle) return true\n return (\n option.label.toLowerCase().includes(needle) ||\n option.summary.toLowerCase().includes(needle)\n )\n })\n .map((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.summary,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <MapPin className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [addressLoading, addressOptions, loadAddressOptions],\n )\n\n const validateItems = React.useCallback(\n (itemsValue: unknown) => {\n const entries = Object.entries((itemsValue ?? {}) as Record<string, unknown>)\n .map(([lineId, value]) => ({ lineId, quantity: Number(value) }))\n .filter((entry) => Number.isFinite(entry.quantity) && entry.quantity > 0)\n if (!entries.length) {\n clearItemErrors()\n throw createCrudFormError(\n t('sales.documents.shipments.errorItems', 'Ship at least one line item.'),\n { items: t('sales.documents.shipments.errorItems', 'Ship at least one line item.') },\n )\n }\n const errors: Record<string, string> = {}\n entries.forEach((entry) => {\n const available = computeAvailable(entry.lineId, shipment?.id ?? null)\n if (entry.quantity > available + 1e-6) {\n errors[entry.lineId] = t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.')\n }\n })\n if (Object.keys(errors).length) {\n itemErrorSetterRef.current?.(errors)\n throw createCrudFormError(\n t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.'),\n { items: t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.') },\n )\n }\n clearItemErrors()\n return entries\n },\n [clearItemErrors, computeAvailable, shipment?.id, t],\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const shipmentNumber =\n typeof values.shipmentNumber === 'string' ? values.shipmentNumber.trim() : ''\n if (!shipmentNumber.length) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorNumber', 'Shipment number is required.'),\n { shipmentNumber: t('sales.documents.shipments.errorNumber', 'Shipment number is required.') },\n )\n }\n const shippingMethodId =\n typeof values.shippingMethodId === 'string' && values.shippingMethodId.trim().length\n ? values.shippingMethodId\n : ''\n if (!shippingMethodId) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.'),\n { shippingMethodId: t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.') },\n )\n }\n const items = validateItems(values.items)\n const shipmentAddressId =\n typeof values.shipmentAddressId === 'string' ? values.shipmentAddressId : ''\n const addressOption = shipmentAddressId\n ? addressOptionsMap.get(shipmentAddressId) ?? null\n : null\n const fallbackAddress = addressOptions.length === 1 ? addressOptions[0] : null\n const addressSnapshot = addressOption?.snapshot ?? fallbackAddress?.snapshot ?? null\n if (!addressSnapshot) {\n const message = addressOptions.length\n ? t('sales.documents.shipments.errorAddress', 'Select an address to ship to.')\n : t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )\n throw createCrudFormError(message, { shipmentAddressId: message })\n }\n const payload: Record<string, unknown> = {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n shipmentNumber,\n shippingMethodId,\n statusEntryId:\n typeof values.statusEntryId === 'string' && values.statusEntryId.trim().length\n ? values.statusEntryId\n : undefined,\n carrierName:\n typeof values.carrierName === 'string' && values.carrierName.trim().length\n ? values.carrierName.trim()\n : undefined,\n trackingNumbers: parseTrackingNumbers(\n typeof values.trackingNumbers === 'string' ? values.trackingNumbers : '',\n ),\n shippedAt:\n typeof values.shippedAt === 'string' && values.shippedAt.trim().length\n ? new Date(values.shippedAt)\n : undefined,\n deliveredAt:\n typeof values.deliveredAt === 'string' && values.deliveredAt.trim().length\n ? new Date(values.deliveredAt)\n : undefined,\n notes:\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : undefined,\n items: items.map((item) => ({\n orderLineId: item.lineId,\n quantity: item.quantity,\n })),\n }\n payload.shipmentAddressSnapshot = addressSnapshot\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n if (Object.keys(customFields).length) {\n payload.customFields = customFields\n }\n if (mode === 'create') {\n const documentStatusEntryId =\n typeof values.documentStatusEntryId === 'string' && values.documentStatusEntryId.trim().length\n ? values.documentStatusEntryId\n : null\n const lineStatusEntryId =\n typeof values.lineStatusEntryId === 'string' && values.lineStatusEntryId.trim().length\n ? values.lineStatusEntryId\n : null\n if (documentStatusEntryId) {\n payload.documentStatusEntryId = documentStatusEntryId\n }\n if (lineStatusEntryId) {\n payload.lineStatusEntryId = lineStatusEntryId\n }\n }\n\n const action = shipment?.id ? updateCrud : createCrud\n let result\n try {\n result = await withScopedApiRequestHeaders(\n // The server guards the PARENT order's aggregate version (Gap B) for\n // both create and update, so send the order's `updated_at`.\n buildOptimisticLockHeader(documentUpdatedAt ?? undefined),\n () =>\n action(\n 'sales/shipments',\n shipment?.id ? { id: shipment.id, ...payload } : payload,\n {\n errorMessage: t('sales.documents.shipments.errorSave', 'Failed to save shipment.'),\n },\n ),\n )\n } catch (err) {\n if (handleSectionMutationError(err, t, () => void onSaved())) {\n return\n }\n throw err\n }\n if (result.ok) {\n const shipmentId = ((result.result as any)?.id as string | undefined) ?? shipment?.id ?? null\n const shouldAddShippingAdjustment =\n mode === 'create' &&\n Boolean(values.addShippingAdjustment) &&\n shipmentId\n if (shouldAddShippingAdjustment) {\n const method = shippingMethods.find((entry) => entry.id === shippingMethodId) ?? null\n const totalQuantity = items.reduce((acc, item) => acc + item.quantity, 0)\n const unitGross =\n method?.baseRateGross ??\n method?.avgPrice ??\n method?.minPrice ??\n (method?.baseRateNet ?? null)\n const unitNet = method?.baseRateNet ?? null\n const amountGross =\n typeof unitGross === 'number' && Number.isFinite(unitGross) && totalQuantity > 0\n ? roundAmount(Math.max(unitGross * totalQuantity, 0))\n : null\n const amountNet =\n typeof unitNet === 'number' && Number.isFinite(unitNet) && totalQuantity > 0\n ? roundAmount(Math.max(unitNet * totalQuantity, 0))\n : null\n const currency =\n typeof method?.currencyCode === 'string' && method.currencyCode.trim().length\n ? method.currencyCode.trim().toUpperCase()\n : typeof currencyCode === 'string' && currencyCode.trim().length\n ? currencyCode.trim().toUpperCase()\n : null\n\n if (amountGross !== null || amountNet !== null) {\n try {\n await createCrud(\n 'sales/order-adjustments',\n {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n scope: 'order',\n kind: 'shipping',\n label:\n method?.name ??\n t('sales.documents.shipments.shippingAdjustmentLabel', 'Shipping cost'),\n code: shipmentNumber ? `ship-${shipmentNumber}` : undefined,\n amountGross: amountGross ?? undefined,\n amountNet: amountNet ?? undefined,\n currencyCode: currency ?? undefined,\n metadata: {\n shipmentId,\n shippingMethodId,\n calculation: 'per_item_base_rate',\n quantity: totalQuantity,\n },\n },\n {\n errorMessage: t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n },\n )\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n } catch (err) {\n logger.warn('sales.shipments.adjustment.create', { err })\n flash(\n t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n 'warning',\n )\n }\n }\n }\n if (values.postComment && onAddComment) {\n const lineTitles = items\n .map((item) => {\n const line = lines.find((entry) => entry.id === item.lineId)\n return `${item.quantity}\u00D7 ${line?.title ?? item.lineId}`\n })\n .join(', ')\n const commentNotes =\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : ''\n const label =\n shipmentNumber.length > 0\n ? `#${shipmentNumber}`\n : shipment?.id\n ? `#${shipment.id.slice(0, 6)}`\n : ''\n const noteParts = [\n t('sales.documents.shipments.comment', 'Shipment {{number}} updated: {{summary}}', {\n number: label || String((result.result as any)?.id ?? ''),\n summary: lineTitles,\n }),\n ]\n if (commentNotes) {\n noteParts.push(\n t('sales.documents.shipments.commentNotes', 'Notes: {{notes}}', { notes: commentNotes }),\n )\n }\n const note = noteParts.join('\\n\\n')\n try {\n await onAddComment(note)\n } catch (err) {\n logger.warn('sales.shipments.comment', { err })\n }\n }\n await onSaved()\n }\n },\n [\n currencyCode,\n documentUpdatedAt,\n lines,\n mode,\n onAddComment,\n onSaved,\n orderId,\n organizationId,\n shipment?.id,\n addressOptions,\n addressOptionsMap,\n shippingMethods,\n t,\n tenantId,\n validateItems,\n ],\n )\n\n const handleSubmitForm = React.useCallback(\n () => dialogContentRef.current?.querySelector('form')?.requestSubmit(),\n [],\n )\n const handleKeyDown = useDialogKeyHandler({\n onConfirm: handleSubmitForm,\n onCancel: onClose,\n })\n\n const fields = React.useMemo<CrudField[]>(() => {\n const shippingAdjustmentLabel = t(\n 'sales.documents.shipments.addShippingAdjustment',\n 'Add shipping cost adjustment for this shipment',\n )\n const shippingAdjustmentHelp = t(\n 'sales.documents.shipments.addShippingAdjustmentHelp',\n 'Create a shipping adjustment using this carrier\u2019s calculated cost.',\n )\n function ShipmentItemsField({ value, setValue }: CrudCustomFieldRenderProps) {\n const quantities = (value as Record<string, string | number> | null) ?? {}\n const [lineErrors, setLineErrors] = React.useState<Record<string, string | undefined>>({})\n\n React.useEffect(() => {\n registerItemErrors(setLineErrors)\n return () => {\n if (itemErrorSetterRef.current === setLineErrors) {\n itemErrorSetterRef.current = null\n }\n }\n }, [])\n\n if (lines.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.shipments.noLines', 'No order lines available.')}\n </p>\n )\n }\n\n return (\n <div className=\"space-y-2 rounded-lg border p-3\">\n {lines.map((line) => {\n const available = computeAvailable(line.id, shipment?.id ?? null)\n const rawValue = quantities[line.id]\n const valueString =\n typeof rawValue === 'number'\n ? rawValue.toString()\n : typeof rawValue === 'string'\n ? rawValue\n : ''\n const disabled = available <= 0 && !valueString\n const lineError = lineErrors[line.id]\n return (\n <div\n key={line.id}\n className={cn(\n 'grid gap-3 md:grid-cols-[1fr,140px]',\n disabled ? 'opacity-60' : null,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {line.thumbnail ? (\n <img\n src={line.thumbnail}\n alt={line.title}\n className=\"h-12 w-12 rounded-md border object-cover\"\n />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md border bg-muted text-xs text-muted-foreground\">\n N/A\n </div>\n )}\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {line.lineNumber ? `#${line.lineNumber} \u00B7 ` : null}\n {line.title}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.shipments.available', '{{count}} available', {\n count: available,\n })}\n </p>\n </div>\n </div>\n <div className=\"space-y-1\">\n <Input\n type=\"number\"\n step=\"1\"\n min=\"0\"\n value={valueString}\n disabled={disabled}\n onChange={(event) => {\n const next = event.target.value\n setValue({ ...(quantities ?? {}), [line.id]: next })\n setLineErrors((prev) => ({ ...prev, [line.id]: undefined }))\n }}\n />\n {lineError ? <p className=\"text-xs text-destructive\">{lineError}</p> : null}\n </div>\n </div>\n )\n })}\n </div>\n )\n }\n\n function ShipmentAddressField({ value, setValue }: CrudCustomFieldRenderProps) {\n const currentValue = typeof value === 'string' ? value : ''\n React.useEffect(() => {\n if (!currentValue && addressOptions.length) {\n setValue(addressOptions[0].id)\n }\n }, [addressOptions, currentValue, setValue])\n const disabled = addressLoading || !addressOptions.length\n return (\n <div className=\"space-y-2\">\n <LookupSelect\n value={currentValue || null}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchAddressItems}\n placeholder={t('sales.documents.shipments.addressPlaceholder', 'Select address')}\n searchPlaceholder={t('sales.documents.shipments.addressSearch', 'Search address')}\n minQuery={0}\n disabled={disabled}\n loading={addressLoading}\n defaultOpen\n />\n {!addressLoading && !addressOptions.length ? (\n <p className=\"text-xs text-destructive\">\n {t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )}\n </p>\n ) : null}\n {addressError ? <p className=\"text-xs text-destructive\">{addressError}</p> : null}\n </div>\n )\n }\n\n const itemsField: CrudField = {\n id: 'items',\n label: t('sales.documents.shipments.items', 'Items to ship'),\n type: 'custom',\n component: ShipmentItemsField,\n }\n\n return [\n {\n id: 'shipmentNumber',\n label: t('sales.documents.shipments.number', 'Shipment number'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'carrierName',\n label: t('sales.documents.shipments.carrier', 'Carrier'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'shippingMethodId',\n label: t('sales.documents.shipments.shippingMethod', 'Shipping method'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShippingMethodItems}\n options={shippingMethodLookupOptions}\n placeholder={t('sales.documents.shipments.shippingMethodPlaceholder', 'Select method')}\n loading={shippingMethodLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'statusEntryId',\n label: t('sales.documents.shipments.status', 'Shipment status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShipmentStatusItems}\n options={shipmentStatusLookupOptions}\n placeholder={t('sales.documents.shipments.statusPlaceholder', 'Select shipment status')}\n loading={shipmentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ...(mode === 'create'\n ? ([\n {\n id: 'documentStatusEntryId',\n label: t('sales.documents.status.changeDocument', 'Change order/quote status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchDocumentStatusItems}\n placeholder={t(\n 'sales.documents.status.documentPlaceholder',\n 'Select new order/quote status',\n )}\n loading={documentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'lineStatusEntryId',\n label: t('sales.documents.status.changeLine', 'Change order/quote item status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchLineStatusItems}\n placeholder={t(\n 'sales.documents.status.linePlaceholder',\n 'Select item status',\n )}\n loading={lineStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ] as CrudField[])\n : []),\n {\n id: 'shipmentAddressId',\n label: t('sales.documents.shipments.address', 'Ship to'),\n type: 'custom',\n required: true,\n component: ShipmentAddressField,\n },\n {\n id: 'shippedAt',\n label: t('sales.documents.shipments.shippedAt', 'Shipped date'),\n type: 'date',\n },\n {\n id: 'deliveredAt',\n label: t('sales.documents.shipments.deliveredAt', 'Delivered date'),\n type: 'date',\n },\n {\n id: 'trackingNumbers',\n label: t('sales.documents.shipments.trackingNumbers', 'Tracking numbers'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={2}\n placeholder={t(\n 'sales.documents.shipments.trackingPlaceholder',\n 'One per line or comma separated',\n )}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'notes',\n label: t('sales.documents.shipments.notes', 'Notes'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'addShippingAdjustment',\n label: shippingAdjustmentLabel,\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-start gap-2\">\n <Switch\n id={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n aria-labelledby={SHIPPING_ADJUSTMENT_LABEL_ID}\n aria-describedby={SHIPPING_ADJUSTMENT_HELP_ID}\n />\n <div className=\"space-y-1\">\n <Label\n htmlFor={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n id={SHIPPING_ADJUSTMENT_LABEL_ID}\n className=\"sr-only\"\n >\n {shippingAdjustmentLabel}\n </Label>\n <p id={SHIPPING_ADJUSTMENT_HELP_ID} className=\"text-xs text-muted-foreground\">\n {shippingAdjustmentHelp}\n </p>\n </div>\n </div>\n ),\n },\n itemsField,\n {\n id: 'postComment',\n label: t('sales.documents.shipments.addComment', 'Add note to comments'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"shipment-comment\"\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n />\n <Label htmlFor=\"shipment-comment\" className=\"cursor-pointer\">\n {t('sales.documents.shipments.addComment', 'Add note to comments')}\n </Label>\n </div>\n ),\n },\n ]\n }, [\n addressError,\n addressLoading,\n addressOptions,\n computeAvailable,\n documentStatusLoading,\n fetchAddressItems,\n fetchDocumentStatusItems,\n fetchLineStatusItems,\n fetchShipmentStatusItems,\n fetchShippingMethodItems,\n lineStatusLoading,\n lines,\n mode,\n registerItemErrors,\n shipment?.id,\n shipmentStatusLoading,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => {\n const base: CrudFormGroup[] = [\n {\n id: 'shipmentDetails',\n title: mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment'),\n column: 1,\n fields: ['shipmentNumber', 'carrierName', 'shippingMethodId', 'statusEntryId', 'shipmentAddressId'],\n },\n ]\n if (mode === 'create') {\n base.push({\n id: 'statusChanges',\n title: t('sales.documents.status.sectionTitle', 'Status changes'),\n column: 2,\n fields: ['documentStatusEntryId', 'lineStatusEntryId'],\n })\n }\n base.push(\n {\n id: 'tracking',\n title: t('sales.documents.shipments.trackingGroup', 'Tracking information'),\n column: 2,\n fields: ['shippedAt', 'deliveredAt', 'trackingNumbers', 'notes'],\n },\n {\n id: 'items',\n column: 1,\n fields: ['items', 'addShippingAdjustment', 'postComment'],\n },\n {\n id: 'shipmentCustomFields',\n title: t('entities.customFields.title', 'Custom fields'),\n column: 2,\n kind: 'customFields',\n },\n )\n return base\n },\n [mode, t],\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => (!next ? onClose() : undefined)}>\n <DialogContent\n ref={dialogContentRef}\n className=\"sm:max-w-5xl\"\n onKeyDown={handleKeyDown}\n >\n <DialogHeader>\n <DialogTitle>\n {mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n key={formResetKey}\n embedded\n entityId={E.sales.sales_shipment}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n submitLabel={t('sales.documents.shipments.saveShortcut', 'Save (\u2318/Ctrl+Enter)')}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.shipments.loading', 'Loading shipments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n isLoading={shippingMethodLoading || addressLoading}\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { useDialogKeyHandler } from '@open-mercato/ui/hooks/useDialogKeyHandler'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { handleSectionMutationError } from './optimisticLock'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { E } from '#generated/entities.ids.generated'\nimport { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatMoney, normalizeNumber } from './lineItemUtils'\nimport type { OrderLine, ShipmentRow } from './shipmentTypes'\nimport { formatAddressString, type AddressFormatStrategy, type AddressValue } from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('sales')\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n currencyCode: string | null\n baseRateNet: number | null\n baseRateGross: number | null\n minPrice: number | null\n avgPrice: number | null\n}\n\ntype ShipmentDialogProps = {\n open: boolean\n mode: 'create' | 'edit'\n shipment: ShipmentRow | null\n lines: OrderLine[]\n orderId: string\n currencyCode?: string | null\n organizationId: string | null\n tenantId: string | null\n documentUpdatedAt?: string | null\n computeAvailable: (lineId: string, excludeShipmentId?: string | null) => number\n shippingAddressSnapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null\n onClose: () => void\n onSaved: () => Promise<void>\n onAddComment?: (body: string) => Promise<void>\n}\n\ntype ShipmentAddressOption = {\n id: string\n label: string\n summary: string\n snapshot: NormalizedAddressSnapshot\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n}\n\nfunction mergeShippingMethodOptions(\n options: ShippingMethodOption[],\n selected: ShippingMethodOption | null,\n): ShippingMethodOption[] {\n if (!selected) return options\n if (options.some((option) => option.id === selected.id)) return options\n return [selected, ...options]\n}\n\nfunction mergeStatusOptions(options: StatusOption[], selected: StatusOption | null): StatusOption[] {\n if (!selected) return options\n if (options.some((option) => option.id === selected.id)) return options\n return [selected, ...options]\n}\n\nfunction mapStatusOption(entry: Record<string, unknown>): StatusOption | null {\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 return { id, value, label, color }\n}\n\nconst ADDRESS_SNAPSHOT_KEY = 'shipmentAddressSnapshot'\nconst ADDRESS_FORMAT: AddressFormatStrategy = 'line_first'\nconst SHIPPING_ADJUSTMENT_TOGGLE_ID = 'shipment-add-shipping-adjustment'\nconst SHIPPING_ADJUSTMENT_LABEL_ID = 'shipment-add-shipping-adjustment-label'\nconst SHIPPING_ADJUSTMENT_HELP_ID = 'shipment-add-shipping-adjustment-help'\n\ntype NormalizedAddressSnapshot = {\n id?: string\n documentAddressId?: string\n name?: string\n purpose?: string\n companyName?: string\n addressLine1?: string\n addressLine2?: string\n buildingNumber?: string\n flatNumber?: string\n city?: string\n region?: string\n postalCode?: string\n country?: string\n latitude?: number\n longitude?: number\n isPrimary?: boolean\n [key: string]: string | number | boolean | null | undefined\n}\n\nconst parseTrackingNumbers = (value: string | null | undefined): string[] =>\n (value ?? '')\n .split(/[\\n,]/g)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n\nconst normalizePrice = (value: unknown): number | null => {\n const parsed = normalizeNumber(value, NaN)\n if (!Number.isFinite(parsed)) return null\n if (parsed <= 0) return null\n return parsed\n}\n\nconst roundAmount = (value: number): number => Math.round((value + Number.EPSILON) * 100) / 100\n\nconst readStringField = (input: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = input[key]\n if (typeof value === 'string' && value.trim().length) return value.trim()\n }\n return null\n}\n\nconst normalizeAddressSnapshot = (\n input?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!input || typeof input !== 'object') return null\n const normalized: NormalizedAddressSnapshot = {}\n const assignString = (target: string, ...sourceKeys: string[]) => {\n const value = readStringField(input as Record<string, unknown>, sourceKeys)\n if (value) normalized[target] = value\n }\n const assignOther = (target: string, value: unknown) => {\n if (typeof value === 'boolean') {\n normalized[target] = value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n normalized[target] = value\n }\n }\n\n const id =\n readStringField(input as Record<string, unknown>, ['customerAddressId', 'customer_address_id']) ??\n readStringField(input as Record<string, unknown>, ['id'])\n if (id) normalized.id = id\n const documentAddressId = readStringField(input as Record<string, unknown>, ['documentAddressId', 'document_address_id'])\n if (documentAddressId && documentAddressId !== id) normalized.documentAddressId = documentAddressId\n\n assignString('name', 'name')\n assignString('purpose', 'purpose')\n assignString('companyName', 'companyName', 'company_name')\n assignString('addressLine1', 'addressLine1', 'address_line1')\n assignString('addressLine2', 'addressLine2', 'address_line2')\n assignString('buildingNumber', 'buildingNumber', 'building_number')\n assignString('flatNumber', 'flatNumber', 'flat_number')\n assignString('city', 'city')\n assignString('region', 'region')\n assignString('postalCode', 'postalCode', 'postal_code')\n assignString('country', 'country')\n assignOther('latitude', (input as any).latitude ?? null)\n assignOther('longitude', (input as any).longitude ?? null)\n assignOther('isPrimary', (input as any).isPrimary ?? (input as any).is_primary ?? false)\n\n return Object.keys(normalized).length ? normalized : null\n}\n\nconst mapSnapshotToAddressValue = (snapshot: NormalizedAddressSnapshot): AddressValue => ({\n addressLine1: readStringField(snapshot, ['addressLine1']),\n addressLine2: readStringField(snapshot, ['addressLine2']),\n buildingNumber: readStringField(snapshot, ['buildingNumber']),\n flatNumber: readStringField(snapshot, ['flatNumber']),\n city: readStringField(snapshot, ['city']),\n region: readStringField(snapshot, ['region']),\n postalCode: readStringField(snapshot, ['postalCode']),\n country: readStringField(snapshot, ['country']),\n companyName: readStringField(snapshot, ['companyName']),\n})\n\nconst snapshotKey = (snapshot?: NormalizedAddressSnapshot | null): string | null => {\n if (!snapshot || typeof snapshot !== 'object') return null\n const normalized: Record<string, unknown> = {}\n Object.keys(snapshot)\n .sort((a, b) => a.localeCompare(b))\n .forEach((key) => {\n normalized[key] = snapshot[key]\n })\n return JSON.stringify(normalized)\n}\n\nconst fallbackAddressId = (id?: string): string => id ?? 'address'\n\nconst buildAddressOption = (\n snapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null,\n opts?: { id?: string; label?: string },\n): ShipmentAddressOption | null => {\n const normalized = normalizeAddressSnapshot(snapshot)\n if (!normalized) return null\n const value = mapSnapshotToAddressValue(normalized)\n const summary = formatAddressString(value, ADDRESS_FORMAT)\n const label: string =\n (opts?.label ?? normalized.name ?? normalized.purpose ?? summary ?? normalized.companyName) ??\n fallbackAddressId(opts?.id)\n const normalizedId =\n (typeof normalized.documentAddressId === 'string' && normalized.documentAddressId) ||\n (typeof normalized.id === 'string' && normalized.id) ||\n null\n const id = opts?.id ?? normalizedId ?? fallbackAddressId(opts?.id)\n return {\n id,\n label: label || id,\n summary: summary || label || id,\n snapshot: normalized,\n }\n}\n\nconst dedupeAddressOptions = (options: ShipmentAddressOption[]): ShipmentAddressOption[] => {\n const seen = new Set<string>()\n return options.reduce<ShipmentAddressOption[]>((acc, option) => {\n const key = snapshotKey(option.snapshot) ?? option.id\n if (seen.has(key)) return acc\n seen.add(key)\n acc.push(option)\n return acc\n }, [])\n}\n\nconst extractShipmentAddressSnapshot = (\n metadata?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!metadata || typeof metadata !== 'object') return null\n const raw = (metadata as any)[ADDRESS_SNAPSHOT_KEY]\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null\n return normalizeAddressSnapshot(raw as Record<string, unknown>)\n}\n\nconst addressOptionsSignature = (options: ShipmentAddressOption[]): string =>\n options.map((option) => `${snapshotKey(option.snapshot) ?? ''}::${option.id}`).join('||')\n\nfunction useStableAddressOptions(options: ShipmentAddressOption[]): ShipmentAddressOption[] {\n const signature = addressOptionsSignature(options)\n const stableRef = React.useRef(options)\n const signatureRef = React.useRef(signature)\n if (signatureRef.current !== signature) {\n signatureRef.current = signature\n stableRef.current = options\n }\n return stableRef.current\n}\n\nexport function ShipmentDialog({\n open,\n mode,\n shipment,\n lines,\n orderId,\n currencyCode,\n organizationId,\n tenantId,\n documentUpdatedAt,\n computeAvailable,\n shippingAddressSnapshot,\n onClose,\n onSaved,\n onAddComment,\n}: ShipmentDialogProps) {\n const t = useT()\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [shippingMethods, setShippingMethods] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<ShipmentAddressOption[]>([])\n const [addressLoading, setAddressLoading] = React.useState(false)\n const [addressError, setAddressError] = React.useState<string | null>(null)\n const addressLoadPromiseRef = React.useRef<{\n orderId: string\n promise: Promise<ShipmentAddressOption[]>\n } | null>(null)\n const currentAddressOrderIdRef = React.useRef(orderId)\n currentAddressOrderIdRef.current = orderId\n const initializedDialogKeyRef = React.useRef<string | null>(null)\n const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([])\n const [shipmentStatuses, setShipmentStatuses] = React.useState<StatusOption[]>([])\n const [documentStatusLoading, setDocumentStatusLoading] = React.useState(false)\n const [lineStatusLoading, setLineStatusLoading] = React.useState(false)\n const [shipmentStatusLoading, setShipmentStatusLoading] = React.useState(false)\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const itemErrorSetterRef = React.useRef<((errors: Record<string, string | undefined>) => void) | null>(null)\n\n const baseItems = React.useMemo(\n () =>\n lines.reduce<Record<string, string>>((acc, line) => {\n acc[line.id] = ''\n return acc\n }, {}),\n [lines],\n )\n\n const shipmentAddressSnapshot = React.useMemo(\n () => extractShipmentAddressSnapshot(shipment?.metadata),\n [shipment?.metadata],\n )\n\n const normalizedShippingAddressSnapshot = React.useMemo(\n () => normalizeAddressSnapshot(shippingAddressSnapshot ?? null),\n [shippingAddressSnapshot],\n )\n\n const shippingAddressOption = React.useMemo(\n () =>\n buildAddressOption(normalizedShippingAddressSnapshot ?? null, {\n id: 'shipping-address',\n label: t('sales.documents.shipments.shippingAddressLabel', 'Shipping address'),\n }),\n [normalizedShippingAddressSnapshot, t],\n )\n\n const shipmentAddressOption = React.useMemo(\n () =>\n buildAddressOption(shipmentAddressSnapshot ?? null, {\n id: 'shipment-address',\n label: t('sales.documents.shipments.shipmentAddressLabel', 'Shipment address'),\n }),\n [shipmentAddressSnapshot, t],\n )\n\n const computedBaseAddressOptions = React.useMemo(\n () =>\n dedupeAddressOptions(\n [shippingAddressOption, shipmentAddressOption].filter(\n (entry): entry is ShipmentAddressOption => Boolean(entry),\n ),\n ),\n [shipmentAddressOption, shippingAddressOption],\n )\n const baseAddressOptions = useStableAddressOptions(computedBaseAddressOptions)\n\n const preferredAddressId = React.useMemo(() => {\n const shipmentKey = snapshotKey(shipmentAddressSnapshot)\n if (shipmentKey) {\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shipmentKey\n )\n if (match) return match.id\n }\n if (normalizedShippingAddressSnapshot) {\n const shippingKey = snapshotKey(normalizedShippingAddressSnapshot)\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shippingKey\n )\n if (match) return match.id\n }\n return baseAddressOptions[0]?.id ?? ''\n }, [baseAddressOptions, shipmentAddressSnapshot, normalizedShippingAddressSnapshot])\n\n const initialValues = React.useMemo(\n () => ({\n shipmentNumber: shipment?.shipmentNumber ?? '',\n carrierName: shipment?.carrierName ?? '',\n shippingMethodId: shipment?.shippingMethodId ?? '',\n shipmentAddressId: preferredAddressId,\n shippedAt: shipment?.shippedAt ? shipment.shippedAt.slice(0, 10) : '',\n deliveredAt: shipment?.deliveredAt ? shipment.deliveredAt.slice(0, 10) : '',\n trackingNumbers: shipment?.trackingNumbers?.join('\\n') ?? '',\n notes: shipment?.notes ?? '',\n statusEntryId: shipment?.statusEntryId ?? '',\n documentStatusEntryId: '',\n lineStatusEntryId: '',\n postComment: true,\n addShippingAdjustment: !shipment,\n items: lines.reduce<Record<string, string>>((acc, line) => {\n const found = shipment?.items.find((item) => item.orderLineId === line.id)\n acc[line.id] = found ? String(found.quantity) : ''\n return acc\n }, baseItems),\n ...extractCustomFieldValues(shipment),\n }),\n [\n baseItems,\n lines,\n mode,\n preferredAddressId,\n shipment?.carrierName,\n shipment?.customValues,\n shipment?.deliveredAt,\n shipment?.items,\n shipment?.metadata,\n shipment?.notes,\n shipment?.shipmentNumber,\n shipment?.shippedAt,\n shipment?.shippingMethodId,\n shipment?.statusEntryId,\n shipment?.trackingNumbers,\n shippingAddressSnapshot,\n shipmentAddressSnapshot,\n ],\n )\n\n const addressOptionsMap = React.useMemo(() => {\n const map = new Map<string, ShipmentAddressOption>()\n addressOptions.forEach((option) => map.set(option.id, option))\n return map\n }, [addressOptions])\n\n const registerItemErrors = React.useCallback((updater: (errors: Record<string, string | undefined>) => void) => {\n itemErrorSetterRef.current = updater\n }, [])\n\n const clearItemErrors = React.useCallback(() => {\n itemErrorSetterRef.current?.({})\n }, [])\n\n const ensureShippingMethodOption = React.useCallback(\n (option: ShippingMethodOption | null) => {\n if (!option) return\n setShippingMethods((prev) => {\n if (prev.some((entry) => entry.id === option.id)) return prev\n return [...prev, option]\n })\n },\n [],\n )\n\n const mapDocumentAddressOption = React.useCallback(\n (item: Record<string, unknown>): ShipmentAddressOption | null => {\n const snapshot = normalizeAddressSnapshot({\n documentAddressId: readStringField(item, ['id']),\n customerAddressId: readStringField(item, ['customer_address_id', 'customerAddressId']),\n name: readStringField(item, ['name']),\n purpose: readStringField(item, ['purpose']),\n companyName: readStringField(item, ['company_name', 'companyName']),\n addressLine1: readStringField(item, ['address_line1', 'addressLine1']),\n addressLine2: readStringField(item, ['address_line2', 'addressLine2']),\n buildingNumber: readStringField(item, ['building_number', 'buildingNumber']),\n flatNumber: readStringField(item, ['flat_number', 'flatNumber']),\n city: readStringField(item, ['city']),\n region: readStringField(item, ['region']),\n postalCode: readStringField(item, ['postal_code', 'postalCode']),\n country: readStringField(item, ['country']),\n })\n if (!snapshot) return null\n const label =\n snapshot.name ??\n snapshot.purpose ??\n t('sales.documents.shipments.addressFallback', 'Document address')\n const id =\n readStringField(item, ['id']) ??\n readStringField(item, ['customer_address_id', 'customerAddressId']) ??\n undefined\n return buildAddressOption(snapshot, { id, label })\n },\n [t],\n )\n\n const mergeAddressOptions = React.useCallback(\n (options: ShipmentAddressOption[]) =>\n setAddressOptions((prev) => {\n const next = dedupeAddressOptions([...prev, ...options])\n return next.length === prev.length ? prev : next\n }),\n [],\n )\n\n const loadAddressOptions = React.useCallback((): Promise<ShipmentAddressOption[]> => {\n const activeRequest = addressLoadPromiseRef.current\n if (activeRequest?.orderId === orderId) return activeRequest.promise\n\n setAddressLoading(true)\n const request = (async () => {\n try {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '100',\n documentId: orderId,\n documentKind: 'order',\n })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/document-addresses?${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((item) => mapDocumentAddressOption(item))\n .filter((entry): entry is ShipmentAddressOption => Boolean(entry))\n const loadedOptions = dedupeAddressOptions([...baseAddressOptions, ...mapped])\n if (currentAddressOrderIdRef.current !== orderId) return baseAddressOptions\n mergeAddressOptions(loadedOptions)\n setAddressError(null)\n return loadedOptions\n } catch (err) {\n logger.error('sales.shipments.addresses.load', { err })\n if (currentAddressOrderIdRef.current === orderId) {\n setAddressError(\n t('sales.documents.shipments.addressLoadError', 'Failed to load addresses.'),\n )\n }\n return baseAddressOptions\n }\n })()\n addressLoadPromiseRef.current = { orderId, promise: request }\n void request.then(() => {\n if (addressLoadPromiseRef.current?.promise === request) {\n addressLoadPromiseRef.current = null\n setAddressLoading(false)\n }\n })\n return request\n }, [baseAddressOptions, mapDocumentAddressOption, mergeAddressOptions, orderId, t])\n\n const buildPriceSubtitle = React.useCallback(\n (option: ShippingMethodOption): string | undefined => {\n const currency = option.currencyCode ?? currencyCode ?? undefined\n const parts: string[] = []\n if (option.avgPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodAvg', 'Avg {{price}}', {\n price: formatMoney(option.avgPrice, currency ?? null),\n }),\n )\n }\n if (option.minPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodMin', 'Min {{price}}', {\n price: formatMoney(option.minPrice, currency ?? null),\n }),\n )\n }\n if (parts.length === 0) return undefined\n return parts.join(' \u00B7 ')\n },\n [currencyCode, t],\n )\n\n const mapShippingMethod = React.useCallback(\n (item: Record<string, unknown>): ShippingMethodOption | null => {\n const id = typeof item.id === 'string' ? item.id : null\n const name = typeof item.name === 'string' ? item.name : null\n const code = typeof (item as any).code === 'string' ? (item as any).code : null\n if (!id || !name) return null\n const baseRateNet = normalizePrice((item as any).baseRateNet ?? (item as any).base_rate_net)\n const baseRateGross = normalizePrice((item as any).baseRateGross ?? (item as any).base_rate_gross)\n const prices = [baseRateNet, baseRateGross].filter((value): value is number => Number.isFinite(value))\n const minPrice = prices.length ? Math.min(...prices) : null\n const avgPrice = prices.length ? prices.reduce((acc, value) => acc + value, 0) / prices.length : null\n return {\n id,\n name,\n code: code ?? id,\n currencyCode: typeof (item as any).currencyCode === 'string' ? (item as any).currencyCode : null,\n baseRateNet,\n baseRateGross,\n minPrice,\n avgPrice,\n }\n },\n [],\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string, opts?: { applyLoadingState?: boolean }): Promise<ShippingMethodOption[]> => {\n const applyLoadingState = opts?.applyLoadingState !== false\n if (applyLoadingState) setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim().length) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const options = items\n .map((item) => mapShippingMethod(item))\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) {\n setShippingMethods((current) =>\n current.reduce(\n (next, selected) => mergeShippingMethodOptions(next, selected),\n options,\n ),\n )\n }\n return options\n } catch (err) {\n logger.error('sales.shipments.shipping-methods.load', { err })\n return []\n } finally {\n if (applyLoadingState) setShippingMethodLoading(false)\n }\n },\n [mapShippingMethod],\n )\n\n const fetchShippingMethodItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!query || !query.trim()) {\n const options =\n shippingMethods.length > 0\n ? shippingMethods\n : await loadShippingMethods(undefined, { applyLoadingState: true })\n return options.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n }\n\n const options = await loadShippingMethods(query, { applyLoadingState: false })\n const needle = query?.trim().toLowerCase() ?? ''\n const filtered = options.filter(\n (opt) =>\n !needle ||\n opt.name.toLowerCase().includes(needle) ||\n opt.code.toLowerCase().includes(needle),\n )\n return filtered.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [buildPriceSubtitle, loadShippingMethods, shippingMethods],\n )\n\n const renderStatusIcon = React.useCallback(\n (color?: string | null) => (\n <span\n className=\"h-2.5 w-2.5 rounded-full border border-border/70\"\n style={color ? { backgroundColor: color, borderColor: color } : undefined}\n />\n ),\n [],\n )\n\n const shippingMethodLookupOptions = React.useMemo<LookupSelectItem[]>(\n () =>\n shippingMethods.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n })),\n [buildPriceSubtitle, shippingMethods],\n )\n\n const loadDocumentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setDocumentStatusLoading(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-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 return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setDocumentStatuses(mapped)\n return mapped\n } catch (err) {\n logger.error('sales.shipments.statuses.load', { err })\n setDocumentStatuses([])\n return []\n } finally {\n setDocumentStatusLoading(false)\n }\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 return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setLineStatuses(mapped)\n return mapped\n } catch (err) {\n logger.error('sales.shipments.line-statuses.load', { err })\n setLineStatuses([])\n return []\n } finally {\n setLineStatusLoading(false)\n }\n }, [])\n\n const loadShipmentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setShipmentStatusLoading(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/shipment-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) => mapStatusOption(entry))\n .filter((entry): entry is StatusOption => Boolean(entry))\n setShipmentStatuses((current) =>\n current.reduce(\n (next, selected) => mergeStatusOptions(next, selected),\n mapped,\n ),\n )\n return mapped\n } catch (err) {\n logger.error('sales.shipments.statuses.load', { err })\n setShipmentStatuses([])\n return []\n } finally {\n setShipmentStatusLoading(false)\n }\n }, [])\n\n const loadShipmentStatusById = React.useCallback(async (statusEntryId: string): Promise<StatusOption | null> => {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipment-statuses?id=${encodeURIComponent(statusEntryId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n return (\n items\n .map((entry) => mapStatusOption(entry))\n .find((entry): entry is StatusOption => entry?.id === statusEntryId) ?? null\n )\n }, [])\n\n const fetchDocumentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n documentStatuses.length && !query ? documentStatuses : await loadDocumentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\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.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [documentStatuses, loadDocumentStatuses, renderStatusIcon],\n )\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options = lineStatuses.length && !query ? lineStatuses : await loadLineStatuses()\n const term = query?.trim().toLowerCase() ?? ''\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.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [lineStatuses, loadLineStatuses, renderStatusIcon],\n )\n\n const fetchShipmentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n shipmentStatuses.length && !query ? shipmentStatuses : await loadShipmentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\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.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [loadShipmentStatuses, renderStatusIcon, shipmentStatuses],\n )\n\n const shipmentStatusLookupOptions = React.useMemo<LookupSelectItem[]>(\n () =>\n shipmentStatuses.map((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n })),\n [renderStatusIcon, shipmentStatuses],\n )\n\n React.useEffect(() => {\n if (!open) {\n initializedDialogKeyRef.current = null\n return\n }\n const dialogKey = `${orderId}:${mode}:${shipment?.id ?? 'new'}`\n if (initializedDialogKeyRef.current === dialogKey) return\n initializedDialogKeyRef.current = dialogKey\n setFormResetKey((prev) => prev + 1)\n if (!shippingMethods.length) {\n void loadShippingMethods()\n }\n setAddressOptions(baseAddressOptions)\n setAddressError(null)\n void loadAddressOptions()\n if (!shipmentStatuses.length) {\n void loadShipmentStatuses()\n }\n if (!documentStatuses.length && mode === 'create') {\n void loadDocumentStatuses()\n }\n if (!lineStatuses.length && mode === 'create') {\n void loadLineStatuses()\n }\n }, [\n baseAddressOptions,\n documentStatuses.length,\n loadAddressOptions,\n loadDocumentStatuses,\n loadShipmentStatuses,\n loadLineStatuses,\n loadShippingMethods,\n mode,\n open,\n orderId,\n shipment?.id,\n lineStatuses.length,\n shipmentStatuses.length,\n shippingMethods.length,\n ])\n\n React.useEffect(() => {\n if (shipment?.shippingMethodId) {\n ensureShippingMethodOption(\n mapShippingMethod({\n id: shipment.shippingMethodId,\n name: shipment.shippingMethodName ?? shipment.shippingMethodCode ?? shipment.shippingMethodId,\n code: shipment.shippingMethodCode ?? shipment.shippingMethodId,\n currencyCode: currencyCode ?? null,\n }),\n )\n }\n }, [\n currencyCode,\n ensureShippingMethodOption,\n mapShippingMethod,\n shipment?.shippingMethodCode,\n shipment?.shippingMethodId,\n shipment?.shippingMethodName,\n ])\n\n React.useEffect(() => {\n const statusEntryId = shipment?.statusEntryId\n if (!statusEntryId || shipmentStatuses.some((status) => status.id === statusEntryId)) return\n const fallback =\n shipment.status || shipment.statusLabel\n ? {\n id: statusEntryId,\n value: shipment.status ?? statusEntryId,\n label: shipment.statusLabel ?? shipment.status ?? statusEntryId,\n color: null,\n }\n : null\n setShipmentStatuses((current) => mergeStatusOptions(current, fallback))\n loadShipmentStatusById(statusEntryId)\n .then((selected) => {\n setShipmentStatuses((current) => mergeStatusOptions(current, selected))\n })\n .catch(() => {})\n }, [\n loadShipmentStatusById,\n shipment?.status,\n shipment?.statusEntryId,\n shipment?.statusLabel,\n shipmentStatuses,\n ])\n\n React.useEffect(() => {\n if (!open) return\n mergeAddressOptions(baseAddressOptions)\n }, [baseAddressOptions, mergeAddressOptions, open])\n\n const fetchAddressItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options = addressOptions.length ? addressOptions : await loadAddressOptions()\n const needle = query?.trim().toLowerCase() ?? ''\n return options\n .filter((option) => {\n if (!needle) return true\n return (\n option.label.toLowerCase().includes(needle) ||\n option.summary.toLowerCase().includes(needle)\n )\n })\n .map((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.summary,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <MapPin className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [addressOptions, loadAddressOptions],\n )\n\n const validateItems = React.useCallback(\n (itemsValue: unknown) => {\n const entries = Object.entries((itemsValue ?? {}) as Record<string, unknown>)\n .map(([lineId, value]) => ({ lineId, quantity: Number(value) }))\n .filter((entry) => Number.isFinite(entry.quantity) && entry.quantity > 0)\n if (!entries.length) {\n clearItemErrors()\n throw createCrudFormError(\n t('sales.documents.shipments.errorItems', 'Ship at least one line item.'),\n { items: t('sales.documents.shipments.errorItems', 'Ship at least one line item.') },\n )\n }\n const errors: Record<string, string> = {}\n entries.forEach((entry) => {\n const available = computeAvailable(entry.lineId, shipment?.id ?? null)\n if (entry.quantity > available + 1e-6) {\n errors[entry.lineId] = t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.')\n }\n })\n if (Object.keys(errors).length) {\n itemErrorSetterRef.current?.(errors)\n throw createCrudFormError(\n t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.'),\n { items: t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.') },\n )\n }\n clearItemErrors()\n return entries\n },\n [clearItemErrors, computeAvailable, shipment?.id, t],\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const shipmentNumber =\n typeof values.shipmentNumber === 'string' ? values.shipmentNumber.trim() : ''\n if (!shipmentNumber.length) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorNumber', 'Shipment number is required.'),\n { shipmentNumber: t('sales.documents.shipments.errorNumber', 'Shipment number is required.') },\n )\n }\n const shippingMethodId =\n typeof values.shippingMethodId === 'string' && values.shippingMethodId.trim().length\n ? values.shippingMethodId\n : ''\n if (!shippingMethodId) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.'),\n { shippingMethodId: t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.') },\n )\n }\n const items = validateItems(values.items)\n const shipmentAddressId =\n typeof values.shipmentAddressId === 'string' ? values.shipmentAddressId : ''\n const addressOption = shipmentAddressId\n ? addressOptionsMap.get(shipmentAddressId) ?? null\n : null\n const fallbackAddress = addressOptions.length === 1 ? addressOptions[0] : null\n const addressSnapshot = addressOption?.snapshot ?? fallbackAddress?.snapshot ?? null\n if (!addressSnapshot) {\n const message = addressOptions.length\n ? t('sales.documents.shipments.errorAddress', 'Select an address to ship to.')\n : t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )\n throw createCrudFormError(message, { shipmentAddressId: message })\n }\n const payload: Record<string, unknown> = {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n shipmentNumber,\n shippingMethodId,\n statusEntryId:\n typeof values.statusEntryId === 'string' && values.statusEntryId.trim().length\n ? values.statusEntryId\n : undefined,\n carrierName:\n typeof values.carrierName === 'string' && values.carrierName.trim().length\n ? values.carrierName.trim()\n : undefined,\n trackingNumbers: parseTrackingNumbers(\n typeof values.trackingNumbers === 'string' ? values.trackingNumbers : '',\n ),\n shippedAt:\n typeof values.shippedAt === 'string' && values.shippedAt.trim().length\n ? new Date(values.shippedAt)\n : undefined,\n deliveredAt:\n typeof values.deliveredAt === 'string' && values.deliveredAt.trim().length\n ? new Date(values.deliveredAt)\n : undefined,\n notes:\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : undefined,\n items: items.map((item) => ({\n orderLineId: item.lineId,\n quantity: item.quantity,\n })),\n }\n payload.shipmentAddressSnapshot = addressSnapshot\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n if (Object.keys(customFields).length) {\n payload.customFields = customFields\n }\n if (mode === 'create') {\n const documentStatusEntryId =\n typeof values.documentStatusEntryId === 'string' && values.documentStatusEntryId.trim().length\n ? values.documentStatusEntryId\n : null\n const lineStatusEntryId =\n typeof values.lineStatusEntryId === 'string' && values.lineStatusEntryId.trim().length\n ? values.lineStatusEntryId\n : null\n if (documentStatusEntryId) {\n payload.documentStatusEntryId = documentStatusEntryId\n }\n if (lineStatusEntryId) {\n payload.lineStatusEntryId = lineStatusEntryId\n }\n }\n\n const action = shipment?.id ? updateCrud : createCrud\n let result\n try {\n result = await withScopedApiRequestHeaders(\n // The server guards the PARENT order's aggregate version (Gap B) for\n // both create and update, so send the order's `updated_at`.\n buildOptimisticLockHeader(documentUpdatedAt ?? undefined),\n () =>\n action(\n 'sales/shipments',\n shipment?.id ? { id: shipment.id, ...payload } : payload,\n {\n errorMessage: t('sales.documents.shipments.errorSave', 'Failed to save shipment.'),\n },\n ),\n )\n } catch (err) {\n if (handleSectionMutationError(err, t, () => void onSaved())) {\n return\n }\n throw err\n }\n if (result.ok) {\n const shipmentId = ((result.result as any)?.id as string | undefined) ?? shipment?.id ?? null\n const shouldAddShippingAdjustment =\n mode === 'create' &&\n Boolean(values.addShippingAdjustment) &&\n shipmentId\n if (shouldAddShippingAdjustment) {\n const method = shippingMethods.find((entry) => entry.id === shippingMethodId) ?? null\n const totalQuantity = items.reduce((acc, item) => acc + item.quantity, 0)\n const unitGross =\n method?.baseRateGross ??\n method?.avgPrice ??\n method?.minPrice ??\n (method?.baseRateNet ?? null)\n const unitNet = method?.baseRateNet ?? null\n const amountGross =\n typeof unitGross === 'number' && Number.isFinite(unitGross) && totalQuantity > 0\n ? roundAmount(Math.max(unitGross * totalQuantity, 0))\n : null\n const amountNet =\n typeof unitNet === 'number' && Number.isFinite(unitNet) && totalQuantity > 0\n ? roundAmount(Math.max(unitNet * totalQuantity, 0))\n : null\n const currency =\n typeof method?.currencyCode === 'string' && method.currencyCode.trim().length\n ? method.currencyCode.trim().toUpperCase()\n : typeof currencyCode === 'string' && currencyCode.trim().length\n ? currencyCode.trim().toUpperCase()\n : null\n\n if (amountGross !== null || amountNet !== null) {\n try {\n await createCrud(\n 'sales/order-adjustments',\n {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n scope: 'order',\n kind: 'shipping',\n label:\n method?.name ??\n t('sales.documents.shipments.shippingAdjustmentLabel', 'Shipping cost'),\n code: shipmentNumber ? `ship-${shipmentNumber}` : undefined,\n amountGross: amountGross ?? undefined,\n amountNet: amountNet ?? undefined,\n currencyCode: currency ?? undefined,\n metadata: {\n shipmentId,\n shippingMethodId,\n calculation: 'per_item_base_rate',\n quantity: totalQuantity,\n },\n },\n {\n errorMessage: t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n },\n )\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n } catch (err) {\n logger.warn('sales.shipments.adjustment.create', { err })\n flash(\n t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n 'warning',\n )\n }\n }\n }\n if (values.postComment && onAddComment) {\n const lineTitles = items\n .map((item) => {\n const line = lines.find((entry) => entry.id === item.lineId)\n return `${item.quantity}\u00D7 ${line?.title ?? item.lineId}`\n })\n .join(', ')\n const commentNotes =\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : ''\n const label =\n shipmentNumber.length > 0\n ? `#${shipmentNumber}`\n : shipment?.id\n ? `#${shipment.id.slice(0, 6)}`\n : ''\n const noteParts = [\n t('sales.documents.shipments.comment', 'Shipment {{number}} updated: {{summary}}', {\n number: label || String((result.result as any)?.id ?? ''),\n summary: lineTitles,\n }),\n ]\n if (commentNotes) {\n noteParts.push(\n t('sales.documents.shipments.commentNotes', 'Notes: {{notes}}', { notes: commentNotes }),\n )\n }\n const note = noteParts.join('\\n\\n')\n try {\n await onAddComment(note)\n } catch (err) {\n logger.warn('sales.shipments.comment', { err })\n }\n }\n await onSaved()\n }\n },\n [\n currencyCode,\n documentUpdatedAt,\n lines,\n mode,\n onAddComment,\n onSaved,\n orderId,\n organizationId,\n shipment?.id,\n addressOptions,\n addressOptionsMap,\n shippingMethods,\n t,\n tenantId,\n validateItems,\n ],\n )\n\n const handleSubmitForm = React.useCallback(\n () => dialogContentRef.current?.querySelector('form')?.requestSubmit(),\n [],\n )\n const handleKeyDown = useDialogKeyHandler({\n onConfirm: handleSubmitForm,\n onCancel: onClose,\n })\n\n const fields = React.useMemo<CrudField[]>(() => {\n const shippingAdjustmentLabel = t(\n 'sales.documents.shipments.addShippingAdjustment',\n 'Add shipping cost adjustment for this shipment',\n )\n const shippingAdjustmentHelp = t(\n 'sales.documents.shipments.addShippingAdjustmentHelp',\n 'Create a shipping adjustment using this carrier\u2019s calculated cost.',\n )\n function ShipmentItemsField({ value, setValue }: CrudCustomFieldRenderProps) {\n const quantities = (value as Record<string, string | number> | null) ?? {}\n const [lineErrors, setLineErrors] = React.useState<Record<string, string | undefined>>({})\n\n React.useEffect(() => {\n registerItemErrors(setLineErrors)\n return () => {\n if (itemErrorSetterRef.current === setLineErrors) {\n itemErrorSetterRef.current = null\n }\n }\n }, [])\n\n if (lines.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.shipments.noLines', 'No order lines available.')}\n </p>\n )\n }\n\n return (\n <div className=\"space-y-2 rounded-lg border p-3\">\n {lines.map((line) => {\n const available = computeAvailable(line.id, shipment?.id ?? null)\n const rawValue = quantities[line.id]\n const valueString =\n typeof rawValue === 'number'\n ? rawValue.toString()\n : typeof rawValue === 'string'\n ? rawValue\n : ''\n const disabled = available <= 0 && !valueString\n const lineError = lineErrors[line.id]\n return (\n <div\n key={line.id}\n className={cn(\n 'grid gap-3 md:grid-cols-[1fr,140px]',\n disabled ? 'opacity-60' : null,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {line.thumbnail ? (\n <img\n src={line.thumbnail}\n alt={line.title}\n className=\"h-12 w-12 rounded-md border object-cover\"\n />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md border bg-muted text-xs text-muted-foreground\">\n N/A\n </div>\n )}\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {line.lineNumber ? `#${line.lineNumber} \u00B7 ` : null}\n {line.title}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.shipments.available', '{{count}} available', {\n count: available,\n })}\n </p>\n </div>\n </div>\n <div className=\"space-y-1\">\n <Input\n type=\"number\"\n step=\"1\"\n min=\"0\"\n value={valueString}\n disabled={disabled}\n onChange={(event) => {\n const next = event.target.value\n setValue({ ...(quantities ?? {}), [line.id]: next })\n setLineErrors((prev) => ({ ...prev, [line.id]: undefined }))\n }}\n />\n {lineError ? <p className=\"text-xs text-destructive\">{lineError}</p> : null}\n </div>\n </div>\n )\n })}\n </div>\n )\n }\n\n function ShipmentAddressField({ value, setValue }: CrudCustomFieldRenderProps) {\n const currentValue = typeof value === 'string' ? value : ''\n React.useEffect(() => {\n if (!currentValue && addressOptions.length) {\n setValue(addressOptions[0].id)\n }\n }, [addressOptions, currentValue, setValue])\n const disabled = addressLoading || !addressOptions.length\n return (\n <div className=\"space-y-2\">\n <LookupSelect\n value={currentValue || null}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchAddressItems}\n placeholder={t('sales.documents.shipments.addressPlaceholder', 'Select address')}\n searchPlaceholder={t('sales.documents.shipments.addressSearch', 'Search address')}\n minQuery={0}\n disabled={disabled}\n loading={addressLoading}\n defaultOpen\n />\n {!addressLoading && !addressOptions.length ? (\n <p className=\"text-xs text-destructive\">\n {t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )}\n </p>\n ) : null}\n {addressError ? <p className=\"text-xs text-destructive\">{addressError}</p> : null}\n </div>\n )\n }\n\n const itemsField: CrudField = {\n id: 'items',\n label: t('sales.documents.shipments.items', 'Items to ship'),\n type: 'custom',\n component: ShipmentItemsField,\n }\n\n return [\n {\n id: 'shipmentNumber',\n label: t('sales.documents.shipments.number', 'Shipment number'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'carrierName',\n label: t('sales.documents.shipments.carrier', 'Carrier'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'shippingMethodId',\n label: t('sales.documents.shipments.shippingMethod', 'Shipping method'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShippingMethodItems}\n options={shippingMethodLookupOptions}\n placeholder={t('sales.documents.shipments.shippingMethodPlaceholder', 'Select method')}\n loading={shippingMethodLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'statusEntryId',\n label: t('sales.documents.shipments.status', 'Shipment status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShipmentStatusItems}\n options={shipmentStatusLookupOptions}\n placeholder={t('sales.documents.shipments.statusPlaceholder', 'Select shipment status')}\n loading={shipmentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ...(mode === 'create'\n ? ([\n {\n id: 'documentStatusEntryId',\n label: t('sales.documents.status.changeDocument', 'Change order/quote status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchDocumentStatusItems}\n placeholder={t(\n 'sales.documents.status.documentPlaceholder',\n 'Select new order/quote status',\n )}\n loading={documentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'lineStatusEntryId',\n label: t('sales.documents.status.changeLine', 'Change order/quote item status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchLineStatusItems}\n placeholder={t(\n 'sales.documents.status.linePlaceholder',\n 'Select item status',\n )}\n loading={lineStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ] as CrudField[])\n : []),\n {\n id: 'shipmentAddressId',\n label: t('sales.documents.shipments.address', 'Ship to'),\n type: 'custom',\n required: true,\n component: ShipmentAddressField,\n },\n {\n id: 'shippedAt',\n label: t('sales.documents.shipments.shippedAt', 'Shipped date'),\n type: 'date',\n },\n {\n id: 'deliveredAt',\n label: t('sales.documents.shipments.deliveredAt', 'Delivered date'),\n type: 'date',\n },\n {\n id: 'trackingNumbers',\n label: t('sales.documents.shipments.trackingNumbers', 'Tracking numbers'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={2}\n placeholder={t(\n 'sales.documents.shipments.trackingPlaceholder',\n 'One per line or comma separated',\n )}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'notes',\n label: t('sales.documents.shipments.notes', 'Notes'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'addShippingAdjustment',\n label: shippingAdjustmentLabel,\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-start gap-2\">\n <Switch\n id={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n aria-labelledby={SHIPPING_ADJUSTMENT_LABEL_ID}\n aria-describedby={SHIPPING_ADJUSTMENT_HELP_ID}\n />\n <div className=\"space-y-1\">\n <Label\n htmlFor={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n id={SHIPPING_ADJUSTMENT_LABEL_ID}\n className=\"sr-only\"\n >\n {shippingAdjustmentLabel}\n </Label>\n <p id={SHIPPING_ADJUSTMENT_HELP_ID} className=\"text-xs text-muted-foreground\">\n {shippingAdjustmentHelp}\n </p>\n </div>\n </div>\n ),\n },\n itemsField,\n {\n id: 'postComment',\n label: t('sales.documents.shipments.addComment', 'Add note to comments'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"shipment-comment\"\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n />\n <Label htmlFor=\"shipment-comment\" className=\"cursor-pointer\">\n {t('sales.documents.shipments.addComment', 'Add note to comments')}\n </Label>\n </div>\n ),\n },\n ]\n }, [\n addressError,\n addressLoading,\n addressOptions,\n computeAvailable,\n documentStatusLoading,\n fetchAddressItems,\n fetchDocumentStatusItems,\n fetchLineStatusItems,\n fetchShipmentStatusItems,\n fetchShippingMethodItems,\n lineStatusLoading,\n lines,\n mode,\n registerItemErrors,\n shipment?.id,\n shipmentStatusLoading,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => {\n const base: CrudFormGroup[] = [\n {\n id: 'shipmentDetails',\n title: mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment'),\n column: 1,\n fields: ['shipmentNumber', 'carrierName', 'shippingMethodId', 'statusEntryId', 'shipmentAddressId'],\n },\n ]\n if (mode === 'create') {\n base.push({\n id: 'statusChanges',\n title: t('sales.documents.status.sectionTitle', 'Status changes'),\n column: 2,\n fields: ['documentStatusEntryId', 'lineStatusEntryId'],\n })\n }\n base.push(\n {\n id: 'tracking',\n title: t('sales.documents.shipments.trackingGroup', 'Tracking information'),\n column: 2,\n fields: ['shippedAt', 'deliveredAt', 'trackingNumbers', 'notes'],\n },\n {\n id: 'items',\n column: 1,\n fields: ['items', 'addShippingAdjustment', 'postComment'],\n },\n {\n id: 'shipmentCustomFields',\n title: t('entities.customFields.title', 'Custom fields'),\n column: 2,\n kind: 'customFields',\n },\n )\n return base\n },\n [mode, t],\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => (!next ? onClose() : undefined)}>\n <DialogContent\n ref={dialogContentRef}\n className=\"sm:max-w-5xl\"\n onKeyDown={handleKeyDown}\n >\n <DialogHeader>\n <DialogTitle>\n {mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n key={formResetKey}\n embedded\n entityId={E.sales.sales_shipment}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n submitLabel={t('sales.documents.shipments.saveShortcut', 'Save (\u2318/Ctrl+Enter)')}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.shipments.loading', 'Loading shipments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n isLoading={shippingMethodLoading || addressLoading}\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["options"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/core",
|
|
3
|
-
"version": "0.6.6-develop.
|
|
3
|
+
"version": "0.6.6-develop.6530.1.6d8442bafd",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -253,16 +253,16 @@
|
|
|
253
253
|
"zod": "^4.4.3"
|
|
254
254
|
},
|
|
255
255
|
"peerDependencies": {
|
|
256
|
-
"@open-mercato/ai-assistant": "0.6.6-develop.
|
|
257
|
-
"@open-mercato/shared": "0.6.6-develop.
|
|
258
|
-
"@open-mercato/ui": "0.6.6-develop.
|
|
256
|
+
"@open-mercato/ai-assistant": "0.6.6-develop.6530.1.6d8442bafd",
|
|
257
|
+
"@open-mercato/shared": "0.6.6-develop.6530.1.6d8442bafd",
|
|
258
|
+
"@open-mercato/ui": "0.6.6-develop.6530.1.6d8442bafd",
|
|
259
259
|
"react": "^19.0.0",
|
|
260
260
|
"react-dom": "^19.0.0"
|
|
261
261
|
},
|
|
262
262
|
"devDependencies": {
|
|
263
|
-
"@open-mercato/ai-assistant": "0.6.6-develop.
|
|
264
|
-
"@open-mercato/shared": "0.6.6-develop.
|
|
265
|
-
"@open-mercato/ui": "0.6.6-develop.
|
|
263
|
+
"@open-mercato/ai-assistant": "0.6.6-develop.6530.1.6d8442bafd",
|
|
264
|
+
"@open-mercato/shared": "0.6.6-develop.6530.1.6d8442bafd",
|
|
265
|
+
"@open-mercato/ui": "0.6.6-develop.6530.1.6d8442bafd",
|
|
266
266
|
"@testing-library/dom": "^10.4.1",
|
|
267
267
|
"@testing-library/jest-dom": "^6.9.1",
|
|
268
268
|
"@testing-library/react": "^16.3.1",
|
|
@@ -890,8 +890,12 @@ export function SalesDocumentAddressesSection({
|
|
|
890
890
|
if (res?.result?.id) billingId = res.result.id
|
|
891
891
|
}
|
|
892
892
|
|
|
893
|
-
|
|
894
|
-
|
|
893
|
+
if (shippingSnapshot || !shippingId) {
|
|
894
|
+
payload.shippingAddressSnapshot = shippingSnapshot ?? null
|
|
895
|
+
}
|
|
896
|
+
if (billingSnapshot || !billingId) {
|
|
897
|
+
payload.billingAddressSnapshot = billingSnapshot ?? null
|
|
898
|
+
}
|
|
895
899
|
payload.shippingAddressId = shippingSnapshot ? null : shippingId
|
|
896
900
|
payload.billingAddressId = billingSnapshot ? null : billingId
|
|
897
901
|
|
|
@@ -168,6 +168,7 @@ function CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {
|
|
|
168
168
|
async (values: PersonFormValues) => {
|
|
169
169
|
setSaving(true)
|
|
170
170
|
try {
|
|
171
|
+
const addresses = Array.isArray(values.addresses) ? values.addresses : []
|
|
171
172
|
const payload = buildPersonPayload(values, organizationId)
|
|
172
173
|
const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {
|
|
173
174
|
errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),
|
|
@@ -177,6 +178,51 @@ function CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {
|
|
|
177
178
|
(result && typeof result.id === 'string' && result.id) ||
|
|
178
179
|
null
|
|
179
180
|
if (!id) throw new Error('Missing customer id')
|
|
181
|
+
if (addresses.length) {
|
|
182
|
+
const normalize = (value?: string | null) => {
|
|
183
|
+
if (typeof value !== 'string') return undefined
|
|
184
|
+
const trimmed = value.trim()
|
|
185
|
+
return trimmed.length ? trimmed : undefined
|
|
186
|
+
}
|
|
187
|
+
for (const entry of addresses) {
|
|
188
|
+
const normalizedLine1 = normalize(entry.addressLine1)
|
|
189
|
+
if (!normalizedLine1) continue
|
|
190
|
+
const body: Record<string, unknown> = {
|
|
191
|
+
entityId: id,
|
|
192
|
+
...(organizationId ? { organizationId } : {}),
|
|
193
|
+
addressLine1: normalizedLine1,
|
|
194
|
+
isPrimary: entry.isPrimary ?? false,
|
|
195
|
+
}
|
|
196
|
+
const name = normalize(entry.name)
|
|
197
|
+
if (name !== undefined) body.name = name
|
|
198
|
+
const purpose = normalize(entry.purpose)
|
|
199
|
+
if (purpose !== undefined) body.purpose = purpose
|
|
200
|
+
const line2 = normalize(entry.addressLine2)
|
|
201
|
+
if (line2 !== undefined) body.addressLine2 = line2
|
|
202
|
+
const buildingNumber = normalize(entry.buildingNumber)
|
|
203
|
+
if (buildingNumber !== undefined) body.buildingNumber = buildingNumber
|
|
204
|
+
const flatNumber = normalize(entry.flatNumber)
|
|
205
|
+
if (flatNumber !== undefined) body.flatNumber = flatNumber
|
|
206
|
+
const city = normalize(entry.city)
|
|
207
|
+
if (city !== undefined) body.city = city
|
|
208
|
+
const region = normalize(entry.region)
|
|
209
|
+
if (region !== undefined) body.region = region
|
|
210
|
+
const postalCode = normalize(entry.postalCode)
|
|
211
|
+
if (postalCode !== undefined) body.postalCode = postalCode
|
|
212
|
+
const country = normalize(entry.country)
|
|
213
|
+
if (country !== undefined) body.country = country.toUpperCase()
|
|
214
|
+
if (typeof entry.latitude === 'number') body.latitude = entry.latitude
|
|
215
|
+
if (typeof entry.longitude === 'number') body.longitude = entry.longitude
|
|
216
|
+
try {
|
|
217
|
+
await createCrud('customers/addresses', body)
|
|
218
|
+
} catch (addressErr) {
|
|
219
|
+
const message =
|
|
220
|
+
(addressErr instanceof Error && addressErr.message ? addressErr.message : null) ||
|
|
221
|
+
t('customers.people.detail.addresses.error')
|
|
222
|
+
flash(message, 'error')
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
180
226
|
const displayName =
|
|
181
227
|
typeof values.displayName === 'string' && values.displayName.trim().length
|
|
182
228
|
? values.displayName.trim()
|