@open-mercato/core 0.5.1-develop.2949.009dcdd2d5 → 0.5.1-develop.2954.610bab2d08
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/integration/salesUi.js +25 -23
- package/dist/helpers/integration/salesUi.js.map +2 -2
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js +24 -24
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +15 -7
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +4 -6
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +63 -23
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +26 -26
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/business_rules/components/ActionRow.js +36 -25
- package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
- package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionRow.js +19 -10
- package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
- package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
- package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
- package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +4 -6
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/components/AddressEditor.js +24 -7
- package/dist/modules/customers/components/AddressEditor.js.map +2 -2
- package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
- package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -14
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js +16 -12
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
- package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js +18 -13
- package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
- package/dist/modules/entities/components/EncryptionManager.js +23 -19
- package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
- package/dist/modules/feature_toggles/components/formConfig.js +17 -9
- package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
- package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
- package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
- package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
- package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
- package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
- package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +14 -9
- package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
- package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js +14 -6
- package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
- package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
- package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
- package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
- package/package.json +3 -3
- package/src/helpers/integration/salesUi.ts +40 -30
- package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
- package/src/modules/attachments/fields/attachment.tsx +4 -6
- package/src/modules/auth/api/users/route.ts +75 -25
- package/src/modules/auth/backend/users/create/page.tsx +16 -20
- package/src/modules/business_rules/components/ActionRow.tsx +51 -32
- package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
- package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
- package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
- package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
- package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
- package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
- package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
- package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
- package/src/modules/customers/components/AddressEditor.tsx +30 -16
- package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
- package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
- package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
- package/src/modules/customers/components/detail/DealForm.tsx +33 -20
- package/src/modules/customers/components/formConfig.tsx +25 -17
- package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
- package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
- package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
- package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
- package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
- package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
- package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
- package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
- package/src/modules/entities/components/EncryptionManager.tsx +49 -33
- package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
- package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
- package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
- package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
- package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
- package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
- package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
- package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
- package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
- package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
- package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
- package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
- package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
- package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
- package/src/modules/workflows/components/StepsEditor.tsx +20 -10
- package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
- package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/components/documents/LineItemDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport {\n LookupSelect,\n type LookupSelectItem,\n} from \"@open-mercato/ui/backend/inputs\";\nimport {\n CrudForm,\n type CrudField,\n type CrudFormGroup,\n type CrudCustomFieldRenderProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { collectCustomFieldValues } from \"@open-mercato/ui/backend/utils/customFieldValues\";\nimport { apiCall } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { createCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@open-mercato/ui/primitives/dialog\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport { DollarSign, Settings } from \"lucide-react\";\nimport { normalizeCustomFieldValues } from \"@open-mercato/shared/lib/custom-fields/normalize\";\nimport {\n DictionaryValue,\n renderDictionaryIcon,\n renderDictionaryColor,\n} from \"@open-mercato/core/modules/dictionaries/components/dictionaryAppearance\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { useOrganizationScopeDetail } from \"@open-mercato/shared/lib/frontend/useOrganizationScope\";\nimport { formatMoney, normalizeNumber } from \"./lineItemUtils\";\nimport type { SalesLineRecord } from \"./lineItemTypes\";\nimport {\n normalizeCustomFieldSubmitValue,\n extractCustomFieldValues,\n} from \"./customFieldHelpers\";\nimport { canonicalizeUnitCode } from \"@open-mercato/shared/lib/units/unitCodes\";\n\ntype ProductOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n defaultUnit?: string | null;\n defaultSalesUnit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n};\n\ntype VariantOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n};\n\ntype PriceOption = {\n id: string;\n amountNet: number | null;\n amountGross: number | null;\n currencyCode: string | null;\n displayMode: \"including-tax\" | \"excluding-tax\" | null;\n taxRate: number | null;\n label: string;\n priceKindId?: string | null;\n priceKindTitle?: string | null;\n priceKindCode?: string | null;\n scopeReason?: string | null;\n scopeTags?: string[];\n};\n\ntype TaxRateOption = {\n id: string;\n name: string;\n code: string | null;\n rate: number | null;\n isDefault: boolean;\n};\n\ntype StatusOption = {\n id: string;\n value: string;\n label: string;\n color: string | null;\n icon: string | null;\n};\n\ntype UnitOption = {\n code: string;\n toBaseFactor: number | null;\n isBase: boolean;\n};\n\ntype LineFormState = {\n lineMode: \"catalog\" | \"custom\";\n productId: string | null;\n variantId: string | null;\n quantity: string;\n quantityUnit: string | null;\n priceId: string | null;\n priceMode: \"net\" | \"gross\";\n unitPrice: string;\n taxRate: number | null;\n taxRateId: string | null;\n name: string;\n currencyCode: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n customFieldSetId?: string | null;\n statusEntryId?: string | null;\n};\n\ntype FieldRenderProps = CrudCustomFieldRenderProps;\n\ntype ApiPriceKind = {\n title?: string | null;\n name?: string | null;\n code?: string | null;\n};\n\ntype ApiPriceItem = Record<string, unknown> & {\n unit_price_net?: number | null;\n unit_price_gross?: number | null;\n currency_code?: string | null;\n currencyCode?: string | null;\n display_mode?: string | null;\n displayMode?: string | null;\n tax_rate?: number | null;\n price_kind_id?: string | null;\n priceKindId?: string | null;\n price_kind_title?: string | null;\n priceKindTitle?: string | null;\n price_kind_code?: string | null;\n priceKindCode?: string | null;\n price_kind?: ApiPriceKind | null;\n kind?: string | null;\n};\n\ntype ApiTaxRateItem = Record<string, unknown> & {\n rate?: number | null;\n code?: string | null;\n isDefault?: boolean;\n is_default?: boolean;\n min_quantity?: number | null;\n max_quantity?: number | null;\n starts_at?: string | null;\n ends_at?: string | null;\n};\n\ntype ApiProductItem = Record<string, unknown> & {\n name?: string;\n sku?: string;\n default_media_url?: string;\n defaultMediaUrl?: string;\n pricing?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiVariantItem = Record<string, unknown> & {\n sku?: string;\n default_media_url?: string;\n thumbnailUrl?: string;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiPricingMetadata = {\n tax_rate_id?: string;\n taxRateId?: string;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype LineMetadataRecord = {\n lineMode?: string;\n customLine?: boolean | null;\n priceMode?: string;\n taxRateId?: string;\n priceId?: string;\n productTitle?: string;\n productSku?: string;\n productThumbnail?: string;\n variantTitle?: string;\n variantSku?: string;\n variantThumbnail?: string;\n};\n\ntype CatalogSnapshotRecord = Record<string, unknown> & {\n product?: Record<string, unknown> | null;\n variant?: Record<string, unknown> | null;\n};\n\ntype SnapshotEntity = {\n defaultUnit?: string | null;\n default_unit?: string | null;\n defaultSalesUnit?: string | null;\n default_sales_unit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n default_sales_unit_quantity?: number | null;\n title?: string;\n sku?: string;\n thumbnailUrl?: string;\n thumbnail_url?: string;\n taxRate?: number | null;\n taxRateId?: string;\n};\n\ntype SalesLineDialogProps = {\n open: boolean;\n kind: \"order\" | \"quote\";\n documentId: string;\n currencyCode: string | null | undefined;\n organizationId: string | null;\n tenantId: string | null;\n initialLine?: SalesLineRecord | null;\n onOpenChange: (open: boolean) => void;\n onSaved?: () => Promise<void> | void;\n};\n\nconst defaultForm = (currencyCode?: string | null): LineFormState => ({\n lineMode: \"catalog\",\n productId: null,\n variantId: null,\n quantity: \"1\",\n quantityUnit: null,\n priceId: null,\n priceMode: \"gross\",\n unitPrice: \"\",\n taxRate: null,\n taxRateId: null,\n name: \"\",\n currencyCode: currencyCode ?? null,\n catalogSnapshot: null,\n customFieldSetId: null,\n statusEntryId: null,\n});\n\nconst UNIT_PRICE_INPUT_SCALE = 4;\n\nfunction buildPriceScopeReason(\n item: Record<string, unknown>,\n t: (k: string, f: string) => string,\n): {\n reason: string | null;\n tags: string[];\n} {\n const tags: string[] = [];\n const add = (key: string) => tags.push(key);\n if (item.channel_id || item.channelId)\n add(t(\"sales.documents.items.priceScope.channel\", \"Channel\"));\n if (item.offer_id || item.offerId)\n add(t(\"sales.documents.items.priceScope.offer\", \"Offer\"));\n if (item.variant_id || item.variantId)\n add(t(\"sales.documents.items.priceScope.variant\", \"Variant\"));\n if (item.customer_group_id || item.customerGroupId)\n add(t(\"sales.documents.items.priceScope.customerGroup\", \"Customer group\"));\n if (item.customer_id || item.customerId)\n add(t(\"sales.documents.items.priceScope.customer\", \"Customer\"));\n if (item.user_group_id || item.userGroupId)\n add(t(\"sales.documents.items.priceScope.userGroup\", \"User group\"));\n if (item.user_id || item.userId)\n add(t(\"sales.documents.items.priceScope.user\", \"User\"));\n const minQty = normalizeNumber((item as ApiPriceItem).min_quantity, Number.NaN);\n const maxQty = normalizeNumber((item as ApiPriceItem).max_quantity, Number.NaN);\n if (Number.isFinite(minQty) || Number.isFinite(maxQty)) {\n add(t(\"sales.documents.items.priceScope.quantity\", \"Quantity\"));\n }\n if ((item as ApiPriceItem).starts_at || (item as ApiPriceItem).ends_at) {\n add(t(\"sales.documents.items.priceScope.schedule\", \"Scheduled\"));\n }\n if (tags.length === 0) return { reason: null, tags };\n return { reason: tags.join(\" \u2022 \"), tags };\n}\n\nfunction buildPlaceholder(label?: string | null) {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded border bg-muted text-xs uppercase text-muted-foreground\">\n {(label ?? \"\").slice(0, 2) || \"\u2022\"}\n </div>\n );\n}\n\nfunction normalizeUnitCode(value: unknown): string | null {\n return canonicalizeUnitCode(value);\n}\n\nfunction getRecordBoolean(\n record: Record<string, unknown>,\n fallback: boolean,\n ...keys: string[]\n): boolean {\n for (const key of keys) {\n const val = record[key];\n if (typeof val === \"boolean\") return val;\n }\n return fallback;\n}\n\nfunction getUomProductFields(item: Record<string, unknown>) {\n return {\n defaultUnit: normalizeUnitCode(item.default_unit ?? item.defaultUnit),\n defaultSalesUnit: normalizeUnitCode(\n item.default_sales_unit ?? item.defaultSalesUnit,\n ),\n defaultSalesUnitQuantity: normalizeNumber(\n item.default_sales_unit_quantity ?? item.defaultSalesUnitQuantity,\n Number.NaN,\n ),\n };\n}\n\nfunction getUomConversionFields(row: Record<string, unknown>) {\n return {\n unitCode: normalizeUnitCode(row.unit_code ?? row.unitCode),\n isActive: getRecordBoolean(row, true, \"is_active\", \"isActive\"),\n toBaseFactor: normalizeNumber(\n row.to_base_factor ?? row.toBaseFactor,\n Number.NaN,\n ),\n };\n}\n\nfunction normalizeQuantityPreview(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * 1_000_000) / 1_000_000;\n}\n\nfunction normalizeUnitPriceInputValue(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n const factor = 10 ** UNIT_PRICE_INPUT_SCALE;\n const rounded = Math.round((value + Number.EPSILON) * factor) / factor;\n if (!Number.isFinite(rounded)) return \"\";\n return rounded.toString();\n}\n\nexport function LineItemDialog({\n open,\n kind,\n documentId,\n currencyCode,\n organizationId,\n tenantId,\n initialLine,\n onOpenChange,\n onSaved,\n}: SalesLineDialogProps) {\n const t = useT();\n const scope = useOrganizationScopeDetail();\n const resolvedOrganizationId = organizationId ?? scope.organizationId ?? null;\n const resolvedTenantId = tenantId ?? scope.tenantId ?? null;\n const [initialValues, setInitialValues] = React.useState<LineFormState>(() =>\n defaultForm(currencyCode),\n );\n const [lineMode, setLineMode] = React.useState<\"catalog\" | \"custom\">(\n defaultForm(currencyCode).lineMode,\n );\n const [productOption, setProductOption] =\n React.useState<ProductOption | null>(null);\n const [variantOption, setVariantOption] =\n React.useState<VariantOption | null>(null);\n const [priceOptions, setPriceOptions] = React.useState<PriceOption[]>([]);\n const [priceLoading, setPriceLoading] = React.useState(false);\n const [formResetKey, setFormResetKey] = React.useState(0);\n const [editingId, setEditingId] = React.useState<string | null>(null);\n const [taxRates, setTaxRates] = React.useState<TaxRateOption[]>([]);\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([]);\n const [unitOptions, setUnitOptions] = React.useState<UnitOption[]>([]);\n const [, setLineStatusLoading] = React.useState(false);\n const productOptionsRef = React.useRef<Map<string, ProductOption>>(new Map());\n const variantOptionsRef = React.useRef<Map<string, VariantOption>>(new Map());\n const taxRatesRef = React.useRef<TaxRateOption[]>([]);\n const defaultTaxRateRef = React.useRef<TaxRateOption | null>(null);\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null);\n\n const resourcePath = React.useMemo(\n () => (kind === \"order\" ? \"sales/order-lines\" : \"sales/quote-lines\"),\n [kind],\n );\n const documentKey = kind === \"order\" ? \"orderId\" : \"quoteId\";\n const customFieldEntityId =\n kind === \"order\" ? E.sales.sales_order_line : E.sales.sales_quote_line;\n\n const taxRateMap = React.useMemo(\n () =>\n taxRates.reduce<Map<string, TaxRateOption>>((acc, rate) => {\n acc.set(rate.id, rate);\n return acc;\n }, new Map()),\n [taxRates],\n );\n\n const findTaxRateIdByValue = React.useCallback(\n (value: number | null | undefined): string | null => {\n const numeric = normalizeNumber(value, Number.NaN);\n if (!Number.isFinite(numeric)) return null;\n const match = taxRatesRef.current.find(\n (rate) =>\n Number.isFinite(rate.rate) &&\n Math.abs((rate.rate as number) - numeric) < 0.0001,\n );\n return match?.id ?? null;\n },\n [],\n );\n\n const resolveTaxSelection = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n const taxRateId =\n typeof source?.taxRateId === \"string\" && source.taxRateId.trim().length\n ? source.taxRateId.trim()\n : null;\n const rateFromId = taxRateId\n ? normalizeNumber(taxRateMap.get(taxRateId)?.rate, Number.NaN)\n : Number.NaN;\n const numericRate = normalizeNumber(source?.taxRate, Number.NaN);\n const resolvedRateId =\n taxRateId ??\n (Number.isFinite(numericRate)\n ? findTaxRateIdByValue(numericRate)\n : null);\n const resolvedRate = Number.isFinite(rateFromId)\n ? rateFromId\n : Number.isFinite(numericRate)\n ? numericRate\n : null;\n return { taxRateId: resolvedRateId, taxRate: resolvedRate };\n },\n [findTaxRateIdByValue, taxRateMap],\n );\n\n const hasTaxMetadata = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n if (!source) return false;\n const id =\n typeof source.taxRateId === \"string\" ? source.taxRateId.trim() : \"\";\n if (id.length) return true;\n const numericRate = normalizeNumber(source.taxRate, Number.NaN);\n return Number.isFinite(numericRate);\n },\n [],\n );\n\n const resetForm = React.useCallback(\n (next?: Partial<LineFormState>) => {\n const base = { ...defaultForm(currencyCode), ...next };\n const defaultRate = defaultTaxRateRef.current;\n if (!base.taxRateId && defaultRate) {\n base.taxRateId = defaultRate.id;\n base.taxRate = Number.isFinite(defaultRate.rate ?? null)\n ? (defaultRate.rate as number)\n : base.taxRate;\n }\n setInitialValues(base);\n setLineMode(base.lineMode);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setEditingId(null);\n setFormResetKey((prev) => prev + 1);\n },\n [currencyCode],\n );\n\n const closeDialog = React.useCallback(() => {\n onOpenChange(false);\n resetForm();\n }, [onOpenChange, resetForm]);\n\n const loadTaxRates = React.useCallback(async () => {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const parsed = items\n .map<TaxRateOption | null>((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n const name =\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name.trim()\n : typeof item.code === \"string\"\n ? item.code\n : null;\n if (!id || !name) return null;\n const rate = normalizeNumber((item as ApiTaxRateItem).rate);\n const code =\n typeof (item as ApiTaxRateItem).code === \"string\" &&\n (item as ApiTaxRateItem).code?.trim().length\n ? (item as ApiTaxRateItem).code?.trim() ?? null\n : null;\n const isDefault = Boolean(\n (item as ApiTaxRateItem).isDefault ?? (item as ApiTaxRateItem).is_default,\n );\n return {\n id,\n name,\n code,\n rate: Number.isFinite(rate) ? rate : null,\n isDefault,\n };\n })\n .filter((entry): entry is TaxRateOption => Boolean(entry));\n taxRatesRef.current = parsed;\n defaultTaxRateRef.current = parsed.find((rate) => rate.isDefault) ?? null;\n setTaxRates(parsed);\n return parsed;\n } catch (err) {\n console.error(\"sales.tax-rates.fetch\", err);\n taxRatesRef.current = [];\n defaultTaxRateRef.current = null;\n setTaxRates([]);\n return [];\n }\n }, []);\n\n const loadProductOptions = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const params = new URLSearchParams({ pageSize: \"8\" });\n if (query && query.trim().length) {\n params.set(\"search\", query.trim());\n } else {\n params.set(\"sortField\", \"title\");\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/products?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? (response.result?.items ?? [])\n : [];\n const mapped = items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const productItem = item as ApiProductItem;\n const title =\n typeof item.title === \"string\"\n ? item.title\n : typeof productItem.name === \"string\"\n ? productItem.name\n : id;\n const sku =\n typeof productItem.sku === \"string\" ? productItem.sku : null;\n const thumbnail =\n typeof productItem.default_media_url === \"string\"\n ? productItem.default_media_url\n : typeof productItem.defaultMediaUrl === \"string\"\n ? productItem.defaultMediaUrl\n : null;\n const pricing =\n typeof productItem.pricing === \"object\" && productItem.pricing\n ? productItem.pricing\n : null;\n const metadata =\n typeof productItem.metadata === \"object\" && productItem.metadata\n ? productItem.metadata\n : null;\n const pricingMeta = pricing as ApiPricingMetadata | null;\n const metaMeta = metadata as ApiPricingMetadata | null;\n const pricingTaxRateId =\n typeof pricingMeta?.tax_rate_id === \"string\" &&\n pricingMeta.tax_rate_id.trim().length\n ? pricingMeta.tax_rate_id.trim()\n : typeof pricingMeta?.taxRateId === \"string\" &&\n pricingMeta.taxRateId.trim().length\n ? pricingMeta.taxRateId.trim()\n : null;\n const metaTaxRateId =\n typeof metaMeta?.taxRateId === \"string\" &&\n metaMeta.taxRateId.trim().length\n ? metaMeta.taxRateId.trim()\n : typeof metaMeta?.tax_rate_id === \"string\" &&\n metaMeta.tax_rate_id.trim().length\n ? metaMeta.tax_rate_id.trim()\n : null;\n const taxRateValue = normalizeNumber(\n pricingMeta?.tax_rate ??\n pricingMeta?.taxRate ??\n productItem.tax_rate ??\n productItem.taxRate,\n Number.NaN,\n );\n const uomFields = getUomProductFields(item);\n const defaultUnit = uomFields.defaultUnit;\n const defaultSalesUnit = uomFields.defaultSalesUnit;\n const defaultSalesUnitQuantity = uomFields.defaultSalesUnitQuantity;\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail ? (\n <img\n src={thumbnail}\n alt={title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(title)\n ),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: pricingTaxRateId ?? metaTaxRateId ?? null,\n taxRate: Number.isFinite(taxRateValue) ? taxRateValue : null,\n defaultUnit,\n defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(\n defaultSalesUnitQuantity,\n )\n ? defaultSalesUnitQuantity\n : null,\n } satisfies ProductOption,\n } as LookupSelectItem & { option: ProductOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: ProductOption } =>\n Boolean(entry),\n );\n return mapped.map((entry) => {\n productOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadVariantOptions = React.useCallback(\n async (\n productId: string,\n fallbackThumbnail?: string | null,\n ): Promise<LookupSelectItem[]> => {\n if (!productId) return [];\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/variants?productId=${encodeURIComponent(productId)}&pageSize=50`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n return items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const title = typeof item.name === \"string\" ? item.name : id;\n const variantItem = item as ApiVariantItem;\n const sku =\n typeof variantItem.sku === \"string\" ? variantItem.sku : null;\n const metadata =\n typeof variantItem.metadata === \"object\" && variantItem.metadata\n ? variantItem.metadata\n : null;\n const variantMeta = metadata as ApiPricingMetadata | null;\n const variantTaxRateId =\n typeof variantMeta?.taxRateId === \"string\" &&\n variantMeta.taxRateId.trim().length\n ? variantMeta.taxRateId.trim()\n : typeof variantMeta?.tax_rate_id === \"string\" &&\n variantMeta.tax_rate_id.trim().length\n ? variantMeta.tax_rate_id.trim()\n : null;\n const variantTaxRate = normalizeNumber(\n variantItem.tax_rate ??\n variantItem.taxRate ??\n variantMeta?.tax_rate ??\n variantMeta?.taxRate,\n Number.NaN,\n );\n const thumbnail =\n typeof variantItem.default_media_url === \"string\"\n ? variantItem.default_media_url\n : typeof variantItem.thumbnailUrl === \"string\"\n ? variantItem.thumbnailUrl\n : (fallbackThumbnail ?? null);\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail ? (\n <img\n src={thumbnail}\n alt={title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(title)\n ),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: variantTaxRateId,\n taxRate: Number.isFinite(variantTaxRate) ? variantTaxRate : null,\n } satisfies VariantOption,\n } as LookupSelectItem & { option: VariantOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: VariantOption } =>\n Boolean(entry),\n )\n .map((entry) => {\n variantOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadProductUnits = React.useCallback(\n async (\n productId: string | null,\n option: ProductOption | null,\n ): Promise<UnitOption[]> => {\n if (!productId) {\n setUnitOptions([]);\n return [];\n }\n const map = new Map<string, UnitOption>();\n let baseUnit = normalizeUnitCode(option?.defaultUnit);\n let defaultSalesUnit = normalizeUnitCode(option?.defaultSalesUnit);\n if (!baseUnit || !defaultSalesUnit) {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const records = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const matched =\n records.find((entry) => entry.id === productId) ??\n records[0] ??\n null;\n if (matched) {\n const matchedUom = getUomProductFields(matched);\n baseUnit = baseUnit ?? matchedUom.defaultUnit;\n defaultSalesUnit = defaultSalesUnit ?? matchedUom.defaultSalesUnit;\n }\n } catch (err) {\n console.error(\"sales.document.items.loadProductUnits.hydration\", err);\n }\n }\n if (baseUnit) {\n map.set(baseUnit, { code: baseUnit, toBaseFactor: 1, isBase: true });\n }\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/product-unit-conversions?productId=${encodeURIComponent(productId)}&pageSize=100`,\n undefined,\n { fallback: { items: [] } },\n );\n const rows = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n for (const row of rows) {\n const conv = getUomConversionFields(row);\n if (!conv.unitCode) continue;\n if (!conv.isActive) continue;\n map.set(conv.unitCode, {\n code: conv.unitCode,\n toBaseFactor:\n Number.isFinite(conv.toBaseFactor) && conv.toBaseFactor > 0\n ? conv.toBaseFactor\n : null,\n isBase: baseUnit ? conv.unitCode === baseUnit : false,\n });\n }\n } catch (err) {\n console.error(\"sales.document.items.loadUnits\", err);\n }\n if (defaultSalesUnit && !map.has(defaultSalesUnit)) {\n map.set(defaultSalesUnit, {\n code: defaultSalesUnit,\n toBaseFactor: baseUnit && defaultSalesUnit === baseUnit ? 1 : null,\n isBase: baseUnit ? defaultSalesUnit === baseUnit : false,\n });\n }\n const nextOptions = Array.from(map.values()).sort((left, right) =>\n left.code.localeCompare(right.code),\n );\n setUnitOptions(nextOptions);\n return nextOptions;\n },\n [],\n );\n\n const loadPrices = React.useCallback(\n async (\n productId: string | null,\n variantId: string | null,\n quantity?: string | number | null,\n quantityUnit?: string | null,\n ) => {\n if (!productId) {\n setPriceOptions([]);\n return [];\n }\n setPriceLoading(true);\n try {\n const params = new URLSearchParams({ productId, pageSize: \"20\" });\n if (variantId) params.set(\"variantId\", variantId);\n const quantityValue = normalizeNumber(quantity, Number.NaN);\n if (Number.isFinite(quantityValue) && quantityValue > 0) {\n params.set(\"quantity\", String(quantityValue));\n }\n const quantityUnitCode = normalizeUnitCode(quantityUnit);\n if (quantityUnitCode) {\n params.set(\"quantityUnit\", quantityUnitCode);\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/prices?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped: PriceOption[] = items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const amountNetRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_net,\n Number.NaN,\n );\n const amountGrossRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_gross,\n Number.NaN,\n );\n const amountNet = Number.isFinite(amountNetRaw)\n ? amountNetRaw\n : null;\n const amountGross = Number.isFinite(amountGrossRaw)\n ? amountGrossRaw\n : null;\n const currency =\n typeof (item as ApiPriceItem).currency_code === \"string\"\n ? (item as ApiPriceItem).currency_code\n : typeof (item as ApiPriceItem).currencyCode === \"string\"\n ? (item as ApiPriceItem).currencyCode\n : null;\n const displayMode =\n (item as ApiPriceItem).display_mode === \"including-tax\" ||\n (item as ApiPriceItem).display_mode === \"excluding-tax\"\n ? (item as ApiPriceItem).display_mode\n : (item as ApiPriceItem).displayMode === \"including-tax\" ||\n (item as ApiPriceItem).displayMode === \"excluding-tax\"\n ? (item as ApiPriceItem).displayMode\n : null;\n const taxRateRaw = normalizeNumber(\n (item as ApiPriceItem).tax_rate,\n Number.NaN,\n );\n const taxRate = Number.isFinite(taxRateRaw) ? taxRateRaw : null;\n const priceKindId =\n typeof (item as ApiPriceItem).price_kind_id === \"string\"\n ? (item as ApiPriceItem).price_kind_id\n : typeof (item as ApiPriceItem).priceKindId === \"string\"\n ? (item as ApiPriceItem).priceKindId\n : null;\n const priceKindTitle =\n typeof (item as ApiPriceItem).price_kind_title === \"string\"\n ? (item as ApiPriceItem).price_kind_title\n : typeof (item as ApiPriceItem).priceKindTitle === \"string\"\n ? (item as ApiPriceItem).priceKindTitle\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.title === \"string\"\n ? (item as ApiPriceItem).price_kind!.title\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.name === \"string\"\n ? (item as ApiPriceItem).price_kind!.name\n : null;\n const priceKindCode =\n typeof (item as ApiPriceItem).price_kind_code === \"string\"\n ? (item as ApiPriceItem).price_kind_code\n : typeof (item as ApiPriceItem).priceKindCode === \"string\"\n ? (item as ApiPriceItem).priceKindCode\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.code === \"string\"\n ? (item as ApiPriceItem).price_kind!.code\n : null;\n const resolvedPriceKindTitle =\n priceKindTitle ??\n priceKindCode ??\n (typeof (item as ApiPriceItem).kind === \"string\"\n ? (item as ApiPriceItem).kind\n : null);\n const labelParts = [\n displayMode === \"including-tax\" &&\n amountGross !== null &&\n currency\n ? formatMoney(amountGross, currency)\n : null,\n displayMode === \"excluding-tax\" && amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : null,\n displayMode\n ? displayMode === \"including-tax\"\n ? t(\"sales.documents.items.priceGross\", \"Gross\")\n : t(\"sales.documents.items.priceNet\", \"Net\")\n : null,\n ].filter(Boolean);\n const { reason, tags } = buildPriceScopeReason(\n item,\n (key, fallback) => t(key, fallback),\n );\n const label =\n labelParts.length > 0\n ? labelParts.join(\" \u2022 \")\n : amountGross !== null && currency\n ? formatMoney(amountGross, currency)\n : amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : id;\n return {\n id,\n amountNet: amountNet ?? null,\n amountGross: amountGross ?? null,\n currencyCode: currency,\n displayMode: displayMode as PriceOption[\"displayMode\"],\n taxRate: Number.isFinite(taxRate) ? taxRate : null,\n label,\n priceKindId,\n priceKindTitle: resolvedPriceKindTitle ?? null,\n priceKindCode: priceKindCode ?? null,\n scopeReason: reason,\n scopeTags: tags,\n } as PriceOption;\n })\n .filter((entry): entry is PriceOption => Boolean(entry));\n setPriceOptions(mapped);\n return mapped;\n } catch (err) {\n console.error(\"sales.document.items.loadPrices\", err);\n return [];\n } finally {\n setPriceLoading(false);\n }\n },\n [t],\n );\n\n const selectPriceAfterRefresh = React.useCallback(\n (\n prices: PriceOption[],\n currentPriceId: string | null,\n currentPriceKindId: string | null,\n ): PriceOption | null => {\n if (!prices.length) return null;\n if (currentPriceId) {\n const sameId = prices.find((entry) => entry.id === currentPriceId);\n if (sameId) return sameId;\n }\n if (currentPriceKindId) {\n const sameKind = prices.find(\n (entry) => entry.priceKindId === currentPriceKindId,\n );\n if (sameKind) return sameKind;\n }\n return prices[0] ?? null;\n },\n [],\n );\n\n const resolveUnitPriceFactor = React.useCallback(\n (quantityUnit: string | null | undefined): number => {\n const normalized = normalizeUnitCode(quantityUnit);\n if (!normalized) return 1;\n const unit = unitOptions.find((entry) => entry.code === normalized) ?? null;\n const factor = normalizeNumber(unit?.toBaseFactor, Number.NaN);\n if (!Number.isFinite(factor) || factor <= 0) return 1;\n return factor;\n },\n [unitOptions],\n );\n\n const convertUnitPriceForUnitChange = React.useCallback(\n (\n rawUnitPrice: unknown,\n fromUnit: string | null | undefined,\n toUnit: string | null | undefined,\n ): string | null => {\n const amount = normalizeNumber(rawUnitPrice, Number.NaN);\n if (!Number.isFinite(amount) || amount <= 0) return null;\n const fromCode = normalizeUnitCode(fromUnit);\n const toCode = normalizeUnitCode(toUnit);\n if (!fromCode || !toCode || fromCode === toCode) return null;\n const fromFactor = resolveUnitPriceFactor(fromCode);\n const toFactor = resolveUnitPriceFactor(toCode);\n if (\n !Number.isFinite(fromFactor) ||\n !Number.isFinite(toFactor) ||\n fromFactor <= 0 ||\n toFactor <= 0\n ) {\n return null;\n }\n const baseAmount = amount / fromFactor;\n const convertedAmount = baseAmount * toFactor;\n if (!Number.isFinite(convertedAmount) || convertedAmount <= 0) return null;\n return normalizeUnitPriceInputValue(convertedAmount);\n },\n [resolveUnitPriceFactor],\n );\n\n const applyPriceSelection = React.useCallback(\n (\n selected: PriceOption | null,\n setFormValue: ((id: string, value: unknown) => void) | undefined,\n options?: {\n fallbackTaxSource?: { taxRateId?: string | null; taxRate?: number | null } | null;\n quantityUnit?: string | null;\n },\n ) => {\n if (!setFormValue) return;\n if (selected) {\n const mode =\n selected.displayMode === \"excluding-tax\" ? \"net\" : \"gross\";\n const amountPerBaseUnit =\n mode === \"net\"\n ? (selected.amountNet ?? selected.amountGross ?? 0)\n : (selected.amountGross ?? selected.amountNet ?? 0);\n const factor = resolveUnitPriceFactor(options?.quantityUnit ?? null);\n const amount = Number.isFinite(amountPerBaseUnit * factor)\n ? amountPerBaseUnit * factor\n : amountPerBaseUnit;\n setFormValue(\"priceId\", selected.id);\n setFormValue(\"priceMode\", mode);\n setFormValue(\"unitPrice\", normalizeUnitPriceInputValue(amount));\n setFormValue(\"taxRate\", selected.taxRate ?? null);\n setFormValue(\"taxRateId\", findTaxRateIdByValue(selected.taxRate));\n setFormValue(\n \"currencyCode\",\n selected.currencyCode ?? currencyCode ?? null,\n );\n return;\n }\n const fallbackTax = resolveTaxSelection(options?.fallbackTaxSource ?? null);\n setFormValue(\"taxRate\", fallbackTax.taxRate ?? null);\n setFormValue(\"taxRateId\", fallbackTax.taxRateId ?? null);\n },\n [currencyCode, findTaxRateIdByValue, resolveTaxSelection, resolveUnitPriceFactor],\n );\n\n const loadLineStatuses = React.useCallback(async (): Promise<\n StatusOption[]\n > => {\n setLineStatusLoading(true);\n try {\n const params = new URLSearchParams({ page: \"1\", pageSize: \"100\" });\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/sales/order-line-statuses?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === \"string\" ? entry.id : null;\n const value = typeof entry.value === \"string\" ? entry.value : null;\n if (!id || !value) return null;\n const label =\n typeof entry.label === \"string\" && entry.label.trim().length\n ? entry.label\n : value;\n const color =\n typeof entry.color === \"string\" && entry.color.trim().length\n ? entry.color\n : null;\n const icon =\n typeof entry.icon === \"string\" && entry.icon.trim().length\n ? entry.icon\n : null;\n return { id, value, label, color, icon };\n })\n .filter((entry): entry is StatusOption => Boolean(entry));\n setLineStatuses(mapped);\n return mapped;\n } catch (err) {\n console.error(\"sales.lines.statuses.load\", err);\n setLineStatuses([]);\n return [];\n } finally {\n setLineStatusLoading(false);\n }\n }, []);\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n lineStatuses.length && !query ? lineStatuses : await loadLineStatuses();\n const term = query?.trim().toLowerCase() ?? \"\";\n const currentMap = options.reduce<\n Record<\n string,\n {\n value: string;\n label: string;\n color?: string | null;\n icon?: string | null;\n }\n >\n >((acc, entry) => {\n acc[entry.value] = {\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon ?? null,\n };\n return acc;\n }, {});\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.label !== option.value ? option.value : undefined,\n icon:\n renderDictionaryIcon(option.icon, \"h-4 w-4\") ??\n renderDictionaryColor(option.color, \"h-4 w-4 rounded-full\"),\n }));\n },\n [lineStatuses, loadLineStatuses],\n );\n\n React.useEffect(() => {\n if (!open) return;\n loadTaxRates().catch(() => {});\n loadLineStatuses().catch(() => {});\n }, [loadLineStatuses, loadTaxRates, open]);\n\n const handleFormSubmit = React.useCallback(\n async (values: LineFormState & Record<string, unknown>) => {\n // Resolve required scope and ids\n const resolvedDocumentId =\n typeof documentId === \"string\" && documentId.trim().length\n ? documentId\n : null;\n const resolvedOrg = resolvedOrganizationId;\n const resolvedTenant = resolvedTenantId;\n\n if (!resolvedOrg || !resolvedTenant || !resolvedDocumentId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorScope\",\n \"Organization and tenant are required.\",\n ),\n );\n }\n const lineMode = values.lineMode === \"custom\" ? \"custom\" : \"catalog\";\n const isCustomLine = lineMode === \"custom\";\n\n if (!isCustomLine && !values.productId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n {\n productId: t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n },\n );\n }\n if (!isCustomLine && !values.variantId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n {\n variantId: t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n },\n );\n }\n\n const qtyNumber = Number(values.quantity ?? 0);\n if (!Number.isFinite(qtyNumber) || qtyNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n {\n quantity: t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n },\n );\n }\n const resolvedQuantityUnit = (() => {\n const entered = normalizeUnitCode(values.quantityUnit);\n if (isCustomLine) return entered;\n return (\n entered ??\n normalizeUnitCode(productOption?.defaultSalesUnit) ??\n normalizeUnitCode(productOption?.defaultUnit)\n );\n })();\n\n const unitPriceNumber = Number(values.unitPrice ?? 0);\n if (!Number.isFinite(unitPriceNumber) || unitPriceNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n {\n unitPrice: t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n },\n );\n }\n\n const selectedPrice =\n !isCustomLine && values.priceId\n ? (priceOptions.find((price) => price.id === values.priceId) ?? null)\n : null;\n const resolvedCurrency =\n (values.currencyCode as string | null | undefined) ??\n selectedPrice?.currencyCode ??\n currencyCode ??\n null;\n if (!resolvedCurrency) {\n throw createCrudFormError(\n t(\"sales.documents.items.errorCurrency\", \"Currency is required.\"),\n {\n priceId: t(\n \"sales.documents.items.errorCurrency\",\n \"Currency is required.\",\n ),\n },\n );\n }\n\n const resolvedNameRaw = (values.name ?? \"\").toString().trim();\n const resolvedName = isCustomLine\n ? resolvedNameRaw\n : resolvedNameRaw ||\n variantOption?.title ||\n productOption?.title ||\n undefined;\n if (isCustomLine && !resolvedName) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n {\n name: t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n },\n );\n }\n const resolvedPriceMode = values.priceMode === \"net\" ? \"net\" : \"gross\";\n const catalogSnapshot =\n !isCustomLine &&\n typeof values.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? values.catalogSnapshot\n : null;\n const selectedTaxRateId =\n typeof values.taxRateId === \"string\" && values.taxRateId.trim().length\n ? values.taxRateId\n : null;\n const resolvedTaxRate = Number.isFinite(values.taxRate)\n ? (values.taxRate as number)\n : normalizeNumber(values.taxRate);\n const normalizedTaxRate = Number.isFinite(resolvedTaxRate)\n ? resolvedTaxRate\n : 0;\n const unitPriceNetValue =\n resolvedPriceMode === \"net\"\n ? unitPriceNumber\n : unitPriceNumber / (1 + normalizedTaxRate / 100);\n const unitPriceGrossValue =\n resolvedPriceMode === \"gross\"\n ? unitPriceNumber\n : unitPriceNumber * (1 + normalizedTaxRate / 100);\n const safeUnitPriceNet = Number.isFinite(unitPriceNetValue)\n ? unitPriceNetValue\n : unitPriceNumber;\n const safeUnitPriceGross = Number.isFinite(unitPriceGrossValue)\n ? unitPriceGrossValue\n : unitPriceNumber;\n const totalNetAmount = safeUnitPriceNet * qtyNumber;\n const totalGrossAmount = safeUnitPriceGross * qtyNumber;\n\n const metadata = {\n ...(catalogSnapshot ?? {}),\n ...(!isCustomLine && values.priceId ? { priceId: values.priceId } : {}),\n priceMode: resolvedPriceMode,\n ...(selectedTaxRateId ? { taxRateId: selectedTaxRateId } : {}),\n ...(!isCustomLine && productOption\n ? {\n productTitle: productOption.title,\n productSku: productOption.sku ?? null,\n productThumbnail: productOption.thumbnailUrl ?? null,\n }\n : {}),\n ...(!isCustomLine && variantOption\n ? {\n variantTitle: variantOption.title,\n variantSku: variantOption.sku ?? null,\n variantThumbnail:\n variantOption.thumbnailUrl ??\n productOption?.thumbnailUrl ??\n null,\n }\n : {}),\n ...(isCustomLine ? { customLine: true } : {}),\n lineMode,\n ...(resolvedQuantityUnit ? { quantityUnit: resolvedQuantityUnit } : {}),\n };\n\n const payload: Record<string, unknown> = {\n [documentKey]: String(resolvedDocumentId),\n organizationId: String(resolvedOrg),\n tenantId: String(resolvedTenant),\n productId: isCustomLine\n ? undefined\n : values.productId\n ? String(values.productId)\n : undefined,\n productVariantId: isCustomLine\n ? undefined\n : values.variantId\n ? String(values.variantId)\n : undefined,\n quantity: qtyNumber,\n quantityUnit: resolvedQuantityUnit ?? undefined,\n currencyCode: String(resolvedCurrency),\n priceId:\n !isCustomLine && values.priceId ? String(values.priceId) : undefined,\n priceMode: resolvedPriceMode,\n taxRate: Number.isFinite(resolvedTaxRate) ? resolvedTaxRate : undefined,\n unitPriceNet: safeUnitPriceNet,\n unitPriceGross: safeUnitPriceGross,\n totalNetAmount,\n totalGrossAmount,\n ...(catalogSnapshot ? { catalogSnapshot } : {}),\n metadata,\n customFieldSetId: values.customFieldSetId ?? undefined,\n ...(typeof values.statusEntryId === \"string\" &&\n values.statusEntryId.trim().length\n ? { statusEntryId: values.statusEntryId.trim() }\n : {}),\n };\n\n const customFields = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n });\n if (Object.keys(customFields).length) {\n payload.customFields = normalizeCustomFieldValues(customFields);\n }\n if (resolvedName) payload.name = resolvedName;\n\n try {\n const action = editingId ? updateCrud : createCrud;\n const result = await action(\n resourcePath,\n editingId ? { id: editingId, ...payload } : payload,\n {\n errorMessage: t(\n \"sales.documents.items.errorSave\",\n \"Failed to save line.\",\n ),\n },\n );\n if (result.ok) {\n if (onSaved) await onSaved();\n closeDialog();\n }\n } catch (err) {\n throw err;\n }\n },\n [\n currencyCode,\n documentId,\n documentKey,\n editingId,\n priceOptions,\n productOption,\n resourcePath,\n t,\n variantOption,\n onSaved,\n closeDialog,\n resolvedOrganizationId,\n resolvedTenantId,\n ],\n );\n\n const fields = React.useMemo<CrudField[]>(() => {\n const isCustomLine = lineMode === \"custom\";\n return [\n {\n id: \"lineMode\",\n label: t(\"sales.documents.items.lineMode.label\", \"Line type\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ value, setValue, setFormValue }: FieldRenderProps) => {\n const mode = value === \"custom\" ? \"custom\" : \"catalog\";\n const switchMode = (next: \"catalog\" | \"custom\") => {\n if (next === mode) return;\n setValue(next);\n setLineMode(next);\n if (next === \"custom\") {\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setFormValue?.(\"productId\", null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"catalogSnapshot\", null);\n setFormValue?.(\"quantityUnit\", null);\n } else {\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n }\n };\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"inline-flex w-fit gap-1 rounded-md border bg-muted/50 p-1\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"catalog\" ? \"default\" : \"ghost\"}\n onClick={() => switchMode(\"catalog\")}\n >\n {t(\"sales.documents.items.lineMode.catalog\", \"Catalog item\")}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"custom\" ? \"default\" : \"ghost\"}\n onClick={() => switchMode(\"custom\")}\n >\n {t(\"sales.documents.items.lineMode.custom\", \"Custom line\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.lineMode.helper\",\n \"Use catalog products or create a freeform line with your own price.\",\n )}\n </p>\n </div>\n );\n },\n } satisfies CrudField,\n ...(!isCustomLine\n ? [\n {\n id: \"productId\",\n label: t(\"sales.documents.items.product\", \"Product\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (productOptionsRef.current.get(next) ?? null)\n : null;\n setProductOption(selectedOption);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setValue(next ?? null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n const defaultQuantityUnit =\n selectedOption?.defaultSalesUnit ??\n selectedOption?.defaultUnit ??\n null;\n setFormValue?.(\"quantityUnit\", defaultQuantityUnit);\n if (\n typeof selectedOption?.defaultSalesUnitQuantity ===\n \"number\" &&\n Number.isFinite(\n selectedOption.defaultSalesUnitQuantity,\n ) &&\n selectedOption.defaultSalesUnitQuantity > 0\n ) {\n setFormValue?.(\n \"quantity\",\n String(selectedOption.defaultSalesUnitQuantity),\n );\n }\n const taxSelection = selectedOption\n ? resolveTaxSelection(selectedOption)\n : { taxRate: null, taxRateId: null };\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\"taxRateId\", taxSelection.taxRateId ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim() && selectedOption?.title) {\n setFormValue?.(\"name\", selectedOption.title);\n }\n setFormValue?.(\n \"catalogSnapshot\",\n next\n ? {\n product: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl:\n selectedOption?.thumbnailUrl ?? null,\n defaultUnit: selectedOption?.defaultUnit ?? null,\n defaultSalesUnit:\n selectedOption?.defaultSalesUnit ?? null,\n },\n }\n : null,\n );\n if (next) {\n void loadProductUnits(next, selectedOption);\n void loadPrices(\n next,\n null,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n defaultQuantityUnit,\n );\n }\n }}\n fetchItems={loadProductOptions}\n options={\n productOption\n ? [\n {\n id: productOption.id,\n title: productOption.title || productOption.id,\n subtitle: productOption.sku ?? undefined,\n icon: productOption.thumbnailUrl ? (\n <img\n src={productOption.thumbnailUrl}\n alt={productOption.title ?? productOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n productOption.title || productOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n minQuery={1}\n searchPlaceholder={t(\n \"sales.documents.items.productSearch\",\n \"Search product\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedProduct\",\n \"Selected {{id}}\",\n {\n id: productOption?.title ?? id,\n },\n )\n }\n />\n ),\n } satisfies CrudField,\n {\n id: \"variantId\",\n label: t(\"sales.documents.items.variant\", \"Variant\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n return (\n <LookupSelect\n key={productId ?? \"no-product\"}\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (variantOptionsRef.current.get(next) ?? null)\n : null;\n setVariantOption(selectedOption);\n setValue(next ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim()) {\n setFormValue?.(\n \"name\",\n selectedOption?.title ??\n productOption?.title ??\n existingName,\n );\n }\n const taxSource = hasTaxMetadata(selectedOption)\n ? selectedOption\n : hasTaxMetadata(productOption)\n ? productOption\n : null;\n if (taxSource) {\n const taxSelection = resolveTaxSelection(taxSource);\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\n \"taxRateId\",\n taxSelection.taxRateId ?? null,\n );\n }\n const prevSnapshot =\n typeof values?.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? (values.catalogSnapshot as Record<string, unknown>)\n : null;\n if (next) {\n setFormValue?.(\"catalogSnapshot\", {\n ...(prevSnapshot ?? {}),\n variant: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl: selectedOption?.thumbnailUrl ?? null,\n },\n });\n } else if (prevSnapshot) {\n const snapshot = { ...prevSnapshot };\n if (\"variant\" in snapshot)\n delete (snapshot as CatalogSnapshotRecord).variant;\n setFormValue?.(\n \"catalogSnapshot\",\n Object.keys(snapshot).length ? snapshot : null,\n );\n } else {\n setFormValue?.(\"catalogSnapshot\", null);\n }\n if (productId) {\n const currentQuantity =\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1;\n const currentQuantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n void loadPrices(\n productId,\n next,\n currentQuantity,\n currentQuantityUnit,\n );\n }\n }}\n fetchItems={async (query) => {\n if (!productId) return [];\n const productThumb = productId\n ? productOptionsRef.current.get(productId)?.thumbnailUrl\n : null;\n const options = await loadVariantOptions(\n productId,\n productThumb,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return needle.length\n ? options.filter((option) =>\n option.title.toLowerCase().includes(needle),\n )\n : options;\n }}\n searchPlaceholder={t(\n \"sales.documents.items.variantSearch\",\n \"Search variant\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n options={\n variantOption\n ? [\n {\n id: variantOption.id,\n title: variantOption.title || variantOption.id,\n subtitle: variantOption.sku ?? undefined,\n icon: variantOption.thumbnailUrl ? (\n <img\n src={variantOption.thumbnailUrl}\n alt={variantOption.title ?? variantOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n variantOption.title || variantOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedVariant\",\n \"Selected {{id}}\",\n {\n id: variantOption?.title ?? id,\n },\n )\n }\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n {\n id: \"priceId\",\n label: t(\"sales.documents.items.price\", \"Price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n const variantId =\n typeof values?.variantId === \"string\"\n ? values.variantId\n : null;\n return (\n <LookupSelect\n key={\n productId\n ? `${productId}-${variantId ?? \"no-variant\"}`\n : \"price\"\n }\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n setValue(next ?? null);\n const selected = next\n ? (priceOptions.find((entry) => entry.id === next) ??\n null)\n : null;\n applyPriceSelection(\n selected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit:\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n },\n );\n }}\n fetchItems={async (query) => {\n const prices = await loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return prices\n .filter((price) => {\n if (!needle.length) return true;\n const haystack = [\n price.label,\n price.priceKindTitle,\n price.priceKindCode,\n price.currencyCode,\n ...(price.scopeTags ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n })\n .map<LookupSelectItem>((price) => ({\n id: price.id,\n title: price.label,\n subtitle:\n price.priceKindTitle ??\n price.priceKindCode ??\n undefined,\n description: price.scopeReason ?? undefined,\n rightLabel: price.currencyCode ?? undefined,\n icon: (\n <DollarSign className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }));\n }}\n minQuery={0}\n loading={priceLoading}\n searchPlaceholder={t(\n \"sales.documents.items.priceSearch\",\n \"Select price\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n ]\n : []),\n {\n id: \"unitPrice\",\n label: t(\"sales.documents.items.unitPrice\", \"Unit price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const mode = values?.priceMode === \"net\" ? \"net\" : \"gross\";\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPrice = selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId) ?? null)\n : null;\n const selectedCurrency =\n selectedPrice?.currencyCode ??\n (typeof values?.currencyCode === \"string\" ? values.currencyCode : null);\n const quantityUnitCode = normalizeUnitCode(values?.quantityUnit);\n const baseUnitCode =\n unitOptions.find((option) => option.isBase)?.code ?? null;\n const selectedUnitOption = quantityUnitCode\n ? (unitOptions.find((option) => option.code === quantityUnitCode) ?? null)\n : null;\n const unitFactor = (() => {\n if (!quantityUnitCode) return null;\n if (baseUnitCode && quantityUnitCode === baseUnitCode) return 1;\n const value = normalizeNumber(selectedUnitOption?.toBaseFactor, Number.NaN);\n return Number.isFinite(value) && value > 0 ? value : null;\n })();\n const selectedBaseAmount = selectedPrice\n ? mode === \"net\"\n ? (selectedPrice.amountNet ?? selectedPrice.amountGross ?? null)\n : (selectedPrice.amountGross ?? selectedPrice.amountNet ?? null)\n : null;\n const convertedAmount =\n selectedBaseAmount !== null &&\n unitFactor !== null &&\n Number.isFinite(selectedBaseAmount * unitFactor)\n ? selectedBaseAmount * unitFactor\n : null;\n const isCatalogLine = lineMode !== \"custom\";\n return (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n />\n <select\n className=\"w-32 rounded border px-2 text-sm\"\n value={mode}\n onChange={(event) => {\n const nextMode =\n event.target.value === \"net\" ? \"net\" : \"gross\";\n setFormValue?.(\"priceMode\", nextMode);\n }}\n >\n <option value=\"gross\">\n {t(\"sales.documents.items.priceGross\", \"Gross\")}\n </option>\n <option value=\"net\">\n {t(\"sales.documents.items.priceNet\", \"Net\")}\n </option>\n </select>\n </div>\n {isCatalogLine && selectedPrice && quantityUnitCode && baseUnitCode ? (\n unitFactor !== null && convertedAmount !== null ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisTemplate\",\n \"Catalog price basis: {{baseAmount}} / {{baseUnit}}. Converted for {{unit}}: {{baseAmount}} \u00D7 {{factor}} = {{convertedAmount}}.\",\n {\n baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency),\n baseUnit: baseUnitCode,\n unit: quantityUnitCode,\n factor: unitFactor,\n convertedAmount: formatMoney(convertedAmount, selectedCurrency),\n },\n )}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisMissingConversion\",\n \"Catalog price basis is base unit, but conversion for selected unit is missing.\",\n )}\n </p>\n )\n ) : null}\n {isCatalogLine && !selectedPrice ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisManual\",\n \"Manual unit price mode. Price will not auto-convert until you select a catalog price.\",\n )}\n </p>\n ) : null}\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"taxRateId\",\n label: t(\"sales.documents.items.taxRate\", \"Tax class\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const resolvedValue =\n typeof value === \"string\" && value.trim().length\n ? value\n : findTaxRateIdByValue((values as Record<string, unknown>)?.taxRate as number | null | undefined);\n const handleChange = (\n event: React.ChangeEvent<HTMLSelectElement>,\n ) => {\n const nextId = event.target.value || null;\n const option = nextId ? (taxRateMap.get(nextId) ?? null) : null;\n setValue(nextId);\n const rate = normalizeNumber(option?.rate);\n setFormValue?.(\"taxRate\", Number.isFinite(rate) ? rate : null);\n };\n return (\n <div className=\"flex items-center gap-2\">\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={resolvedValue ?? \"\"}\n onChange={handleChange}\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t(\n \"sales.documents.items.taxRate.none\",\n \"No tax class selected\",\n )\n : t(\n \"sales.documents.items.taxRate.empty\",\n \"No tax classes available\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {rate.name}\n {rate.code ? ` \u2022 ${rate.code.toUpperCase()}` : \"\"}\n {Number.isFinite(rate.rate) ? ` \u2022 ${rate.rate}%` : \"\"}\n </option>\n ))}\n </select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantityUnit\",\n label: t(\"sales.documents.items.quantityUnit\", \"Unit\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n if (isCustomLine) {\n return (\n <Input\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => setValue(event.target.value || null)}\n placeholder={t(\n \"sales.documents.items.quantityUnitPlaceholder\",\n \"e.g. pc\",\n )}\n />\n );\n }\n return (\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => {\n const nextValue = event.target.value || null;\n const nextUnitPrice = convertUnitPriceForUnitChange(\n values?.unitPrice,\n typeof value === \"string\" ? value : null,\n nextValue,\n );\n setValue(nextValue);\n if (nextUnitPrice) {\n setFormValue?.(\"unitPrice\", nextUnitPrice);\n }\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find(\n (entry) => entry.id === selectedPriceId,\n )?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\" ? values.quantity : 1,\n nextValue,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit: nextValue,\n },\n );\n });\n }\n }}\n disabled={!productId}\n >\n <option value=\"\">\n {t(\"sales.documents.items.quantityUnitSelect\", \"Select unit\")}\n </option>\n {unitOptions.map((option) => (\n <option key={option.code} value={option.code}>\n {option.isBase\n ? `${option.code} (${t(\"sales.documents.items.baseUnitTag\", \"base\")})`\n : option.code}\n </option>\n ))}\n </select>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantity\",\n label: t(\"sales.documents.items.quantity\", \"Quantity\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => (\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => {\n const nextQuantity = event.target.value;\n setValue(nextQuantity);\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n const quantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId)\n ?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n nextQuantity,\n quantityUnit,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit,\n },\n );\n });\n }\n }}\n placeholder=\"1\"\n />\n ),\n } satisfies CrudField,\n {\n id: \"uomPreview\",\n label: t(\"sales.documents.items.uomPreview\", \"Normalized quantity\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ values }: FieldRenderProps) => {\n if (isCustomLine) return null;\n const quantity = normalizeNumber(values?.quantity, Number.NaN);\n const enteredUnit = normalizeUnitCode(values?.quantityUnit);\n if (!Number.isFinite(quantity) || quantity <= 0 || !enteredUnit) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewEmpty\",\n \"Select unit and quantity to preview normalization.\",\n )}\n </p>\n );\n }\n const selectedOption =\n unitOptions.find((option) => option.code === enteredUnit) ?? null;\n const baseOption =\n unitOptions.find((option) => option.isBase) ?? null;\n const factor = selectedOption?.toBaseFactor;\n if (!Number.isFinite(factor) || !factor || !baseOption) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewUnavailable\",\n \"Missing conversion to base unit.\",\n )}\n </p>\n );\n }\n const normalized = normalizeQuantityPreview(quantity * factor);\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewTemplate\",\n \"{{quantity}} {{unit}} \u2192 {{normalized}} {{baseUnit}}\",\n {\n quantity,\n unit: enteredUnit,\n normalized,\n baseUnit: baseOption.code,\n },\n )}\n </p>\n );\n },\n } satisfies CrudField,\n {\n id: \"statusEntryId\",\n label: t(\"sales.documents.items.status\", \"Status\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => setValue(next ?? null)}\n placeholder={t(\n \"sales.documents.items.statusPlaceholder\",\n \"Select status\",\n )}\n emptyLabel={t(\"sales.documents.items.statusEmpty\", \"No status\")}\n fetchItems={fetchLineStatusItems}\n loadingLabel={t(\n \"sales.documents.items.statusLoading\",\n \"Loading statuses\u2026\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\"ui.lookupSelect.clearSelection\", \"Clear selection\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n />\n ),\n } satisfies CrudField,\n {\n id: \"name\",\n label: t(\"sales.documents.items.name\", \"Name\"),\n type: \"text\",\n placeholder: t(\n \"sales.documents.items.namePlaceholder\",\n \"Optional line name\",\n ),\n layout: \"full\",\n required: isCustomLine,\n } satisfies CrudField,\n ];\n }, [\n applyPriceSelection,\n convertUnitPriceForUnitChange,\n currencyCode,\n findTaxRateIdByValue,\n loadPrices,\n loadProductUnits,\n loadProductOptions,\n loadVariantOptions,\n fetchLineStatusItems,\n priceLoading,\n priceOptions,\n productOption,\n unitOptions,\n lineMode,\n variantOption,\n t,\n taxRateMap,\n taxRates,\n resolveTaxSelection,\n selectPriceAfterRefresh,\n hasTaxMetadata,\n ]);\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n return [\n { id: \"line-core\", fields },\n {\n id: \"line-custom\",\n column: 2,\n title: t(\"entities.customFields.title\", \"Custom fields\"),\n kind: \"customFields\",\n },\n ];\n }, [fields, t]);\n\n React.useEffect(() => {\n if (!open) return;\n if (!initialLine) {\n resetForm();\n return;\n }\n setEditingId(initialLine.id);\n const nextForm = defaultForm(initialLine.currencyCode ?? currencyCode);\n const meta = initialLine.metadata ?? {};\n const snapshot =\n (initialLine.catalogSnapshot as\n | Record<string, unknown>\n | null\n | undefined) ?? null;\n const snapshotProduct =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).product === \"object\" &&\n (snapshot as CatalogSnapshotRecord).product\n ? ((snapshot as CatalogSnapshotRecord).product as Record<string, unknown>)\n : null;\n const snapshotVariant =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).variant === \"object\" &&\n (snapshot as CatalogSnapshotRecord).variant\n ? ((snapshot as CatalogSnapshotRecord).variant as Record<string, unknown>)\n : null;\n const metaRec = (typeof meta === \"object\" && meta ? meta : null) as LineMetadataRecord | null;\n const metaLineMode =\n typeof metaRec?.lineMode === \"string\" &&\n (metaRec.lineMode === \"custom\" || metaRec.lineMode === \"catalog\")\n ? (metaRec.lineMode as \"custom\" | \"catalog\")\n : metaRec?.customLine\n ? \"custom\"\n : undefined;\n nextForm.productId = initialLine.productId;\n nextForm.variantId = initialLine.productVariantId;\n nextForm.quantity = initialLine.quantity.toString();\n nextForm.quantityUnit = normalizeUnitCode(initialLine.quantityUnit) ?? null;\n const metaMode = metaRec?.priceMode;\n const resolvedPriceMode =\n metaMode === \"net\" || metaMode === \"gross\"\n ? metaMode\n : (initialLine.priceMode ?? \"gross\");\n nextForm.unitPrice =\n resolvedPriceMode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n nextForm.priceMode = resolvedPriceMode;\n nextForm.taxRate = Number.isFinite(initialLine.taxRate)\n ? initialLine.taxRate\n : null;\n nextForm.name = initialLine.name ?? \"\";\n nextForm.catalogSnapshot = snapshot ?? null;\n nextForm.customFieldSetId = initialLine.customFieldSetId ?? null;\n nextForm.statusEntryId = initialLine.statusEntryId ?? null;\n nextForm.lineMode =\n metaLineMode ??\n (initialLine.productId || initialLine.productVariantId\n ? \"catalog\"\n : \"custom\");\n const metaTaxRateId =\n typeof metaRec?.taxRateId === \"string\"\n ? metaRec.taxRateId\n : null;\n const fallbackTaxRateId = findTaxRateIdByValue(nextForm.taxRate);\n nextForm.taxRateId =\n metaTaxRateId ??\n fallbackTaxRateId ??\n (defaultTaxRateRef.current ? defaultTaxRateRef.current.id : null);\n if (!Number.isFinite(nextForm.taxRate) && nextForm.taxRateId) {\n const matched = taxRatesRef.current.find(\n (rate) => rate.id === nextForm.taxRateId,\n );\n const numericRate = normalizeNumber(matched?.rate);\n if (Number.isFinite(numericRate)) {\n nextForm.taxRate = numericRate;\n }\n }\n let resolvedProductOption: ProductOption | null = null;\n let resolvedVariantOption: VariantOption | null = null;\n if (metaRec) {\n const metaRecord = metaRec;\n const mode = metaRecord.priceMode;\n if (mode === \"net\" || mode === \"gross\") {\n nextForm.priceMode = mode;\n nextForm.unitPrice =\n mode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n }\n nextForm.priceId =\n typeof metaRecord.priceId === \"string\"\n ? metaRecord.priceId\n : null;\n const productTitle =\n typeof metaRecord.productTitle === \"string\"\n ? metaRecord.productTitle\n : initialLine.name;\n const productSku =\n typeof metaRecord.productSku === \"string\"\n ? metaRecord.productSku\n : null;\n const productThumbnail =\n typeof metaRecord.productThumbnail === \"string\"\n ? metaRecord.productThumbnail\n : null;\n if (productTitle && initialLine.productId) {\n const snapshotUom = snapshotProduct\n ? getUomProductFields(snapshotProduct)\n : { defaultUnit: null, defaultSalesUnit: null, defaultSalesUnitQuantity: Number.NaN };\n const option: ProductOption = {\n id: initialLine.productId,\n title: productTitle,\n sku: productSku,\n thumbnailUrl: productThumbnail,\n defaultUnit: snapshotUom.defaultUnit,\n defaultSalesUnit: snapshotUom.defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(snapshotUom.defaultSalesUnitQuantity)\n ? snapshotUom.defaultSalesUnitQuantity\n : null,\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n const variantTitle =\n typeof metaRecord.variantTitle === \"string\"\n ? metaRecord.variantTitle\n : null;\n const variantSku =\n typeof metaRecord.variantSku === \"string\"\n ? metaRecord.variantSku\n : null;\n const variantThumb =\n typeof metaRecord.variantThumbnail === \"string\"\n ? metaRecord.variantThumbnail\n : productThumbnail;\n if (variantTitle && initialLine.productVariantId) {\n const option = {\n id: initialLine.productVariantId,\n title: variantTitle,\n sku: variantSku,\n thumbnailUrl: variantThumb ?? null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n }\n if (!resolvedProductOption && initialLine.productId && snapshotProduct) {\n const sp = snapshotProduct as SnapshotEntity;\n const snapshotTitle =\n typeof sp.title === \"string\" && sp.title.trim().length\n ? sp.title\n : (initialLine.name ?? initialLine.productId);\n const snapshotSku =\n typeof sp.sku === \"string\" && sp.sku.trim().length\n ? sp.sku\n : null;\n const snapshotThumb =\n typeof sp.thumbnailUrl === \"string\"\n ? sp.thumbnailUrl\n : typeof sp.thumbnail_url === \"string\"\n ? sp.thumbnail_url\n : null;\n const snapshotTaxRate = normalizeNumber(sp.taxRate, Number.NaN);\n const option: ProductOption = {\n id: initialLine.productId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sp.taxRateId === \"string\" ? sp.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n defaultUnit: normalizeUnitCode(sp.defaultUnit ?? sp.default_unit),\n defaultSalesUnit: normalizeUnitCode(sp.defaultSalesUnit ?? sp.default_sales_unit),\n defaultSalesUnitQuantity: (() => {\n const raw = normalizeNumber(sp.defaultSalesUnitQuantity ?? sp.default_sales_unit_quantity, Number.NaN);\n return Number.isFinite(raw) ? raw : null;\n })(),\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n if (\n !resolvedVariantOption &&\n initialLine.productVariantId &&\n snapshotVariant\n ) {\n const sv = snapshotVariant as SnapshotEntity;\n const snapshotTitle =\n typeof sv.title === \"string\" && sv.title.trim().length\n ? sv.title\n : (initialLine.name ?? initialLine.productVariantId);\n const snapshotSku =\n typeof sv.sku === \"string\" && sv.sku.trim().length\n ? sv.sku\n : null;\n const snapshotThumb =\n typeof sv.thumbnailUrl === \"string\"\n ? sv.thumbnailUrl\n : typeof sv.thumbnail_url === \"string\"\n ? sv.thumbnail_url\n : (resolvedProductOption?.thumbnailUrl ??\n productOptionsRef.current.get(initialLine.productId ?? \"\")\n ?.thumbnailUrl ??\n null);\n const snapshotTaxRate = normalizeNumber(sv.taxRate, Number.NaN);\n const option: VariantOption = {\n id: initialLine.productVariantId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sv.taxRateId === \"string\" ? sv.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n if (resolvedProductOption) setProductOption(resolvedProductOption);\n if (resolvedVariantOption) setVariantOption(resolvedVariantOption);\n const customValues = extractCustomFieldValues(\n initialLine as Record<string, unknown>,\n );\n const merged = { ...nextForm, ...customValues };\n setInitialValues(merged);\n setLineMode(merged.lineMode);\n setFormResetKey((prev) => prev + 1);\n if (initialLine.productId) {\n void loadProductUnits(initialLine.productId, resolvedProductOption).then(\n (options) => {\n const requestedUnit = normalizeUnitCode(nextForm.quantityUnit);\n if (\n requestedUnit &&\n !options.some((entry) => entry.code === requestedUnit)\n ) {\n setUnitOptions((prev) => [\n ...prev,\n { code: requestedUnit, toBaseFactor: null, isBase: false },\n ]);\n }\n },\n );\n void loadPrices(\n initialLine.productId,\n initialLine.productVariantId,\n nextForm.quantity,\n nextForm.quantityUnit,\n );\n } else {\n setPriceOptions([]);\n setUnitOptions([]);\n }\n }, [\n currencyCode,\n findTaxRateIdByValue,\n initialLine,\n loadPrices,\n loadProductUnits,\n open,\n resetForm,\n ]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => (next ? onOpenChange(true) : closeDialog())}\n >\n <DialogContent\n className=\"sm:max-w-5xl\"\n ref={dialogContentRef}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\") {\n event.preventDefault();\n dialogContentRef.current?.querySelector(\"form\")?.requestSubmit();\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeDialog();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {editingId\n ? t(\"sales.documents.items.editTitle\", \"Edit line\")\n : t(\"sales.documents.items.addTitle\", \"Add line\")}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<LineFormState>\n key={formResetKey}\n embedded\n fields={fields}\n groups={groups}\n entityId={customFieldEntityId}\n initialValues={initialValues}\n submitLabel={\n editingId\n ? t(\"sales.documents.items.save\", \"Save changes\")\n : t(\"sales.documents.items.addLine\", \"Add item\")\n }\n onSubmit={handleFormSubmit}\n loadingMessage={t(\"sales.documents.items.loading\", \"Loading items\u2026\")}\n />\n </DialogContent>\n </Dialog>\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport {\n LookupSelect,\n type LookupSelectItem,\n} from \"@open-mercato/ui/backend/inputs\";\nimport {\n CrudForm,\n type CrudField,\n type CrudFormGroup,\n type CrudCustomFieldRenderProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { collectCustomFieldValues } from \"@open-mercato/ui/backend/utils/customFieldValues\";\nimport { apiCall } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { createCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@open-mercato/ui/primitives/dialog\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@open-mercato/ui/primitives/select\";\nimport { DollarSign, Settings } from \"lucide-react\";\nimport { normalizeCustomFieldValues } from \"@open-mercato/shared/lib/custom-fields/normalize\";\nimport {\n DictionaryValue,\n renderDictionaryIcon,\n renderDictionaryColor,\n} from \"@open-mercato/core/modules/dictionaries/components/dictionaryAppearance\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { useOrganizationScopeDetail } from \"@open-mercato/shared/lib/frontend/useOrganizationScope\";\nimport { formatMoney, normalizeNumber } from \"./lineItemUtils\";\nimport type { SalesLineRecord } from \"./lineItemTypes\";\nimport {\n normalizeCustomFieldSubmitValue,\n extractCustomFieldValues,\n} from \"./customFieldHelpers\";\nimport { canonicalizeUnitCode } from \"@open-mercato/shared/lib/units/unitCodes\";\n\ntype ProductOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n defaultUnit?: string | null;\n defaultSalesUnit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n};\n\ntype VariantOption = {\n id: string;\n title: string;\n sku: string | null;\n thumbnailUrl: string | null;\n taxRateId?: string | null;\n taxRate?: number | null;\n};\n\ntype PriceOption = {\n id: string;\n amountNet: number | null;\n amountGross: number | null;\n currencyCode: string | null;\n displayMode: \"including-tax\" | \"excluding-tax\" | null;\n taxRate: number | null;\n label: string;\n priceKindId?: string | null;\n priceKindTitle?: string | null;\n priceKindCode?: string | null;\n scopeReason?: string | null;\n scopeTags?: string[];\n};\n\ntype TaxRateOption = {\n id: string;\n name: string;\n code: string | null;\n rate: number | null;\n isDefault: boolean;\n};\n\ntype StatusOption = {\n id: string;\n value: string;\n label: string;\n color: string | null;\n icon: string | null;\n};\n\ntype UnitOption = {\n code: string;\n toBaseFactor: number | null;\n isBase: boolean;\n};\n\ntype LineFormState = {\n lineMode: \"catalog\" | \"custom\";\n productId: string | null;\n variantId: string | null;\n quantity: string;\n quantityUnit: string | null;\n priceId: string | null;\n priceMode: \"net\" | \"gross\";\n unitPrice: string;\n taxRate: number | null;\n taxRateId: string | null;\n name: string;\n currencyCode: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n customFieldSetId?: string | null;\n statusEntryId?: string | null;\n};\n\ntype FieldRenderProps = CrudCustomFieldRenderProps;\n\ntype ApiPriceKind = {\n title?: string | null;\n name?: string | null;\n code?: string | null;\n};\n\ntype ApiPriceItem = Record<string, unknown> & {\n unit_price_net?: number | null;\n unit_price_gross?: number | null;\n currency_code?: string | null;\n currencyCode?: string | null;\n display_mode?: string | null;\n displayMode?: string | null;\n tax_rate?: number | null;\n price_kind_id?: string | null;\n priceKindId?: string | null;\n price_kind_title?: string | null;\n priceKindTitle?: string | null;\n price_kind_code?: string | null;\n priceKindCode?: string | null;\n price_kind?: ApiPriceKind | null;\n kind?: string | null;\n};\n\ntype ApiTaxRateItem = Record<string, unknown> & {\n rate?: number | null;\n code?: string | null;\n isDefault?: boolean;\n is_default?: boolean;\n min_quantity?: number | null;\n max_quantity?: number | null;\n starts_at?: string | null;\n ends_at?: string | null;\n};\n\ntype ApiProductItem = Record<string, unknown> & {\n name?: string;\n sku?: string;\n default_media_url?: string;\n defaultMediaUrl?: string;\n pricing?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiVariantItem = Record<string, unknown> & {\n sku?: string;\n default_media_url?: string;\n thumbnailUrl?: string;\n metadata?: Record<string, unknown> | null;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype ApiPricingMetadata = {\n tax_rate_id?: string;\n taxRateId?: string;\n tax_rate?: number | null;\n taxRate?: number | null;\n};\n\ntype LineMetadataRecord = {\n lineMode?: string;\n customLine?: boolean | null;\n priceMode?: string;\n taxRateId?: string;\n priceId?: string;\n productTitle?: string;\n productSku?: string;\n productThumbnail?: string;\n variantTitle?: string;\n variantSku?: string;\n variantThumbnail?: string;\n};\n\ntype CatalogSnapshotRecord = Record<string, unknown> & {\n product?: Record<string, unknown> | null;\n variant?: Record<string, unknown> | null;\n};\n\ntype SnapshotEntity = {\n defaultUnit?: string | null;\n default_unit?: string | null;\n defaultSalesUnit?: string | null;\n default_sales_unit?: string | null;\n defaultSalesUnitQuantity?: number | null;\n default_sales_unit_quantity?: number | null;\n title?: string;\n sku?: string;\n thumbnailUrl?: string;\n thumbnail_url?: string;\n taxRate?: number | null;\n taxRateId?: string;\n};\n\ntype SalesLineDialogProps = {\n open: boolean;\n kind: \"order\" | \"quote\";\n documentId: string;\n currencyCode: string | null | undefined;\n organizationId: string | null;\n tenantId: string | null;\n initialLine?: SalesLineRecord | null;\n onOpenChange: (open: boolean) => void;\n onSaved?: () => Promise<void> | void;\n};\n\nconst defaultForm = (currencyCode?: string | null): LineFormState => ({\n lineMode: \"catalog\",\n productId: null,\n variantId: null,\n quantity: \"1\",\n quantityUnit: null,\n priceId: null,\n priceMode: \"gross\",\n unitPrice: \"\",\n taxRate: null,\n taxRateId: null,\n name: \"\",\n currencyCode: currencyCode ?? null,\n catalogSnapshot: null,\n customFieldSetId: null,\n statusEntryId: null,\n});\n\nconst UNIT_PRICE_INPUT_SCALE = 4;\n\nfunction buildPriceScopeReason(\n item: Record<string, unknown>,\n t: (k: string, f: string) => string,\n): {\n reason: string | null;\n tags: string[];\n} {\n const tags: string[] = [];\n const add = (key: string) => tags.push(key);\n if (item.channel_id || item.channelId)\n add(t(\"sales.documents.items.priceScope.channel\", \"Channel\"));\n if (item.offer_id || item.offerId)\n add(t(\"sales.documents.items.priceScope.offer\", \"Offer\"));\n if (item.variant_id || item.variantId)\n add(t(\"sales.documents.items.priceScope.variant\", \"Variant\"));\n if (item.customer_group_id || item.customerGroupId)\n add(t(\"sales.documents.items.priceScope.customerGroup\", \"Customer group\"));\n if (item.customer_id || item.customerId)\n add(t(\"sales.documents.items.priceScope.customer\", \"Customer\"));\n if (item.user_group_id || item.userGroupId)\n add(t(\"sales.documents.items.priceScope.userGroup\", \"User group\"));\n if (item.user_id || item.userId)\n add(t(\"sales.documents.items.priceScope.user\", \"User\"));\n const minQty = normalizeNumber((item as ApiPriceItem).min_quantity, Number.NaN);\n const maxQty = normalizeNumber((item as ApiPriceItem).max_quantity, Number.NaN);\n if (Number.isFinite(minQty) || Number.isFinite(maxQty)) {\n add(t(\"sales.documents.items.priceScope.quantity\", \"Quantity\"));\n }\n if ((item as ApiPriceItem).starts_at || (item as ApiPriceItem).ends_at) {\n add(t(\"sales.documents.items.priceScope.schedule\", \"Scheduled\"));\n }\n if (tags.length === 0) return { reason: null, tags };\n return { reason: tags.join(\" \u2022 \"), tags };\n}\n\nfunction buildPlaceholder(label?: string | null) {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded border bg-muted text-xs uppercase text-muted-foreground\">\n {(label ?? \"\").slice(0, 2) || \"\u2022\"}\n </div>\n );\n}\n\nfunction normalizeUnitCode(value: unknown): string | null {\n return canonicalizeUnitCode(value);\n}\n\nfunction getRecordBoolean(\n record: Record<string, unknown>,\n fallback: boolean,\n ...keys: string[]\n): boolean {\n for (const key of keys) {\n const val = record[key];\n if (typeof val === \"boolean\") return val;\n }\n return fallback;\n}\n\nfunction getUomProductFields(item: Record<string, unknown>) {\n return {\n defaultUnit: normalizeUnitCode(item.default_unit ?? item.defaultUnit),\n defaultSalesUnit: normalizeUnitCode(\n item.default_sales_unit ?? item.defaultSalesUnit,\n ),\n defaultSalesUnitQuantity: normalizeNumber(\n item.default_sales_unit_quantity ?? item.defaultSalesUnitQuantity,\n Number.NaN,\n ),\n };\n}\n\nfunction getUomConversionFields(row: Record<string, unknown>) {\n return {\n unitCode: normalizeUnitCode(row.unit_code ?? row.unitCode),\n isActive: getRecordBoolean(row, true, \"is_active\", \"isActive\"),\n toBaseFactor: normalizeNumber(\n row.to_base_factor ?? row.toBaseFactor,\n Number.NaN,\n ),\n };\n}\n\nfunction normalizeQuantityPreview(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * 1_000_000) / 1_000_000;\n}\n\nfunction normalizeUnitPriceInputValue(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n const factor = 10 ** UNIT_PRICE_INPUT_SCALE;\n const rounded = Math.round((value + Number.EPSILON) * factor) / factor;\n if (!Number.isFinite(rounded)) return \"\";\n return rounded.toString();\n}\n\nexport function LineItemDialog({\n open,\n kind,\n documentId,\n currencyCode,\n organizationId,\n tenantId,\n initialLine,\n onOpenChange,\n onSaved,\n}: SalesLineDialogProps) {\n const t = useT();\n const scope = useOrganizationScopeDetail();\n const resolvedOrganizationId = organizationId ?? scope.organizationId ?? null;\n const resolvedTenantId = tenantId ?? scope.tenantId ?? null;\n const [initialValues, setInitialValues] = React.useState<LineFormState>(() =>\n defaultForm(currencyCode),\n );\n const [lineMode, setLineMode] = React.useState<\"catalog\" | \"custom\">(\n defaultForm(currencyCode).lineMode,\n );\n const [productOption, setProductOption] =\n React.useState<ProductOption | null>(null);\n const [variantOption, setVariantOption] =\n React.useState<VariantOption | null>(null);\n const [priceOptions, setPriceOptions] = React.useState<PriceOption[]>([]);\n const [priceLoading, setPriceLoading] = React.useState(false);\n const [formResetKey, setFormResetKey] = React.useState(0);\n const [editingId, setEditingId] = React.useState<string | null>(null);\n const [taxRates, setTaxRates] = React.useState<TaxRateOption[]>([]);\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([]);\n const [unitOptions, setUnitOptions] = React.useState<UnitOption[]>([]);\n const [, setLineStatusLoading] = React.useState(false);\n const productOptionsRef = React.useRef<Map<string, ProductOption>>(new Map());\n const variantOptionsRef = React.useRef<Map<string, VariantOption>>(new Map());\n const taxRatesRef = React.useRef<TaxRateOption[]>([]);\n const defaultTaxRateRef = React.useRef<TaxRateOption | null>(null);\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null);\n\n const resourcePath = React.useMemo(\n () => (kind === \"order\" ? \"sales/order-lines\" : \"sales/quote-lines\"),\n [kind],\n );\n const documentKey = kind === \"order\" ? \"orderId\" : \"quoteId\";\n const customFieldEntityId =\n kind === \"order\" ? E.sales.sales_order_line : E.sales.sales_quote_line;\n\n const taxRateMap = React.useMemo(\n () =>\n taxRates.reduce<Map<string, TaxRateOption>>((acc, rate) => {\n acc.set(rate.id, rate);\n return acc;\n }, new Map()),\n [taxRates],\n );\n\n const findTaxRateIdByValue = React.useCallback(\n (value: number | null | undefined): string | null => {\n const numeric = normalizeNumber(value, Number.NaN);\n if (!Number.isFinite(numeric)) return null;\n const match = taxRatesRef.current.find(\n (rate) =>\n Number.isFinite(rate.rate) &&\n Math.abs((rate.rate as number) - numeric) < 0.0001,\n );\n return match?.id ?? null;\n },\n [],\n );\n\n const resolveTaxSelection = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n const taxRateId =\n typeof source?.taxRateId === \"string\" && source.taxRateId.trim().length\n ? source.taxRateId.trim()\n : null;\n const rateFromId = taxRateId\n ? normalizeNumber(taxRateMap.get(taxRateId)?.rate, Number.NaN)\n : Number.NaN;\n const numericRate = normalizeNumber(source?.taxRate, Number.NaN);\n const resolvedRateId =\n taxRateId ??\n (Number.isFinite(numericRate)\n ? findTaxRateIdByValue(numericRate)\n : null);\n const resolvedRate = Number.isFinite(rateFromId)\n ? rateFromId\n : Number.isFinite(numericRate)\n ? numericRate\n : null;\n return { taxRateId: resolvedRateId, taxRate: resolvedRate };\n },\n [findTaxRateIdByValue, taxRateMap],\n );\n\n const hasTaxMetadata = React.useCallback(\n (\n source?: { taxRateId?: string | null; taxRate?: number | null } | null,\n ) => {\n if (!source) return false;\n const id =\n typeof source.taxRateId === \"string\" ? source.taxRateId.trim() : \"\";\n if (id.length) return true;\n const numericRate = normalizeNumber(source.taxRate, Number.NaN);\n return Number.isFinite(numericRate);\n },\n [],\n );\n\n const resetForm = React.useCallback(\n (next?: Partial<LineFormState>) => {\n const base = { ...defaultForm(currencyCode), ...next };\n const defaultRate = defaultTaxRateRef.current;\n if (!base.taxRateId && defaultRate) {\n base.taxRateId = defaultRate.id;\n base.taxRate = Number.isFinite(defaultRate.rate ?? null)\n ? (defaultRate.rate as number)\n : base.taxRate;\n }\n setInitialValues(base);\n setLineMode(base.lineMode);\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setEditingId(null);\n setFormResetKey((prev) => prev + 1);\n },\n [currencyCode],\n );\n\n const closeDialog = React.useCallback(() => {\n onOpenChange(false);\n resetForm();\n }, [onOpenChange, resetForm]);\n\n const loadTaxRates = React.useCallback(async () => {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const parsed = items\n .map<TaxRateOption | null>((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n const name =\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name.trim()\n : typeof item.code === \"string\"\n ? item.code\n : null;\n if (!id || !name) return null;\n const rate = normalizeNumber((item as ApiTaxRateItem).rate);\n const code =\n typeof (item as ApiTaxRateItem).code === \"string\" &&\n (item as ApiTaxRateItem).code?.trim().length\n ? (item as ApiTaxRateItem).code?.trim() ?? null\n : null;\n const isDefault = Boolean(\n (item as ApiTaxRateItem).isDefault ?? (item as ApiTaxRateItem).is_default,\n );\n return {\n id,\n name,\n code,\n rate: Number.isFinite(rate) ? rate : null,\n isDefault,\n };\n })\n .filter((entry): entry is TaxRateOption => Boolean(entry));\n taxRatesRef.current = parsed;\n defaultTaxRateRef.current = parsed.find((rate) => rate.isDefault) ?? null;\n setTaxRates(parsed);\n return parsed;\n } catch (err) {\n console.error(\"sales.tax-rates.fetch\", err);\n taxRatesRef.current = [];\n defaultTaxRateRef.current = null;\n setTaxRates([]);\n return [];\n }\n }, []);\n\n const loadProductOptions = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const params = new URLSearchParams({ pageSize: \"8\" });\n if (query && query.trim().length) {\n params.set(\"search\", query.trim());\n } else {\n params.set(\"sortField\", \"title\");\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/products?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? (response.result?.items ?? [])\n : [];\n const mapped = items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const productItem = item as ApiProductItem;\n const title =\n typeof item.title === \"string\"\n ? item.title\n : typeof productItem.name === \"string\"\n ? productItem.name\n : id;\n const sku =\n typeof productItem.sku === \"string\" ? productItem.sku : null;\n const thumbnail =\n typeof productItem.default_media_url === \"string\"\n ? productItem.default_media_url\n : typeof productItem.defaultMediaUrl === \"string\"\n ? productItem.defaultMediaUrl\n : null;\n const pricing =\n typeof productItem.pricing === \"object\" && productItem.pricing\n ? productItem.pricing\n : null;\n const metadata =\n typeof productItem.metadata === \"object\" && productItem.metadata\n ? productItem.metadata\n : null;\n const pricingMeta = pricing as ApiPricingMetadata | null;\n const metaMeta = metadata as ApiPricingMetadata | null;\n const pricingTaxRateId =\n typeof pricingMeta?.tax_rate_id === \"string\" &&\n pricingMeta.tax_rate_id.trim().length\n ? pricingMeta.tax_rate_id.trim()\n : typeof pricingMeta?.taxRateId === \"string\" &&\n pricingMeta.taxRateId.trim().length\n ? pricingMeta.taxRateId.trim()\n : null;\n const metaTaxRateId =\n typeof metaMeta?.taxRateId === \"string\" &&\n metaMeta.taxRateId.trim().length\n ? metaMeta.taxRateId.trim()\n : typeof metaMeta?.tax_rate_id === \"string\" &&\n metaMeta.tax_rate_id.trim().length\n ? metaMeta.tax_rate_id.trim()\n : null;\n const taxRateValue = normalizeNumber(\n pricingMeta?.tax_rate ??\n pricingMeta?.taxRate ??\n productItem.tax_rate ??\n productItem.taxRate,\n Number.NaN,\n );\n const uomFields = getUomProductFields(item);\n const defaultUnit = uomFields.defaultUnit;\n const defaultSalesUnit = uomFields.defaultSalesUnit;\n const defaultSalesUnitQuantity = uomFields.defaultSalesUnitQuantity;\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail ? (\n <img\n src={thumbnail}\n alt={title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(title)\n ),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: pricingTaxRateId ?? metaTaxRateId ?? null,\n taxRate: Number.isFinite(taxRateValue) ? taxRateValue : null,\n defaultUnit,\n defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(\n defaultSalesUnitQuantity,\n )\n ? defaultSalesUnitQuantity\n : null,\n } satisfies ProductOption,\n } as LookupSelectItem & { option: ProductOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: ProductOption } =>\n Boolean(entry),\n );\n return mapped.map((entry) => {\n productOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadVariantOptions = React.useCallback(\n async (\n productId: string,\n fallbackThumbnail?: string | null,\n ): Promise<LookupSelectItem[]> => {\n if (!productId) return [];\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/variants?productId=${encodeURIComponent(productId)}&pageSize=50`,\n undefined,\n { fallback: { items: [] } },\n );\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n return items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const title = typeof item.name === \"string\" ? item.name : id;\n const variantItem = item as ApiVariantItem;\n const sku =\n typeof variantItem.sku === \"string\" ? variantItem.sku : null;\n const metadata =\n typeof variantItem.metadata === \"object\" && variantItem.metadata\n ? variantItem.metadata\n : null;\n const variantMeta = metadata as ApiPricingMetadata | null;\n const variantTaxRateId =\n typeof variantMeta?.taxRateId === \"string\" &&\n variantMeta.taxRateId.trim().length\n ? variantMeta.taxRateId.trim()\n : typeof variantMeta?.tax_rate_id === \"string\" &&\n variantMeta.tax_rate_id.trim().length\n ? variantMeta.tax_rate_id.trim()\n : null;\n const variantTaxRate = normalizeNumber(\n variantItem.tax_rate ??\n variantItem.taxRate ??\n variantMeta?.tax_rate ??\n variantMeta?.taxRate,\n Number.NaN,\n );\n const thumbnail =\n typeof variantItem.default_media_url === \"string\"\n ? variantItem.default_media_url\n : typeof variantItem.thumbnailUrl === \"string\"\n ? variantItem.thumbnailUrl\n : (fallbackThumbnail ?? null);\n return {\n id,\n title,\n subtitle: sku ?? undefined,\n icon: thumbnail ? (\n <img\n src={thumbnail}\n alt={title}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(title)\n ),\n option: {\n id,\n title,\n sku,\n thumbnailUrl: thumbnail,\n taxRateId: variantTaxRateId,\n taxRate: Number.isFinite(variantTaxRate) ? variantTaxRate : null,\n } satisfies VariantOption,\n } as LookupSelectItem & { option: VariantOption };\n })\n .filter(\n (entry): entry is LookupSelectItem & { option: VariantOption } =>\n Boolean(entry),\n )\n .map((entry) => {\n variantOptionsRef.current.set(entry.option.id, entry.option);\n return entry;\n });\n },\n [],\n );\n\n const loadProductUnits = React.useCallback(\n async (\n productId: string | null,\n option: ProductOption | null,\n ): Promise<UnitOption[]> => {\n if (!productId) {\n setUnitOptions([]);\n return [];\n }\n const map = new Map<string, UnitOption>();\n let baseUnit = normalizeUnitCode(option?.defaultUnit);\n let defaultSalesUnit = normalizeUnitCode(option?.defaultSalesUnit);\n if (!baseUnit || !defaultSalesUnit) {\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { fallback: { items: [] } },\n );\n const records = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const matched =\n records.find((entry) => entry.id === productId) ??\n records[0] ??\n null;\n if (matched) {\n const matchedUom = getUomProductFields(matched);\n baseUnit = baseUnit ?? matchedUom.defaultUnit;\n defaultSalesUnit = defaultSalesUnit ?? matchedUom.defaultSalesUnit;\n }\n } catch (err) {\n console.error(\"sales.document.items.loadProductUnits.hydration\", err);\n }\n }\n if (baseUnit) {\n map.set(baseUnit, { code: baseUnit, toBaseFactor: 1, isBase: true });\n }\n try {\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(\n `/api/catalog/product-unit-conversions?productId=${encodeURIComponent(productId)}&pageSize=100`,\n undefined,\n { fallback: { items: [] } },\n );\n const rows = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n for (const row of rows) {\n const conv = getUomConversionFields(row);\n if (!conv.unitCode) continue;\n if (!conv.isActive) continue;\n map.set(conv.unitCode, {\n code: conv.unitCode,\n toBaseFactor:\n Number.isFinite(conv.toBaseFactor) && conv.toBaseFactor > 0\n ? conv.toBaseFactor\n : null,\n isBase: baseUnit ? conv.unitCode === baseUnit : false,\n });\n }\n } catch (err) {\n console.error(\"sales.document.items.loadUnits\", err);\n }\n if (defaultSalesUnit && !map.has(defaultSalesUnit)) {\n map.set(defaultSalesUnit, {\n code: defaultSalesUnit,\n toBaseFactor: baseUnit && defaultSalesUnit === baseUnit ? 1 : null,\n isBase: baseUnit ? defaultSalesUnit === baseUnit : false,\n });\n }\n const nextOptions = Array.from(map.values()).sort((left, right) =>\n left.code.localeCompare(right.code),\n );\n setUnitOptions(nextOptions);\n return nextOptions;\n },\n [],\n );\n\n const loadPrices = React.useCallback(\n async (\n productId: string | null,\n variantId: string | null,\n quantity?: string | number | null,\n quantityUnit?: string | null,\n ) => {\n if (!productId) {\n setPriceOptions([]);\n return [];\n }\n setPriceLoading(true);\n try {\n const params = new URLSearchParams({ productId, pageSize: \"20\" });\n if (variantId) params.set(\"variantId\", variantId);\n const quantityValue = normalizeNumber(quantity, Number.NaN);\n if (Number.isFinite(quantityValue) && quantityValue > 0) {\n params.set(\"quantity\", String(quantityValue));\n }\n const quantityUnitCode = normalizeUnitCode(quantityUnit);\n if (quantityUnitCode) {\n params.set(\"quantityUnit\", quantityUnitCode);\n }\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/catalog/prices?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped: PriceOption[] = items\n .map((item) => {\n const id = typeof item.id === \"string\" ? item.id : null;\n if (!id) return null;\n const amountNetRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_net,\n Number.NaN,\n );\n const amountGrossRaw = normalizeNumber(\n (item as ApiPriceItem).unit_price_gross,\n Number.NaN,\n );\n const amountNet = Number.isFinite(amountNetRaw)\n ? amountNetRaw\n : null;\n const amountGross = Number.isFinite(amountGrossRaw)\n ? amountGrossRaw\n : null;\n const currency =\n typeof (item as ApiPriceItem).currency_code === \"string\"\n ? (item as ApiPriceItem).currency_code\n : typeof (item as ApiPriceItem).currencyCode === \"string\"\n ? (item as ApiPriceItem).currencyCode\n : null;\n const displayMode =\n (item as ApiPriceItem).display_mode === \"including-tax\" ||\n (item as ApiPriceItem).display_mode === \"excluding-tax\"\n ? (item as ApiPriceItem).display_mode\n : (item as ApiPriceItem).displayMode === \"including-tax\" ||\n (item as ApiPriceItem).displayMode === \"excluding-tax\"\n ? (item as ApiPriceItem).displayMode\n : null;\n const taxRateRaw = normalizeNumber(\n (item as ApiPriceItem).tax_rate,\n Number.NaN,\n );\n const taxRate = Number.isFinite(taxRateRaw) ? taxRateRaw : null;\n const priceKindId =\n typeof (item as ApiPriceItem).price_kind_id === \"string\"\n ? (item as ApiPriceItem).price_kind_id\n : typeof (item as ApiPriceItem).priceKindId === \"string\"\n ? (item as ApiPriceItem).priceKindId\n : null;\n const priceKindTitle =\n typeof (item as ApiPriceItem).price_kind_title === \"string\"\n ? (item as ApiPriceItem).price_kind_title\n : typeof (item as ApiPriceItem).priceKindTitle === \"string\"\n ? (item as ApiPriceItem).priceKindTitle\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.title === \"string\"\n ? (item as ApiPriceItem).price_kind!.title\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.name === \"string\"\n ? (item as ApiPriceItem).price_kind!.name\n : null;\n const priceKindCode =\n typeof (item as ApiPriceItem).price_kind_code === \"string\"\n ? (item as ApiPriceItem).price_kind_code\n : typeof (item as ApiPriceItem).priceKindCode === \"string\"\n ? (item as ApiPriceItem).priceKindCode\n : typeof (item as ApiPriceItem).price_kind === \"object\" &&\n item &&\n typeof (item as ApiPriceItem).price_kind?.code === \"string\"\n ? (item as ApiPriceItem).price_kind!.code\n : null;\n const resolvedPriceKindTitle =\n priceKindTitle ??\n priceKindCode ??\n (typeof (item as ApiPriceItem).kind === \"string\"\n ? (item as ApiPriceItem).kind\n : null);\n const labelParts = [\n displayMode === \"including-tax\" &&\n amountGross !== null &&\n currency\n ? formatMoney(amountGross, currency)\n : null,\n displayMode === \"excluding-tax\" && amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : null,\n displayMode\n ? displayMode === \"including-tax\"\n ? t(\"sales.documents.items.priceGross\", \"Gross\")\n : t(\"sales.documents.items.priceNet\", \"Net\")\n : null,\n ].filter(Boolean);\n const { reason, tags } = buildPriceScopeReason(\n item,\n (key, fallback) => t(key, fallback),\n );\n const label =\n labelParts.length > 0\n ? labelParts.join(\" \u2022 \")\n : amountGross !== null && currency\n ? formatMoney(amountGross, currency)\n : amountNet !== null && currency\n ? formatMoney(amountNet, currency)\n : id;\n return {\n id,\n amountNet: amountNet ?? null,\n amountGross: amountGross ?? null,\n currencyCode: currency,\n displayMode: displayMode as PriceOption[\"displayMode\"],\n taxRate: Number.isFinite(taxRate) ? taxRate : null,\n label,\n priceKindId,\n priceKindTitle: resolvedPriceKindTitle ?? null,\n priceKindCode: priceKindCode ?? null,\n scopeReason: reason,\n scopeTags: tags,\n } as PriceOption;\n })\n .filter((entry): entry is PriceOption => Boolean(entry));\n setPriceOptions(mapped);\n return mapped;\n } catch (err) {\n console.error(\"sales.document.items.loadPrices\", err);\n return [];\n } finally {\n setPriceLoading(false);\n }\n },\n [t],\n );\n\n const selectPriceAfterRefresh = React.useCallback(\n (\n prices: PriceOption[],\n currentPriceId: string | null,\n currentPriceKindId: string | null,\n ): PriceOption | null => {\n if (!prices.length) return null;\n if (currentPriceId) {\n const sameId = prices.find((entry) => entry.id === currentPriceId);\n if (sameId) return sameId;\n }\n if (currentPriceKindId) {\n const sameKind = prices.find(\n (entry) => entry.priceKindId === currentPriceKindId,\n );\n if (sameKind) return sameKind;\n }\n return prices[0] ?? null;\n },\n [],\n );\n\n const resolveUnitPriceFactor = React.useCallback(\n (quantityUnit: string | null | undefined): number => {\n const normalized = normalizeUnitCode(quantityUnit);\n if (!normalized) return 1;\n const unit = unitOptions.find((entry) => entry.code === normalized) ?? null;\n const factor = normalizeNumber(unit?.toBaseFactor, Number.NaN);\n if (!Number.isFinite(factor) || factor <= 0) return 1;\n return factor;\n },\n [unitOptions],\n );\n\n const convertUnitPriceForUnitChange = React.useCallback(\n (\n rawUnitPrice: unknown,\n fromUnit: string | null | undefined,\n toUnit: string | null | undefined,\n ): string | null => {\n const amount = normalizeNumber(rawUnitPrice, Number.NaN);\n if (!Number.isFinite(amount) || amount <= 0) return null;\n const fromCode = normalizeUnitCode(fromUnit);\n const toCode = normalizeUnitCode(toUnit);\n if (!fromCode || !toCode || fromCode === toCode) return null;\n const fromFactor = resolveUnitPriceFactor(fromCode);\n const toFactor = resolveUnitPriceFactor(toCode);\n if (\n !Number.isFinite(fromFactor) ||\n !Number.isFinite(toFactor) ||\n fromFactor <= 0 ||\n toFactor <= 0\n ) {\n return null;\n }\n const baseAmount = amount / fromFactor;\n const convertedAmount = baseAmount * toFactor;\n if (!Number.isFinite(convertedAmount) || convertedAmount <= 0) return null;\n return normalizeUnitPriceInputValue(convertedAmount);\n },\n [resolveUnitPriceFactor],\n );\n\n const applyPriceSelection = React.useCallback(\n (\n selected: PriceOption | null,\n setFormValue: ((id: string, value: unknown) => void) | undefined,\n options?: {\n fallbackTaxSource?: { taxRateId?: string | null; taxRate?: number | null } | null;\n quantityUnit?: string | null;\n },\n ) => {\n if (!setFormValue) return;\n if (selected) {\n const mode =\n selected.displayMode === \"excluding-tax\" ? \"net\" : \"gross\";\n const amountPerBaseUnit =\n mode === \"net\"\n ? (selected.amountNet ?? selected.amountGross ?? 0)\n : (selected.amountGross ?? selected.amountNet ?? 0);\n const factor = resolveUnitPriceFactor(options?.quantityUnit ?? null);\n const amount = Number.isFinite(amountPerBaseUnit * factor)\n ? amountPerBaseUnit * factor\n : amountPerBaseUnit;\n setFormValue(\"priceId\", selected.id);\n setFormValue(\"priceMode\", mode);\n setFormValue(\"unitPrice\", normalizeUnitPriceInputValue(amount));\n setFormValue(\"taxRate\", selected.taxRate ?? null);\n setFormValue(\"taxRateId\", findTaxRateIdByValue(selected.taxRate));\n setFormValue(\n \"currencyCode\",\n selected.currencyCode ?? currencyCode ?? null,\n );\n return;\n }\n const fallbackTax = resolveTaxSelection(options?.fallbackTaxSource ?? null);\n setFormValue(\"taxRate\", fallbackTax.taxRate ?? null);\n setFormValue(\"taxRateId\", fallbackTax.taxRateId ?? null);\n },\n [currencyCode, findTaxRateIdByValue, resolveTaxSelection, resolveUnitPriceFactor],\n );\n\n const loadLineStatuses = React.useCallback(async (): Promise<\n StatusOption[]\n > => {\n setLineStatusLoading(true);\n try {\n const params = new URLSearchParams({ page: \"1\", pageSize: \"100\" });\n const response = await apiCall<{\n items?: Array<Record<string, unknown>>;\n }>(`/api/sales/order-line-statuses?${params.toString()}`, undefined, {\n fallback: { items: [] },\n });\n const items = Array.isArray(response.result?.items)\n ? response.result.items\n : [];\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === \"string\" ? entry.id : null;\n const value = typeof entry.value === \"string\" ? entry.value : null;\n if (!id || !value) return null;\n const label =\n typeof entry.label === \"string\" && entry.label.trim().length\n ? entry.label\n : value;\n const color =\n typeof entry.color === \"string\" && entry.color.trim().length\n ? entry.color\n : null;\n const icon =\n typeof entry.icon === \"string\" && entry.icon.trim().length\n ? entry.icon\n : null;\n return { id, value, label, color, icon };\n })\n .filter((entry): entry is StatusOption => Boolean(entry));\n setLineStatuses(mapped);\n return mapped;\n } catch (err) {\n console.error(\"sales.lines.statuses.load\", err);\n setLineStatuses([]);\n return [];\n } finally {\n setLineStatusLoading(false);\n }\n }, []);\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n lineStatuses.length && !query ? lineStatuses : await loadLineStatuses();\n const term = query?.trim().toLowerCase() ?? \"\";\n const currentMap = options.reduce<\n Record<\n string,\n {\n value: string;\n label: string;\n color?: string | null;\n icon?: string | null;\n }\n >\n >((acc, entry) => {\n acc[entry.value] = {\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon ?? null,\n };\n return acc;\n }, {});\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.label !== option.value ? option.value : undefined,\n icon:\n renderDictionaryIcon(option.icon, \"h-4 w-4\") ??\n renderDictionaryColor(option.color, \"h-4 w-4 rounded-full\"),\n }));\n },\n [lineStatuses, loadLineStatuses],\n );\n\n React.useEffect(() => {\n if (!open) return;\n loadTaxRates().catch(() => {});\n loadLineStatuses().catch(() => {});\n }, [loadLineStatuses, loadTaxRates, open]);\n\n const handleFormSubmit = React.useCallback(\n async (values: LineFormState & Record<string, unknown>) => {\n // Resolve required scope and ids\n const resolvedDocumentId =\n typeof documentId === \"string\" && documentId.trim().length\n ? documentId\n : null;\n const resolvedOrg = resolvedOrganizationId;\n const resolvedTenant = resolvedTenantId;\n\n if (!resolvedOrg || !resolvedTenant || !resolvedDocumentId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorScope\",\n \"Organization and tenant are required.\",\n ),\n );\n }\n const lineMode = values.lineMode === \"custom\" ? \"custom\" : \"catalog\";\n const isCustomLine = lineMode === \"custom\";\n\n if (!isCustomLine && !values.productId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n {\n productId: t(\n \"sales.documents.items.errorProductRequired\",\n \"Select a product to continue.\",\n ),\n },\n );\n }\n if (!isCustomLine && !values.variantId) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n {\n variantId: t(\n \"sales.documents.items.errorVariantRequired\",\n \"Select a variant to continue.\",\n ),\n },\n );\n }\n\n const qtyNumber = Number(values.quantity ?? 0);\n if (!Number.isFinite(qtyNumber) || qtyNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n {\n quantity: t(\n \"sales.documents.items.errorQuantity\",\n \"Quantity must be greater than 0.\",\n ),\n },\n );\n }\n const resolvedQuantityUnit = (() => {\n const entered = normalizeUnitCode(values.quantityUnit);\n if (isCustomLine) return entered;\n return (\n entered ??\n normalizeUnitCode(productOption?.defaultSalesUnit) ??\n normalizeUnitCode(productOption?.defaultUnit)\n );\n })();\n\n const unitPriceNumber = Number(values.unitPrice ?? 0);\n if (!Number.isFinite(unitPriceNumber) || unitPriceNumber <= 0) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n {\n unitPrice: t(\n \"sales.documents.items.errorUnitPrice\",\n \"Unit price must be greater than 0.\",\n ),\n },\n );\n }\n\n const selectedPrice =\n !isCustomLine && values.priceId\n ? (priceOptions.find((price) => price.id === values.priceId) ?? null)\n : null;\n const resolvedCurrency =\n (values.currencyCode as string | null | undefined) ??\n selectedPrice?.currencyCode ??\n currencyCode ??\n null;\n if (!resolvedCurrency) {\n throw createCrudFormError(\n t(\"sales.documents.items.errorCurrency\", \"Currency is required.\"),\n {\n priceId: t(\n \"sales.documents.items.errorCurrency\",\n \"Currency is required.\",\n ),\n },\n );\n }\n\n const resolvedNameRaw = (values.name ?? \"\").toString().trim();\n const resolvedName = isCustomLine\n ? resolvedNameRaw\n : resolvedNameRaw ||\n variantOption?.title ||\n productOption?.title ||\n undefined;\n if (isCustomLine && !resolvedName) {\n throw createCrudFormError(\n t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n {\n name: t(\n \"sales.documents.items.errorNameRequired\",\n \"Name is required for custom lines.\",\n ),\n },\n );\n }\n const resolvedPriceMode = values.priceMode === \"net\" ? \"net\" : \"gross\";\n const catalogSnapshot =\n !isCustomLine &&\n typeof values.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? values.catalogSnapshot\n : null;\n const selectedTaxRateId =\n typeof values.taxRateId === \"string\" && values.taxRateId.trim().length\n ? values.taxRateId\n : null;\n const resolvedTaxRate = Number.isFinite(values.taxRate)\n ? (values.taxRate as number)\n : normalizeNumber(values.taxRate);\n const normalizedTaxRate = Number.isFinite(resolvedTaxRate)\n ? resolvedTaxRate\n : 0;\n const unitPriceNetValue =\n resolvedPriceMode === \"net\"\n ? unitPriceNumber\n : unitPriceNumber / (1 + normalizedTaxRate / 100);\n const unitPriceGrossValue =\n resolvedPriceMode === \"gross\"\n ? unitPriceNumber\n : unitPriceNumber * (1 + normalizedTaxRate / 100);\n const safeUnitPriceNet = Number.isFinite(unitPriceNetValue)\n ? unitPriceNetValue\n : unitPriceNumber;\n const safeUnitPriceGross = Number.isFinite(unitPriceGrossValue)\n ? unitPriceGrossValue\n : unitPriceNumber;\n const totalNetAmount = safeUnitPriceNet * qtyNumber;\n const totalGrossAmount = safeUnitPriceGross * qtyNumber;\n\n const metadata = {\n ...(catalogSnapshot ?? {}),\n ...(!isCustomLine && values.priceId ? { priceId: values.priceId } : {}),\n priceMode: resolvedPriceMode,\n ...(selectedTaxRateId ? { taxRateId: selectedTaxRateId } : {}),\n ...(!isCustomLine && productOption\n ? {\n productTitle: productOption.title,\n productSku: productOption.sku ?? null,\n productThumbnail: productOption.thumbnailUrl ?? null,\n }\n : {}),\n ...(!isCustomLine && variantOption\n ? {\n variantTitle: variantOption.title,\n variantSku: variantOption.sku ?? null,\n variantThumbnail:\n variantOption.thumbnailUrl ??\n productOption?.thumbnailUrl ??\n null,\n }\n : {}),\n ...(isCustomLine ? { customLine: true } : {}),\n lineMode,\n ...(resolvedQuantityUnit ? { quantityUnit: resolvedQuantityUnit } : {}),\n };\n\n const payload: Record<string, unknown> = {\n [documentKey]: String(resolvedDocumentId),\n organizationId: String(resolvedOrg),\n tenantId: String(resolvedTenant),\n productId: isCustomLine\n ? undefined\n : values.productId\n ? String(values.productId)\n : undefined,\n productVariantId: isCustomLine\n ? undefined\n : values.variantId\n ? String(values.variantId)\n : undefined,\n quantity: qtyNumber,\n quantityUnit: resolvedQuantityUnit ?? undefined,\n currencyCode: String(resolvedCurrency),\n priceId:\n !isCustomLine && values.priceId ? String(values.priceId) : undefined,\n priceMode: resolvedPriceMode,\n taxRate: Number.isFinite(resolvedTaxRate) ? resolvedTaxRate : undefined,\n unitPriceNet: safeUnitPriceNet,\n unitPriceGross: safeUnitPriceGross,\n totalNetAmount,\n totalGrossAmount,\n ...(catalogSnapshot ? { catalogSnapshot } : {}),\n metadata,\n customFieldSetId: values.customFieldSetId ?? undefined,\n ...(typeof values.statusEntryId === \"string\" &&\n values.statusEntryId.trim().length\n ? { statusEntryId: values.statusEntryId.trim() }\n : {}),\n };\n\n const customFields = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n });\n if (Object.keys(customFields).length) {\n payload.customFields = normalizeCustomFieldValues(customFields);\n }\n if (resolvedName) payload.name = resolvedName;\n\n try {\n const action = editingId ? updateCrud : createCrud;\n const result = await action(\n resourcePath,\n editingId ? { id: editingId, ...payload } : payload,\n {\n errorMessage: t(\n \"sales.documents.items.errorSave\",\n \"Failed to save line.\",\n ),\n },\n );\n if (result.ok) {\n if (onSaved) await onSaved();\n closeDialog();\n }\n } catch (err) {\n throw err;\n }\n },\n [\n currencyCode,\n documentId,\n documentKey,\n editingId,\n priceOptions,\n productOption,\n resourcePath,\n t,\n variantOption,\n onSaved,\n closeDialog,\n resolvedOrganizationId,\n resolvedTenantId,\n ],\n );\n\n const fields = React.useMemo<CrudField[]>(() => {\n const isCustomLine = lineMode === \"custom\";\n return [\n {\n id: \"lineMode\",\n label: t(\"sales.documents.items.lineMode.label\", \"Line type\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ value, setValue, setFormValue }: FieldRenderProps) => {\n const mode = value === \"custom\" ? \"custom\" : \"catalog\";\n const switchMode = (next: \"catalog\" | \"custom\") => {\n if (next === mode) return;\n setValue(next);\n setLineMode(next);\n if (next === \"custom\") {\n setProductOption(null);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setFormValue?.(\"productId\", null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"catalogSnapshot\", null);\n setFormValue?.(\"quantityUnit\", null);\n } else {\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n }\n };\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"inline-flex w-fit gap-1 rounded-md border bg-muted/50 p-1\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"catalog\" ? \"default\" : \"ghost\"}\n onClick={() => switchMode(\"catalog\")}\n >\n {t(\"sales.documents.items.lineMode.catalog\", \"Catalog item\")}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === \"custom\" ? \"default\" : \"ghost\"}\n onClick={() => switchMode(\"custom\")}\n >\n {t(\"sales.documents.items.lineMode.custom\", \"Custom line\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.lineMode.helper\",\n \"Use catalog products or create a freeform line with your own price.\",\n )}\n </p>\n </div>\n );\n },\n } satisfies CrudField,\n ...(!isCustomLine\n ? [\n {\n id: \"productId\",\n label: t(\"sales.documents.items.product\", \"Product\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (productOptionsRef.current.get(next) ?? null)\n : null;\n setProductOption(selectedOption);\n setVariantOption(null);\n setPriceOptions([]);\n setUnitOptions([]);\n setValue(next ?? null);\n setFormValue?.(\"variantId\", null);\n setFormValue?.(\"priceId\", null);\n setFormValue?.(\"unitPrice\", \"\");\n setFormValue?.(\"priceMode\", \"gross\");\n const defaultQuantityUnit =\n selectedOption?.defaultSalesUnit ??\n selectedOption?.defaultUnit ??\n null;\n setFormValue?.(\"quantityUnit\", defaultQuantityUnit);\n if (\n typeof selectedOption?.defaultSalesUnitQuantity ===\n \"number\" &&\n Number.isFinite(\n selectedOption.defaultSalesUnitQuantity,\n ) &&\n selectedOption.defaultSalesUnitQuantity > 0\n ) {\n setFormValue?.(\n \"quantity\",\n String(selectedOption.defaultSalesUnitQuantity),\n );\n }\n const taxSelection = selectedOption\n ? resolveTaxSelection(selectedOption)\n : { taxRate: null, taxRateId: null };\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\"taxRateId\", taxSelection.taxRateId ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim() && selectedOption?.title) {\n setFormValue?.(\"name\", selectedOption.title);\n }\n setFormValue?.(\n \"catalogSnapshot\",\n next\n ? {\n product: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl:\n selectedOption?.thumbnailUrl ?? null,\n defaultUnit: selectedOption?.defaultUnit ?? null,\n defaultSalesUnit:\n selectedOption?.defaultSalesUnit ?? null,\n },\n }\n : null,\n );\n if (next) {\n void loadProductUnits(next, selectedOption);\n void loadPrices(\n next,\n null,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n defaultQuantityUnit,\n );\n }\n }}\n fetchItems={loadProductOptions}\n options={\n productOption\n ? [\n {\n id: productOption.id,\n title: productOption.title || productOption.id,\n subtitle: productOption.sku ?? undefined,\n icon: productOption.thumbnailUrl ? (\n <img\n src={productOption.thumbnailUrl}\n alt={productOption.title ?? productOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n productOption.title || productOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n minQuery={1}\n searchPlaceholder={t(\n \"sales.documents.items.productSearch\",\n \"Search product\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedProduct\",\n \"Selected {{id}}\",\n {\n id: productOption?.title ?? id,\n },\n )\n }\n />\n ),\n } satisfies CrudField,\n {\n id: \"variantId\",\n label: t(\"sales.documents.items.variant\", \"Variant\"),\n type: \"custom\",\n required: true,\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n return (\n <LookupSelect\n key={productId ?? \"no-product\"}\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n const selectedOption = next\n ? (variantOptionsRef.current.get(next) ?? null)\n : null;\n setVariantOption(selectedOption);\n setValue(next ?? null);\n const existingName =\n typeof values?.name === \"string\" ? values.name : \"\";\n if (!existingName.trim()) {\n setFormValue?.(\n \"name\",\n selectedOption?.title ??\n productOption?.title ??\n existingName,\n );\n }\n const taxSource = hasTaxMetadata(selectedOption)\n ? selectedOption\n : hasTaxMetadata(productOption)\n ? productOption\n : null;\n if (taxSource) {\n const taxSelection = resolveTaxSelection(taxSource);\n setFormValue?.(\"taxRate\", taxSelection.taxRate ?? null);\n setFormValue?.(\n \"taxRateId\",\n taxSelection.taxRateId ?? null,\n );\n }\n const prevSnapshot =\n typeof values?.catalogSnapshot === \"object\" &&\n values.catalogSnapshot\n ? (values.catalogSnapshot as Record<string, unknown>)\n : null;\n if (next) {\n setFormValue?.(\"catalogSnapshot\", {\n ...(prevSnapshot ?? {}),\n variant: {\n id: next,\n title: selectedOption?.title ?? null,\n sku: selectedOption?.sku ?? null,\n thumbnailUrl: selectedOption?.thumbnailUrl ?? null,\n },\n });\n } else if (prevSnapshot) {\n const snapshot = { ...prevSnapshot };\n if (\"variant\" in snapshot)\n delete (snapshot as CatalogSnapshotRecord).variant;\n setFormValue?.(\n \"catalogSnapshot\",\n Object.keys(snapshot).length ? snapshot : null,\n );\n } else {\n setFormValue?.(\"catalogSnapshot\", null);\n }\n if (productId) {\n const currentQuantity =\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1;\n const currentQuantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n void loadPrices(\n productId,\n next,\n currentQuantity,\n currentQuantityUnit,\n );\n }\n }}\n fetchItems={async (query) => {\n if (!productId) return [];\n const productThumb = productId\n ? productOptionsRef.current.get(productId)?.thumbnailUrl\n : null;\n const options = await loadVariantOptions(\n productId,\n productThumb,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return needle.length\n ? options.filter((option) =>\n option.title.toLowerCase().includes(needle),\n )\n : options;\n }}\n searchPlaceholder={t(\n \"sales.documents.items.variantSearch\",\n \"Search variant\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n options={\n variantOption\n ? [\n {\n id: variantOption.id,\n title: variantOption.title || variantOption.id,\n subtitle: variantOption.sku ?? undefined,\n icon: variantOption.thumbnailUrl ? (\n <img\n src={variantOption.thumbnailUrl}\n alt={variantOption.title ?? variantOption.id}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ) : (\n buildPlaceholder(\n variantOption.title || variantOption.id,\n )\n ),\n },\n ]\n : undefined\n }\n selectedHintLabel={(id) =>\n t(\n \"sales.documents.items.selectedVariant\",\n \"Selected {{id}}\",\n {\n id: variantOption?.title ?? id,\n },\n )\n }\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n {\n id: \"priceId\",\n label: t(\"sales.documents.items.price\", \"Price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\"\n ? values.productId\n : null;\n const variantId =\n typeof values?.variantId === \"string\"\n ? values.variantId\n : null;\n return (\n <LookupSelect\n key={\n productId\n ? `${productId}-${variantId ?? \"no-variant\"}`\n : \"price\"\n }\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => {\n setValue(next ?? null);\n const selected = next\n ? (priceOptions.find((entry) => entry.id === next) ??\n null)\n : null;\n applyPriceSelection(\n selected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit:\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n },\n );\n }}\n fetchItems={async (query) => {\n const prices = await loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\"\n ? values.quantity\n : 1,\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null,\n );\n const needle = query?.trim().toLowerCase() ?? \"\";\n return prices\n .filter((price) => {\n if (!needle.length) return true;\n const haystack = [\n price.label,\n price.priceKindTitle,\n price.priceKindCode,\n price.currencyCode,\n ...(price.scopeTags ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n })\n .map<LookupSelectItem>((price) => ({\n id: price.id,\n title: price.label,\n subtitle:\n price.priceKindTitle ??\n price.priceKindCode ??\n undefined,\n description: price.scopeReason ?? undefined,\n rightLabel: price.currencyCode ?? undefined,\n icon: (\n <DollarSign className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }));\n }}\n minQuery={0}\n loading={priceLoading}\n searchPlaceholder={t(\n \"sales.documents.items.priceSearch\",\n \"Select price\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\n \"ui.lookupSelect.clearSelection\",\n \"Clear selection\",\n )}\n emptyLabel={t(\"ui.lookupSelect.noResults\", \"No results\")}\n loadingLabel={t(\"ui.lookupSelect.searching\", \"Searching\u2026\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n disabled={!productId}\n />\n );\n },\n } satisfies CrudField,\n ]\n : []),\n {\n id: \"unitPrice\",\n label: t(\"sales.documents.items.unitPrice\", \"Unit price\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const mode = values?.priceMode === \"net\" ? \"net\" : \"gross\";\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPrice = selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId) ?? null)\n : null;\n const selectedCurrency =\n selectedPrice?.currencyCode ??\n (typeof values?.currencyCode === \"string\" ? values.currencyCode : null);\n const quantityUnitCode = normalizeUnitCode(values?.quantityUnit);\n const baseUnitCode =\n unitOptions.find((option) => option.isBase)?.code ?? null;\n const selectedUnitOption = quantityUnitCode\n ? (unitOptions.find((option) => option.code === quantityUnitCode) ?? null)\n : null;\n const unitFactor = (() => {\n if (!quantityUnitCode) return null;\n if (baseUnitCode && quantityUnitCode === baseUnitCode) return 1;\n const value = normalizeNumber(selectedUnitOption?.toBaseFactor, Number.NaN);\n return Number.isFinite(value) && value > 0 ? value : null;\n })();\n const selectedBaseAmount = selectedPrice\n ? mode === \"net\"\n ? (selectedPrice.amountNet ?? selectedPrice.amountGross ?? null)\n : (selectedPrice.amountGross ?? selectedPrice.amountNet ?? null)\n : null;\n const convertedAmount =\n selectedBaseAmount !== null &&\n unitFactor !== null &&\n Number.isFinite(selectedBaseAmount * unitFactor)\n ? selectedBaseAmount * unitFactor\n : null;\n const isCatalogLine = lineMode !== \"custom\";\n return (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n />\n <Select\n value={mode}\n onValueChange={(value) => {\n const nextMode = value === \"net\" ? \"net\" : \"gross\";\n setFormValue?.(\"priceMode\", nextMode);\n }}\n >\n <SelectTrigger className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"gross\">\n {t(\"sales.documents.items.priceGross\", \"Gross\")}\n </SelectItem>\n <SelectItem value=\"net\">\n {t(\"sales.documents.items.priceNet\", \"Net\")}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n {isCatalogLine && selectedPrice && quantityUnitCode && baseUnitCode ? (\n unitFactor !== null && convertedAmount !== null ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisTemplate\",\n \"Catalog price basis: {{baseAmount}} / {{baseUnit}}. Converted for {{unit}}: {{baseAmount}} \u00D7 {{factor}} = {{convertedAmount}}.\",\n {\n baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency),\n baseUnit: baseUnitCode,\n unit: quantityUnitCode,\n factor: unitFactor,\n convertedAmount: formatMoney(convertedAmount, selectedCurrency),\n },\n )}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisMissingConversion\",\n \"Catalog price basis is base unit, but conversion for selected unit is missing.\",\n )}\n </p>\n )\n ) : null}\n {isCatalogLine && !selectedPrice ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.priceBasisManual\",\n \"Manual unit price mode. Price will not auto-convert until you select a catalog price.\",\n )}\n </p>\n ) : null}\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"taxRateId\",\n label: t(\"sales.documents.items.taxRate\", \"Tax class\"),\n type: \"custom\",\n layout: \"half\",\n component: ({\n value,\n setValue,\n setFormValue,\n values,\n }: FieldRenderProps) => {\n const resolvedValue =\n typeof value === \"string\" && value.trim().length\n ? value\n : findTaxRateIdByValue((values as Record<string, unknown>)?.taxRate as number | null | undefined);\n const handleChange = (\n event: React.ChangeEvent<HTMLSelectElement>,\n ) => {\n const nextId = event.target.value || null;\n const option = nextId ? (taxRateMap.get(nextId) ?? null) : null;\n setValue(nextId);\n const rate = normalizeNumber(option?.rate);\n setFormValue?.(\"taxRate\", Number.isFinite(rate) ? rate : null);\n };\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={resolvedValue || undefined}\n onValueChange={(value) => handleChange({ target: { value } } as React.ChangeEvent<HTMLSelectElement>)}\n disabled={!taxRates.length}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n taxRates.length\n ? t(\n \"sales.documents.items.taxRate.none\",\n \"No tax class selected\",\n )\n : t(\n \"sales.documents.items.taxRate.empty\",\n \"No tax classes available\",\n )\n }\n />\n </SelectTrigger>\n <SelectContent>\n {taxRates.map((rate) => (\n <SelectItem key={rate.id} value={rate.id}>\n {rate.name}\n {rate.code ? ` \u2022 ${rate.code.toUpperCase()}` : \"\"}\n {Number.isFinite(rate.rate) ? ` \u2022 ${rate.rate}%` : \"\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantityUnit\",\n label: t(\"sales.documents.items.quantityUnit\", \"Unit\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => {\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n if (isCustomLine) {\n return (\n <Input\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => setValue(event.target.value || null)}\n placeholder={t(\n \"sales.documents.items.quantityUnitPlaceholder\",\n \"e.g. pc\",\n )}\n />\n );\n }\n return (\n <Select\n value={typeof value === \"string\" && value ? value : undefined}\n onValueChange={(next) => {\n const nextValue = next || null;\n const nextUnitPrice = convertUnitPriceForUnitChange(\n values?.unitPrice,\n typeof value === \"string\" ? value : null,\n nextValue,\n );\n setValue(nextValue);\n if (nextUnitPrice) {\n setFormValue?.(\"unitPrice\", nextUnitPrice);\n }\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find(\n (entry) => entry.id === selectedPriceId,\n )?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n typeof values?.quantity === \"string\" ? values.quantity : 1,\n nextValue,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit: nextValue,\n },\n );\n });\n }\n }}\n disabled={!productId}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={t(\"sales.documents.items.quantityUnitSelect\", \"Select unit\")}\n />\n </SelectTrigger>\n <SelectContent>\n {unitOptions.map((option) => (\n <SelectItem key={option.code} value={option.code}>\n {option.isBase\n ? `${option.code} (${t(\"sales.documents.items.baseUnitTag\", \"base\")})`\n : option.code}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n },\n } satisfies CrudField,\n {\n id: \"quantity\",\n label: t(\"sales.documents.items.quantity\", \"Quantity\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue, setFormValue, values }: FieldRenderProps) => (\n <Input\n value={\n typeof value === \"string\"\n ? value\n : value == null\n ? \"\"\n : String(value)\n }\n onChange={(event) => {\n const nextQuantity = event.target.value;\n setValue(nextQuantity);\n const productId =\n typeof values?.productId === \"string\" ? values.productId : null;\n const variantId =\n typeof values?.variantId === \"string\" ? values.variantId : null;\n const quantityUnit =\n typeof values?.quantityUnit === \"string\"\n ? values.quantityUnit\n : null;\n if (productId) {\n const selectedPriceId =\n typeof values?.priceId === \"string\" ? values.priceId : null;\n const selectedPriceKindId =\n selectedPriceId\n ? (priceOptions.find((entry) => entry.id === selectedPriceId)\n ?.priceKindId ?? null)\n : null;\n void loadPrices(\n productId,\n variantId,\n nextQuantity,\n quantityUnit,\n ).then((prices) => {\n if (!selectedPriceId) return;\n const nextSelected = selectPriceAfterRefresh(\n prices,\n selectedPriceId,\n selectedPriceKindId,\n );\n if (!nextSelected) {\n setFormValue?.(\"priceId\", null);\n return;\n }\n applyPriceSelection(\n nextSelected,\n setFormValue,\n {\n fallbackTaxSource: variantOption ?? productOption ?? null,\n quantityUnit,\n },\n );\n });\n }\n }}\n placeholder=\"1\"\n />\n ),\n } satisfies CrudField,\n {\n id: \"uomPreview\",\n label: t(\"sales.documents.items.uomPreview\", \"Normalized quantity\"),\n type: \"custom\",\n layout: \"full\",\n component: ({ values }: FieldRenderProps) => {\n if (isCustomLine) return null;\n const quantity = normalizeNumber(values?.quantity, Number.NaN);\n const enteredUnit = normalizeUnitCode(values?.quantityUnit);\n if (!Number.isFinite(quantity) || quantity <= 0 || !enteredUnit) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewEmpty\",\n \"Select unit and quantity to preview normalization.\",\n )}\n </p>\n );\n }\n const selectedOption =\n unitOptions.find((option) => option.code === enteredUnit) ?? null;\n const baseOption =\n unitOptions.find((option) => option.isBase) ?? null;\n const factor = selectedOption?.toBaseFactor;\n if (!Number.isFinite(factor) || !factor || !baseOption) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewUnavailable\",\n \"Missing conversion to base unit.\",\n )}\n </p>\n );\n }\n const normalized = normalizeQuantityPreview(quantity * factor);\n return (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"sales.documents.items.uomPreviewTemplate\",\n \"{{quantity}} {{unit}} \u2192 {{normalized}} {{baseUnit}}\",\n {\n quantity,\n unit: enteredUnit,\n normalized,\n baseUnit: baseOption.code,\n },\n )}\n </p>\n );\n },\n } satisfies CrudField,\n {\n id: \"statusEntryId\",\n label: t(\"sales.documents.items.status\", \"Status\"),\n type: \"custom\",\n layout: \"half\",\n component: ({ value, setValue }: FieldRenderProps) => (\n <LookupSelect\n value={typeof value === \"string\" ? value : null}\n onChange={(next) => setValue(next ?? null)}\n placeholder={t(\n \"sales.documents.items.statusPlaceholder\",\n \"Select status\",\n )}\n emptyLabel={t(\"sales.documents.items.statusEmpty\", \"No status\")}\n fetchItems={fetchLineStatusItems}\n loadingLabel={t(\n \"sales.documents.items.statusLoading\",\n \"Loading statuses\u2026\",\n )}\n selectLabel={t(\"ui.lookupSelect.select\", \"Select\")}\n selectedLabel={t(\"ui.lookupSelect.selected\", \"Selected\")}\n clearLabel={t(\"ui.lookupSelect.clearSelection\", \"Clear selection\")}\n startTypingLabel={t(\n \"ui.lookupSelect.startTyping\",\n \"Start typing to search.\",\n )}\n minQuery={0}\n />\n ),\n } satisfies CrudField,\n {\n id: \"name\",\n label: t(\"sales.documents.items.name\", \"Name\"),\n type: \"text\",\n placeholder: t(\n \"sales.documents.items.namePlaceholder\",\n \"Optional line name\",\n ),\n layout: \"full\",\n required: isCustomLine,\n } satisfies CrudField,\n ];\n }, [\n applyPriceSelection,\n convertUnitPriceForUnitChange,\n currencyCode,\n findTaxRateIdByValue,\n loadPrices,\n loadProductUnits,\n loadProductOptions,\n loadVariantOptions,\n fetchLineStatusItems,\n priceLoading,\n priceOptions,\n productOption,\n unitOptions,\n lineMode,\n variantOption,\n t,\n taxRateMap,\n taxRates,\n resolveTaxSelection,\n selectPriceAfterRefresh,\n hasTaxMetadata,\n ]);\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n return [\n { id: \"line-core\", fields },\n {\n id: \"line-custom\",\n column: 2,\n title: t(\"entities.customFields.title\", \"Custom fields\"),\n kind: \"customFields\",\n },\n ];\n }, [fields, t]);\n\n React.useEffect(() => {\n if (!open) return;\n if (!initialLine) {\n resetForm();\n return;\n }\n setEditingId(initialLine.id);\n const nextForm = defaultForm(initialLine.currencyCode ?? currencyCode);\n const meta = initialLine.metadata ?? {};\n const snapshot =\n (initialLine.catalogSnapshot as\n | Record<string, unknown>\n | null\n | undefined) ?? null;\n const snapshotProduct =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).product === \"object\" &&\n (snapshot as CatalogSnapshotRecord).product\n ? ((snapshot as CatalogSnapshotRecord).product as Record<string, unknown>)\n : null;\n const snapshotVariant =\n snapshot &&\n typeof snapshot === \"object\" &&\n typeof (snapshot as CatalogSnapshotRecord).variant === \"object\" &&\n (snapshot as CatalogSnapshotRecord).variant\n ? ((snapshot as CatalogSnapshotRecord).variant as Record<string, unknown>)\n : null;\n const metaRec = (typeof meta === \"object\" && meta ? meta : null) as LineMetadataRecord | null;\n const metaLineMode =\n typeof metaRec?.lineMode === \"string\" &&\n (metaRec.lineMode === \"custom\" || metaRec.lineMode === \"catalog\")\n ? (metaRec.lineMode as \"custom\" | \"catalog\")\n : metaRec?.customLine\n ? \"custom\"\n : undefined;\n nextForm.productId = initialLine.productId;\n nextForm.variantId = initialLine.productVariantId;\n nextForm.quantity = initialLine.quantity.toString();\n nextForm.quantityUnit = normalizeUnitCode(initialLine.quantityUnit) ?? null;\n const metaMode = metaRec?.priceMode;\n const resolvedPriceMode =\n metaMode === \"net\" || metaMode === \"gross\"\n ? metaMode\n : (initialLine.priceMode ?? \"gross\");\n nextForm.unitPrice =\n resolvedPriceMode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n nextForm.priceMode = resolvedPriceMode;\n nextForm.taxRate = Number.isFinite(initialLine.taxRate)\n ? initialLine.taxRate\n : null;\n nextForm.name = initialLine.name ?? \"\";\n nextForm.catalogSnapshot = snapshot ?? null;\n nextForm.customFieldSetId = initialLine.customFieldSetId ?? null;\n nextForm.statusEntryId = initialLine.statusEntryId ?? null;\n nextForm.lineMode =\n metaLineMode ??\n (initialLine.productId || initialLine.productVariantId\n ? \"catalog\"\n : \"custom\");\n const metaTaxRateId =\n typeof metaRec?.taxRateId === \"string\"\n ? metaRec.taxRateId\n : null;\n const fallbackTaxRateId = findTaxRateIdByValue(nextForm.taxRate);\n nextForm.taxRateId =\n metaTaxRateId ??\n fallbackTaxRateId ??\n (defaultTaxRateRef.current ? defaultTaxRateRef.current.id : null);\n if (!Number.isFinite(nextForm.taxRate) && nextForm.taxRateId) {\n const matched = taxRatesRef.current.find(\n (rate) => rate.id === nextForm.taxRateId,\n );\n const numericRate = normalizeNumber(matched?.rate);\n if (Number.isFinite(numericRate)) {\n nextForm.taxRate = numericRate;\n }\n }\n let resolvedProductOption: ProductOption | null = null;\n let resolvedVariantOption: VariantOption | null = null;\n if (metaRec) {\n const metaRecord = metaRec;\n const mode = metaRecord.priceMode;\n if (mode === \"net\" || mode === \"gross\") {\n nextForm.priceMode = mode;\n nextForm.unitPrice =\n mode === \"net\"\n ? initialLine.unitPriceNet.toString()\n : initialLine.unitPriceGross.toString();\n }\n nextForm.priceId =\n typeof metaRecord.priceId === \"string\"\n ? metaRecord.priceId\n : null;\n const productTitle =\n typeof metaRecord.productTitle === \"string\"\n ? metaRecord.productTitle\n : initialLine.name;\n const productSku =\n typeof metaRecord.productSku === \"string\"\n ? metaRecord.productSku\n : null;\n const productThumbnail =\n typeof metaRecord.productThumbnail === \"string\"\n ? metaRecord.productThumbnail\n : null;\n if (productTitle && initialLine.productId) {\n const snapshotUom = snapshotProduct\n ? getUomProductFields(snapshotProduct)\n : { defaultUnit: null, defaultSalesUnit: null, defaultSalesUnitQuantity: Number.NaN };\n const option: ProductOption = {\n id: initialLine.productId,\n title: productTitle,\n sku: productSku,\n thumbnailUrl: productThumbnail,\n defaultUnit: snapshotUom.defaultUnit,\n defaultSalesUnit: snapshotUom.defaultSalesUnit,\n defaultSalesUnitQuantity: Number.isFinite(snapshotUom.defaultSalesUnitQuantity)\n ? snapshotUom.defaultSalesUnitQuantity\n : null,\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n const variantTitle =\n typeof metaRecord.variantTitle === \"string\"\n ? metaRecord.variantTitle\n : null;\n const variantSku =\n typeof metaRecord.variantSku === \"string\"\n ? metaRecord.variantSku\n : null;\n const variantThumb =\n typeof metaRecord.variantThumbnail === \"string\"\n ? metaRecord.variantThumbnail\n : productThumbnail;\n if (variantTitle && initialLine.productVariantId) {\n const option = {\n id: initialLine.productVariantId,\n title: variantTitle,\n sku: variantSku,\n thumbnailUrl: variantThumb ?? null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n }\n if (!resolvedProductOption && initialLine.productId && snapshotProduct) {\n const sp = snapshotProduct as SnapshotEntity;\n const snapshotTitle =\n typeof sp.title === \"string\" && sp.title.trim().length\n ? sp.title\n : (initialLine.name ?? initialLine.productId);\n const snapshotSku =\n typeof sp.sku === \"string\" && sp.sku.trim().length\n ? sp.sku\n : null;\n const snapshotThumb =\n typeof sp.thumbnailUrl === \"string\"\n ? sp.thumbnailUrl\n : typeof sp.thumbnail_url === \"string\"\n ? sp.thumbnail_url\n : null;\n const snapshotTaxRate = normalizeNumber(sp.taxRate, Number.NaN);\n const option: ProductOption = {\n id: initialLine.productId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sp.taxRateId === \"string\" ? sp.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n defaultUnit: normalizeUnitCode(sp.defaultUnit ?? sp.default_unit),\n defaultSalesUnit: normalizeUnitCode(sp.defaultSalesUnit ?? sp.default_sales_unit),\n defaultSalesUnitQuantity: (() => {\n const raw = normalizeNumber(sp.defaultSalesUnitQuantity ?? sp.default_sales_unit_quantity, Number.NaN);\n return Number.isFinite(raw) ? raw : null;\n })(),\n };\n productOptionsRef.current.set(initialLine.productId, option);\n resolvedProductOption = option;\n }\n if (\n !resolvedVariantOption &&\n initialLine.productVariantId &&\n snapshotVariant\n ) {\n const sv = snapshotVariant as SnapshotEntity;\n const snapshotTitle =\n typeof sv.title === \"string\" && sv.title.trim().length\n ? sv.title\n : (initialLine.name ?? initialLine.productVariantId);\n const snapshotSku =\n typeof sv.sku === \"string\" && sv.sku.trim().length\n ? sv.sku\n : null;\n const snapshotThumb =\n typeof sv.thumbnailUrl === \"string\"\n ? sv.thumbnailUrl\n : typeof sv.thumbnail_url === \"string\"\n ? sv.thumbnail_url\n : (resolvedProductOption?.thumbnailUrl ??\n productOptionsRef.current.get(initialLine.productId ?? \"\")\n ?.thumbnailUrl ??\n null);\n const snapshotTaxRate = normalizeNumber(sv.taxRate, Number.NaN);\n const option: VariantOption = {\n id: initialLine.productVariantId,\n title: snapshotTitle,\n sku: snapshotSku,\n thumbnailUrl: snapshotThumb,\n taxRateId: typeof sv.taxRateId === \"string\" ? sv.taxRateId : null,\n taxRate: Number.isFinite(snapshotTaxRate) ? snapshotTaxRate : null,\n };\n variantOptionsRef.current.set(initialLine.productVariantId, option);\n resolvedVariantOption = option;\n }\n if (resolvedProductOption) setProductOption(resolvedProductOption);\n if (resolvedVariantOption) setVariantOption(resolvedVariantOption);\n const customValues = extractCustomFieldValues(\n initialLine as Record<string, unknown>,\n );\n const merged = { ...nextForm, ...customValues };\n setInitialValues(merged);\n setLineMode(merged.lineMode);\n setFormResetKey((prev) => prev + 1);\n if (initialLine.productId) {\n void loadProductUnits(initialLine.productId, resolvedProductOption).then(\n (options) => {\n const requestedUnit = normalizeUnitCode(nextForm.quantityUnit);\n if (\n requestedUnit &&\n !options.some((entry) => entry.code === requestedUnit)\n ) {\n setUnitOptions((prev) => [\n ...prev,\n { code: requestedUnit, toBaseFactor: null, isBase: false },\n ]);\n }\n },\n );\n void loadPrices(\n initialLine.productId,\n initialLine.productVariantId,\n nextForm.quantity,\n nextForm.quantityUnit,\n );\n } else {\n setPriceOptions([]);\n setUnitOptions([]);\n }\n }, [\n currencyCode,\n findTaxRateIdByValue,\n initialLine,\n loadPrices,\n loadProductUnits,\n open,\n resetForm,\n ]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => (next ? onOpenChange(true) : closeDialog())}\n >\n <DialogContent\n className=\"sm:max-w-5xl\"\n ref={dialogContentRef}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\") {\n event.preventDefault();\n dialogContentRef.current?.querySelector(\"form\")?.requestSubmit();\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeDialog();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {editingId\n ? t(\"sales.documents.items.editTitle\", \"Edit line\")\n : t(\"sales.documents.items.addTitle\", \"Add line\")}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<LineFormState>\n key={formResetKey}\n embedded\n fields={fields}\n groups={groups}\n entityId={customFieldEntityId}\n initialValues={initialValues}\n submitLabel={\n editingId\n ? t(\"sales.documents.items.save\", \"Save changes\")\n : t(\"sales.documents.items.addLine\", \"Add item\")\n }\n onSubmit={handleFormSubmit}\n loadingMessage={t(\"sales.documents.items.loading\", \"Loading items\u2026\")}\n />\n </DialogContent>\n </Dialog>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["lineMode", "value"]
|
|
7
7
|
}
|