@open-mercato/core 0.4.6-develop-e321a4e2a1 → 0.4.6-main-24e64eef39
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/AGENTS.md +0 -22
- package/dist/modules/api_docs/frontend/docs/api/page.js +1 -1
- package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
- package/dist/modules/attachments/api/library/[id]/route.js +1 -0
- package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +1 -1
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/lib/partitionEnv.js +1 -1
- package/dist/modules/attachments/lib/partitionEnv.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +1 -1
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/commands/users.js +1 -1
- package/dist/modules/auth/commands/users.js.map +2 -2
- package/dist/modules/business_rules/components/utils/formHelpers.js +1 -1
- package/dist/modules/business_rules/components/utils/formHelpers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -1
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +1 -1
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/shared.js +1 -1
- package/dist/modules/catalog/commands/shared.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +1 -1
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/productForm.js +1 -1
- package/dist/modules/catalog/components/products/productForm.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js.map +1 -1
- package/dist/modules/currencies/services/providers/raiffeisen.js +1 -1
- package/dist/modules/currencies/services/providers/raiffeisen.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +3 -3
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +3 -3
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +3 -3
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/cli.js +2 -2
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/lib/detailHelpers.js +1 -1
- package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
- package/dist/modules/entities/cli.js +1 -1
- package/dist/modules/entities/cli.js.map +2 -2
- package/dist/modules/entities/lib/field-definitions.js +1 -1
- package/dist/modules/entities/lib/field-definitions.js.map +2 -2
- package/dist/modules/entities/lib/install-from-ce.js +1 -1
- package/dist/modules/entities/lib/install-from-ce.js.map +2 -2
- package/dist/modules/inbox_ops/lib/emailParser.js +1 -1
- package/dist/modules/inbox_ops/lib/emailParser.js.map +2 -2
- package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +0 -8
- package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
- package/dist/modules/perspectives/services/perspectiveService.js +1 -1
- package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +7 -7
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +1 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/commands/resources.js +1 -1
- package/dist/modules/resources/commands/resources.js.map +2 -2
- package/dist/modules/resources/lib/seeds.js +1 -1
- package/dist/modules/resources/lib/seeds.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js +1 -1
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js +1 -1
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +2 -2
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/channels/offerTableUtils.js +2 -3
- package/dist/modules/sales/components/channels/offerTableUtils.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +4 -4
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +1 -1
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/lib/shipments/snapshots.js.map +1 -1
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -8
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +2 -2
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -8
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +2 -2
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/lib/graph-utils.js +1 -1
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/package.json +2 -2
- package/src/modules/api_docs/frontend/docs/api/page.tsx +1 -1
- package/src/modules/attachments/api/library/[id]/route.ts +1 -0
- package/src/modules/attachments/components/AttachmentLibrary.tsx +1 -1
- package/src/modules/attachments/lib/partitionEnv.ts +1 -1
- package/src/modules/auth/backend/users/page.tsx +1 -1
- package/src/modules/auth/cli.ts +1 -1
- package/src/modules/auth/commands/users.ts +1 -1
- package/src/modules/business_rules/components/utils/formHelpers.ts +1 -1
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -1
- package/src/modules/catalog/commands/products.ts +1 -1
- package/src/modules/catalog/commands/shared.ts +1 -1
- package/src/modules/catalog/components/PriceKindSettings.tsx +1 -1
- package/src/modules/catalog/components/products/productForm.ts +1 -1
- package/src/modules/configs/lib/upgrade-actions.ts +1 -1
- package/src/modules/currencies/services/providers/raiffeisen.ts +1 -1
- package/src/modules/customers/backend/customers/companies/page.tsx +3 -3
- package/src/modules/customers/backend/customers/deals/page.tsx +3 -3
- package/src/modules/customers/backend/customers/people/page.tsx +3 -3
- package/src/modules/customers/cli.ts +2 -2
- package/src/modules/customers/lib/detailHelpers.ts +1 -1
- package/src/modules/entities/cli.ts +1 -1
- package/src/modules/entities/lib/field-definitions.ts +1 -1
- package/src/modules/entities/lib/install-from-ce.ts +1 -1
- package/src/modules/inbox_ops/lib/emailParser.ts +1 -1
- package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +0 -8
- package/src/modules/perspectives/services/perspectiveService.ts +1 -1
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -3
- package/src/modules/query_index/components/QueryIndexesTable.tsx +7 -7
- package/src/modules/query_index/lib/engine.ts +1 -1
- package/src/modules/resources/backend/resources/resource-types/page.tsx +3 -2
- package/src/modules/resources/backend/resources/resources/page.tsx +3 -3
- package/src/modules/resources/commands/resources.ts +1 -1
- package/src/modules/resources/lib/seeds.ts +1 -1
- package/src/modules/sales/api/dashboard/widgets/new-orders/route.ts +1 -1
- package/src/modules/sales/api/dashboard/widgets/new-quotes/route.ts +1 -1
- package/src/modules/sales/backend/sales/channels/page.tsx +3 -3
- package/src/modules/sales/commands/documents.ts +2 -2
- package/src/modules/sales/components/channels/offerTableUtils.tsx +2 -3
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +4 -4
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +1 -1
- package/src/modules/sales/lib/shipments/snapshots.ts +1 -1
- package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -8
- package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -8
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +3 -3
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +3 -3
- package/src/modules/staff/backend/staff/team-members/page.tsx +3 -3
- package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -3
- package/src/modules/staff/backend/staff/teams/page.tsx +3 -2
- package/src/modules/workflows/backend/instances/page.tsx +2 -2
- package/src/modules/workflows/backend/tasks/page.tsx +1 -1
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
- package/src/modules/workflows/lib/graph-utils.ts +1 -1
- package/dist/modules/integrations/acl.js +0 -8
- package/dist/modules/integrations/acl.js.map +0 -7
- package/dist/modules/integrations/data/enrichers.js +0 -72
- package/dist/modules/integrations/data/enrichers.js.map +0 -7
- package/dist/modules/integrations/data/entities.js +0 -63
- package/dist/modules/integrations/data/entities.js.map +0 -7
- package/dist/modules/integrations/index.js +0 -9
- package/dist/modules/integrations/index.js.map +0 -7
- package/dist/modules/integrations/setup.js +0 -13
- package/dist/modules/integrations/setup.js.map +0 -7
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -69
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +0 -7
- package/dist/modules/integrations/widgets/injection-table.js +0 -13
- package/dist/modules/integrations/widgets/injection-table.js.map +0 -7
- package/src/modules/integrations/acl.ts +0 -4
- package/src/modules/integrations/data/enrichers.ts +0 -98
- package/src/modules/integrations/data/entities.ts +0 -46
- package/src/modules/integrations/index.ts +0 -5
- package/src/modules/integrations/setup.ts +0 -11
- package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -94
- package/src/modules/integrations/widgets/injection-table.ts +0 -17
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/sales/commands/documents.ts"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\n\nimport { randomUUID } from \"crypto\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"@open-mercato/shared/lib/commands\";\nimport type { CommandHandler } from \"@open-mercato/shared/lib/commands\";\nimport {\n buildChanges,\n emitCrudSideEffects,\n requireId,\n type CrudEventsConfig,\n} from \"@open-mercato/shared/lib/commands/helpers\";\nimport type { EntityManager } from \"@mikro-orm/postgresql\";\nimport type { EventBus } from \"@open-mercato/events\";\nimport type { DataEngine } from \"@open-mercato/shared/lib/data/engine\";\nimport { CrudHttpError } from \"@open-mercato/shared/lib/crud/errors\";\nimport {\n deriveResourceFromCommandId,\n invalidateCrudCache,\n} from \"@open-mercato/shared/lib/crud/cache\";\nimport { resolveTranslations } from \"@open-mercato/shared/lib/i18n/server\";\nimport { resolveNotificationService } from \"../../notifications/lib/notificationService\";\nimport { buildFeatureNotificationFromType } from \"../../notifications/lib/notificationBuilder\";\nimport { setRecordCustomFields } from \"@open-mercato/core/modules/entities/lib/helpers\";\nimport { loadCustomFieldValues } from \"@open-mercato/shared/lib/crud/custom-fields\";\nimport { normalizeCustomFieldValues } from \"@open-mercato/shared/lib/custom-fields/normalize\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport { findWithDecryption, findOneWithDecryption } from \"@open-mercato/shared/lib/encryption/find\";\nimport {\n SalesQuote,\n SalesQuoteLine,\n SalesQuoteAdjustment,\n SalesOrder,\n SalesOrderLine,\n SalesOrderAdjustment,\n SalesShipment,\n SalesShipmentItem,\n SalesPayment,\n SalesPaymentAllocation,\n SalesDocumentAddress,\n SalesNote,\n SalesChannel,\n SalesShippingMethod,\n SalesDeliveryWindow,\n SalesPaymentMethod,\n SalesDocumentTag,\n SalesDocumentTagAssignment,\n type SalesLineKind,\n type SalesAdjustmentKind,\n type SalesSettings,\n} from \"../data/entities\";\nimport {\n CatalogProduct,\n CatalogProductUnitConversion,\n} from \"../../catalog/data/entities\";\nimport { Dictionary, DictionaryEntry } from \"../../dictionaries/data/entities\";\nimport { CustomFieldValue } from \"@open-mercato/core/modules/entities/data/entities\";\nimport {\n CustomerAddress,\n CustomerEntity,\n CustomerPersonProfile,\n} from \"../../customers/data/entities\";\nimport {\n quoteCreateSchema,\n quoteLineCreateSchema,\n quoteAdjustmentCreateSchema,\n orderCreateSchema,\n orderLineCreateSchema,\n orderAdjustmentCreateSchema,\n type QuoteCreateInput,\n type QuoteLineCreateInput,\n type QuoteAdjustmentCreateInput,\n type OrderCreateInput,\n type OrderLineCreateInput,\n type OrderAdjustmentCreateInput,\n} from \"../data/validators\";\nimport {\n ensureOrganizationScope,\n ensureTenantScope,\n extractUndoPayload,\n toNumericString,\n} from \"./shared\";\nimport {\n loadShipmentSnapshot,\n restoreShipmentSnapshot,\n type ShipmentSnapshot,\n} from \"./shipments\";\nimport {\n loadPaymentSnapshot,\n restorePaymentSnapshot,\n type PaymentSnapshot,\n} from \"./payments\";\nimport type { SalesCalculationService } from \"../services/salesCalculationService\";\nimport type { TaxCalculationService } from \"../services/taxCalculationService\";\nimport type {\n PaymentMethodContext,\n ShippingMethodContext,\n} from \"../lib/providers\";\nimport {\n type SalesLineSnapshot,\n type SalesLineUomSnapshot,\n type SalesAdjustmentDraft,\n type SalesLineCalculationResult,\n type SalesDocumentCalculationResult,\n} from \"../lib/types\";\nimport { resolveDictionaryEntryValue } from \"../lib/dictionaries\";\nimport { resolveStatusEntryIdByValue } from \"../lib/statusHelpers\";\nimport { SalesDocumentNumberGenerator } from \"../services/salesDocumentNumberGenerator\";\nimport { loadSalesSettings } from \"./settings\";\nimport { notificationTypes } from \"../notifications\";\nimport {\n REFERENCE_UNIT_CODES,\n canonicalizeUnitCode,\n toUnitLookupKey,\n} from \"@open-mercato/shared/lib/units/unitCodes\";\nimport type { AuthContext } from \"@open-mercato/shared/lib/auth/server\";\nimport type { TranslateWithFallbackFn } from \"@open-mercato/shared/lib/i18n/translate\";\n\n// CRUD events configuration for workflow triggers\nconst orderCrudEvents: CrudEventsConfig<SalesOrder> = {\n module: \"sales\",\n entity: \"order\",\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n};\n\nconst quoteCrudEvents: CrudEventsConfig<SalesQuote> = {\n module: \"sales\",\n entity: \"quote\",\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n};\n\ntype DocumentAddressSnapshot = {\n id: string;\n organizationId: string;\n tenantId: string;\n documentId: string;\n documentKind: \"order\" | \"quote\";\n customerAddressId: string | null;\n name: string | null;\n purpose: string | null;\n companyName: string | null;\n addressLine1: string;\n addressLine2: string | null;\n city: string | null;\n region: string | null;\n postalCode: string | null;\n country: string | null;\n buildingNumber: string | null;\n flatNumber: string | null;\n latitude: number | null;\n longitude: number | null;\n};\n\ntype NoteSnapshot = {\n id: string;\n organizationId: string;\n tenantId: string;\n contextType: \"order\" | \"quote\";\n contextId: string;\n orderId: string | null;\n quoteId: string | null;\n body: string;\n authorUserId: string | null;\n appearanceIcon: string | null;\n appearanceColor: string | null;\n};\n\ntype TagAssignmentSnapshot = {\n id: string;\n tagId: string;\n organizationId: string;\n tenantId: string;\n documentId: string;\n documentKind: \"order\" | \"quote\";\n};\n\ntype QuoteGraphSnapshot = {\n quote: {\n id: string;\n organizationId: string;\n tenantId: string;\n quoteNumber: string;\n statusEntryId: string | null;\n status: string | null;\n customerEntityId: string | null;\n customerContactId: string | null;\n customerSnapshot: Record<string, unknown> | null;\n billingAddressId: string | null;\n shippingAddressId: string | null;\n billingAddressSnapshot: Record<string, unknown> | null;\n shippingAddressSnapshot: Record<string, unknown> | null;\n currencyCode: string;\n validFrom: string | null;\n validUntil: string | null;\n comments: string | null;\n taxInfo: Record<string, unknown> | null;\n shippingMethodId: string | null;\n shippingMethodCode: string | null;\n deliveryWindowId: string | null;\n deliveryWindowCode: string | null;\n paymentMethodId: string | null;\n paymentMethodCode: string | null;\n channelId: string | null;\n shippingMethodSnapshot: Record<string, unknown> | null;\n deliveryWindowSnapshot: Record<string, unknown> | null;\n paymentMethodSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n subtotalNetAmount: string;\n subtotalGrossAmount: string;\n discountTotalAmount: string;\n taxTotalAmount: string;\n grandTotalNetAmount: string;\n grandTotalGrossAmount: string;\n totalsSnapshot: Record<string, unknown> | null;\n lineItemCount: number;\n };\n lines: QuoteLineSnapshot[];\n adjustments: QuoteAdjustmentSnapshot[];\n addresses: DocumentAddressSnapshot[];\n notes: NoteSnapshot[];\n tags: TagAssignmentSnapshot[];\n};\n\ntype QuoteLineSnapshot = {\n id: string;\n lineNumber: number;\n kind: string;\n statusEntryId: string | null;\n status: string | null;\n productId: string | null;\n productVariantId: string | null;\n catalogSnapshot: Record<string, unknown> | null;\n name: string | null;\n description: string | null;\n comment: string | null;\n quantity: string;\n quantityUnit: string | null;\n normalizedQuantity: string;\n normalizedUnit: string | null;\n uomSnapshot: SalesLineUomSnapshot | null;\n currencyCode: string;\n unitPriceNet: string;\n unitPriceGross: string;\n discountAmount: string;\n discountPercent: string;\n taxRate: string;\n taxAmount: string;\n totalNetAmount: string;\n totalGrossAmount: string;\n configuration: Record<string, unknown> | null;\n promotionCode: string | null;\n promotionSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype QuoteAdjustmentSnapshot = {\n id: string;\n scope: \"order\" | \"line\";\n kind: string;\n code: string | null;\n label: string | null;\n calculatorKey: string | null;\n promotionId: string | null;\n rate: string;\n amountNet: string;\n amountGross: string;\n currencyCode: string | null;\n metadata: Record<string, unknown> | null;\n position: number;\n quoteLineId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype OrderGraphSnapshot = {\n order: {\n id: string;\n organizationId: string;\n tenantId: string;\n orderNumber: string;\n statusEntryId: string | null;\n status: string | null;\n fulfillmentStatusEntryId: string | null;\n fulfillmentStatus: string | null;\n paymentStatusEntryId: string | null;\n paymentStatus: string | null;\n customerEntityId: string | null;\n customerContactId: string | null;\n customerSnapshot: Record<string, unknown> | null;\n billingAddressId: string | null;\n shippingAddressId: string | null;\n billingAddressSnapshot: Record<string, unknown> | null;\n shippingAddressSnapshot: Record<string, unknown> | null;\n currencyCode: string;\n exchangeRate: string | null;\n taxStrategyKey: string | null;\n discountStrategyKey: string | null;\n taxInfo: Record<string, unknown> | null;\n shippingMethodId: string | null;\n shippingMethodCode: string | null;\n deliveryWindowId: string | null;\n deliveryWindowCode: string | null;\n paymentMethodId: string | null;\n paymentMethodCode: string | null;\n channelId: string | null;\n placedAt: string | null;\n expectedDeliveryAt: string | null;\n dueAt: string | null;\n comments: string | null;\n internalNotes: string | null;\n shippingMethodSnapshot: Record<string, unknown> | null;\n deliveryWindowSnapshot: Record<string, unknown> | null;\n paymentMethodSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n subtotalNetAmount: string;\n subtotalGrossAmount: string;\n discountTotalAmount: string;\n taxTotalAmount: string;\n shippingNetAmount: string;\n shippingGrossAmount: string;\n surchargeTotalAmount: string;\n grandTotalNetAmount: string;\n grandTotalGrossAmount: string;\n paidTotalAmount: string;\n refundedTotalAmount: string;\n outstandingAmount: string;\n totalsSnapshot: Record<string, unknown> | null;\n lineItemCount: number;\n };\n lines: OrderLineSnapshot[];\n adjustments: OrderAdjustmentSnapshot[];\n addresses: DocumentAddressSnapshot[];\n notes: NoteSnapshot[];\n tags: TagAssignmentSnapshot[];\n shipments: ShipmentSnapshot[];\n payments: PaymentSnapshot[];\n};\n\ntype OrderLineSnapshot = {\n id: string;\n lineNumber: number;\n kind: string;\n statusEntryId: string | null;\n status: string | null;\n productId: string | null;\n productVariantId: string | null;\n catalogSnapshot: Record<string, unknown> | null;\n name: string | null;\n description: string | null;\n comment: string | null;\n quantity: string;\n quantityUnit: string | null;\n normalizedQuantity: string;\n normalizedUnit: string | null;\n uomSnapshot: SalesLineUomSnapshot | null;\n reservedQuantity: string;\n fulfilledQuantity: string;\n invoicedQuantity: string;\n returnedQuantity: string;\n currencyCode: string;\n unitPriceNet: string;\n unitPriceGross: string;\n discountAmount: string;\n discountPercent: string;\n taxRate: string;\n taxAmount: string;\n totalNetAmount: string;\n totalGrossAmount: string;\n configuration: Record<string, unknown> | null;\n promotionCode: string | null;\n promotionSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype OrderAdjustmentSnapshot = {\n id: string;\n scope: \"order\" | \"line\";\n kind: string;\n code: string | null;\n label: string | null;\n calculatorKey: string | null;\n promotionId: string | null;\n rate: string;\n amountNet: string;\n amountGross: string;\n currencyCode: string | null;\n metadata: Record<string, unknown> | null;\n position: number;\n orderLineId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype OrderUndoPayload = {\n before?: OrderGraphSnapshot | null;\n after?: OrderGraphSnapshot | null;\n};\n\ntype QuoteUndoPayload = {\n before?: QuoteGraphSnapshot | null;\n after?: QuoteGraphSnapshot | null;\n};\n\ntype QuoteConvertUndoPayload = {\n quote?: QuoteGraphSnapshot | null;\n order?: OrderGraphSnapshot | null;\n};\n\nconst currencyCodeSchema = z\n .string()\n .trim()\n .toUpperCase()\n .regex(/^[A-Z]{3}$/, { message: \"currency_code_invalid\" });\n\nconst dateOnlySchema = z\n .string()\n .trim()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: \"invalid_date\" })\n .refine((value) => !Number.isNaN(new Date(value).getTime()), {\n message: \"invalid_date\",\n });\n\nconst addressSnapshotSchema = z\n .record(z.string(), z.unknown())\n .nullable()\n .optional();\n\nexport const documentUpdateSchema = z\n .object({\n id: z.string().uuid(),\n customerEntityId: z.string().uuid().nullable().optional(),\n customerContactId: z.string().uuid().nullable().optional(),\n customerSnapshot: z.record(z.string(), z.unknown()).nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n customerReference: z.string().nullable().optional(),\n externalReference: z.string().nullable().optional(),\n comment: z.string().nullable().optional(),\n orderNumber: z.string().trim().min(1).max(191).optional(),\n quoteNumber: z.string().trim().min(1).max(191).optional(),\n currencyCode: currencyCodeSchema.optional(),\n channelId: z.string().uuid().nullable().optional(),\n statusEntryId: z.string().uuid().nullable().optional(),\n placedAt: z.union([dateOnlySchema, z.null()]).optional(),\n expectedDeliveryAt: z.union([dateOnlySchema, z.null()]).optional(),\n shippingAddressId: z.string().uuid().nullable().optional(),\n billingAddressId: z.string().uuid().nullable().optional(),\n shippingAddressSnapshot: addressSnapshotSchema,\n billingAddressSnapshot: addressSnapshotSchema,\n shippingMethodId: z.string().uuid().nullable().optional(),\n shippingMethodCode: z.string().nullable().optional(),\n shippingMethodSnapshot: z\n .record(z.string(), z.unknown())\n .nullable()\n .optional(),\n paymentMethodId: z.string().uuid().nullable().optional(),\n paymentMethodCode: z.string().nullable().optional(),\n paymentMethodSnapshot: z\n .record(z.string(), z.unknown())\n .nullable()\n .optional(),\n tags: z.array(z.string().uuid()).optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n customFieldSetId: z.string().uuid().nullable().optional(),\n })\n .refine(\n (input) =>\n typeof input.currencyCode === \"string\" ||\n input.placedAt !== undefined ||\n input.expectedDeliveryAt !== undefined ||\n input.channelId !== undefined ||\n input.statusEntryId !== undefined ||\n input.shippingAddressId !== undefined ||\n input.billingAddressId !== undefined ||\n input.customerEntityId !== undefined ||\n input.customerContactId !== undefined ||\n input.customerSnapshot !== undefined ||\n input.metadata !== undefined ||\n input.customerReference !== undefined ||\n input.externalReference !== undefined ||\n input.comment !== undefined ||\n input.orderNumber !== undefined ||\n input.quoteNumber !== undefined ||\n input.shippingAddressSnapshot !== undefined ||\n input.billingAddressSnapshot !== undefined ||\n input.shippingMethodId !== undefined ||\n input.shippingMethodCode !== undefined ||\n input.shippingMethodSnapshot !== undefined ||\n input.paymentMethodId !== undefined ||\n input.paymentMethodCode !== undefined ||\n input.paymentMethodSnapshot !== undefined ||\n input.tags !== undefined ||\n input.customFields !== undefined ||\n input.customFieldSetId !== undefined,\n { message: \"update_payload_empty\" },\n );\n\nexport type DocumentUpdateInput = z.infer<typeof documentUpdateSchema>;\n\ntype DocumentLineCreateInput = QuoteLineCreateInput | OrderLineCreateInput;\ntype DocumentAdjustmentCreateInput =\n | QuoteAdjustmentCreateInput\n | OrderAdjustmentCreateInput;\n\nfunction cloneJson<T>(value: T): T {\n if (value === null || value === undefined) return value;\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nasync function resolveCustomerSnapshot(\n em: EntityManager,\n organizationId: string,\n tenantId: string,\n customerEntityId?: string | null,\n customerContactId?: string | null,\n): Promise<Record<string, unknown> | null> {\n if (!customerEntityId) return null;\n const customer = await em.findOne(\n CustomerEntity,\n { id: customerEntityId, organizationId, tenantId },\n { populate: [\"personProfile\", \"companyProfile\"] },\n );\n if (!customer) return null;\n\n const contact = customerContactId\n ? await em.findOne(CustomerPersonProfile, {\n id: customerContactId,\n organizationId,\n tenantId,\n })\n : null;\n\n return {\n customer: {\n id: customer.id,\n kind: customer.kind,\n displayName: customer.displayName,\n primaryEmail: customer.primaryEmail ?? null,\n primaryPhone: customer.primaryPhone ?? null,\n personProfile: customer.personProfile\n ? {\n id: customer.personProfile.id,\n firstName: customer.personProfile.firstName ?? null,\n lastName: customer.personProfile.lastName ?? null,\n preferredName: customer.personProfile.preferredName ?? null,\n }\n : null,\n companyProfile: customer.companyProfile\n ? {\n id: customer.companyProfile.id,\n legalName: customer.companyProfile.legalName ?? null,\n brandName: customer.companyProfile.brandName ?? null,\n domain: customer.companyProfile.domain ?? null,\n websiteUrl: customer.companyProfile.websiteUrl ?? null,\n }\n : null,\n },\n contact: contact\n ? {\n id: contact.id,\n firstName: contact.firstName ?? null,\n lastName: contact.lastName ?? null,\n preferredName: contact.preferredName ?? null,\n jobTitle: contact.jobTitle ?? null,\n department: contact.department ?? null,\n }\n : null,\n };\n}\n\nasync function resolveAddressSnapshot(\n em: EntityManager,\n organizationId: string,\n tenantId: string,\n addressId?: string | null,\n): Promise<Record<string, unknown> | null> {\n if (!addressId) return null;\n const address = await em.findOne(CustomerAddress, {\n id: addressId,\n organizationId,\n tenantId,\n });\n if (!address) return null;\n\n return {\n id: address.id,\n name: address.name ?? null,\n purpose: address.purpose ?? null,\n companyName: address.companyName ?? null,\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2 ?? null,\n buildingNumber: address.buildingNumber ?? null,\n flatNumber: address.flatNumber ?? null,\n city: address.city ?? null,\n region: address.region ?? null,\n postalCode: address.postalCode ?? null,\n country: address.country ?? null,\n latitude: address.latitude ?? null,\n longitude: address.longitude ?? null,\n isPrimary: address.isPrimary,\n };\n}\n\nasync function resolveDocumentReferences(\n em: EntityManager,\n parsed: {\n organizationId: string;\n tenantId: string;\n customerEntityId?: string | null;\n customerContactId?: string | null;\n customerSnapshot?: Record<string, unknown> | null;\n billingAddressId?: string | null;\n shippingAddressId?: string | null;\n billingAddressSnapshot?: Record<string, unknown> | null;\n shippingAddressSnapshot?: Record<string, unknown> | null;\n shippingMethodId?: string | null;\n deliveryWindowId?: string | null;\n paymentMethodId?: string | null;\n },\n): Promise<{\n customerSnapshot: Record<string, unknown> | null;\n billingAddressSnapshot: Record<string, unknown> | null;\n shippingAddressSnapshot: Record<string, unknown> | null;\n shippingMethod: SalesShippingMethod | null;\n deliveryWindow: SalesDeliveryWindow | null;\n paymentMethod: SalesPaymentMethod | null;\n}> {\n const [\n resolvedCustomerSnapshot,\n resolvedBillingSnapshot,\n resolvedShippingSnapshot,\n shippingMethod,\n deliveryWindow,\n paymentMethod,\n ] = await Promise.all([\n parsed.customerSnapshot\n ? Promise.resolve(cloneJson(parsed.customerSnapshot))\n : resolveCustomerSnapshot(\n em,\n parsed.organizationId,\n parsed.tenantId,\n parsed.customerEntityId ?? null,\n parsed.customerContactId ?? null,\n ),\n parsed.billingAddressSnapshot\n ? Promise.resolve(cloneJson(parsed.billingAddressSnapshot))\n : resolveAddressSnapshot(\n em,\n parsed.organizationId,\n parsed.tenantId,\n parsed.billingAddressId ?? null,\n ),\n parsed.shippingAddressSnapshot\n ? Promise.resolve(cloneJson(parsed.shippingAddressSnapshot))\n : resolveAddressSnapshot(\n em,\n parsed.organizationId,\n parsed.tenantId,\n parsed.shippingAddressId ?? null,\n ),\n parsed.shippingMethodId\n ? em.findOne(SalesShippingMethod, {\n id: parsed.shippingMethodId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n })\n : Promise.resolve(null),\n parsed.deliveryWindowId\n ? em.findOne(SalesDeliveryWindow, {\n id: parsed.deliveryWindowId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n })\n : Promise.resolve(null),\n parsed.paymentMethodId\n ? em.findOne(SalesPaymentMethod, {\n id: parsed.paymentMethodId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n })\n : Promise.resolve(null),\n ]);\n\n return {\n customerSnapshot: resolvedCustomerSnapshot\n ? cloneJson(resolvedCustomerSnapshot)\n : null,\n billingAddressSnapshot: resolvedBillingSnapshot\n ? cloneJson(resolvedBillingSnapshot)\n : null,\n shippingAddressSnapshot: resolvedShippingSnapshot\n ? cloneJson(resolvedShippingSnapshot)\n : null,\n shippingMethod: shippingMethod ?? null,\n deliveryWindow: deliveryWindow ?? null,\n paymentMethod: paymentMethod ?? null,\n };\n}\n\nfunction normalizeStatusValue(raw: unknown): string | null {\n if (typeof raw !== \"string\") return null;\n const trimmed = raw.trim();\n return trimmed.length ? trimmed : null;\n}\n\nfunction resolveNoteAuthorFromAuth(auth: AuthContext | null): string | null {\n if (!auth || auth.isApiKey) return null;\n const sub = typeof auth.sub === \"string\" ? auth.sub.trim() : \"\";\n const uuidRegex =\n /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;\n return uuidRegex.test(sub) ? sub : null;\n}\n\nfunction resolveStatusChangeActor(auth: AuthContext | null, translate: TranslateWithFallbackFn): string {\n const unknownLabel = translate(\n \"sales.orders.status_change.actor_unknown\",\n \"unknown user\",\n );\n if (!auth) return unknownLabel;\n if (auth.isApiKey) {\n const keyName = typeof auth.keyName === \"string\" ? auth.keyName.trim() : \"\";\n const keyId = typeof auth.keyId === \"string\" ? auth.keyId.trim() : \"\";\n const label =\n keyName || keyId || (typeof auth.sub === \"string\" ? auth.sub : \"\");\n return label\n ? translate(\n \"sales.orders.status_change.actor_api_key\",\n \"API key {name}\",\n { name: label },\n )\n : unknownLabel;\n }\n const email = typeof auth.email === \"string\" ? auth.email.trim() : \"\";\n if (email) return email;\n const sub = typeof auth.sub === \"string\" ? auth.sub.trim() : \"\";\n if (sub) return sub;\n return unknownLabel;\n}\n\nfunction formatStatusLabel(status: string | null, translate: TranslateWithFallbackFn): string {\n if (status && status.trim().length) return status.trim();\n return translate(\"sales.orders.status_change.empty\", \"unset\");\n}\n\nasync function appendOrderStatusChangeNote({\n em,\n order,\n previousStatus,\n auth,\n}: {\n em: EntityManager;\n order: SalesOrder;\n previousStatus: string | null;\n auth: AuthContext | null;\n}): Promise<SalesNote | null> {\n const nextStatus = normalizeStatusValue(order.status);\n if (previousStatus === nextStatus) return null;\n const { translate } = await resolveTranslations();\n const body = translate(\n \"sales.orders.status_change.note\",\n \"Status changed from {from} to {to} by {actor}.\",\n {\n from: formatStatusLabel(previousStatus, translate),\n to: formatStatusLabel(nextStatus, translate),\n actor: resolveStatusChangeActor(auth, translate),\n },\n );\n const note = em.create(SalesNote, {\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n contextType: \"order\",\n contextId: order.id,\n order,\n authorUserId: resolveNoteAuthorFromAuth(auth),\n appearanceIcon: null,\n appearanceColor: null,\n body,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(note);\n return note;\n}\n\nasync function applyDocumentUpdate({\n kind,\n entity,\n input,\n em,\n}: {\n kind: \"order\" | \"quote\";\n entity: SalesOrder | SalesQuote;\n input: DocumentUpdateInput;\n em: EntityManager;\n}): Promise<void> {\n const organizationId = (entity as any).organizationId as string;\n const tenantId = (entity as any).tenantId as string;\n const status =\n typeof (entity as any).status === \"string\" ? (entity as any).status : null;\n const { translate } = await resolveTranslations();\n\n const wantsCustomerChange =\n input.customerEntityId !== undefined ||\n input.customerContactId !== undefined ||\n input.customerSnapshot !== undefined ||\n input.metadata !== undefined;\n const wantsAddressChange =\n input.shippingAddressId !== undefined ||\n input.billingAddressId !== undefined ||\n input.shippingAddressSnapshot !== undefined ||\n input.billingAddressSnapshot !== undefined;\n\n let settings: SalesSettings | null = null;\n if (kind === \"order\" && (wantsCustomerChange || wantsAddressChange)) {\n settings = await loadSalesSettings(em, { organizationId, tenantId });\n }\n\n const guardStatus = (\n allowed: string[] | null | undefined,\n errorKey: string,\n fallback: string,\n ) => {\n if (!Array.isArray(allowed)) return;\n if (allowed.length === 0) {\n throw new CrudHttpError(400, { error: translate(errorKey, fallback) });\n }\n if (!status || !allowed.includes(status)) {\n throw new CrudHttpError(400, { error: translate(errorKey, fallback) });\n }\n };\n\n if (kind === \"order\" && wantsCustomerChange) {\n guardStatus(\n settings?.orderCustomerEditableStatuses ?? null,\n \"sales.orders.edit_customer_blocked\",\n \"Editing the customer is blocked for this status.\",\n );\n }\n if (kind === \"order\" && wantsAddressChange) {\n guardStatus(\n settings?.orderAddressEditableStatuses ?? null,\n \"sales.orders.edit_addresses_blocked\",\n \"Editing addresses is blocked for this status.\",\n );\n }\n\n if (kind === \"order\" && typeof input.orderNumber === \"string\") {\n (entity as SalesOrder).orderNumber = input.orderNumber;\n }\n if (kind === \"quote\" && typeof input.quoteNumber === \"string\") {\n (entity as SalesQuote).quoteNumber = input.quoteNumber;\n }\n\n if (input.customerEntityId !== undefined) {\n entity.customerEntityId = input.customerEntityId ?? null;\n entity.customerSnapshot = await resolveCustomerSnapshot(\n em,\n organizationId,\n tenantId,\n input.customerEntityId,\n input.customerContactId ?? entity.customerContactId ?? null,\n );\n entity.customerContactId = input.customerContactId ?? null;\n entity.billingAddressId = null;\n entity.shippingAddressId = null;\n entity.billingAddressSnapshot = null;\n entity.shippingAddressSnapshot = null;\n }\n if (input.customerContactId !== undefined) {\n entity.customerContactId = input.customerContactId ?? null;\n if (entity.customerEntityId) {\n entity.customerSnapshot = await resolveCustomerSnapshot(\n em,\n organizationId,\n tenantId,\n entity.customerEntityId,\n input.customerContactId,\n );\n }\n }\n if (input.customerSnapshot !== undefined) {\n entity.customerSnapshot = input.customerSnapshot ?? null;\n }\n if (input.metadata !== undefined) {\n entity.metadata = input.metadata ?? null;\n }\n if (input.externalReference !== undefined) {\n const normalized =\n typeof input.externalReference === \"string\"\n ? input.externalReference.trim()\n : \"\";\n entity.externalReference = normalized.length ? normalized : null;\n }\n if (input.customerReference !== undefined) {\n const normalized =\n typeof input.customerReference === \"string\"\n ? input.customerReference.trim()\n : \"\";\n entity.customerReference = normalized.length ? normalized : null;\n }\n if (input.comment !== undefined) {\n const normalized =\n typeof input.comment === \"string\" ? input.comment.trim() : \"\";\n entity.comments = normalized.length ? normalized : null;\n }\n if (typeof input.currencyCode === \"string\") {\n entity.currencyCode = input.currencyCode;\n }\n if (input.channelId !== undefined) {\n if (input.channelId === null) {\n entity.channelId = null;\n } else {\n const channel = await em.findOne(SalesChannel, {\n id: input.channelId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!channel) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.channelInvalid\",\n \"Selected channel could not be found.\",\n ),\n });\n }\n entity.channelId = channel.id;\n }\n }\n if (input.statusEntryId !== undefined) {\n const statusValue = await resolveDictionaryEntryValue(\n em,\n input.statusEntryId,\n );\n if (input.statusEntryId && !statusValue) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.statusInvalid\",\n \"Selected status could not be found.\",\n ),\n });\n }\n (entity as any).statusEntryId = input.statusEntryId ?? null;\n (entity as any).status = statusValue;\n }\n if (input.placedAt !== undefined) {\n if (input.placedAt === null) {\n entity.placedAt = null;\n } else {\n const parsed = new Date(input.placedAt);\n entity.placedAt = Number.isNaN(parsed.getTime())\n ? entity.placedAt\n : parsed;\n }\n }\n if (\n input.expectedDeliveryAt !== undefined &&\n \"expectedDeliveryAt\" in entity\n ) {\n if (input.expectedDeliveryAt === null) {\n (entity as SalesOrder).expectedDeliveryAt = null;\n } else {\n const parsed = new Date(input.expectedDeliveryAt);\n (entity as SalesOrder).expectedDeliveryAt = Number.isNaN(parsed.getTime())\n ? (entity as SalesOrder).expectedDeliveryAt\n : parsed;\n }\n }\n if (input.shippingAddressId !== undefined) {\n entity.shippingAddressId = input.shippingAddressId ?? null;\n if (input.shippingAddressSnapshot === undefined) {\n entity.shippingAddressSnapshot = await resolveAddressSnapshot(\n em,\n organizationId,\n tenantId,\n input.shippingAddressId,\n );\n }\n }\n if (input.billingAddressId !== undefined) {\n entity.billingAddressId = input.billingAddressId ?? null;\n if (input.billingAddressSnapshot === undefined) {\n entity.billingAddressSnapshot = await resolveAddressSnapshot(\n em,\n organizationId,\n tenantId,\n input.billingAddressId,\n );\n }\n }\n if (input.shippingAddressSnapshot !== undefined) {\n entity.shippingAddressSnapshot = input.shippingAddressSnapshot ?? null;\n }\n if (input.billingAddressSnapshot !== undefined) {\n entity.billingAddressSnapshot = input.billingAddressSnapshot ?? null;\n }\n if (\n input.shippingMethodId !== undefined ||\n input.shippingMethodSnapshot !== undefined ||\n input.shippingMethodCode !== undefined\n ) {\n let shippingMethod: SalesShippingMethod | null = null;\n if (input.shippingMethodId) {\n shippingMethod = await em.findOne(SalesShippingMethod, {\n id: input.shippingMethodId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!shippingMethod) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.shippingMethodInvalid\",\n \"Selected shipping method could not be found.\",\n ),\n });\n }\n }\n (entity as any).shippingMethodId = input.shippingMethodId ?? null;\n (entity as any).shippingMethod = shippingMethod ?? null;\n (entity as any).shippingMethodCode =\n input.shippingMethodCode ?? shippingMethod?.code ?? null;\n if (input.shippingMethodSnapshot !== undefined) {\n (entity as any).shippingMethodSnapshot =\n input.shippingMethodSnapshot ?? null;\n } else {\n (entity as any).shippingMethodSnapshot = shippingMethod\n ? {\n id: shippingMethod.id,\n code: shippingMethod.code,\n name: shippingMethod.name,\n description: shippingMethod.description ?? null,\n carrierCode: shippingMethod.carrierCode ?? null,\n providerKey: shippingMethod.providerKey ?? null,\n serviceLevel: shippingMethod.serviceLevel ?? null,\n estimatedTransitDays: shippingMethod.estimatedTransitDays ?? null,\n baseRateNet: shippingMethod.baseRateNet,\n baseRateGross: shippingMethod.baseRateGross,\n currencyCode: shippingMethod.currencyCode ?? null,\n metadata: shippingMethod.metadata\n ? cloneJson(shippingMethod.metadata)\n : null,\n providerSettings:\n shippingMethod.metadata &&\n typeof shippingMethod.metadata === \"object\"\n ? cloneJson(\n (shippingMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null;\n }\n }\n if (\n input.paymentMethodId !== undefined ||\n input.paymentMethodSnapshot !== undefined ||\n input.paymentMethodCode !== undefined\n ) {\n let paymentMethod: SalesPaymentMethod | null = null;\n if (input.paymentMethodId) {\n paymentMethod = await em.findOne(SalesPaymentMethod, {\n id: input.paymentMethodId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!paymentMethod) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.paymentMethodInvalid\",\n \"Selected payment method could not be found.\",\n ),\n });\n }\n }\n (entity as any).paymentMethodId = input.paymentMethodId ?? null;\n (entity as any).paymentMethod = paymentMethod ?? null;\n (entity as any).paymentMethodCode =\n input.paymentMethodCode ?? paymentMethod?.code ?? null;\n if (input.paymentMethodSnapshot !== undefined) {\n (entity as any).paymentMethodSnapshot =\n input.paymentMethodSnapshot ?? null;\n } else {\n (entity as any).paymentMethodSnapshot = paymentMethod\n ? {\n id: paymentMethod.id,\n code: paymentMethod.code,\n name: paymentMethod.name,\n description: paymentMethod.description ?? null,\n providerKey: paymentMethod.providerKey ?? null,\n terms: paymentMethod.terms ?? null,\n metadata: paymentMethod.metadata\n ? cloneJson(paymentMethod.metadata)\n : null,\n providerSettings:\n paymentMethod.metadata &&\n typeof paymentMethod.metadata === \"object\"\n ? cloneJson(\n (paymentMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null;\n }\n }\n\n if (input.tags !== undefined) {\n await syncSalesDocumentTags(em, {\n documentId: entity.id,\n kind,\n organizationId,\n tenantId,\n tagIds: input.tags,\n });\n }\n\n if (input.customFieldSetId !== undefined) {\n (entity as any).customFieldSetId = input.customFieldSetId ?? null;\n }\n\n if (input.customFields !== undefined) {\n const values =\n input.customFields &&\n typeof input.customFields === \"object\" &&\n !Array.isArray(input.customFields)\n ? (input.customFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: kind === \"order\" ? E.sales.sales_order : E.sales.sales_quote,\n recordId: entity.id,\n organizationId,\n tenantId,\n values,\n });\n }\n}\n\nasync function loadQuoteSnapshot(\n em: EntityManager,\n id: string,\n): Promise<QuoteGraphSnapshot | null> {\n const quote = await em.findOne(SalesQuote, { id, deletedAt: null });\n if (!quote) return null;\n const lines = await em.find(\n SalesQuoteLine,\n { quote: quote },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesQuoteAdjustment,\n { quote: quote },\n { orderBy: { position: \"asc\" } },\n );\n const [\n addresses,\n notes,\n tags,\n quoteCustomFields,\n lineCustomFields,\n adjustmentCustomFields,\n ] = await Promise.all([\n em.find(SalesDocumentAddress, { documentId: id, documentKind: \"quote\" }),\n em.find(SalesNote, { contextType: \"quote\", contextId: id }),\n findWithDecryption(\n em,\n SalesDocumentTagAssignment,\n { documentId: id, documentKind: \"quote\" },\n { populate: [\"tag\"] },\n { tenantId: quote.tenantId, organizationId: quote.organizationId },\n ),\n loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote,\n recordIds: [quote.id],\n tenantIdByRecord: { [quote.id]: quote.tenantId },\n organizationIdByRecord: { [quote.id]: quote.organizationId },\n }),\n lines.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote_line,\n recordIds: lines.map((line) => line.id),\n tenantIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, quote.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, quote.organizationId]),\n ),\n })\n : Promise.resolve({}),\n adjustments.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote_adjustment,\n recordIds: adjustments.map((adj) => adj.id),\n tenantIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, quote.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, quote.organizationId]),\n ),\n })\n : Promise.resolve({}),\n ]);\n const addressSnapshots: DocumentAddressSnapshot[] = addresses.map(\n (entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: entry.documentId,\n documentKind: \"quote\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n }),\n );\n const noteSnapshots: NoteSnapshot[] = notes.map((entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: entry.contextType as \"order\" | \"quote\",\n contextId: entry.contextId,\n orderId: entry.order\n ? typeof entry.order === \"string\"\n ? entry.order\n : entry.order.id\n : null,\n quoteId: entry.quote\n ? typeof entry.quote === \"string\"\n ? entry.quote\n : entry.quote.id\n : null,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n }));\n const tagSnapshots: TagAssignmentSnapshot[] = tags\n .map((assignment) => {\n const tagId =\n typeof assignment.tag === \"string\"\n ? assignment.tag\n : (assignment.tag?.id ?? (assignment as any)?.tag_id ?? null);\n if (!tagId) return null;\n return {\n id: assignment.id,\n tagId,\n organizationId: assignment.organizationId,\n tenantId: assignment.tenantId,\n documentId: assignment.documentId,\n documentKind: \"quote\",\n };\n })\n .filter((entry): entry is TagAssignmentSnapshot => !!entry);\n\n return {\n quote: {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteNumber: quote.quoteNumber,\n statusEntryId: quote.statusEntryId ?? null,\n status: quote.status ?? null,\n customerEntityId: quote.customerEntityId ?? null,\n customerContactId: quote.customerContactId ?? null,\n customerSnapshot: quote.customerSnapshot\n ? cloneJson(quote.customerSnapshot)\n : null,\n billingAddressId: quote.billingAddressId ?? null,\n shippingAddressId: quote.shippingAddressId ?? null,\n billingAddressSnapshot: quote.billingAddressSnapshot\n ? cloneJson(quote.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: quote.shippingAddressSnapshot\n ? cloneJson(quote.shippingAddressSnapshot)\n : null,\n currencyCode: quote.currencyCode,\n validFrom: quote.validFrom ? quote.validFrom.toISOString() : null,\n validUntil: quote.validUntil ? quote.validUntil.toISOString() : null,\n comments: quote.comments ?? null,\n taxInfo: quote.taxInfo ? cloneJson(quote.taxInfo) : null,\n shippingMethodId: quote.shippingMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n deliveryWindowId: quote.deliveryWindowId ?? null,\n deliveryWindowCode: quote.deliveryWindowCode ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n channelId: quote.channelId ?? null,\n shippingMethodSnapshot: quote.shippingMethodSnapshot\n ? cloneJson(quote.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: quote.deliveryWindowSnapshot\n ? cloneJson(quote.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: quote.paymentMethodSnapshot\n ? cloneJson(quote.paymentMethodSnapshot)\n : null,\n metadata: quote.metadata ? cloneJson(quote.metadata) : null,\n customFieldSetId: quote.customFieldSetId ?? null,\n customFields: quoteCustomFields[quote.id]\n ? cloneJson(quoteCustomFields[quote.id])\n : null,\n subtotalNetAmount: quote.subtotalNetAmount,\n subtotalGrossAmount: quote.subtotalGrossAmount,\n discountTotalAmount: quote.discountTotalAmount,\n taxTotalAmount: quote.taxTotalAmount,\n grandTotalNetAmount: quote.grandTotalNetAmount,\n grandTotalGrossAmount: quote.grandTotalGrossAmount,\n totalsSnapshot: quote.totalsSnapshot\n ? cloneJson(quote.totalsSnapshot)\n : null,\n lineItemCount: quote.lineItemCount,\n },\n lines: lines.map((line) => ({\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n customFields: lineCustomFields[line.id]\n ? cloneJson(lineCustomFields[line.id])\n : null,\n })),\n adjustments: adjustments.map((adj) => ({\n id: adj.id,\n scope: adj.scope,\n kind: adj.kind,\n code: adj.code ?? null,\n label: adj.label ?? null,\n calculatorKey: adj.calculatorKey ?? null,\n promotionId: adj.promotionId ?? null,\n rate: adj.rate,\n amountNet: adj.amountNet,\n amountGross: adj.amountGross,\n currencyCode: adj.currencyCode ?? null,\n metadata: adj.metadata ? cloneJson(adj.metadata) : null,\n position: adj.position,\n quoteLineId:\n typeof adj.quoteLine === \"string\"\n ? adj.quoteLine\n : (adj.quoteLine?.id ?? null),\n customFields: adjustmentCustomFields[adj.id]\n ? cloneJson(adjustmentCustomFields[adj.id])\n : null,\n })),\n addresses: addressSnapshots,\n notes: noteSnapshots,\n tags: tagSnapshots,\n };\n}\n\nasync function loadOrderSnapshot(\n em: EntityManager,\n id: string,\n): Promise<OrderGraphSnapshot | null> {\n const order = await em.findOne(SalesOrder, { id, deletedAt: null });\n if (!order) return null;\n const lines = await em.find(\n SalesOrderLine,\n { order: order },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesOrderAdjustment,\n { order: order },\n { orderBy: { position: \"asc\" } },\n );\n const [\n addresses,\n notes,\n tags,\n shipments,\n payments,\n orderCustomFields,\n lineCustomFields,\n adjustmentCustomFields,\n ] = await Promise.all([\n em.find(SalesDocumentAddress, { documentId: id, documentKind: \"order\" }),\n em.find(SalesNote, { contextType: \"order\", contextId: id }),\n findWithDecryption(\n em,\n SalesDocumentTagAssignment,\n { documentId: id, documentKind: \"order\" },\n { populate: [\"tag\"] },\n { tenantId: order.tenantId, organizationId: order.organizationId },\n ),\n em.find(SalesShipment, { order: order }),\n em.find(SalesPayment, { order: order }),\n loadCustomFieldValues({\n em,\n entityId: E.sales.sales_order,\n recordIds: [order.id],\n tenantIdByRecord: { [order.id]: order.tenantId },\n organizationIdByRecord: { [order.id]: order.organizationId },\n }),\n lines.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_order_line,\n recordIds: lines.map((line) => line.id),\n tenantIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, order.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, order.organizationId]),\n ),\n })\n : Promise.resolve({}),\n adjustments.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_order_adjustment,\n recordIds: adjustments.map((adj) => adj.id),\n tenantIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, order.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, order.organizationId]),\n ),\n })\n : Promise.resolve({}),\n ]);\n const shipmentSnapshots = (\n await Promise.all(\n shipments.map((entry) => loadShipmentSnapshot(em, entry.id)),\n )\n ).filter((entry): entry is ShipmentSnapshot => !!entry);\n const paymentSnapshots = (\n await Promise.all(\n payments.map((entry) => loadPaymentSnapshot(em, entry.id)),\n )\n ).filter((entry): entry is PaymentSnapshot => !!entry);\n const addressSnapshots: DocumentAddressSnapshot[] = addresses.map(\n (entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: entry.documentId,\n documentKind: \"order\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n }),\n );\n const noteSnapshots: NoteSnapshot[] = notes.map((entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: entry.contextType as \"order\" | \"quote\",\n contextId: entry.contextId,\n orderId: entry.order\n ? typeof entry.order === \"string\"\n ? entry.order\n : entry.order.id\n : null,\n quoteId: entry.quote\n ? typeof entry.quote === \"string\"\n ? entry.quote\n : entry.quote.id\n : null,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n }));\n const tagSnapshots: TagAssignmentSnapshot[] = tags\n .map((assignment) => {\n const tagId =\n typeof assignment.tag === \"string\"\n ? assignment.tag\n : (assignment.tag?.id ?? (assignment as any)?.tag_id ?? null);\n if (!tagId) return null;\n return {\n id: assignment.id,\n tagId,\n organizationId: assignment.organizationId,\n tenantId: assignment.tenantId,\n documentId: assignment.documentId,\n documentKind: \"order\",\n };\n })\n .filter((entry): entry is TagAssignmentSnapshot => !!entry);\n\n return {\n order: {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderNumber: order.orderNumber,\n statusEntryId: order.statusEntryId ?? null,\n status: order.status ?? null,\n fulfillmentStatusEntryId: order.fulfillmentStatusEntryId ?? null,\n fulfillmentStatus: order.fulfillmentStatus ?? null,\n paymentStatusEntryId: order.paymentStatusEntryId ?? null,\n paymentStatus: order.paymentStatus ?? null,\n customerEntityId: order.customerEntityId ?? null,\n customerContactId: order.customerContactId ?? null,\n customerSnapshot: order.customerSnapshot\n ? cloneJson(order.customerSnapshot)\n : null,\n billingAddressId: order.billingAddressId ?? null,\n shippingAddressId: order.shippingAddressId ?? null,\n billingAddressSnapshot: order.billingAddressSnapshot\n ? cloneJson(order.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: order.shippingAddressSnapshot\n ? cloneJson(order.shippingAddressSnapshot)\n : null,\n currencyCode: order.currencyCode,\n exchangeRate: order.exchangeRate ?? null,\n taxStrategyKey: order.taxStrategyKey ?? null,\n discountStrategyKey: order.discountStrategyKey ?? null,\n taxInfo: order.taxInfo ? cloneJson(order.taxInfo) : null,\n shippingMethodId: order.shippingMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n deliveryWindowId: order.deliveryWindowId ?? null,\n deliveryWindowCode: order.deliveryWindowCode ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n channelId: order.channelId ?? null,\n placedAt: order.placedAt ? order.placedAt.toISOString() : null,\n expectedDeliveryAt: order.expectedDeliveryAt\n ? order.expectedDeliveryAt.toISOString()\n : null,\n dueAt: order.dueAt ? order.dueAt.toISOString() : null,\n comments: order.comments ?? null,\n internalNotes: order.internalNotes ?? null,\n shippingMethodSnapshot: order.shippingMethodSnapshot\n ? cloneJson(order.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: order.deliveryWindowSnapshot\n ? cloneJson(order.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: order.paymentMethodSnapshot\n ? cloneJson(order.paymentMethodSnapshot)\n : null,\n metadata: order.metadata ? cloneJson(order.metadata) : null,\n customFieldSetId: order.customFieldSetId ?? null,\n customFields: orderCustomFields[order.id]\n ? cloneJson(orderCustomFields[order.id])\n : null,\n subtotalNetAmount: order.subtotalNetAmount,\n subtotalGrossAmount: order.subtotalGrossAmount,\n discountTotalAmount: order.discountTotalAmount,\n taxTotalAmount: order.taxTotalAmount,\n shippingNetAmount: order.shippingNetAmount,\n shippingGrossAmount: order.shippingGrossAmount,\n surchargeTotalAmount: order.surchargeTotalAmount,\n grandTotalNetAmount: order.grandTotalNetAmount,\n grandTotalGrossAmount: order.grandTotalGrossAmount,\n paidTotalAmount: order.paidTotalAmount,\n refundedTotalAmount: order.refundedTotalAmount,\n outstandingAmount: order.outstandingAmount,\n totalsSnapshot: order.totalsSnapshot\n ? cloneJson(order.totalsSnapshot)\n : null,\n lineItemCount: order.lineItemCount,\n },\n lines: lines.map((line) => ({\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n reservedQuantity: line.reservedQuantity,\n fulfilledQuantity: line.fulfilledQuantity,\n invoicedQuantity: line.invoicedQuantity,\n returnedQuantity: line.returnedQuantity,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n customFields: lineCustomFields[line.id]\n ? cloneJson(lineCustomFields[line.id])\n : null,\n })),\n adjustments: adjustments.map((adj) => ({\n id: adj.id,\n scope: adj.scope,\n kind: adj.kind,\n code: adj.code ?? null,\n label: adj.label ?? null,\n calculatorKey: adj.calculatorKey ?? null,\n promotionId: adj.promotionId ?? null,\n rate: adj.rate,\n amountNet: adj.amountNet,\n amountGross: adj.amountGross,\n currencyCode: adj.currencyCode ?? null,\n metadata: adj.metadata ? cloneJson(adj.metadata) : null,\n position: adj.position,\n orderLineId:\n typeof adj.orderLine === \"string\"\n ? adj.orderLine\n : (adj.orderLine?.id ?? null),\n customFields: adjustmentCustomFields[adj.id]\n ? cloneJson(adjustmentCustomFields[adj.id])\n : null,\n })),\n addresses: addressSnapshots,\n notes: noteSnapshots,\n tags: tagSnapshots,\n shipments: shipmentSnapshots,\n payments: paymentSnapshots,\n };\n}\n\ntype DeletableEntity = {\n id?: string;\n organizationId?: string | null;\n tenantId?: string | null;\n};\n\nasync function queueDeletionSideEffects(\n dataEngine: DataEngine,\n entities: DeletableEntity[] | DeletableEntity | null | undefined,\n entityType: string,\n): Promise<void> {\n if (!entities) return;\n const list = Array.isArray(entities) ? entities : [entities];\n const tasks: Array<Promise<void>> = [];\n for (const entity of list) {\n if (!entity) continue;\n const id = typeof entity.id === \"string\" ? entity.id : null;\n if (!id) continue;\n tasks.push(\n emitCrudSideEffects({\n dataEngine,\n action: \"deleted\",\n entity,\n identifiers: {\n id,\n organizationId: entity.organizationId ?? null,\n tenantId: entity.tenantId ?? null,\n },\n indexer: { entityType },\n }),\n );\n }\n if (tasks.length) await Promise.all(tasks);\n}\n\nfunction toNumeric(value: string | number | null | undefined): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.trim().length) {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return 0;\n}\n\nconst UNIT_DICTIONARY_KEYS = [\"unit\", \"units\", \"measurement_units\"] as const;\nconst UOM_REFERENCE_UNITS = new Set<string>(REFERENCE_UNIT_CODES);\nconst UOM_NORMALIZED_SCALE = 6;\nconst UOM_NORMALIZED_MAX = 1_000_000_000_000;\nconst UNIT_PRICE_AUTOCONVERT_SCALE = 4;\n\ntype ProductUomState = {\n productId: string;\n baseUnitCode: string | null;\n defaultSalesUnit: string | null;\n unitPriceEnabled: boolean;\n unitPriceReferenceUnit: \"kg\" | \"l\" | \"m2\" | \"m3\" | \"pc\" | null;\n unitPriceBaseQuantity: string | null;\n conversionsByUnitKey: Map<string, CatalogProductUnitConversion>;\n};\n\ntype UomResolver = {\n dictionaryPromise: Promise<Dictionary | null> | null;\n unitExistsCache: Map<string, boolean>;\n productCache: Map<string, ProductUomState | null>;\n};\n\ntype NormalizeLineUomInput = {\n em: EntityManager;\n resolver: UomResolver;\n organizationId: string;\n tenantId: string;\n line: {\n productId?: string | null;\n productVariantId?: string | null;\n quantity?: number | string | null;\n quantityUnit?: string | null;\n unitPriceNet?: number | null;\n unitPriceGross?: number | null;\n normalizedQuantity?: number | string | null;\n normalizedUnit?: string | null;\n uomSnapshot?: Record<string, unknown> | null;\n };\n};\n\nfunction createUomResolver(): UomResolver {\n return {\n dictionaryPromise: null,\n unitExistsCache: new Map<string, boolean>(),\n productCache: new Map<string, ProductUomState | null>(),\n };\n}\n\nfunction normalizeUnitCode(value: unknown): string | null {\n return canonicalizeUnitCode(value);\n}\n\nfunction unitLookupKey(value: string | null | undefined): string | null {\n return toUnitLookupKey(value);\n}\n\nfunction roundNormalizedQuantity(value: number): number {\n const factor = 10 ** UOM_NORMALIZED_SCALE;\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * factor) / factor;\n}\n\nfunction assertNormalizedPrecision(value: number) {\n if (!Number.isFinite(value) || Math.abs(value) >= UOM_NORMALIZED_MAX) {\n throw new CrudHttpError(422, { error: \"uom.precision_overflow\" });\n }\n}\n\nfunction toOptionalNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"string\" && value.trim().length) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction resolveSnapshotToBaseFactor(snapshot: unknown): number {\n if (!snapshot || typeof snapshot !== \"object\") return 1;\n const payload = snapshot as Record<string, unknown>;\n const factor = toOptionalNumber(payload.toBaseFactor ?? payload.to_base_factor);\n if (!Number.isFinite(factor) || !factor || factor <= 0) return 1;\n return factor;\n}\n\nfunction roundAutoConvertedUnitPrice(value: number): number | null {\n if (!Number.isFinite(value) || value < 0) return null;\n const factor = 10 ** UNIT_PRICE_AUTOCONVERT_SCALE;\n const rounded = Math.round((value + Number.EPSILON) * factor) / factor;\n return Number.isFinite(rounded) ? rounded : null;\n}\n\nfunction convertLineUnitPricesOnUnitChange(params: {\n existingSnapshot: SalesLineSnapshot | null;\n nextQuantityUnit: string | null;\n nextUomSnapshot: SalesLineUomSnapshot | Record<string, unknown> | null;\n unitPriceNet: number | null;\n unitPriceGross: number | null;\n}): {\n unitPriceNet: number | null;\n unitPriceGross: number | null;\n didConvert: boolean;\n} {\n if (!params.existingSnapshot) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const existingUnitPriceNet =\n typeof params.existingSnapshot.unitPriceNet === \"number\" &&\n Number.isFinite(params.existingSnapshot.unitPriceNet)\n ? params.existingSnapshot.unitPriceNet\n : null;\n const existingUnitPriceGross =\n typeof params.existingSnapshot.unitPriceGross === \"number\" &&\n Number.isFinite(params.existingSnapshot.unitPriceGross)\n ? params.existingSnapshot.unitPriceGross\n : null;\n const sameNumber = (left: number | null, right: number | null): boolean => {\n if (left === null || right === null) return left === right;\n return Math.abs(left - right) < 0.000001;\n };\n const shouldConvertNet =\n params.unitPriceNet === null ||\n sameNumber(params.unitPriceNet, existingUnitPriceNet);\n const shouldConvertGross =\n params.unitPriceGross === null ||\n sameNumber(params.unitPriceGross, existingUnitPriceGross);\n if (!shouldConvertNet && !shouldConvertGross) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const previousUnit = normalizeUnitCode(params.existingSnapshot?.quantityUnit ?? null);\n const nextUnit = normalizeUnitCode(params.nextQuantityUnit);\n if (!previousUnit || !nextUnit || previousUnit === nextUnit) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const previousFactor = resolveSnapshotToBaseFactor(\n params.existingSnapshot?.uomSnapshot ?? null,\n );\n const nextFactor = resolveSnapshotToBaseFactor(params.nextUomSnapshot);\n if (\n !Number.isFinite(previousFactor) ||\n previousFactor <= 0 ||\n !Number.isFinite(nextFactor) ||\n nextFactor <= 0\n ) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const convertAmount = (\n value: number | null,\n shouldConvert: boolean,\n ): number | null => {\n if (!shouldConvert) return value;\n if (value === null || !Number.isFinite(value)) return value;\n const converted = roundAutoConvertedUnitPrice((value / previousFactor) * nextFactor);\n return converted ?? value;\n };\n const nextUnitPriceNet = convertAmount(params.unitPriceNet, shouldConvertNet);\n const nextUnitPriceGross = convertAmount(\n params.unitPriceGross,\n shouldConvertGross,\n );\n const didConvert =\n nextUnitPriceNet !== params.unitPriceNet ||\n nextUnitPriceGross !== params.unitPriceGross;\n return {\n unitPriceNet: nextUnitPriceNet,\n unitPriceGross: nextUnitPriceGross,\n didConvert,\n };\n}\n\nfunction resolveReferenceUnit(\n value: unknown,\n): \"kg\" | \"l\" | \"m2\" | \"m3\" | \"pc\" | null {\n const normalized = toUnitLookupKey(value);\n if (!normalized) return null;\n if (!UOM_REFERENCE_UNITS.has(normalized)) return null;\n return normalized as \"kg\" | \"l\" | \"m2\" | \"m3\" | \"pc\";\n}\n\nasync function resolveUnitDictionaryScoped(\n em: EntityManager,\n organizationId: string,\n tenantId: string,\n): Promise<Dictionary | null> {\n return findOneWithDecryption(\n em,\n Dictionary,\n {\n organizationId,\n tenantId,\n key: { $in: [...UNIT_DICTIONARY_KEYS] },\n deletedAt: null,\n isActive: true,\n },\n { orderBy: { createdAt: \"asc\" } },\n );\n}\n\nasync function assertUnitExists(\n em: EntityManager,\n resolver: UomResolver,\n organizationId: string,\n tenantId: string,\n unitCode: string,\n): Promise<void> {\n const normalizedCode = unitLookupKey(unitCode);\n if (!normalizedCode) return;\n const rawUnitCode = unitCode.trim();\n if (!resolver.dictionaryPromise) {\n resolver.dictionaryPromise = resolveUnitDictionaryScoped(\n em,\n organizationId,\n tenantId,\n );\n }\n const dictionary = await resolver.dictionaryPromise;\n if (!dictionary) {\n throw new CrudHttpError(400, { error: \"uom.unit_not_found\" });\n }\n const cacheKey = `${dictionary.id}:${normalizedCode}`;\n if (resolver.unitExistsCache.has(cacheKey)) {\n if (!resolver.unitExistsCache.get(cacheKey)) {\n throw new CrudHttpError(400, { error: \"uom.unit_not_found\" });\n }\n return;\n }\n const entry = await findOneWithDecryption(em, DictionaryEntry, {\n dictionary,\n organizationId: dictionary.organizationId,\n tenantId: dictionary.tenantId,\n $or: [{ normalizedValue: normalizedCode }, { value: rawUnitCode }],\n });\n const exists = !!entry;\n resolver.unitExistsCache.set(cacheKey, exists);\n if (!exists) {\n throw new CrudHttpError(400, { error: \"uom.unit_not_found\" });\n }\n}\n\nasync function resolveProductUomState(\n em: EntityManager,\n resolver: UomResolver,\n organizationId: string,\n tenantId: string,\n productId: string,\n): Promise<ProductUomState | null> {\n if (resolver.productCache.has(productId)) {\n return resolver.productCache.get(productId) ?? null;\n }\n const product = await findOneWithDecryption(em, CatalogProduct, {\n id: productId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!product) {\n resolver.productCache.set(productId, null);\n return null;\n }\n const conversions = await findWithDecryption(em, CatalogProductUnitConversion, {\n product: product.id,\n organizationId,\n tenantId,\n deletedAt: null,\n isActive: true,\n });\n const conversionsByUnitKey = new Map<string, CatalogProductUnitConversion>();\n for (const conversion of conversions) {\n const key = unitLookupKey(conversion.unitCode);\n if (!key) continue;\n conversionsByUnitKey.set(key, conversion);\n }\n const state: ProductUomState = {\n productId: product.id,\n baseUnitCode: normalizeUnitCode(product.defaultUnit ?? null),\n defaultSalesUnit: normalizeUnitCode(product.defaultSalesUnit ?? null),\n unitPriceEnabled: Boolean(product.unitPriceEnabled),\n unitPriceReferenceUnit: resolveReferenceUnit(\n product.unitPriceReferenceUnit,\n ),\n unitPriceBaseQuantity: product.unitPriceBaseQuantity ?? null,\n conversionsByUnitKey,\n };\n resolver.productCache.set(productId, state);\n return state;\n}\n\nfunction buildUnitPriceReferenceSnapshot(params: {\n product: ProductUomState;\n toBaseFactor: number;\n unitPriceNet: number | null;\n unitPriceGross: number | null;\n}) {\n if (!params.product.unitPriceEnabled) return undefined;\n const baseQuantityNumber = toNumeric(params.product.unitPriceBaseQuantity);\n const output: NonNullable<SalesLineUomSnapshot[\"unitPriceReference\"]> = {\n enabled: true,\n referenceUnitCode: params.product.unitPriceReferenceUnit ?? null,\n baseQuantity: params.product.unitPriceBaseQuantity ?? null,\n };\n if (\n !params.product.unitPriceReferenceUnit ||\n params.toBaseFactor <= 0 ||\n baseQuantityNumber <= 0\n ) {\n return output;\n }\n if (\n typeof params.unitPriceGross === \"number\" &&\n Number.isFinite(params.unitPriceGross)\n ) {\n output.grossPerReference = toNumericString(\n (params.unitPriceGross / params.toBaseFactor) * baseQuantityNumber,\n );\n }\n if (\n typeof params.unitPriceNet === \"number\" &&\n Number.isFinite(params.unitPriceNet)\n ) {\n output.netPerReference = toNumericString(\n (params.unitPriceNet / params.toBaseFactor) * baseQuantityNumber,\n );\n }\n return output;\n}\n\nasync function normalizeLineUom(input: NormalizeLineUomInput): Promise<{\n quantity: number;\n quantityUnit: string | null;\n normalizedQuantity: number;\n normalizedUnit: string | null;\n uomSnapshot: SalesLineUomSnapshot | null;\n}> {\n const quantity = toNumeric(input.line.quantity);\n const existingSnapshot =\n input.line.uomSnapshot && typeof input.line.uomSnapshot === \"object\"\n ? (cloneJson(input.line.uomSnapshot) as SalesLineUomSnapshot)\n : null;\n const productId =\n typeof input.line.productId === \"string\" ? input.line.productId : null;\n const variantId =\n typeof input.line.productVariantId === \"string\"\n ? input.line.productVariantId\n : null;\n const enteredUnitInput = normalizeUnitCode(input.line.quantityUnit);\n if (!productId) {\n if (enteredUnitInput) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n enteredUnitInput,\n );\n }\n const normalizedQuantity = toNumeric(\n input.line.normalizedQuantity ?? quantity,\n );\n assertNormalizedPrecision(normalizedQuantity);\n return {\n quantity,\n quantityUnit: enteredUnitInput ?? null,\n normalizedQuantity,\n normalizedUnit:\n normalizeUnitCode(input.line.normalizedUnit) ??\n enteredUnitInput ??\n null,\n uomSnapshot: existingSnapshot ?? {\n version: 1,\n productId: null,\n productVariantId: variantId,\n baseUnitCode:\n normalizeUnitCode(input.line.normalizedUnit) ??\n enteredUnitInput ??\n null,\n enteredUnitCode: enteredUnitInput,\n enteredQuantity: toNumericString(quantity) ?? \"0\",\n toBaseFactor: \"1\",\n normalizedQuantity: toNumericString(normalizedQuantity) ?? \"0\",\n rounding: { mode: \"half_up\", scale: UOM_NORMALIZED_SCALE },\n source: { conversionId: null, resolvedAt: new Date().toISOString() },\n },\n };\n }\n\n const productState = await resolveProductUomState(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n productId,\n );\n if (!productState) {\n if (enteredUnitInput) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n enteredUnitInput,\n );\n }\n const normalizedQuantity = toNumeric(\n input.line.normalizedQuantity ?? quantity,\n );\n assertNormalizedPrecision(normalizedQuantity);\n return {\n quantity,\n quantityUnit: enteredUnitInput ?? null,\n normalizedQuantity,\n normalizedUnit:\n normalizeUnitCode(input.line.normalizedUnit) ??\n enteredUnitInput ??\n null,\n uomSnapshot: existingSnapshot,\n };\n }\n\n const baseUnitCode = productState.baseUnitCode;\n const enteredUnitCode =\n enteredUnitInput ??\n productState.defaultSalesUnit ??\n baseUnitCode ??\n normalizeUnitCode(input.line.normalizedUnit);\n if (enteredUnitCode) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n enteredUnitCode,\n );\n }\n if (baseUnitCode) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n baseUnitCode,\n );\n }\n\n if (!baseUnitCode) {\n const requiresBase =\n Boolean(enteredUnitCode) ||\n productState.conversionsByUnitKey.size > 0 ||\n Boolean(productState.defaultSalesUnit);\n if (requiresBase) {\n throw new CrudHttpError(400, { error: \"uom.default_unit_missing\" });\n }\n const normalizedQuantity = toNumeric(\n input.line.normalizedQuantity ?? quantity,\n );\n assertNormalizedPrecision(normalizedQuantity);\n return {\n quantity,\n quantityUnit: enteredUnitCode ?? null,\n normalizedQuantity,\n normalizedUnit:\n normalizeUnitCode(input.line.normalizedUnit) ?? enteredUnitCode ?? null,\n uomSnapshot: existingSnapshot,\n };\n }\n\n const resolvedEnteredUnit = enteredUnitCode ?? baseUnitCode;\n const enteredKey = unitLookupKey(resolvedEnteredUnit);\n const baseKey = unitLookupKey(baseUnitCode);\n let toBaseFactor = 1;\n let conversionId: string | null = null;\n if (enteredKey && baseKey && enteredKey !== baseKey) {\n const conversion = productState.conversionsByUnitKey.get(enteredKey);\n if (!conversion) {\n throw new CrudHttpError(400, { error: \"uom.conversion_not_found\" });\n }\n toBaseFactor = toNumeric(conversion.toBaseFactor);\n conversionId = conversion.id;\n }\n if (!Number.isFinite(toBaseFactor) || toBaseFactor <= 0) {\n throw new CrudHttpError(400, { error: \"uom.invalid_factor\" });\n }\n const normalizedQuantity = roundNormalizedQuantity(quantity * toBaseFactor);\n assertNormalizedPrecision(normalizedQuantity);\n const unitPriceReference = buildUnitPriceReferenceSnapshot({\n product: productState,\n toBaseFactor,\n unitPriceNet: toOptionalNumber(input.line.unitPriceNet),\n unitPriceGross: toOptionalNumber(input.line.unitPriceGross),\n });\n const snapshot: SalesLineUomSnapshot = {\n version: 1,\n productId,\n productVariantId: variantId,\n baseUnitCode,\n enteredUnitCode: resolvedEnteredUnit,\n enteredQuantity: toNumericString(quantity) ?? \"0\",\n toBaseFactor: toNumericString(toBaseFactor) ?? \"1\",\n normalizedQuantity: toNumericString(normalizedQuantity) ?? \"0\",\n rounding: {\n mode: \"half_up\",\n scale: UOM_NORMALIZED_SCALE,\n },\n source: {\n conversionId,\n resolvedAt: new Date().toISOString(),\n },\n ...(unitPriceReference ? { unitPriceReference } : {}),\n };\n\n return {\n quantity,\n quantityUnit: resolvedEnteredUnit,\n normalizedQuantity,\n normalizedUnit: baseUnitCode,\n uomSnapshot: snapshot,\n };\n}\n\nfunction normalizeShippingMethodContext(\n snapshot: Record<string, unknown> | null | undefined,\n id?: string | null,\n code?: string | null,\n currencyCode?: string,\n): ShippingMethodContext | null {\n if (!snapshot || typeof snapshot !== \"object\") return null;\n const metadata = (snapshot as Record<string, unknown>).metadata;\n const providerSettings =\n (snapshot as Record<string, unknown>).providerSettings ??\n (metadata && typeof metadata === \"object\"\n ? ((metadata as Record<string, unknown>).providerSettings ?? null)\n : null);\n return {\n id:\n ((snapshot as Record<string, unknown>).id as string | undefined) ??\n id ??\n null,\n code:\n typeof (snapshot as Record<string, unknown>).code === \"string\"\n ? ((snapshot as Record<string, unknown>).code as string)\n : (code ?? null),\n name:\n typeof (snapshot as Record<string, unknown>).name === \"string\"\n ? ((snapshot as Record<string, unknown>).name as string)\n : null,\n providerKey:\n typeof (snapshot as Record<string, unknown>).providerKey === \"string\"\n ? ((snapshot as Record<string, unknown>).providerKey as string)\n : null,\n currencyCode:\n typeof (snapshot as Record<string, unknown>).currencyCode === \"string\"\n ? ((snapshot as Record<string, unknown>).currencyCode as string)\n : (currencyCode ?? null),\n baseRateNet: toNumeric(\n ((snapshot as Record<string, unknown>).baseRateNet ??\n (snapshot as Record<string, unknown>).base_rate_net) as\n | string\n | number\n | null,\n ),\n baseRateGross: toNumeric(\n ((snapshot as Record<string, unknown>).baseRateGross ??\n (snapshot as Record<string, unknown>).base_rate_gross) as\n | string\n | number\n | null,\n ),\n metadata:\n metadata && typeof metadata === \"object\"\n ? cloneJson(metadata as Record<string, unknown>)\n : null,\n providerSettings:\n providerSettings && typeof providerSettings === \"object\"\n ? cloneJson(providerSettings as Record<string, unknown>)\n : null,\n };\n}\n\nfunction normalizePaymentMethodContext(\n snapshot: Record<string, unknown> | null | undefined,\n id?: string | null,\n code?: string | null,\n): PaymentMethodContext | null {\n if (!snapshot || typeof snapshot !== \"object\") return null;\n const metadata = (snapshot as Record<string, unknown>).metadata;\n const providerSettings =\n (snapshot as Record<string, unknown>).providerSettings ??\n (metadata && typeof metadata === \"object\"\n ? ((metadata as Record<string, unknown>).providerSettings ?? null)\n : null);\n return {\n id:\n ((snapshot as Record<string, unknown>).id as string | undefined) ??\n id ??\n null,\n code:\n typeof (snapshot as Record<string, unknown>).code === \"string\"\n ? ((snapshot as Record<string, unknown>).code as string)\n : (code ?? null),\n name:\n typeof (snapshot as Record<string, unknown>).name === \"string\"\n ? ((snapshot as Record<string, unknown>).name as string)\n : null,\n providerKey:\n typeof (snapshot as Record<string, unknown>).providerKey === \"string\"\n ? ((snapshot as Record<string, unknown>).providerKey as string)\n : null,\n terms:\n typeof (snapshot as Record<string, unknown>).terms === \"string\"\n ? ((snapshot as Record<string, unknown>).terms as string)\n : null,\n metadata:\n metadata && typeof metadata === \"object\"\n ? cloneJson(metadata as Record<string, unknown>)\n : null,\n providerSettings:\n providerSettings && typeof providerSettings === \"object\"\n ? cloneJson(providerSettings as Record<string, unknown>)\n : null,\n };\n}\n\nfunction buildProviderContext(params: {\n shippingSnapshot?: Record<string, unknown> | null;\n paymentSnapshot?: Record<string, unknown> | null;\n shippingMethodId?: string | null;\n paymentMethodId?: string | null;\n shippingMethodCode?: string | null;\n paymentMethodCode?: string | null;\n currencyCode: string;\n}) {\n return {\n shippingMethod: normalizeShippingMethodContext(\n params.shippingSnapshot,\n params.shippingMethodId,\n params.shippingMethodCode,\n params.currencyCode,\n ),\n paymentMethod: normalizePaymentMethodContext(\n params.paymentSnapshot,\n params.paymentMethodId,\n params.paymentMethodCode,\n ),\n };\n}\n\nfunction buildCalculationContext(params: {\n tenantId: string;\n organizationId: string;\n currencyCode: string;\n shippingSnapshot?: Record<string, unknown> | null;\n paymentSnapshot?: Record<string, unknown> | null;\n shippingMethodId?: string | null;\n paymentMethodId?: string | null;\n shippingMethodCode?: string | null;\n paymentMethodCode?: string | null;\n}) {\n return {\n tenantId: params.tenantId,\n organizationId: params.organizationId,\n currencyCode: params.currencyCode,\n metadata: buildProviderContext({\n shippingSnapshot: params.shippingSnapshot,\n paymentSnapshot: params.paymentSnapshot,\n shippingMethodId: params.shippingMethodId,\n paymentMethodId: params.paymentMethodId,\n shippingMethodCode: params.shippingMethodCode,\n paymentMethodCode: params.paymentMethodCode,\n currencyCode: params.currencyCode,\n }),\n };\n}\n\nfunction mapOrderLineEntityToSnapshot(line: SalesOrderLine): SalesLineSnapshot {\n return {\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: toNumeric(line.quantity),\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: toNumeric(line.normalizedQuantity ?? line.quantity),\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: toNumeric(line.unitPriceNet),\n unitPriceGross: toNumeric(line.unitPriceGross),\n discountAmount: toNumeric(line.discountAmount),\n discountPercent: toNumeric(line.discountPercent),\n taxRate: toNumeric(line.taxRate),\n taxAmount: toNumeric(line.taxAmount),\n totalNetAmount: toNumeric(line.totalNetAmount),\n totalGrossAmount: toNumeric(line.totalGrossAmount),\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n };\n}\n\nfunction mapQuoteLineEntityToSnapshot(line: SalesQuoteLine): SalesLineSnapshot {\n return {\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: toNumeric(line.quantity),\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: toNumeric(line.normalizedQuantity ?? line.quantity),\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: toNumeric(line.unitPriceNet),\n unitPriceGross: toNumeric(line.unitPriceGross),\n discountAmount: toNumeric(line.discountAmount),\n discountPercent: toNumeric(line.discountPercent),\n taxRate: toNumeric(line.taxRate),\n taxAmount: toNumeric(line.taxAmount),\n totalNetAmount: toNumeric(line.totalNetAmount),\n totalGrossAmount: toNumeric(line.totalGrossAmount),\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n };\n}\n\nfunction mapOrderAdjustmentToDraft(\n adjustment: SalesOrderAdjustment,\n): SalesAdjustmentDraft {\n return {\n id: adjustment.id,\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: toNumeric(adjustment.rate),\n amountNet: toNumeric(adjustment.amountNet),\n amountGross: toNumeric(adjustment.amountGross),\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? 0,\n };\n}\n\nfunction mapQuoteAdjustmentToDraft(\n adjustment: SalesQuoteAdjustment,\n): SalesAdjustmentDraft {\n return {\n id: adjustment.id,\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: toNumeric(adjustment.rate),\n amountNet: toNumeric(adjustment.amountNet),\n amountGross: toNumeric(adjustment.amountGross),\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? 0,\n };\n}\n\nasync function emitTotalsCalculated(\n eventBus: EventBus | null | undefined,\n payload: {\n documentKind: SalesDocumentKind;\n documentId: string;\n organizationId: string;\n tenantId: string;\n customerId?: string | null;\n totals: SalesDocumentCalculationResult[\"totals\"];\n lineCount: number;\n },\n): Promise<void> {\n if (!eventBus) return;\n await eventBus.emitEvent(\"sales.document.totals.calculated\", payload);\n}\n\nfunction createLineSnapshotFromInput(\n line: DocumentLineCreateInput,\n lineNumber: number,\n): SalesLineSnapshot {\n const quantity = Number(line.quantity ?? 0);\n const normalizedQuantity = toNumeric(\n line.normalizedQuantity ?? quantity,\n );\n return {\n lineNumber,\n kind: line.kind ?? \"product\",\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity,\n normalizedUnit:\n typeof line.normalizedUnit === \"string\"\n ? line.normalizedUnit\n : (line.quantityUnit ?? null),\n uomSnapshot:\n line.uomSnapshot && typeof line.uomSnapshot === \"object\"\n ? cloneJson(line.uomSnapshot as Record<string, unknown>)\n : null,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet ?? null,\n unitPriceGross: line.unitPriceGross ?? null,\n discountAmount: line.discountAmount ?? null,\n discountPercent: line.discountPercent ?? null,\n taxRate: line.taxRate ?? null,\n taxAmount: line.taxAmount ?? null,\n totalNetAmount: line.totalNetAmount ?? null,\n totalGrossAmount: line.totalGrossAmount ?? null,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId:\n \"customFieldSetId\" in line\n ? ((line as any).customFieldSetId ?? null)\n : null,\n customFields:\n \"customFields\" in line && line.customFields\n ? cloneJson((line as any).customFields)\n : null,\n };\n}\n\nfunction createAdjustmentDraftFromInput(\n adjustment: DocumentAdjustmentCreateInput & { id?: string | null },\n): SalesAdjustmentDraft {\n const lineRef =\n \"quoteLineId\" in adjustment\n ? (adjustment as any).quoteLineId\n : (adjustment as any).orderLineId;\n if (adjustment.scope === \"line\" && lineRef) {\n throw new CrudHttpError(400, {\n error: \"Line-scoped adjustments are not supported yet.\",\n });\n }\n return {\n id: typeof adjustment.id === \"string\" ? adjustment.id : undefined,\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind ?? \"custom\",\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: adjustment.rate ?? null,\n amountNet: adjustment.amountNet ?? null,\n amountGross: adjustment.amountGross ?? null,\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? 0,\n };\n}\n\nfunction convertLineCalculationToEntityInput(\n lineResult: SalesLineCalculationResult,\n sourceLine: DocumentLineCreateInput,\n document: { organizationId: string; tenantId: string },\n index: number,\n) {\n const line = lineResult.line;\n return {\n lineNumber: line.lineNumber ?? index + 1,\n kind: line.kind ?? \"product\",\n statusEntryId: sourceLine.statusEntryId ?? null,\n productId: sourceLine.productId ?? null,\n productVariantId: sourceLine.productVariantId ?? null,\n catalogSnapshot: sourceLine.catalogSnapshot\n ? cloneJson(sourceLine.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: toNumericString(line.quantity) ?? \"0\",\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity:\n toNumericString(line.normalizedQuantity ?? line.quantity) ?? \"0\",\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot:\n line.uomSnapshot && typeof line.uomSnapshot === \"object\"\n ? cloneJson(line.uomSnapshot as Record<string, unknown>)\n : null,\n currencyCode: line.currencyCode,\n unitPriceNet:\n toNumericString(\n line.unitPriceNet ??\n lineResult.netAmount / Math.max(line.quantity || 1, 1),\n ) ?? \"0\",\n unitPriceGross:\n toNumericString(\n line.unitPriceGross ??\n lineResult.grossAmount / Math.max(line.quantity || 1, 1),\n ) ?? \"0\",\n discountAmount: toNumericString(lineResult.discountAmount) ?? \"0\",\n discountPercent: toNumericString(line.discountPercent) ?? \"0\",\n taxRate: toNumericString(line.taxRate) ?? \"0\",\n taxAmount: toNumericString(lineResult.taxAmount) ?? \"0\",\n totalNetAmount: toNumericString(lineResult.netAmount) ?? \"0\",\n totalGrossAmount: toNumericString(lineResult.grossAmount) ?? \"0\",\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: sourceLine.promotionSnapshot\n ? cloneJson(sourceLine.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: sourceLine.customFieldSetId ?? null,\n organizationId: document.organizationId,\n tenantId: document.tenantId,\n };\n}\n\nfunction convertAdjustmentResultToEntityInput(\n adjustment: SalesAdjustmentDraft,\n sourceAdjustment: DocumentAdjustmentCreateInput | null,\n document: { organizationId: string; tenantId: string },\n index: number,\n) {\n const metadata = adjustment.metadata ? cloneJson(adjustment.metadata) : null;\n const resolvedPosition =\n sourceAdjustment?.position ??\n (adjustment.position !== null && adjustment.position !== undefined\n ? adjustment.position\n : index);\n return {\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind ?? \"custom\",\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: toNumericString(adjustment.rate) ?? \"0\",\n amountNet: toNumericString(adjustment.amountNet) ?? \"0\",\n amountGross:\n toNumericString(adjustment.amountGross ?? adjustment.amountNet) ?? \"0\",\n currencyCode: adjustment.currencyCode ?? null,\n metadata,\n position: resolvedPosition,\n organizationId: document.organizationId,\n tenantId: document.tenantId,\n };\n}\n\nasync function applyOrderLineResults(params: {\n em: EntityManager;\n order: SalesOrder;\n calculation: SalesDocumentCalculationResult;\n sourceLines: Array<DocumentLineCreateInput & { id?: string }>;\n existingLines: SalesOrderLine[];\n}): Promise<void> {\n const { em, order, calculation, sourceLines, existingLines } = params;\n const existingMap = new Map(existingLines.map((line) => [line.id, line]));\n const persisted = new Set<string>();\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = sourceLines[index];\n const statusEntryId = (sourceLine as any).statusEntryId ?? null;\n const statusValue = await resolveStatus(statusEntryId ?? null);\n const payload = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n order,\n index,\n );\n const existing = sourceLine.id\n ? (existingMap.get(sourceLine.id) ?? null)\n : null;\n const lineEntity =\n existing ??\n em.create(SalesOrderLine, {\n order,\n id: sourceLine.id ?? undefined,\n reservedQuantity: existing?.reservedQuantity ?? \"0\",\n fulfilledQuantity: existing?.fulfilledQuantity ?? \"0\",\n invoicedQuantity: existing?.invoicedQuantity ?? \"0\",\n returnedQuantity: existing?.returnedQuantity ?? \"0\",\n createdAt: existing?.createdAt ?? new Date(),\n updatedAt: new Date(),\n });\n Object.assign(lineEntity, {\n ...payload,\n order,\n statusEntryId,\n status: statusValue,\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: lineEntity.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n persisted.add(lineEntity.id);\n }\n for (const [id, line] of existingMap.entries()) {\n if (!persisted.has(id)) {\n em.remove(line);\n }\n }\n}\n\nasync function applyQuoteLineResults(params: {\n em: EntityManager;\n quote: SalesQuote;\n calculation: SalesDocumentCalculationResult;\n sourceLines: Array<DocumentLineCreateInput & { id?: string }>;\n existingLines: SalesQuoteLine[];\n}): Promise<void> {\n const { em, quote, calculation, sourceLines, existingLines } = params;\n const existingMap = new Map(existingLines.map((line) => [line.id, line]));\n const persisted = new Set<string>();\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = sourceLines[index];\n const statusEntryId = (sourceLine as any).statusEntryId ?? null;\n const statusValue = await resolveStatus(statusEntryId ?? null);\n const payload = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n quote,\n index,\n );\n const existing = sourceLine.id\n ? (existingMap.get(sourceLine.id) ?? null)\n : null;\n const lineEntity =\n existing ??\n em.create(SalesQuoteLine, {\n quote,\n id: sourceLine.id ?? undefined,\n createdAt: existing?.createdAt ?? new Date(),\n updatedAt: new Date(),\n });\n Object.assign(lineEntity, {\n ...payload,\n quote,\n statusEntryId,\n status: statusValue,\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_line,\n recordId: lineEntity.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n persisted.add(lineEntity.id);\n }\n for (const [id, line] of existingMap.entries()) {\n if (!persisted.has(id)) {\n em.remove(line);\n }\n }\n}\n\nasync function replaceQuoteLines(\n em: EntityManager,\n quote: SalesQuote,\n calculation: SalesDocumentCalculationResult,\n lineInputs: QuoteLineCreateInput[],\n): Promise<void> {\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = lineInputs[index];\n const entityInput = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n quote,\n index,\n );\n const statusValue = await resolveStatus(sourceLine.statusEntryId ?? null);\n const lineEntity = em.create(SalesQuoteLine, {\n quote,\n ...entityInput,\n status: statusValue,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_line,\n recordId: lineEntity.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n }\n}\n\nasync function replaceQuoteAdjustments(\n em: EntityManager,\n quote: SalesQuote,\n calculation: SalesDocumentCalculationResult,\n adjustmentInputs: QuoteAdjustmentCreateInput[] | null,\n): Promise<void> {\n const existing = await em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n );\n const existingMap = new Map<string, SalesQuoteAdjustment>();\n existing.forEach((adj) => existingMap.set(adj.id, adj));\n const seen = new Set<string>();\n const adjustmentDrafts = calculation.adjustments;\n for (let index = 0; index < adjustmentDrafts.length; index += 1) {\n const draft = adjustmentDrafts[index];\n const sourceById =\n adjustmentInputs?.find((adj) => (adj as any).id === draft.id) ?? null;\n const source =\n sourceById ??\n (adjustmentInputs ? (adjustmentInputs[index] ?? null) : null);\n const entityInput = convertAdjustmentResultToEntityInput(\n draft,\n source,\n quote,\n index,\n );\n const adjustmentId =\n (draft as any).id ?? (source as any)?.id ?? randomUUID();\n const existingEntity = existingMap.get(adjustmentId);\n const entity =\n existingEntity ??\n em.create(SalesQuoteAdjustment, {\n id: adjustmentId,\n quote,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n createdAt: new Date(),\n });\n entity.scope = entityInput.scope;\n entity.kind = entityInput.kind;\n entity.code = entityInput.code ?? null;\n entity.label = entityInput.label ?? null;\n entity.calculatorKey = entityInput.calculatorKey ?? null;\n entity.promotionId = entityInput.promotionId ?? null;\n entity.rate = entityInput.rate ?? \"0\";\n entity.amountNet = entityInput.amountNet ?? \"0\";\n entity.amountGross =\n entityInput.amountGross ?? entityInput.amountNet ?? \"0\";\n entity.currencyCode = entityInput.currencyCode ?? quote.currencyCode;\n entity.metadata = entityInput.metadata ?? null;\n entity.position = entityInput.position ?? index;\n entity.updatedAt = new Date();\n entity.quoteLine = null;\n seen.add(adjustmentId);\n if (source?.customFields !== undefined) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_adjustment,\n recordId: adjustmentId,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values:\n source.customFields && typeof source.customFields === \"object\"\n ? (source.customFields as Record<string, unknown>)\n : {},\n });\n }\n em.persist(entity);\n }\n\n existing.forEach((adj) => {\n if (!seen.has(adj.id)) {\n em.remove(adj);\n }\n });\n}\n\nasync function replaceOrderLines(\n em: EntityManager,\n order: SalesOrder,\n calculation: SalesDocumentCalculationResult,\n lineInputs: OrderLineCreateInput[],\n): Promise<void> {\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = lineInputs[index];\n const entityInput = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n order,\n index,\n );\n const statusValue = await resolveStatus(sourceLine.statusEntryId ?? null);\n const lineEntity = em.create(SalesOrderLine, {\n order,\n ...entityInput,\n reservedQuantity: \"0\",\n fulfilledQuantity: \"0\",\n invoicedQuantity: \"0\",\n returnedQuantity: \"0\",\n status: statusValue,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: lineEntity.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n }\n}\n\nasync function replaceOrderAdjustments(\n em: EntityManager,\n order: SalesOrder,\n calculation: SalesDocumentCalculationResult,\n adjustmentInputs: OrderAdjustmentCreateInput[] | null,\n): Promise<void> {\n const existing = await em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n );\n const existingMap = new Map<string, SalesOrderAdjustment>();\n existing.forEach((adj) => existingMap.set(adj.id, adj));\n const seen = new Set<string>();\n const adjustmentDrafts = calculation.adjustments;\n for (let index = 0; index < adjustmentDrafts.length; index += 1) {\n const draft = adjustmentDrafts[index];\n const sourceById =\n adjustmentInputs?.find((adj) => (adj as any).id === draft.id) ?? null;\n const source =\n sourceById ??\n (adjustmentInputs ? (adjustmentInputs[index] ?? null) : null);\n const entityInput = convertAdjustmentResultToEntityInput(\n draft,\n source,\n order,\n index,\n );\n const adjustmentId =\n (draft as any).id ?? (source as any)?.id ?? randomUUID();\n const existingEntity = existingMap.get(adjustmentId);\n const entity =\n existingEntity ??\n em.create(SalesOrderAdjustment, {\n id: adjustmentId,\n order,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n createdAt: new Date(),\n });\n entity.scope = entityInput.scope;\n entity.kind = entityInput.kind;\n entity.code = entityInput.code ?? null;\n entity.label = entityInput.label ?? null;\n entity.calculatorKey = entityInput.calculatorKey ?? null;\n entity.promotionId = entityInput.promotionId ?? null;\n entity.rate = entityInput.rate ?? \"0\";\n entity.amountNet = entityInput.amountNet ?? \"0\";\n entity.amountGross =\n entityInput.amountGross ?? entityInput.amountNet ?? \"0\";\n entity.currencyCode = entityInput.currencyCode ?? order.currencyCode;\n entity.metadata = entityInput.metadata ?? null;\n entity.position = entityInput.position ?? index;\n entity.updatedAt = new Date();\n entity.orderLine = null;\n seen.add(adjustmentId);\n if (source?.customFields !== undefined) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_adjustment,\n recordId: adjustmentId,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values:\n source.customFields && typeof source.customFields === \"object\"\n ? (source.customFields as Record<string, unknown>)\n : {},\n });\n }\n em.persist(entity);\n }\n\n existing.forEach((adj) => {\n if (!seen.has(adj.id)) {\n em.remove(adj);\n }\n });\n}\n\nfunction applyQuoteTotals(\n quote: SalesQuote,\n totals: SalesDocumentCalculationResult[\"totals\"],\n lineCount: number,\n): void {\n quote.subtotalNetAmount = toNumericString(totals.subtotalNetAmount) ?? \"0\";\n quote.subtotalGrossAmount =\n toNumericString(totals.subtotalGrossAmount) ?? \"0\";\n quote.discountTotalAmount =\n toNumericString(totals.discountTotalAmount) ?? \"0\";\n quote.taxTotalAmount = toNumericString(totals.taxTotalAmount) ?? \"0\";\n quote.grandTotalNetAmount =\n toNumericString(totals.grandTotalNetAmount) ?? \"0\";\n quote.grandTotalGrossAmount =\n toNumericString(totals.grandTotalGrossAmount) ?? \"0\";\n quote.totalsSnapshot = cloneJson(totals);\n quote.lineItemCount = lineCount;\n}\n\nfunction applyOrderTotals(\n order: SalesOrder,\n totals: SalesDocumentCalculationResult[\"totals\"],\n lineCount: number,\n): void {\n order.subtotalNetAmount = toNumericString(totals.subtotalNetAmount) ?? \"0\";\n order.subtotalGrossAmount =\n toNumericString(totals.subtotalGrossAmount) ?? \"0\";\n order.discountTotalAmount =\n toNumericString(totals.discountTotalAmount) ?? \"0\";\n order.taxTotalAmount = toNumericString(totals.taxTotalAmount) ?? \"0\";\n order.shippingNetAmount = toNumericString(totals.shippingNetAmount) ?? \"0\";\n order.shippingGrossAmount =\n toNumericString(totals.shippingGrossAmount) ?? \"0\";\n order.surchargeTotalAmount =\n toNumericString(totals.surchargeTotalAmount) ?? \"0\";\n order.grandTotalNetAmount =\n toNumericString(totals.grandTotalNetAmount) ?? \"0\";\n order.grandTotalGrossAmount =\n toNumericString(totals.grandTotalGrossAmount) ?? \"0\";\n order.paidTotalAmount = toNumericString(totals.paidTotalAmount) ?? \"0\";\n order.refundedTotalAmount =\n toNumericString(totals.refundedTotalAmount) ?? \"0\";\n order.outstandingAmount = toNumericString(totals.outstandingAmount) ?? \"0\";\n order.totalsSnapshot = cloneJson(totals);\n order.lineItemCount = lineCount;\n}\n\nfunction normalizePaymentTotal(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value))\n return Math.max(value, 0);\n if (typeof value === \"string\" && value.trim().length) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? Math.max(parsed, 0) : 0;\n }\n return 0;\n}\n\nfunction resolveExistingPaymentTotals(order: SalesOrder) {\n return {\n paidTotalAmount: normalizePaymentTotal(order.paidTotalAmount),\n refundedTotalAmount: normalizePaymentTotal(order.refundedTotalAmount),\n };\n}\n\nfunction ensureQuoteScope(\n ctx: Parameters<typeof ensureTenantScope>[0],\n organizationId: string,\n tenantId: string,\n): void {\n ensureTenantScope(ctx, tenantId);\n ensureOrganizationScope(ctx, organizationId);\n}\n\nfunction ensureOrderScope(\n ctx: Parameters<typeof ensureTenantScope>[0],\n organizationId: string,\n tenantId: string,\n): void {\n ensureTenantScope(ctx, tenantId);\n ensureOrganizationScope(ctx, organizationId);\n}\n\nfunction normalizeTagIds(tags?: Array<string | null | undefined>): string[] {\n if (!Array.isArray(tags)) return [];\n const set = new Set<string>();\n tags.forEach((id) => {\n if (typeof id === \"string\" && id.trim().length > 0) set.add(id.trim());\n });\n return Array.from(set);\n}\n\nfunction buildTagChange(\n beforeTags: TagAssignmentSnapshot[] | undefined,\n afterTags: TagAssignmentSnapshot[] | undefined,\n): { from: string[]; to: string[] } | null {\n const beforeIds = normalizeTagIds(beforeTags?.map((tag) => tag.tagId));\n const afterIds = normalizeTagIds(afterTags?.map((tag) => tag.tagId));\n beforeIds.sort((a, b) => a.localeCompare(b));\n afterIds.sort((a, b) => a.localeCompare(b));\n if (\n beforeIds.length === afterIds.length &&\n beforeIds.every((id, index) => id === afterIds[index])\n ) {\n return null;\n }\n return { from: beforeIds, to: afterIds };\n}\n\nfunction buildDocumentUpdateChangeKeys(kind: SalesDocumentKind, input: DocumentUpdateInput): string[] {\n const keys = new Set<string>();\n if (kind === \"order\") {\n if (input.orderNumber !== undefined) keys.add(\"orderNumber\");\n } else {\n if (input.quoteNumber !== undefined) keys.add(\"quoteNumber\");\n }\n if (input.statusEntryId !== undefined) {\n keys.add(\"statusEntryId\");\n keys.add(\"status\");\n }\n if (input.customerEntityId !== undefined) {\n keys.add(\"customerEntityId\");\n keys.add(\"customerContactId\");\n keys.add(\"customerSnapshot\");\n keys.add(\"billingAddressId\");\n keys.add(\"shippingAddressId\");\n keys.add(\"billingAddressSnapshot\");\n keys.add(\"shippingAddressSnapshot\");\n }\n if (input.customerContactId !== undefined) {\n keys.add(\"customerContactId\");\n keys.add(\"customerSnapshot\");\n }\n if (input.customerSnapshot !== undefined) keys.add(\"customerSnapshot\");\n if (input.metadata !== undefined) keys.add(\"metadata\");\n if (input.comment !== undefined) keys.add(\"comments\");\n if (input.currencyCode !== undefined) keys.add(\"currencyCode\");\n if (input.channelId !== undefined) keys.add(\"channelId\");\n if (kind === \"order\") {\n if (input.placedAt !== undefined) keys.add(\"placedAt\");\n if (input.expectedDeliveryAt !== undefined) keys.add(\"expectedDeliveryAt\");\n }\n if (\n input.shippingAddressId !== undefined ||\n input.shippingAddressSnapshot !== undefined\n ) {\n keys.add(\"shippingAddressId\");\n keys.add(\"shippingAddressSnapshot\");\n }\n if (\n input.billingAddressId !== undefined ||\n input.billingAddressSnapshot !== undefined\n ) {\n keys.add(\"billingAddressId\");\n keys.add(\"billingAddressSnapshot\");\n }\n if (\n input.shippingMethodId !== undefined ||\n input.shippingMethodCode !== undefined ||\n input.shippingMethodSnapshot !== undefined\n ) {\n keys.add(\"shippingMethodId\");\n keys.add(\"shippingMethodCode\");\n keys.add(\"shippingMethodSnapshot\");\n }\n if (\n input.paymentMethodId !== undefined ||\n input.paymentMethodCode !== undefined ||\n input.paymentMethodSnapshot !== undefined\n ) {\n keys.add(\"paymentMethodId\");\n keys.add(\"paymentMethodCode\");\n keys.add(\"paymentMethodSnapshot\");\n }\n if (input.customFieldSetId !== undefined) keys.add(\"customFieldSetId\");\n if (input.customFields !== undefined) keys.add(\"customFields\");\n return Array.from(keys);\n}\n\nasync function syncSalesDocumentTags(\n em: EntityManager,\n params: {\n documentId: string;\n kind: SalesDocumentKind;\n organizationId: string;\n tenantId: string;\n tagIds?: Array<string | null | undefined> | null;\n },\n) {\n if (params.tagIds === undefined) return;\n const tagIds = normalizeTagIds(params.tagIds);\n if (tagIds.length === 0) {\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: params.documentId,\n documentKind: params.kind,\n });\n return;\n }\n const tagsInScope = await em.find(SalesDocumentTag, {\n id: { $in: tagIds },\n organizationId: params.organizationId,\n tenantId: params.tenantId,\n });\n if (tagsInScope.length !== tagIds.length) {\n throw new CrudHttpError(400, {\n error: \"One or more tags not found for this scope\",\n });\n }\n const byId = new Map(tagsInScope.map((tag) => [tag.id, tag]));\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: params.documentId,\n documentKind: params.kind,\n });\n for (const tagId of tagIds) {\n const tag = byId.get(tagId);\n if (!tag) continue;\n const assignment = em.create(SalesDocumentTagAssignment, {\n organizationId: params.organizationId,\n tenantId: params.tenantId,\n documentId: params.documentId,\n documentKind: params.kind,\n tag,\n order:\n params.kind === \"order\"\n ? em.getReference(SalesOrder, params.documentId)\n : null,\n quote:\n params.kind === \"quote\"\n ? em.getReference(SalesQuote, params.documentId)\n : null,\n });\n em.persist(assignment);\n }\n}\n\nfunction applyQuoteSnapshot(\n quote: SalesQuote,\n snapshot: QuoteGraphSnapshot[\"quote\"],\n): void {\n quote.organizationId = snapshot.organizationId;\n quote.tenantId = snapshot.tenantId;\n quote.quoteNumber = snapshot.quoteNumber;\n quote.statusEntryId = snapshot.statusEntryId ?? null;\n quote.status = snapshot.status ?? null;\n quote.customerEntityId = snapshot.customerEntityId ?? null;\n quote.customerContactId = snapshot.customerContactId ?? null;\n quote.customerSnapshot = snapshot.customerSnapshot\n ? cloneJson(snapshot.customerSnapshot)\n : null;\n quote.billingAddressId = snapshot.billingAddressId ?? null;\n quote.shippingAddressId = snapshot.shippingAddressId ?? null;\n quote.billingAddressSnapshot = snapshot.billingAddressSnapshot\n ? cloneJson(snapshot.billingAddressSnapshot)\n : null;\n quote.shippingAddressSnapshot = snapshot.shippingAddressSnapshot\n ? cloneJson(snapshot.shippingAddressSnapshot)\n : null;\n quote.currencyCode = snapshot.currencyCode;\n quote.validFrom = snapshot.validFrom ? new Date(snapshot.validFrom) : null;\n quote.validUntil = snapshot.validUntil ? new Date(snapshot.validUntil) : null;\n quote.comments = snapshot.comments ?? null;\n quote.taxInfo = snapshot.taxInfo ? cloneJson(snapshot.taxInfo) : null;\n quote.shippingMethodId = snapshot.shippingMethodId ?? null;\n quote.shippingMethodCode = snapshot.shippingMethodCode ?? null;\n quote.deliveryWindowId = snapshot.deliveryWindowId ?? null;\n quote.deliveryWindowCode = snapshot.deliveryWindowCode ?? null;\n quote.paymentMethodId = snapshot.paymentMethodId ?? null;\n quote.paymentMethodCode = snapshot.paymentMethodCode ?? null;\n quote.shippingMethodSnapshot = snapshot.shippingMethodSnapshot\n ? cloneJson(snapshot.shippingMethodSnapshot)\n : null;\n quote.deliveryWindowSnapshot = snapshot.deliveryWindowSnapshot\n ? cloneJson(snapshot.deliveryWindowSnapshot)\n : null;\n quote.paymentMethodSnapshot = snapshot.paymentMethodSnapshot\n ? cloneJson(snapshot.paymentMethodSnapshot)\n : null;\n quote.metadata = snapshot.metadata ? cloneJson(snapshot.metadata) : null;\n quote.channelId = snapshot.channelId ?? null;\n quote.customFieldSetId = snapshot.customFieldSetId ?? null;\n quote.subtotalNetAmount = snapshot.subtotalNetAmount;\n quote.subtotalGrossAmount = snapshot.subtotalGrossAmount;\n quote.discountTotalAmount = snapshot.discountTotalAmount;\n quote.taxTotalAmount = snapshot.taxTotalAmount;\n quote.grandTotalNetAmount = snapshot.grandTotalNetAmount;\n quote.grandTotalGrossAmount = snapshot.grandTotalGrossAmount;\n quote.totalsSnapshot = snapshot.totalsSnapshot\n ? cloneJson(snapshot.totalsSnapshot)\n : null;\n quote.lineItemCount = snapshot.lineItemCount;\n}\n\nfunction applyOrderSnapshot(\n order: SalesOrder,\n snapshot: OrderGraphSnapshot[\"order\"],\n): void {\n order.organizationId = snapshot.organizationId;\n order.tenantId = snapshot.tenantId;\n order.orderNumber = snapshot.orderNumber;\n order.statusEntryId = snapshot.statusEntryId ?? null;\n order.status = snapshot.status ?? null;\n order.fulfillmentStatusEntryId = snapshot.fulfillmentStatusEntryId ?? null;\n order.fulfillmentStatus = snapshot.fulfillmentStatus ?? null;\n order.paymentStatusEntryId = snapshot.paymentStatusEntryId ?? null;\n order.paymentStatus = snapshot.paymentStatus ?? null;\n order.customerEntityId = snapshot.customerEntityId ?? null;\n order.customerContactId = snapshot.customerContactId ?? null;\n order.customerSnapshot = snapshot.customerSnapshot\n ? cloneJson(snapshot.customerSnapshot)\n : null;\n order.billingAddressId = snapshot.billingAddressId ?? null;\n order.shippingAddressId = snapshot.shippingAddressId ?? null;\n order.billingAddressSnapshot = snapshot.billingAddressSnapshot\n ? cloneJson(snapshot.billingAddressSnapshot)\n : null;\n order.shippingAddressSnapshot = snapshot.shippingAddressSnapshot\n ? cloneJson(snapshot.shippingAddressSnapshot)\n : null;\n order.currencyCode = snapshot.currencyCode;\n order.exchangeRate = snapshot.exchangeRate ?? null;\n order.taxStrategyKey = snapshot.taxStrategyKey ?? null;\n order.discountStrategyKey = snapshot.discountStrategyKey ?? null;\n order.taxInfo = snapshot.taxInfo ? cloneJson(snapshot.taxInfo) : null;\n order.shippingMethodId = snapshot.shippingMethodId ?? null;\n order.shippingMethodCode = snapshot.shippingMethodCode ?? null;\n order.deliveryWindowId = snapshot.deliveryWindowId ?? null;\n order.deliveryWindowCode = snapshot.deliveryWindowCode ?? null;\n order.paymentMethodId = snapshot.paymentMethodId ?? null;\n order.paymentMethodCode = snapshot.paymentMethodCode ?? null;\n order.channelId = snapshot.channelId ?? null;\n order.placedAt = snapshot.placedAt ? new Date(snapshot.placedAt) : null;\n order.expectedDeliveryAt = snapshot.expectedDeliveryAt\n ? new Date(snapshot.expectedDeliveryAt)\n : null;\n order.dueAt = snapshot.dueAt ? new Date(snapshot.dueAt) : null;\n order.comments = snapshot.comments ?? null;\n order.internalNotes = snapshot.internalNotes ?? null;\n order.shippingMethodSnapshot = snapshot.shippingMethodSnapshot\n ? cloneJson(snapshot.shippingMethodSnapshot)\n : null;\n order.deliveryWindowSnapshot = snapshot.deliveryWindowSnapshot\n ? cloneJson(snapshot.deliveryWindowSnapshot)\n : null;\n order.paymentMethodSnapshot = snapshot.paymentMethodSnapshot\n ? cloneJson(snapshot.paymentMethodSnapshot)\n : null;\n order.metadata = snapshot.metadata ? cloneJson(snapshot.metadata) : null;\n order.customFieldSetId = snapshot.customFieldSetId ?? null;\n order.subtotalNetAmount = snapshot.subtotalNetAmount;\n order.subtotalGrossAmount = snapshot.subtotalGrossAmount;\n order.discountTotalAmount = snapshot.discountTotalAmount;\n order.taxTotalAmount = snapshot.taxTotalAmount;\n order.shippingNetAmount = snapshot.shippingNetAmount;\n order.shippingGrossAmount = snapshot.shippingGrossAmount;\n order.surchargeTotalAmount = snapshot.surchargeTotalAmount;\n order.grandTotalNetAmount = snapshot.grandTotalNetAmount;\n order.grandTotalGrossAmount = snapshot.grandTotalGrossAmount;\n order.paidTotalAmount = snapshot.paidTotalAmount;\n order.refundedTotalAmount = snapshot.refundedTotalAmount;\n order.outstandingAmount = snapshot.outstandingAmount;\n order.totalsSnapshot = snapshot.totalsSnapshot\n ? cloneJson(snapshot.totalsSnapshot)\n : null;\n order.lineItemCount = snapshot.lineItemCount;\n}\n\nasync function restoreQuoteGraph(\n em: EntityManager,\n snapshot: QuoteGraphSnapshot,\n): Promise<SalesQuote> {\n let quote = await em.findOne(SalesQuote, { id: snapshot.quote.id });\n if (!quote) {\n quote = em.create(SalesQuote, {\n id: snapshot.quote.id,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n quoteNumber: snapshot.quote.quoteNumber,\n statusEntryId: snapshot.quote.statusEntryId ?? null,\n status: snapshot.quote.status ?? null,\n customerEntityId: snapshot.quote.customerEntityId ?? null,\n customerContactId: snapshot.quote.customerContactId ?? null,\n customerSnapshot: snapshot.quote.customerSnapshot\n ? cloneJson(snapshot.quote.customerSnapshot)\n : null,\n billingAddressId: snapshot.quote.billingAddressId ?? null,\n shippingAddressId: snapshot.quote.shippingAddressId ?? null,\n billingAddressSnapshot: snapshot.quote.billingAddressSnapshot\n ? cloneJson(snapshot.quote.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: snapshot.quote.shippingAddressSnapshot\n ? cloneJson(snapshot.quote.shippingAddressSnapshot)\n : null,\n currencyCode: snapshot.quote.currencyCode,\n validFrom: snapshot.quote.validFrom\n ? new Date(snapshot.quote.validFrom)\n : null,\n validUntil: snapshot.quote.validUntil\n ? new Date(snapshot.quote.validUntil)\n : null,\n comments: snapshot.quote.comments ?? null,\n taxInfo: snapshot.quote.taxInfo\n ? cloneJson(snapshot.quote.taxInfo)\n : null,\n shippingMethodId: snapshot.quote.shippingMethodId ?? null,\n shippingMethodCode: snapshot.quote.shippingMethodCode ?? null,\n deliveryWindowId: snapshot.quote.deliveryWindowId ?? null,\n deliveryWindowCode: snapshot.quote.deliveryWindowCode ?? null,\n paymentMethodId: snapshot.quote.paymentMethodId ?? null,\n paymentMethodCode: snapshot.quote.paymentMethodCode ?? null,\n shippingMethodSnapshot: snapshot.quote.shippingMethodSnapshot\n ? cloneJson(snapshot.quote.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: snapshot.quote.deliveryWindowSnapshot\n ? cloneJson(snapshot.quote.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: snapshot.quote.paymentMethodSnapshot\n ? cloneJson(snapshot.quote.paymentMethodSnapshot)\n : null,\n metadata: snapshot.quote.metadata\n ? cloneJson(snapshot.quote.metadata)\n : null,\n channelId: snapshot.quote.channelId ?? null,\n customFieldSetId: snapshot.quote.customFieldSetId ?? null,\n subtotalNetAmount: snapshot.quote.subtotalNetAmount,\n subtotalGrossAmount: snapshot.quote.subtotalGrossAmount,\n discountTotalAmount: snapshot.quote.discountTotalAmount,\n taxTotalAmount: snapshot.quote.taxTotalAmount,\n grandTotalNetAmount: snapshot.quote.grandTotalNetAmount,\n grandTotalGrossAmount: snapshot.quote.grandTotalGrossAmount,\n totalsSnapshot: snapshot.quote.totalsSnapshot\n ? cloneJson(snapshot.quote.totalsSnapshot)\n : null,\n lineItemCount: snapshot.quote.lineItemCount,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(quote);\n }\n applyQuoteSnapshot(quote, snapshot.quote);\n await em.flush();\n const existingLines = await em.find(\n SalesQuoteLine,\n { quote: quote.id },\n { fields: [\"id\"] },\n );\n const existingAdjustments = await em.find(\n SalesQuoteAdjustment,\n { quote: quote.id },\n { fields: [\"id\"] },\n );\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_quote,\n recordId: quote.id,\n });\n if (existingLines.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_quote_line,\n recordId: { $in: existingLines.map((line) => line.id) },\n });\n }\n if (existingAdjustments.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_quote_adjustment,\n recordId: { $in: existingAdjustments.map((adj) => adj.id) },\n });\n }\n const addressSnapshots = Array.isArray(snapshot.addresses)\n ? snapshot.addresses\n : [];\n const noteSnapshots = Array.isArray(snapshot.notes) ? snapshot.notes : [];\n const tagSnapshots = Array.isArray(snapshot.tags) ? snapshot.tags : [];\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"quote\",\n contextId: quote.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n await em.nativeDelete(SalesQuoteAdjustment, { quote: quote.id });\n existingLines.forEach((entry) => em.getUnitOfWork().unsetIdentity(entry));\n existingAdjustments.forEach((entry) =>\n em.getUnitOfWork().unsetIdentity(entry),\n );\n\n snapshot.lines.forEach((line) => {\n const lineEntity = em.create(SalesQuoteLine, {\n id: line.id,\n quote,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n lineNumber: line.lineNumber,\n kind: line.kind as SalesLineKind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n });\n\n snapshot.adjustments.forEach((adjustment, index) => {\n const adjustmentEntity = em.create(SalesQuoteAdjustment, {\n id: adjustment.id,\n quote,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n scope: adjustment.scope,\n kind: adjustment.kind as SalesAdjustmentKind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: adjustment.rate,\n amountNet: adjustment.amountNet,\n amountGross: adjustment.amountGross,\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? index,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n adjustmentEntity.quoteLine = null;\n em.persist(adjustmentEntity);\n });\n\n addressSnapshots.forEach((entry) => {\n const entity = em.create(SalesDocumentAddress, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: quote.id,\n documentKind: \"quote\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n quote,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n noteSnapshots.forEach((entry) => {\n const entity = em.create(SalesNote, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: \"quote\",\n contextId: quote.id,\n order: null,\n quote,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n tagSnapshots.forEach((entry) => {\n const tag = em.getReference(SalesDocumentTag, entry.tagId);\n const assignment = em.create(SalesDocumentTagAssignment, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: quote.id,\n documentKind: \"quote\",\n tag,\n quote,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(assignment);\n });\n\n if (snapshot.quote.customFields) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote,\n recordId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(snapshot.quote.customFields),\n });\n }\n for (const line of snapshot.lines) {\n if (!line.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_line,\n recordId: line.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(line.customFields),\n });\n }\n for (const adjustment of snapshot.adjustments) {\n if (!adjustment.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_adjustment,\n recordId: adjustment.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(adjustment.customFields),\n });\n }\n\n return quote;\n}\n\nasync function restoreOrderGraph(\n em: EntityManager,\n snapshot: OrderGraphSnapshot,\n): Promise<SalesOrder> {\n let order = await em.findOne(SalesOrder, { id: snapshot.order.id });\n if (!order) {\n order = em.create(SalesOrder, {\n id: snapshot.order.id,\n organizationId: snapshot.order.organizationId,\n tenantId: snapshot.order.tenantId,\n orderNumber: snapshot.order.orderNumber,\n statusEntryId: snapshot.order.statusEntryId ?? null,\n status: snapshot.order.status ?? null,\n fulfillmentStatusEntryId: snapshot.order.fulfillmentStatusEntryId ?? null,\n fulfillmentStatus: snapshot.order.fulfillmentStatus ?? null,\n paymentStatusEntryId: snapshot.order.paymentStatusEntryId ?? null,\n paymentStatus: snapshot.order.paymentStatus ?? null,\n customerEntityId: snapshot.order.customerEntityId ?? null,\n customerContactId: snapshot.order.customerContactId ?? null,\n customerSnapshot: snapshot.order.customerSnapshot\n ? cloneJson(snapshot.order.customerSnapshot)\n : null,\n billingAddressId: snapshot.order.billingAddressId ?? null,\n shippingAddressId: snapshot.order.shippingAddressId ?? null,\n billingAddressSnapshot: snapshot.order.billingAddressSnapshot\n ? cloneJson(snapshot.order.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: snapshot.order.shippingAddressSnapshot\n ? cloneJson(snapshot.order.shippingAddressSnapshot)\n : null,\n currencyCode: snapshot.order.currencyCode,\n exchangeRate: snapshot.order.exchangeRate ?? null,\n taxStrategyKey: snapshot.order.taxStrategyKey ?? null,\n discountStrategyKey: snapshot.order.discountStrategyKey ?? null,\n taxInfo: snapshot.order.taxInfo\n ? cloneJson(snapshot.order.taxInfo)\n : null,\n shippingMethodId: snapshot.order.shippingMethodId ?? null,\n shippingMethodCode: snapshot.order.shippingMethodCode ?? null,\n deliveryWindowId: snapshot.order.deliveryWindowId ?? null,\n deliveryWindowCode: snapshot.order.deliveryWindowCode ?? null,\n paymentMethodId: snapshot.order.paymentMethodId ?? null,\n paymentMethodCode: snapshot.order.paymentMethodCode ?? null,\n channelId: snapshot.order.channelId ?? null,\n placedAt: snapshot.order.placedAt\n ? new Date(snapshot.order.placedAt)\n : null,\n expectedDeliveryAt: snapshot.order.expectedDeliveryAt\n ? new Date(snapshot.order.expectedDeliveryAt)\n : null,\n dueAt: snapshot.order.dueAt ? new Date(snapshot.order.dueAt) : null,\n comments: snapshot.order.comments ?? null,\n internalNotes: snapshot.order.internalNotes ?? null,\n shippingMethodSnapshot: snapshot.order.shippingMethodSnapshot\n ? cloneJson(snapshot.order.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: snapshot.order.deliveryWindowSnapshot\n ? cloneJson(snapshot.order.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: snapshot.order.paymentMethodSnapshot\n ? cloneJson(snapshot.order.paymentMethodSnapshot)\n : null,\n metadata: snapshot.order.metadata\n ? cloneJson(snapshot.order.metadata)\n : null,\n customFieldSetId: snapshot.order.customFieldSetId ?? null,\n subtotalNetAmount: snapshot.order.subtotalNetAmount,\n subtotalGrossAmount: snapshot.order.subtotalGrossAmount,\n discountTotalAmount: snapshot.order.discountTotalAmount,\n taxTotalAmount: snapshot.order.taxTotalAmount,\n shippingNetAmount: snapshot.order.shippingNetAmount,\n shippingGrossAmount: snapshot.order.shippingGrossAmount,\n surchargeTotalAmount: snapshot.order.surchargeTotalAmount,\n grandTotalNetAmount: snapshot.order.grandTotalNetAmount,\n grandTotalGrossAmount: snapshot.order.grandTotalGrossAmount,\n paidTotalAmount: snapshot.order.paidTotalAmount,\n refundedTotalAmount: snapshot.order.refundedTotalAmount,\n outstandingAmount: snapshot.order.outstandingAmount,\n totalsSnapshot: snapshot.order.totalsSnapshot\n ? cloneJson(snapshot.order.totalsSnapshot)\n : null,\n lineItemCount: snapshot.order.lineItemCount,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(order);\n }\n applyOrderSnapshot(order, snapshot.order);\n await em.flush();\n const existingLines = await em.find(\n SalesOrderLine,\n { order: order.id },\n { fields: [\"id\"] },\n );\n const existingAdjustments = await em.find(\n SalesOrderAdjustment,\n { order: order.id },\n { fields: [\"id\"] },\n );\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order,\n recordId: order.id,\n });\n if (existingLines.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order_line,\n recordId: { $in: existingLines.map((line) => line.id) },\n });\n }\n if (existingAdjustments.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order_adjustment,\n recordId: { $in: existingAdjustments.map((adj) => adj.id) },\n });\n }\n const addressSnapshots = Array.isArray(snapshot.addresses)\n ? snapshot.addresses\n : [];\n const noteSnapshots = Array.isArray(snapshot.notes) ? snapshot.notes : [];\n const tagSnapshots = Array.isArray(snapshot.tags) ? snapshot.tags : [];\n const shipmentSnapshots = Array.isArray(snapshot.shipments)\n ? snapshot.shipments\n : [];\n const paymentSnapshots = Array.isArray(snapshot.payments)\n ? snapshot.payments\n : [];\n const existingShipments = await em.find(SalesShipment, { order: order.id });\n const shipmentIds = existingShipments.map((entry) => entry.id);\n if (shipmentIds.length) {\n await em.nativeDelete(SalesShipmentItem, {\n shipment: { $in: shipmentIds },\n });\n await em.nativeDelete(SalesShipment, { id: { $in: shipmentIds } });\n existingShipments.forEach((entry) =>\n em.getUnitOfWork().unsetIdentity(entry),\n );\n }\n await em.nativeDelete(SalesPaymentAllocation, { order: order.id });\n await em.nativeDelete(SalesPayment, { order: order.id });\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"order\",\n contextId: order.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesOrderAdjustment, { order: order.id });\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n existingLines.forEach((entry) => em.getUnitOfWork().unsetIdentity(entry));\n existingAdjustments.forEach((entry) =>\n em.getUnitOfWork().unsetIdentity(entry),\n );\n\n snapshot.lines.forEach((line) => {\n const lineEntity = em.create(SalesOrderLine, {\n id: line.id,\n order,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n lineNumber: line.lineNumber,\n kind: line.kind as SalesLineKind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n reservedQuantity: line.reservedQuantity,\n fulfilledQuantity: line.fulfilledQuantity,\n invoicedQuantity: line.invoicedQuantity,\n returnedQuantity: line.returnedQuantity,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n });\n\n snapshot.adjustments.forEach((adjustment, index) => {\n const adjustmentEntity = em.create(SalesOrderAdjustment, {\n id: adjustment.id,\n order,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n scope: adjustment.scope,\n kind: adjustment.kind as SalesAdjustmentKind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: adjustment.rate,\n amountNet: adjustment.amountNet,\n amountGross: adjustment.amountGross,\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? index,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n adjustmentEntity.orderLine = null;\n em.persist(adjustmentEntity);\n });\n\n addressSnapshots.forEach((entry) => {\n const entity = em.create(SalesDocumentAddress, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: order.id,\n documentKind: \"order\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n order,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n noteSnapshots.forEach((entry) => {\n const entity = em.create(SalesNote, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: \"order\",\n contextId: order.id,\n order,\n quote: null,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n tagSnapshots.forEach((entry) => {\n const tag = em.getReference(SalesDocumentTag, entry.tagId);\n const assignment = em.create(SalesDocumentTagAssignment, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: order.id,\n documentKind: \"order\",\n tag,\n order,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(assignment);\n });\n\n if (snapshot.order.customFields) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order,\n recordId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(snapshot.order.customFields),\n });\n }\n for (const line of snapshot.lines) {\n if (!line.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: line.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(line.customFields),\n });\n }\n for (const adjustment of snapshot.adjustments) {\n if (!adjustment.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_adjustment,\n recordId: adjustment.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(adjustment.customFields),\n });\n }\n\n for (const shipment of shipmentSnapshots) {\n await restoreShipmentSnapshot(em, shipment);\n }\n\n for (const payment of paymentSnapshots) {\n await restorePaymentSnapshot(em, payment);\n }\n\n return order;\n}\n\nconst createQuoteCommand: CommandHandler<\n QuoteCreateInput,\n { quoteId: string }\n> = {\n id: \"sales.quotes.create\",\n async execute(rawInput, ctx) {\n const generator = ctx.container.resolve(\n \"salesDocumentNumberGenerator\",\n ) as SalesDocumentNumberGenerator;\n const initial = quoteCreateSchema.parse(rawInput ?? {});\n const quoteNumber =\n typeof initial.quoteNumber === \"string\" &&\n initial.quoteNumber.trim().length\n ? initial.quoteNumber.trim()\n : (\n await generator.generate({\n kind: \"quote\",\n organizationId: initial.organizationId,\n tenantId: initial.tenantId,\n })\n ).number;\n const parsed = quoteCreateSchema.parse({ ...initial, quoteNumber });\n const ensuredQuoteNumber = parsed.quoteNumber ?? quoteNumber;\n if (!ensuredQuoteNumber) {\n throw new CrudHttpError(400, { error: \"Quote number is required.\" });\n }\n ensureQuoteScope(ctx, parsed.organizationId, parsed.tenantId);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const {\n customerSnapshot: resolvedCustomerSnapshot,\n billingAddressSnapshot: resolvedBillingSnapshot,\n shippingAddressSnapshot: resolvedShippingSnapshot,\n shippingMethod,\n deliveryWindow,\n paymentMethod,\n } = await resolveDocumentReferences(em, parsed);\n const quoteStatus = await resolveDictionaryEntryValue(\n em,\n parsed.statusEntryId ?? null,\n );\n const quoteId = randomUUID();\n const quote = em.create(SalesQuote, {\n id: quoteId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n quoteNumber: ensuredQuoteNumber,\n statusEntryId: parsed.statusEntryId ?? null,\n status: quoteStatus,\n customerEntityId: parsed.customerEntityId ?? null,\n customerContactId: parsed.customerContactId ?? null,\n customerSnapshot: resolvedCustomerSnapshot\n ? cloneJson(resolvedCustomerSnapshot)\n : null,\n billingAddressId: parsed.billingAddressId ?? null,\n shippingAddressId: parsed.shippingAddressId ?? null,\n billingAddressSnapshot: resolvedBillingSnapshot\n ? cloneJson(resolvedBillingSnapshot)\n : null,\n shippingAddressSnapshot: resolvedShippingSnapshot\n ? cloneJson(resolvedShippingSnapshot)\n : null,\n currencyCode: parsed.currencyCode,\n validFrom: parsed.validFrom ?? null,\n validUntil: parsed.validUntil ?? null,\n comments: parsed.comments ?? null,\n taxInfo: parsed.taxInfo ? cloneJson(parsed.taxInfo) : null,\n shippingMethodId: parsed.shippingMethodId ?? null,\n shippingMethod: shippingMethod ?? null,\n shippingMethodCode:\n parsed.shippingMethodCode ?? shippingMethod?.code ?? null,\n deliveryWindowId: parsed.deliveryWindowId ?? null,\n deliveryWindow: deliveryWindow ?? null,\n deliveryWindowCode:\n parsed.deliveryWindowCode ?? deliveryWindow?.code ?? null,\n paymentMethodId: parsed.paymentMethodId ?? null,\n paymentMethod: paymentMethod ?? null,\n paymentMethodCode:\n parsed.paymentMethodCode ?? paymentMethod?.code ?? null,\n shippingMethodSnapshot: parsed.shippingMethodSnapshot\n ? cloneJson(parsed.shippingMethodSnapshot)\n : shippingMethod\n ? {\n id: shippingMethod.id,\n code: shippingMethod.code,\n name: shippingMethod.name,\n description: shippingMethod.description ?? null,\n carrierCode: shippingMethod.carrierCode ?? null,\n providerKey: shippingMethod.providerKey ?? null,\n serviceLevel: shippingMethod.serviceLevel ?? null,\n estimatedTransitDays: shippingMethod.estimatedTransitDays ?? null,\n baseRateNet: shippingMethod.baseRateNet,\n baseRateGross: shippingMethod.baseRateGross,\n currencyCode: shippingMethod.currencyCode ?? null,\n metadata: shippingMethod.metadata\n ? cloneJson(shippingMethod.metadata)\n : null,\n providerSettings:\n shippingMethod.metadata &&\n typeof shippingMethod.metadata === \"object\"\n ? cloneJson(\n (shippingMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n deliveryWindowSnapshot: parsed.deliveryWindowSnapshot\n ? cloneJson(parsed.deliveryWindowSnapshot)\n : deliveryWindow\n ? {\n id: deliveryWindow.id,\n code: deliveryWindow.code,\n name: deliveryWindow.name,\n description: deliveryWindow.description ?? null,\n leadTimeDays: deliveryWindow.leadTimeDays ?? null,\n cutoffTime: deliveryWindow.cutoffTime ?? null,\n timezone: deliveryWindow.timezone ?? null,\n }\n : null,\n paymentMethodSnapshot: parsed.paymentMethodSnapshot\n ? cloneJson(parsed.paymentMethodSnapshot)\n : paymentMethod\n ? {\n id: paymentMethod.id,\n code: paymentMethod.code,\n name: paymentMethod.name,\n description: paymentMethod.description ?? null,\n providerKey: paymentMethod.providerKey ?? null,\n terms: paymentMethod.terms ?? null,\n metadata: paymentMethod.metadata\n ? cloneJson(paymentMethod.metadata)\n : null,\n providerSettings:\n paymentMethod.metadata &&\n typeof paymentMethod.metadata === \"object\"\n ? cloneJson(\n (paymentMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n metadata: parsed.metadata ? cloneJson(parsed.metadata) : null,\n channelId: parsed.channelId ?? null,\n customFieldSetId: parsed.customFieldSetId ?? null,\n subtotalNetAmount: \"0\",\n subtotalGrossAmount: \"0\",\n discountTotalAmount: \"0\",\n taxTotalAmount: \"0\",\n grandTotalNetAmount: \"0\",\n grandTotalGrossAmount: \"0\",\n lineItemCount: 0,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(quote);\n\n const lineInputs = (parsed.lines ?? []).map((line, index) =>\n quoteLineCreateSchema.parse({\n ...line,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n }),\n );\n const uomResolver = createUomResolver();\n const normalizedLineInputs = await Promise.all(\n lineInputs.map(async (line) => {\n const normalized = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n line,\n });\n return {\n ...line,\n quantity: normalized.quantity,\n quantityUnit: normalized.quantityUnit,\n normalizedQuantity: normalized.normalizedQuantity,\n normalizedUnit: normalized.normalizedUnit,\n uomSnapshot: normalized.uomSnapshot,\n };\n }),\n );\n const adjustmentInputs = parsed.adjustments\n ? parsed.adjustments.map((adj) =>\n quoteAdjustmentCreateSchema.parse({\n ...adj,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n quoteId: quote.id,\n }),\n )\n : null;\n\n const lineSnapshots: SalesLineSnapshot[] = normalizedLineInputs.map(\n (line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts: SalesAdjustmentDraft[] = adjustmentInputs\n ? adjustmentInputs.map((adj) => createAdjustmentDraftFromInput(adj))\n : [];\n\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: lineSnapshots,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n\n await replaceQuoteLines(em, quote, calculation, normalizedLineInputs);\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await syncSalesDocumentTags(em, {\n documentId: quote.id,\n kind: \"quote\",\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n tagIds: parsed.tags,\n });\n await em.flush();\n\n // Create notification for users with sales.quotes.manage feature\n try {\n const notificationService = resolveNotificationService(ctx.container);\n const typeDef = notificationTypes.find(\n (type) => type.type === \"sales.quote.created\",\n );\n if (typeDef) {\n const totalAmount =\n quote.grandTotalGrossAmount && quote.currencyCode\n ? `${quote.grandTotalGrossAmount} ${quote.currencyCode}`\n : \"\";\n const totalDisplay = totalAmount ? ` (${totalAmount})` : \"\";\n const notificationInput = buildFeatureNotificationFromType(typeDef, {\n requiredFeature: \"sales.quotes.manage\",\n bodyVariables: {\n quoteNumber: quote.quoteNumber,\n total: totalDisplay,\n totalAmount,\n },\n sourceEntityType: \"sales:quote\",\n sourceEntityId: quote.id,\n linkHref: `/backend/sales/quotes/${quote.id}`,\n });\n\n await notificationService.createForFeature(notificationInput, {\n tenantId: quote.tenantId,\n organizationId: quote.organizationId ?? null,\n });\n }\n } catch (err) {\n // Notification creation is non-critical, don't fail the command\n console.error(\n \"[sales.quotes.create] Failed to create notification:\",\n err,\n );\n }\n\n // Emit CRUD side effects to trigger workflow event listeners\n const dataEngine = ctx.container.resolve(\"dataEngine\") as DataEngine;\n await emitCrudSideEffects({\n dataEngine,\n action: \"created\",\n entity: quote,\n identifiers: {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n },\n events: quoteCrudEvents,\n indexer: { entityType: E.sales.sales_quote },\n });\n\n // Invalidate cache\n const resourceKind =\n deriveResourceFromCommandId(createQuoteCommand.id) ?? \"sales.quote\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"created\",\n );\n\n return { quoteId: quote.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.quotes.create\", \"Create sales quote\"),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotAfter: after,\n payload: {\n undo: {\n after,\n } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const after = payload?.after;\n if (!after) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, { id: after.quote.id });\n if (!quote) return;\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n await em.nativeDelete(SalesQuoteAdjustment, { quote: quote.id });\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n em.remove(quote);\n await em.flush();\n },\n};\n\nconst deleteQuoteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string }\n> = {\n id: \"sales.quotes.delete\",\n async prepare(input, ctx) {\n const id = requireId(input, \"Quote id is required\");\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, id);\n if (snapshot) {\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const id = requireId(input, \"Quote id is required\");\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, { id });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const [addresses, notes, tags, adjustments, lines] = await Promise.all([\n em.find(SalesDocumentAddress, {\n documentId: quote.id,\n documentKind: \"quote\",\n }),\n em.find(SalesNote, { contextType: \"quote\", contextId: quote.id }),\n em.find(SalesDocumentTagAssignment, {\n documentId: quote.id,\n documentKind: \"quote\",\n }),\n em.find(SalesQuoteAdjustment, { quote: quote.id }),\n em.find(SalesQuoteLine, { quote: quote.id }),\n ]);\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"quote\",\n contextId: quote.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesQuoteAdjustment, { quote: quote.id });\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n em.remove(quote);\n await em.flush();\n const dataEngine = ctx.container.resolve<DataEngine>(\"dataEngine\");\n await Promise.all([\n queueDeletionSideEffects(dataEngine, quote, E.sales.sales_quote),\n queueDeletionSideEffects(dataEngine, lines, E.sales.sales_quote_line),\n queueDeletionSideEffects(\n dataEngine,\n adjustments,\n E.sales.sales_quote_adjustment,\n ),\n queueDeletionSideEffects(\n dataEngine,\n addresses,\n E.sales.sales_document_address,\n ),\n queueDeletionSideEffects(dataEngine, notes, E.sales.sales_note),\n queueDeletionSideEffects(\n dataEngine,\n tags,\n E.sales.sales_document_tag_assignment,\n ),\n ]);\n return { quoteId: id };\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n if (!before) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.quotes.delete\", \"Delete sales quote\"),\n resourceKind: \"sales.quote\",\n resourceId: before.quote.id,\n tenantId: before.quote.tenantId,\n organizationId: before.quote.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst updateQuoteCommand: CommandHandler<\n DocumentUpdateInput,\n { quote: SalesQuote }\n> = {\n id: \"sales.quotes.update\",\n async prepare(input, ctx) {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, parsed.id);\n if (snapshot) {\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(rawInput, ctx) {\n const parsed = documentUpdateSchema.parse(rawInput ?? {});\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.id,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const shouldInvalidateSentToken = (quote.status ?? null) === \"sent\";\n if (shouldInvalidateSentToken) {\n quote.acceptanceToken = null;\n quote.sentAt = null;\n }\n const shouldRecalculateTotals =\n parsed.shippingMethodId !== undefined ||\n parsed.shippingMethodSnapshot !== undefined ||\n parsed.shippingMethodCode !== undefined ||\n parsed.paymentMethodId !== undefined ||\n parsed.paymentMethodSnapshot !== undefined ||\n parsed.paymentMethodCode !== undefined ||\n parsed.currencyCode !== undefined;\n await applyDocumentUpdate({\n kind: \"quote\",\n entity: quote,\n input: parsed,\n em,\n });\n await em.flush();\n if (shouldInvalidateSentToken) {\n quote.status = \"draft\";\n quote.statusEntryId = await resolveStatusEntryIdByValue(em, {\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n value: \"draft\",\n });\n }\n if (shouldRecalculateTotals) {\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = adjustments.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\n \"salesCalculationService\",\n );\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals(\n {\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n },\n );\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? quote.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n }\n quote.updatedAt = new Date();\n await em.flush();\n const resourceKind =\n deriveResourceFromCommandId(updateQuoteCommand.id) ?? \"sales.quote\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"updated\",\n );\n return { quote };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quote.id);\n },\n buildLog: async ({ input, snapshots, result }) => {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n const changes = before\n ? buildChanges(\n before.quote as unknown as Record<string, unknown>,\n after.quote as unknown as Record<string, unknown>,\n buildDocumentUpdateChangeKeys(\"quote\", parsed),\n )\n : {};\n if (parsed.tags !== undefined) {\n const tagChange = buildTagChange(before?.tags, after.tags);\n if (tagChange) changes.tags = tagChange;\n }\n return {\n actionLabel: translate(\"sales.audit.quotes.update\", \"Update sales quote\"),\n resourceKind: \"sales.quote\",\n resourceId: result.quote.id,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n changes: Object.keys(changes).length ? changes : null,\n payload: {\n undo: {\n before,\n after,\n } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst updateOrderCommand: CommandHandler<\n DocumentUpdateInput,\n { order: SalesOrder }\n> = {\n id: \"sales.orders.update\",\n async prepare(input, ctx) {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, parsed.id);\n if (snapshot) {\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(rawInput, ctx) {\n const parsed = documentUpdateSchema.parse(rawInput ?? {});\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.id,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n const previousStatus = normalizeStatusValue(order.status);\n let statusChangeNote: SalesNote | null = null;\n const shouldRecalculateTotals =\n parsed.shippingMethodId !== undefined ||\n parsed.shippingMethodSnapshot !== undefined ||\n parsed.shippingMethodCode !== undefined ||\n parsed.paymentMethodId !== undefined ||\n parsed.paymentMethodSnapshot !== undefined ||\n parsed.paymentMethodCode !== undefined ||\n parsed.currencyCode !== undefined;\n await applyDocumentUpdate({\n kind: \"order\",\n entity: order,\n input: parsed,\n em,\n });\n await em.flush();\n if (shouldRecalculateTotals) {\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = adjustments.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\n \"salesCalculationService\",\n );\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals(\n {\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n },\n );\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? order.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n }\n statusChangeNote = await appendOrderStatusChangeNote({\n em,\n order,\n previousStatus,\n auth: ctx.auth ?? null,\n });\n order.updatedAt = new Date();\n await em.flush();\n if (statusChangeNote) {\n const dataEngine = ctx.container.resolve(\"dataEngine\");\n await emitCrudSideEffects({\n dataEngine,\n action: \"created\",\n entity: statusChangeNote,\n identifiers: {\n id: statusChangeNote.id,\n organizationId: statusChangeNote.organizationId,\n tenantId: statusChangeNote.tenantId,\n },\n indexer: { entityType: E.sales.sales_note },\n });\n }\n const resourceKind =\n deriveResourceFromCommandId(updateOrderCommand.id) ?? \"sales.order\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"updated\",\n );\n return { order };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.order.id);\n },\n buildLog: async ({ input, snapshots, result }) => {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n const changes = before\n ? buildChanges(\n before.order as unknown as Record<string, unknown>,\n after.order as unknown as Record<string, unknown>,\n buildDocumentUpdateChangeKeys(\"order\", parsed),\n )\n : {};\n if (parsed.tags !== undefined) {\n const tagChange = buildTagChange(before?.tags, after.tags);\n if (tagChange) changes.tags = tagChange;\n }\n return {\n actionLabel: translate(\"sales.audit.orders.update\", \"Update sales order\"),\n resourceKind: \"sales.order\",\n resourceId: result.order.id,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n changes: Object.keys(changes).length ? changes : null,\n payload: {\n undo: {\n before,\n after,\n } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst createOrderCommand: CommandHandler<\n OrderCreateInput,\n { orderId: string }\n> = {\n id: \"sales.orders.create\",\n async execute(rawInput, ctx) {\n const generator = ctx.container.resolve(\n \"salesDocumentNumberGenerator\",\n ) as SalesDocumentNumberGenerator;\n const initial = orderCreateSchema.parse(rawInput ?? {});\n const orderNumber =\n typeof initial.orderNumber === \"string\" &&\n initial.orderNumber.trim().length\n ? initial.orderNumber.trim()\n : (\n await generator.generate({\n kind: \"order\",\n organizationId: initial.organizationId,\n tenantId: initial.tenantId,\n })\n ).number;\n const parsed = orderCreateSchema.parse({ ...initial, orderNumber });\n const ensuredOrderNumber = parsed.orderNumber ?? orderNumber;\n if (!ensuredOrderNumber) {\n throw new CrudHttpError(400, { error: \"Order number is required.\" });\n }\n ensureOrderScope(ctx, parsed.organizationId, parsed.tenantId);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const [status, fulfillmentStatus, paymentStatus] = await Promise.all([\n resolveDictionaryEntryValue(em, parsed.statusEntryId ?? null),\n resolveDictionaryEntryValue(em, parsed.fulfillmentStatusEntryId ?? null),\n resolveDictionaryEntryValue(em, parsed.paymentStatusEntryId ?? null),\n ]);\n const {\n customerSnapshot: resolvedCustomerSnapshot,\n billingAddressSnapshot: resolvedBillingSnapshot,\n shippingAddressSnapshot: resolvedShippingSnapshot,\n shippingMethod,\n deliveryWindow,\n paymentMethod,\n } = await resolveDocumentReferences(em, parsed);\n\n const orderId = randomUUID()\n const order = em.create(SalesOrder, {\n id: orderId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n orderNumber: ensuredOrderNumber,\n externalReference: parsed.externalReference ?? null,\n customerReference: parsed.customerReference ?? null,\n statusEntryId: parsed.statusEntryId ?? null,\n status,\n fulfillmentStatusEntryId: parsed.fulfillmentStatusEntryId ?? null,\n fulfillmentStatus,\n paymentStatusEntryId: parsed.paymentStatusEntryId ?? null,\n paymentStatus,\n customerEntityId: parsed.customerEntityId ?? null,\n customerContactId: parsed.customerContactId ?? null,\n customerSnapshot: resolvedCustomerSnapshot\n ? cloneJson(resolvedCustomerSnapshot)\n : null,\n billingAddressId: parsed.billingAddressId ?? null,\n shippingAddressId: parsed.shippingAddressId ?? null,\n billingAddressSnapshot: resolvedBillingSnapshot\n ? cloneJson(resolvedBillingSnapshot)\n : null,\n shippingAddressSnapshot: resolvedShippingSnapshot\n ? cloneJson(resolvedShippingSnapshot)\n : null,\n currencyCode: parsed.currencyCode,\n exchangeRate:\n typeof parsed.exchangeRate === \"number\"\n ? toNumericString(parsed.exchangeRate)\n : null,\n taxStrategyKey: parsed.taxStrategyKey ?? null,\n discountStrategyKey: parsed.discountStrategyKey ?? null,\n taxInfo: parsed.taxInfo ? cloneJson(parsed.taxInfo) : null,\n shippingMethodId: parsed.shippingMethodId ?? null,\n shippingMethod: shippingMethod ?? null,\n shippingMethodCode:\n parsed.shippingMethodCode ?? shippingMethod?.code ?? null,\n deliveryWindowId: parsed.deliveryWindowId ?? null,\n deliveryWindow: deliveryWindow ?? null,\n deliveryWindowCode:\n parsed.deliveryWindowCode ?? deliveryWindow?.code ?? null,\n paymentMethodId: parsed.paymentMethodId ?? null,\n paymentMethod: paymentMethod ?? null,\n paymentMethodCode:\n parsed.paymentMethodCode ?? paymentMethod?.code ?? null,\n channelId: parsed.channelId ?? null,\n placedAt: parsed.placedAt ?? null,\n expectedDeliveryAt: parsed.expectedDeliveryAt ?? null,\n dueAt: parsed.dueAt ?? null,\n comments: parsed.comments ?? null,\n internalNotes: parsed.internalNotes ?? null,\n shippingMethodSnapshot: parsed.shippingMethodSnapshot\n ? cloneJson(parsed.shippingMethodSnapshot)\n : shippingMethod\n ? {\n id: shippingMethod.id,\n code: shippingMethod.code,\n name: shippingMethod.name,\n description: shippingMethod.description ?? null,\n carrierCode: shippingMethod.carrierCode ?? null,\n providerKey: shippingMethod.providerKey ?? null,\n serviceLevel: shippingMethod.serviceLevel ?? null,\n estimatedTransitDays: shippingMethod.estimatedTransitDays ?? null,\n baseRateNet: shippingMethod.baseRateNet,\n baseRateGross: shippingMethod.baseRateGross,\n currencyCode: shippingMethod.currencyCode ?? null,\n metadata: shippingMethod.metadata\n ? cloneJson(shippingMethod.metadata)\n : null,\n providerSettings:\n shippingMethod.metadata &&\n typeof shippingMethod.metadata === \"object\"\n ? cloneJson(\n (shippingMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n deliveryWindowSnapshot: parsed.deliveryWindowSnapshot\n ? cloneJson(parsed.deliveryWindowSnapshot)\n : deliveryWindow\n ? {\n id: deliveryWindow.id,\n code: deliveryWindow.code,\n name: deliveryWindow.name,\n description: deliveryWindow.description ?? null,\n leadTimeDays: deliveryWindow.leadTimeDays ?? null,\n cutoffTime: deliveryWindow.cutoffTime ?? null,\n timezone: deliveryWindow.timezone ?? null,\n }\n : null,\n paymentMethodSnapshot: parsed.paymentMethodSnapshot\n ? cloneJson(parsed.paymentMethodSnapshot)\n : paymentMethod\n ? {\n id: paymentMethod.id,\n code: paymentMethod.code,\n name: paymentMethod.name,\n description: paymentMethod.description ?? null,\n providerKey: paymentMethod.providerKey ?? null,\n terms: paymentMethod.terms ?? null,\n metadata: paymentMethod.metadata\n ? cloneJson(paymentMethod.metadata)\n : null,\n providerSettings:\n paymentMethod.metadata &&\n typeof paymentMethod.metadata === \"object\"\n ? cloneJson(\n (paymentMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n metadata: parsed.metadata ? cloneJson(parsed.metadata) : null,\n customFieldSetId: parsed.customFieldSetId ?? null,\n subtotalNetAmount: \"0\",\n subtotalGrossAmount: \"0\",\n discountTotalAmount: \"0\",\n taxTotalAmount: \"0\",\n shippingNetAmount: \"0\",\n shippingGrossAmount: \"0\",\n surchargeTotalAmount: \"0\",\n grandTotalNetAmount: \"0\",\n grandTotalGrossAmount: \"0\",\n paidTotalAmount: \"0\",\n refundedTotalAmount: \"0\",\n outstandingAmount: \"0\",\n lineItemCount: 0,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(order);\n\n const lineInputs = (parsed.lines ?? []).map((line, index) =>\n orderLineCreateSchema.parse({\n ...line,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n }),\n );\n const uomResolver = createUomResolver();\n const normalizedLineInputs = await Promise.all(\n lineInputs.map(async (line) => {\n const normalized = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n line,\n });\n return {\n ...line,\n quantity: normalized.quantity,\n quantityUnit: normalized.quantityUnit,\n normalizedQuantity: normalized.normalizedQuantity,\n normalizedUnit: normalized.normalizedUnit,\n uomSnapshot: normalized.uomSnapshot,\n };\n }),\n );\n const adjustmentInputs = parsed.adjustments\n ? parsed.adjustments.map((adj) =>\n orderAdjustmentCreateSchema.parse({\n ...adj,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n orderId: order.id,\n }),\n )\n : null;\n\n const lineSnapshots: SalesLineSnapshot[] = normalizedLineInputs.map(\n (line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts: SalesAdjustmentDraft[] = adjustmentInputs\n ? adjustmentInputs.map((adj) => createAdjustmentDraftFromInput(adj))\n : [];\n\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: lineSnapshots,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n\n await replaceOrderLines(em, order, calculation, normalizedLineInputs);\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await syncSalesDocumentTags(em, {\n documentId: order.id,\n kind: \"order\",\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n tagIds: parsed.tags,\n });\n await em.flush();\n\n // Create notification for users with sales.orders.manage feature\n try {\n const notificationService = resolveNotificationService(ctx.container);\n const typeDef = notificationTypes.find(\n (type) => type.type === \"sales.order.created\",\n );\n if (typeDef) {\n const totalAmount =\n order.grandTotalGrossAmount && order.currencyCode\n ? `${order.grandTotalGrossAmount} ${order.currencyCode}`\n : \"\";\n const totalDisplay = totalAmount ? ` (${totalAmount})` : \"\";\n const notificationInput = buildFeatureNotificationFromType(typeDef, {\n requiredFeature: \"sales.orders.manage\",\n bodyVariables: {\n orderNumber: order.orderNumber,\n total: totalDisplay,\n totalAmount,\n },\n sourceEntityType: \"sales:order\",\n sourceEntityId: order.id,\n linkHref: `/backend/sales/orders/${order.id}`,\n });\n\n await notificationService.createForFeature(notificationInput, {\n tenantId: order.tenantId,\n organizationId: order.organizationId ?? null,\n });\n }\n } catch (err) {\n // Notification creation is non-critical, don't fail the command\n console.error(\n \"[sales.orders.create] Failed to create notification:\",\n err,\n );\n }\n\n // Emit CRUD side effects to trigger workflow event listeners\n const dataEngine = ctx.container.resolve(\"dataEngine\") as DataEngine;\n await emitCrudSideEffects({\n dataEngine,\n action: \"created\",\n entity: order,\n identifiers: {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n },\n events: orderCrudEvents,\n indexer: { entityType: E.sales.sales_order },\n });\n\n // Invalidate cache\n const resourceKind =\n deriveResourceFromCommandId(createOrderCommand.id) ?? \"sales.order\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"created\",\n );\n\n return { orderId: order.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.orders.create\", \"Create sales order\"),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotAfter: after,\n payload: {\n undo: {\n after,\n } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const after = payload?.after;\n if (!after) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, { id: after.order.id });\n if (!order) return;\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n await em.nativeDelete(SalesOrderAdjustment, { order: order.id });\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n em.remove(order);\n await em.flush();\n },\n};\n\nconst deleteOrderCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string }\n> = {\n id: \"sales.orders.delete\",\n async prepare(input, ctx) {\n const id = requireId(input, \"Order id is required\");\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, id);\n if (snapshot) {\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const id = requireId(input, \"Order id is required\");\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, { id });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n const shipments = await em.find(SalesShipment, { order: order.id });\n const shipmentIds = shipments.map((entry) => entry.id);\n const [\n shipmentItems,\n payments,\n paymentAllocations,\n addresses,\n notes,\n tags,\n adjustments,\n lines,\n ] = await Promise.all([\n shipmentIds.length\n ? em.find(SalesShipmentItem, { shipment: { $in: shipmentIds } })\n : Promise.resolve([]),\n em.find(SalesPayment, { order: order.id }),\n em.find(SalesPaymentAllocation, { order: order.id }),\n em.find(SalesDocumentAddress, {\n documentId: order.id,\n documentKind: \"order\",\n }),\n em.find(SalesNote, { contextType: \"order\", contextId: order.id }),\n em.find(SalesDocumentTagAssignment, {\n documentId: order.id,\n documentKind: \"order\",\n }),\n em.find(SalesOrderAdjustment, { order: order.id }),\n em.find(SalesOrderLine, { order: order.id }),\n ]);\n if (shipmentIds.length) {\n await em.nativeDelete(SalesShipmentItem, {\n shipment: { $in: shipmentIds },\n });\n await em.nativeDelete(SalesShipment, { id: { $in: shipmentIds } });\n }\n await em.nativeDelete(SalesPaymentAllocation, { order: order.id });\n await em.nativeDelete(SalesPayment, { order: order.id });\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"order\",\n contextId: order.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesOrderAdjustment, { order: order.id });\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n em.remove(order);\n await em.flush();\n const dataEngine = ctx.container.resolve<DataEngine>(\"dataEngine\");\n await Promise.all([\n queueDeletionSideEffects(dataEngine, order, E.sales.sales_order),\n queueDeletionSideEffects(dataEngine, lines, E.sales.sales_order_line),\n queueDeletionSideEffects(\n dataEngine,\n adjustments,\n E.sales.sales_order_adjustment,\n ),\n queueDeletionSideEffects(dataEngine, shipments, E.sales.sales_shipment),\n queueDeletionSideEffects(\n dataEngine,\n shipmentItems,\n E.sales.sales_shipment_item,\n ),\n queueDeletionSideEffects(dataEngine, payments, E.sales.sales_payment),\n queueDeletionSideEffects(\n dataEngine,\n paymentAllocations,\n E.sales.sales_payment_allocation,\n ),\n queueDeletionSideEffects(\n dataEngine,\n addresses,\n E.sales.sales_document_address,\n ),\n queueDeletionSideEffects(dataEngine, notes, E.sales.sales_note),\n queueDeletionSideEffects(\n dataEngine,\n tags,\n E.sales.sales_document_tag_assignment,\n ),\n ]);\n return { orderId: id };\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n if (!before) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.orders.delete\", \"Delete sales order\"),\n resourceKind: \"sales.order\",\n resourceId: before.order.id,\n tenantId: before.order.tenantId,\n organizationId: before.order.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteConvertToOrderSchema = z.object({\n quoteId: z.string().uuid(),\n orderId: z.string().uuid().optional(),\n orderNumber: z.string().trim().max(191).optional(),\n});\n\nconst convertQuoteToOrderCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string }\n> = {\n id: \"sales.quotes.convert_to_order\",\n async prepare(input, ctx) {\n const parsed = quoteConvertToOrderSchema.safeParse(input ?? {});\n const quoteId = parsed.success\n ? parsed.data.quoteId\n : typeof (input as any)?.quoteId === \"string\"\n ? (input as any).quoteId\n : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(rawInput, ctx) {\n const payload = quoteConvertToOrderSchema.parse(rawInput ?? {});\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: payload.quoteId,\n deletedAt: null,\n });\n const { translate } = await resolveTranslations();\n if (!quote)\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const snapshot = await loadQuoteSnapshot(em, payload.quoteId);\n if (!snapshot)\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n const orderId = payload.orderId ?? quote.id;\n const existingOrder = await em.findOne(SalesOrder, {\n id: orderId,\n deletedAt: null,\n });\n if (existingOrder) {\n throw new CrudHttpError(409, {\n error: translate(\n \"sales.documents.detail.convertExists\",\n \"Order already exists for this quote.\",\n ),\n });\n }\n\n const generator = ctx.container.resolve(\n \"salesDocumentNumberGenerator\",\n ) as SalesDocumentNumberGenerator;\n const generatedNumber =\n snapshot.quote.quoteNumber && snapshot.quote.quoteNumber.trim().length\n ? snapshot.quote.quoteNumber\n : (\n await generator.generate({\n kind: \"order\",\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n })\n ).number;\n const orderNumber =\n typeof payload.orderNumber === \"string\" &&\n payload.orderNumber.trim().length\n ? payload.orderNumber.trim()\n : generatedNumber;\n\n const [quoteCustomFields, quoteLineCustomFields] = await Promise.all([\n loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote,\n recordIds: [snapshot.quote.id],\n tenantIdByRecord: { [snapshot.quote.id]: snapshot.quote.tenantId },\n organizationIdByRecord: {\n [snapshot.quote.id]: snapshot.quote.organizationId,\n },\n }),\n snapshot.lines.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote_line,\n recordIds: snapshot.lines.map((line) => line.id),\n tenantIdByRecord: Object.fromEntries(\n snapshot.lines.map((line) => [line.id, snapshot.quote.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n snapshot.lines.map((line) => [\n line.id,\n snapshot.quote.organizationId,\n ]),\n ),\n })\n : Promise.resolve({}),\n ]);\n\n const order = em.create(SalesOrder, {\n id: orderId,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n orderNumber,\n statusEntryId: snapshot.quote.statusEntryId ?? null,\n status: snapshot.quote.status ?? null,\n fulfillmentStatusEntryId: null,\n fulfillmentStatus: null,\n paymentStatusEntryId: null,\n paymentStatus: null,\n customerEntityId: snapshot.quote.customerEntityId ?? null,\n customerContactId: snapshot.quote.customerContactId ?? null,\n customerSnapshot: snapshot.quote.customerSnapshot\n ? cloneJson(snapshot.quote.customerSnapshot)\n : null,\n billingAddressId: snapshot.quote.billingAddressId ?? null,\n shippingAddressId: snapshot.quote.shippingAddressId ?? null,\n billingAddressSnapshot: snapshot.quote.billingAddressSnapshot\n ? cloneJson(snapshot.quote.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: snapshot.quote.shippingAddressSnapshot\n ? cloneJson(snapshot.quote.shippingAddressSnapshot)\n : null,\n currencyCode: snapshot.quote.currencyCode,\n exchangeRate: null,\n taxStrategyKey: null,\n discountStrategyKey: null,\n taxInfo: snapshot.quote.taxInfo\n ? cloneJson(snapshot.quote.taxInfo)\n : null,\n shippingMethodId: snapshot.quote.shippingMethodId ?? null,\n shippingMethodCode: snapshot.quote.shippingMethodCode ?? null,\n deliveryWindowId: snapshot.quote.deliveryWindowId ?? null,\n deliveryWindowCode: snapshot.quote.deliveryWindowCode ?? null,\n paymentMethodId: snapshot.quote.paymentMethodId ?? null,\n paymentMethodCode: snapshot.quote.paymentMethodCode ?? null,\n channelId: snapshot.quote.channelId ?? null,\n placedAt: snapshot.quote.validFrom\n ? new Date(snapshot.quote.validFrom)\n : quote.createdAt,\n expectedDeliveryAt: snapshot.quote.validUntil\n ? new Date(snapshot.quote.validUntil)\n : null,\n dueAt: null,\n comments: snapshot.quote.comments ?? null,\n internalNotes: null,\n shippingMethodSnapshot: snapshot.quote.shippingMethodSnapshot\n ? cloneJson(snapshot.quote.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: snapshot.quote.deliveryWindowSnapshot\n ? cloneJson(snapshot.quote.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: snapshot.quote.paymentMethodSnapshot\n ? cloneJson(snapshot.quote.paymentMethodSnapshot)\n : null,\n metadata: snapshot.quote.metadata\n ? cloneJson(snapshot.quote.metadata)\n : null,\n customFieldSetId: snapshot.quote.customFieldSetId ?? null,\n subtotalNetAmount: snapshot.quote.subtotalNetAmount,\n subtotalGrossAmount: snapshot.quote.subtotalGrossAmount,\n discountTotalAmount: snapshot.quote.discountTotalAmount,\n taxTotalAmount: snapshot.quote.taxTotalAmount,\n shippingNetAmount: \"0\",\n shippingGrossAmount: \"0\",\n surchargeTotalAmount: \"0\",\n grandTotalNetAmount: snapshot.quote.grandTotalNetAmount,\n grandTotalGrossAmount: snapshot.quote.grandTotalGrossAmount,\n paidTotalAmount: \"0\",\n refundedTotalAmount: \"0\",\n outstandingAmount: snapshot.quote.grandTotalGrossAmount,\n totalsSnapshot: snapshot.quote.totalsSnapshot\n ? cloneJson(snapshot.quote.totalsSnapshot)\n : null,\n lineItemCount: snapshot.quote.lineItemCount,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(order);\n\n const orderLineMap = new Map<string, SalesOrderLine>();\n snapshot.lines.forEach((line, index) => {\n const orderLine = em.create(SalesOrderLine, {\n id: line.id,\n order,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n lineNumber: line.lineNumber ?? index + 1,\n kind: line.kind as SalesLineKind,\n statusEntryId: (line as any).statusEntryId ?? null,\n status: (line as any).status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n reservedQuantity: \"0\",\n fulfilledQuantity: \"0\",\n invoicedQuantity: \"0\",\n returnedQuantity: \"0\",\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration\n ? cloneJson(line.configuration)\n : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(orderLine);\n orderLineMap.set(orderLine.id, orderLine);\n });\n\n snapshot.adjustments.forEach((adj, index) => {\n const orderLineId = adj.quoteLineId ?? null;\n const orderLine = orderLineId\n ? (orderLineMap.get(orderLineId) ?? null)\n : null;\n const entity = em.create(SalesOrderAdjustment, {\n id: adj.id,\n order,\n orderLine: orderLine ?? null,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n scope: adj.scope,\n kind: adj.kind as SalesAdjustmentKind,\n code: adj.code ?? null,\n label: adj.label ?? null,\n calculatorKey: adj.calculatorKey ?? null,\n promotionId: adj.promotionId ?? null,\n rate: adj.rate,\n amountNet: adj.amountNet,\n amountGross: adj.amountGross,\n currencyCode: adj.currencyCode ?? null,\n metadata: adj.metadata ? cloneJson(adj.metadata) : null,\n position: adj.position ?? index,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n const [addresses, notes, tags] = await Promise.all([\n em.find(SalesDocumentAddress, {\n documentId: snapshot.quote.id,\n documentKind: \"quote\",\n }),\n em.find(SalesNote, {\n contextType: \"quote\",\n contextId: snapshot.quote.id,\n }),\n em.find(SalesDocumentTagAssignment, {\n documentId: snapshot.quote.id,\n documentKind: \"quote\",\n }),\n ]);\n addresses.forEach((entry) => {\n entry.documentKind = \"order\";\n entry.documentId = order.id;\n entry.order = order;\n entry.quote = null;\n entry.updatedAt = new Date();\n });\n notes.forEach((note) => {\n note.contextType = \"order\";\n note.contextId = order.id;\n note.order = order;\n note.quote = null;\n note.updatedAt = new Date();\n });\n tags.forEach((assignment) => {\n assignment.documentKind = \"order\";\n assignment.documentId = order.id;\n assignment.order = order;\n assignment.quote = null;\n assignment.updatedAt = new Date();\n });\n\n const documentCustomValues = quoteCustomFields[snapshot.quote.id];\n if (documentCustomValues && Object.keys(documentCustomValues).length) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order,\n recordId: order.id,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n values: documentCustomValues,\n });\n }\n const lineCustomEntries = quoteLineCustomFields as Record<\n string,\n Record<string, unknown>\n >;\n if (lineCustomEntries && Object.keys(lineCustomEntries).length) {\n for (const [lineId, values] of Object.entries(lineCustomEntries)) {\n if (!values || !Object.keys(values).length) continue;\n if (!orderLineMap.has(lineId)) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: lineId,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n values,\n });\n }\n }\n\n await em.nativeDelete(SalesQuoteAdjustment, { quote: snapshot.quote.id });\n await em.nativeDelete(SalesQuoteLine, { quote: snapshot.quote.id });\n em.remove(quote);\n await em.flush();\n\n return { orderId: order.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!before) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.convert\",\n \"Convert quote to order\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: before.quote.tenantId,\n organizationId: before.quote.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: {\n quote: before,\n order: after ?? null,\n } satisfies QuoteConvertUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteConvertUndoPayload>(logEntry);\n const quoteSnapshot = payload?.quote;\n const orderSnapshot = payload?.order;\n if (!quoteSnapshot) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(\n ctx,\n quoteSnapshot.quote.organizationId,\n quoteSnapshot.quote.tenantId,\n );\n if (orderSnapshot) {\n const orderId = orderSnapshot.order.id;\n const orderLineIds = orderSnapshot.lines.map((line) => line.id);\n const existingOrder = await em.findOne(SalesOrder, { id: orderId });\n if (existingOrder) {\n const shipments = await em.find(SalesShipment, { order: orderId });\n const shipmentIds = shipments.map((entry) => entry.id);\n if (shipmentIds.length) {\n await em.nativeDelete(SalesShipmentItem, {\n shipment: { $in: shipmentIds },\n });\n await em.nativeDelete(SalesShipment, { id: { $in: shipmentIds } });\n }\n await em.nativeDelete(SalesPaymentAllocation, { order: orderId });\n await em.nativeDelete(SalesPayment, { order: orderId });\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: orderId,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: orderId,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesOrderAdjustment, { order: orderId });\n await em.nativeDelete(SalesOrderLine, { order: orderId });\n em.remove(existingOrder);\n }\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order,\n recordId: orderId,\n });\n if (orderLineIds.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order_line,\n recordId: { $in: orderLineIds } as any,\n });\n }\n }\n const noteIds = quoteSnapshot.notes.map((note) => note.id);\n if (noteIds.length) {\n await em.nativeDelete(SalesNote, { id: { $in: noteIds } });\n }\n await restoreQuoteGraph(em, quoteSnapshot);\n await em.flush();\n },\n};\n\nconst orderLineUpsertSchema = orderLineCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst orderLineDeleteSchema = z.object({\n id: z.string().uuid(),\n orderId: z.string().uuid(),\n});\n\nconst quoteLineUpsertSchema = quoteLineCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst quoteLineDeleteSchema = z.object({\n id: z.string().uuid(),\n quoteId: z.string().uuid(),\n});\n\nconst orderAdjustmentUpsertSchema = orderAdjustmentCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst orderAdjustmentDeleteSchema = z.object({\n id: z.string().uuid(),\n orderId: z.string().uuid(),\n});\n\nconst quoteAdjustmentUpsertSchema = quoteAdjustmentCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst quoteAdjustmentDeleteSchema = z.object({\n id: z.string().uuid(),\n quoteId: z.string().uuid(),\n});\n\nconst orderLineUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; lineId: string }\n> = {\n id: \"sales.orders.lines.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const rawBody = (input?.body as Record<string, unknown> | undefined) ?? {};\n const parsed = orderLineUpsertSchema.parse(rawBody);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const existingSnapshot = parsed.id\n ? (lineSnapshots.find((line) => line.id === parsed.id) ?? null)\n : null;\n const priceMode =\n parsed.priceMode === \"gross\"\n ? \"gross\"\n : parsed.priceMode === \"net\"\n ? \"net\"\n : null;\n let unitPriceNet =\n parsed.unitPriceNet ?? existingSnapshot?.unitPriceNet ?? null;\n let unitPriceGross =\n parsed.unitPriceGross ?? existingSnapshot?.unitPriceGross ?? null;\n let taxRate = parsed.taxRate ?? existingSnapshot?.taxRate ?? null;\n if (priceMode && (unitPriceNet === null || unitPriceGross === null)) {\n let taxService: TaxCalculationService | null = null;\n try {\n taxService = ctx.container.resolve(\n \"taxCalculationService\",\n ) as TaxCalculationService;\n } catch {\n taxService = null;\n }\n if (taxService) {\n const taxResult = await taxService.calculateUnitAmounts({\n amount:\n priceMode === \"gross\"\n ? (unitPriceGross ?? unitPriceNet ?? 0)\n : (unitPriceNet ?? unitPriceGross ?? 0),\n mode: priceMode,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n taxRateId: parsed.taxRateId ?? undefined,\n taxRate: taxRate ?? undefined,\n });\n unitPriceNet = unitPriceNet ?? taxResult.netAmount;\n unitPriceGross = unitPriceGross ?? taxResult.grossAmount;\n taxRate = taxResult.taxRate ?? taxRate;\n }\n }\n\n const metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? { ...parsed.metadata }\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : {};\n if (parsed.priceId) metadata.priceId = parsed.priceId;\n if (priceMode) metadata.priceMode = priceMode;\n\n const statusEntryId =\n parsed.statusEntryId ?? (existingSnapshot as any)?.statusEntryId ?? null;\n const lineId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n const lineUomInput = {\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n quantity: parsed.quantity ?? existingSnapshot?.quantity ?? 0,\n quantityUnit: parsed.quantityUnit ?? existingSnapshot?.quantityUnit ?? null,\n normalizedQuantity: existingSnapshot?.normalizedQuantity ?? null,\n normalizedUnit: existingSnapshot?.normalizedUnit ?? null,\n uomSnapshot: existingSnapshot?.uomSnapshot ?? null,\n };\n const uomResolver = createUomResolver();\n let normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n const convertedPrices = convertLineUnitPricesOnUnitChange({\n existingSnapshot,\n nextQuantityUnit: normalizedUom.quantityUnit,\n nextUomSnapshot: normalizedUom.uomSnapshot,\n unitPriceNet,\n unitPriceGross,\n });\n if (convertedPrices.didConvert) {\n unitPriceNet = convertedPrices.unitPriceNet;\n unitPriceGross = convertedPrices.unitPriceGross;\n normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n }\n const updatedSnapshot: SalesLineSnapshot & {\n statusEntryId?: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n promotionSnapshot?: Record<string, unknown> | null;\n } = {\n id: lineId,\n lineNumber:\n parsed.lineNumber ??\n existingSnapshot?.lineNumber ??\n lineSnapshots.length + 1,\n kind: parsed.kind ?? existingSnapshot?.kind ?? \"product\",\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n name: parsed.name ?? existingSnapshot?.name ?? null,\n description: parsed.description ?? existingSnapshot?.description ?? null,\n comment: parsed.comment ?? existingSnapshot?.comment ?? null,\n quantity: normalizedUom.quantity,\n quantityUnit: normalizedUom.quantityUnit,\n normalizedQuantity: normalizedUom.normalizedQuantity,\n normalizedUnit: normalizedUom.normalizedUnit,\n uomSnapshot: normalizedUom.uomSnapshot\n ? cloneJson(normalizedUom.uomSnapshot)\n : null,\n currencyCode:\n parsed.currencyCode ??\n existingSnapshot?.currencyCode ??\n order.currencyCode,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n discountAmount:\n parsed.discountAmount ?? existingSnapshot?.discountAmount ?? 0,\n discountPercent:\n parsed.discountPercent ?? existingSnapshot?.discountPercent ?? 0,\n taxRate: taxRate ?? 0,\n taxAmount: parsed.taxAmount ?? existingSnapshot?.taxAmount ?? null,\n totalNetAmount:\n parsed.totalNetAmount ?? existingSnapshot?.totalNetAmount ?? null,\n totalGrossAmount:\n parsed.totalGrossAmount ?? existingSnapshot?.totalGrossAmount ?? null,\n configuration:\n parsed.configuration ?? existingSnapshot?.configuration ?? null,\n promotionCode:\n parsed.promotionCode ?? existingSnapshot?.promotionCode ?? null,\n metadata,\n customFieldSetId:\n parsed.customFieldSetId ?? existingSnapshot?.customFieldSetId ?? null,\n customFields:\n parsed.customFields && typeof parsed.customFields === \"object\"\n ? cloneJson(parsed.customFields)\n : ((existingSnapshot as any)?.customFields ?? null),\n };\n (updatedSnapshot as any).statusEntryId = statusEntryId;\n (updatedSnapshot as any).catalogSnapshot =\n parsed.catalogSnapshot ??\n (existingSnapshot as any)?.catalogSnapshot ??\n null;\n (updatedSnapshot as any).promotionSnapshot =\n parsed.promotionSnapshot ??\n (existingSnapshot as any)?.promotionSnapshot ??\n null;\n\n let nextLines = parsed.id\n ? lineSnapshots.map((line) =>\n line.id === parsed.id ? updatedSnapshot : line,\n )\n : [...lineSnapshots, updatedSnapshot];\n nextLines = nextLines\n .sort((a, b) => (a.lineNumber ?? 0) - (b.lineNumber ?? 0))\n .map((line, index) => ({ ...line, lineNumber: index + 1 }));\n\n const sourceInputs = nextLines.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines: SalesLineSnapshot[] = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n await applyOrderLineResults({\n em,\n order,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, lineId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.lines.upsert\",\n \"Upsert order line\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst orderLineDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; lineId: string }\n> = {\n id: \"sales.orders.lines.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const { translate } = await resolveTranslations();\n const parsed = orderLineDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n const shipmentCount = await em.count(SalesShipmentItem, {\n orderLine: parsed.id,\n shipment: { deletedAt: null },\n });\n if (shipmentCount > 0) {\n throw new CrudHttpError(409, {\n error: translate(\n \"sales.documents.items.errorDeleteShipped\",\n \"Cannot delete a line that has shipped items.\",\n ),\n });\n }\n const existingLines = await em.find(\n SalesOrderLine,\n { order },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n );\n const filtered = existingLines.filter((line) => line.id !== parsed.id);\n if (filtered.length === existingLines.length) {\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n }\n const sourceInputs = filtered.map((line, index) => ({\n ...mapOrderLineEntityToSnapshot(line),\n statusEntryId: line.statusEntryId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: index + 1,\n }));\n const calcLines = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n await applyOrderLineResults({\n em,\n order,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, lineId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.lines.delete\",\n \"Delete order line\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteLineUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; lineId: string }\n> = {\n id: \"sales.quotes.lines.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const rawBody = (input?.body as Record<string, unknown> | undefined) ?? {};\n const parsed = quoteLineUpsertSchema.parse(rawBody);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const existingSnapshot = parsed.id\n ? (lineSnapshots.find((line) => line.id === parsed.id) ?? null)\n : null;\n const priceMode =\n parsed.priceMode === \"gross\"\n ? \"gross\"\n : parsed.priceMode === \"net\"\n ? \"net\"\n : null;\n let unitPriceNet =\n parsed.unitPriceNet ?? existingSnapshot?.unitPriceNet ?? null;\n let unitPriceGross =\n parsed.unitPriceGross ?? existingSnapshot?.unitPriceGross ?? null;\n let taxRate = parsed.taxRate ?? existingSnapshot?.taxRate ?? null;\n if (priceMode && (unitPriceNet === null || unitPriceGross === null)) {\n let taxService: TaxCalculationService | null = null;\n try {\n taxService = ctx.container.resolve(\n \"taxCalculationService\",\n ) as TaxCalculationService;\n } catch {\n taxService = null;\n }\n if (taxService) {\n const taxResult = await taxService.calculateUnitAmounts({\n amount:\n priceMode === \"gross\"\n ? (unitPriceGross ?? unitPriceNet ?? 0)\n : (unitPriceNet ?? unitPriceGross ?? 0),\n mode: priceMode,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n taxRateId: parsed.taxRateId ?? undefined,\n taxRate: taxRate ?? undefined,\n });\n unitPriceNet = unitPriceNet ?? taxResult.netAmount;\n unitPriceGross = unitPriceGross ?? taxResult.grossAmount;\n taxRate = taxResult.taxRate ?? taxRate;\n }\n }\n const metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? { ...parsed.metadata }\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : {};\n if (parsed.priceId) metadata.priceId = parsed.priceId;\n if (priceMode) metadata.priceMode = priceMode;\n\n const statusEntryId =\n parsed.statusEntryId ?? (existingSnapshot as any)?.statusEntryId ?? null;\n const lineId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n const lineUomInput = {\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n quantity: parsed.quantity ?? existingSnapshot?.quantity ?? 0,\n quantityUnit: parsed.quantityUnit ?? existingSnapshot?.quantityUnit ?? null,\n normalizedQuantity: existingSnapshot?.normalizedQuantity ?? null,\n normalizedUnit: existingSnapshot?.normalizedUnit ?? null,\n uomSnapshot: existingSnapshot?.uomSnapshot ?? null,\n };\n const uomResolver = createUomResolver();\n let normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n const convertedPrices = convertLineUnitPricesOnUnitChange({\n existingSnapshot,\n nextQuantityUnit: normalizedUom.quantityUnit,\n nextUomSnapshot: normalizedUom.uomSnapshot,\n unitPriceNet,\n unitPriceGross,\n });\n if (convertedPrices.didConvert) {\n unitPriceNet = convertedPrices.unitPriceNet;\n unitPriceGross = convertedPrices.unitPriceGross;\n normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n }\n const updatedSnapshot: SalesLineSnapshot & {\n statusEntryId?: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n promotionSnapshot?: Record<string, unknown> | null;\n } = {\n id: lineId,\n lineNumber:\n parsed.lineNumber ??\n existingSnapshot?.lineNumber ??\n lineSnapshots.length + 1,\n kind: parsed.kind ?? existingSnapshot?.kind ?? \"product\",\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n name: parsed.name ?? existingSnapshot?.name ?? null,\n description: parsed.description ?? existingSnapshot?.description ?? null,\n comment: parsed.comment ?? existingSnapshot?.comment ?? null,\n quantity: normalizedUom.quantity,\n quantityUnit: normalizedUom.quantityUnit,\n normalizedQuantity: normalizedUom.normalizedQuantity,\n normalizedUnit: normalizedUom.normalizedUnit,\n uomSnapshot: normalizedUom.uomSnapshot\n ? cloneJson(normalizedUom.uomSnapshot)\n : null,\n currencyCode:\n parsed.currencyCode ??\n existingSnapshot?.currencyCode ??\n quote.currencyCode,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n discountAmount:\n parsed.discountAmount ?? existingSnapshot?.discountAmount ?? 0,\n discountPercent:\n parsed.discountPercent ?? existingSnapshot?.discountPercent ?? 0,\n taxRate: taxRate ?? 0,\n taxAmount: parsed.taxAmount ?? existingSnapshot?.taxAmount ?? null,\n totalNetAmount:\n parsed.totalNetAmount ?? existingSnapshot?.totalNetAmount ?? null,\n totalGrossAmount:\n parsed.totalGrossAmount ?? existingSnapshot?.totalGrossAmount ?? null,\n configuration:\n parsed.configuration ?? existingSnapshot?.configuration ?? null,\n promotionCode:\n parsed.promotionCode ?? existingSnapshot?.promotionCode ?? null,\n metadata,\n customFieldSetId:\n parsed.customFieldSetId ?? existingSnapshot?.customFieldSetId ?? null,\n customFields:\n parsed.customFields && typeof parsed.customFields === \"object\"\n ? cloneJson(parsed.customFields)\n : ((existingSnapshot as any)?.customFields ?? null),\n };\n (updatedSnapshot as any).statusEntryId = statusEntryId;\n (updatedSnapshot as any).catalogSnapshot =\n parsed.catalogSnapshot ??\n (existingSnapshot as any)?.catalogSnapshot ??\n null;\n (updatedSnapshot as any).promotionSnapshot =\n parsed.promotionSnapshot ??\n (existingSnapshot as any)?.promotionSnapshot ??\n null;\n\n let nextLines = parsed.id\n ? lineSnapshots.map((line) =>\n line.id === parsed.id ? updatedSnapshot : line,\n )\n : [...lineSnapshots, updatedSnapshot];\n nextLines = nextLines\n .sort((a, b) => (a.lineNumber ?? 0) - (b.lineNumber ?? 0))\n .map((line, index) => ({ ...line, lineNumber: index + 1 }));\n\n const sourceInputs = nextLines.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines: SalesLineSnapshot[] = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n await applyQuoteLineResults({\n em,\n quote,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, lineId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.lines.upsert\",\n \"Upsert quote line\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteLineDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; lineId: string }\n> = {\n id: \"sales.quotes.lines.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = quoteLineDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const existingLines = await em.find(\n SalesQuoteLine,\n { quote },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n );\n const filtered = existingLines.filter((line) => line.id !== parsed.id);\n if (filtered.length === existingLines.length) {\n throw new CrudHttpError(404, { error: \"Quote line not found\" });\n }\n const sourceInputs = filtered.map((line, index) => ({\n ...mapQuoteLineEntityToSnapshot(line),\n statusEntryId: line.statusEntryId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: index + 1,\n }));\n const calcLines = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n await applyQuoteLineResults({\n em,\n quote,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, lineId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.lines.delete\",\n \"Delete quote line\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst orderAdjustmentUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; adjustmentId: string }\n> = {\n id: \"sales.orders.adjustments.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = orderAdjustmentUpsertSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n if (parsed.scope === \"line\") {\n throw new CrudHttpError(400, {\n error: \"Line-scoped adjustments are not supported yet.\",\n });\n }\n\n const [existingLines, existingAdjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const adjustmentDrafts = existingAdjustments.map(mapOrderAdjustmentToDraft);\n const existingSnapshot = parsed.id\n ? (adjustmentDrafts.find((adj) => adj.id === parsed.id) ?? null)\n : null;\n const adjustmentId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n let metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? cloneJson(parsed.metadata)\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : null;\n const calculatorKey =\n parsed.calculatorKey ?? existingSnapshot?.calculatorKey ?? null;\n if (\n parsed.id &&\n calculatorKey &&\n (calculatorKey.startsWith(\"shipping-provider:\") ||\n calculatorKey.startsWith(\"payment-provider:\"))\n ) {\n metadata = { ...(metadata ?? {}), manualOverride: true };\n }\n let nextAdjustments = parsed.id\n ? adjustmentDrafts.map((adj) =>\n adj.id === parsed.id\n ? {\n ...adj,\n id: adjustmentId,\n scope: parsed.scope ?? adj.scope ?? \"order\",\n kind: parsed.kind ?? adj.kind ?? \"custom\",\n code: parsed.code ?? adj.code ?? null,\n label: parsed.label ?? adj.label ?? null,\n calculatorKey:\n parsed.calculatorKey ?? adj.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? adj.promotionId ?? null,\n rate: parsed.rate ?? adj.rate ?? null,\n amountNet: parsed.amountNet ?? adj.amountNet ?? null,\n amountGross: parsed.amountGross ?? adj.amountGross ?? null,\n currencyCode:\n parsed.currencyCode ?? adj.currencyCode ?? order.currencyCode,\n metadata,\n customFields:\n parsed.customFields !== undefined\n ? parsed.customFields\n : ((adj as any).customFields ?? null),\n position:\n parsed.position ?? adj.position ?? adjustmentDrafts.length,\n }\n : adj,\n )\n : [\n ...adjustmentDrafts,\n {\n id: adjustmentId,\n scope: parsed.scope ?? \"order\",\n kind: parsed.kind ?? \"custom\",\n code: parsed.code ?? null,\n label: parsed.label ?? null,\n calculatorKey: parsed.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? null,\n rate: parsed.rate ?? null,\n amountNet: parsed.amountNet ?? null,\n amountGross: parsed.amountGross ?? null,\n currencyCode: parsed.currencyCode ?? order.currencyCode,\n metadata,\n customFields: parsed.customFields ?? null,\n position: parsed.position ?? adjustmentDrafts.length,\n },\n ];\n\n nextAdjustments = nextAdjustments\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((adj, index) => ({ ...adj, position: adj.position ?? index }));\n\n const sourceLines = lineSnapshots.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines = sourceLines.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: nextAdjustments,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n const adjustmentInputs = nextAdjustments.map((adj, index) => ({\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? order.currencyCode,\n metadata: adj.metadata ?? undefined,\n customFields: (adj as any).customFields ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n order.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, adjustmentId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.adjustments.upsert\",\n \"Upsert order adjustment\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst orderAdjustmentDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; adjustmentId: string }\n> = {\n id: \"sales.orders.adjustments.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = orderAdjustmentDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const filtered = adjustments.filter((adj) => adj.id !== parsed.id);\n if (filtered.length === adjustments.length) {\n throw new CrudHttpError(404, { error: \"Adjustment not found\" });\n }\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = filtered.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? order.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n order.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, adjustmentId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.adjustments.delete\",\n \"Delete order adjustment\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteAdjustmentUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; adjustmentId: string }\n> = {\n id: \"sales.quotes.adjustments.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = quoteAdjustmentUpsertSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n if (parsed.scope === \"line\") {\n throw new CrudHttpError(400, {\n error: \"Line-scoped adjustments are not supported yet.\",\n });\n }\n\n const [existingLines, existingAdjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const adjustmentDrafts = existingAdjustments.map(mapQuoteAdjustmentToDraft);\n const existingSnapshot = parsed.id\n ? (adjustmentDrafts.find((adj) => adj.id === parsed.id) ?? null)\n : null;\n const adjustmentId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n let metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? cloneJson(parsed.metadata)\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : null;\n const calculatorKey =\n parsed.calculatorKey ?? existingSnapshot?.calculatorKey ?? null;\n if (\n parsed.id &&\n calculatorKey &&\n (calculatorKey.startsWith(\"shipping-provider:\") ||\n calculatorKey.startsWith(\"payment-provider:\"))\n ) {\n metadata = { ...(metadata ?? {}), manualOverride: true };\n }\n let nextAdjustments = parsed.id\n ? adjustmentDrafts.map((adj) =>\n adj.id === parsed.id\n ? {\n ...adj,\n id: adjustmentId,\n scope: parsed.scope ?? adj.scope ?? \"order\",\n kind: parsed.kind ?? adj.kind ?? \"custom\",\n code: parsed.code ?? adj.code ?? null,\n label: parsed.label ?? adj.label ?? null,\n calculatorKey:\n parsed.calculatorKey ?? adj.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? adj.promotionId ?? null,\n rate: parsed.rate ?? adj.rate ?? null,\n amountNet: parsed.amountNet ?? adj.amountNet ?? null,\n amountGross: parsed.amountGross ?? adj.amountGross ?? null,\n currencyCode:\n parsed.currencyCode ?? adj.currencyCode ?? quote.currencyCode,\n metadata,\n customFields:\n parsed.customFields !== undefined\n ? parsed.customFields\n : ((adj as any).customFields ?? null),\n position:\n parsed.position ?? adj.position ?? adjustmentDrafts.length,\n }\n : adj,\n )\n : [\n ...adjustmentDrafts,\n {\n id: adjustmentId,\n scope: parsed.scope ?? \"order\",\n kind: parsed.kind ?? \"custom\",\n code: parsed.code ?? null,\n label: parsed.label ?? null,\n calculatorKey: parsed.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? null,\n rate: parsed.rate ?? null,\n amountNet: parsed.amountNet ?? null,\n amountGross: parsed.amountGross ?? null,\n currencyCode: parsed.currencyCode ?? quote.currencyCode,\n metadata,\n customFields: parsed.customFields ?? null,\n position: parsed.position ?? adjustmentDrafts.length,\n },\n ];\n\n nextAdjustments = nextAdjustments\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((adj, index) => ({ ...adj, position: adj.position ?? index }));\n\n const sourceLines = lineSnapshots.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines = sourceLines.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: nextAdjustments,\n context: calculationContext,\n });\n const adjustmentInputs = nextAdjustments.map((adj, index) => ({\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? quote.currencyCode,\n metadata: adj.metadata ?? undefined,\n customFields: (adj as any).customFields ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n quote.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, adjustmentId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.adjustments.upsert\",\n \"Upsert quote adjustment\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteAdjustmentDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; adjustmentId: string }\n> = {\n id: \"sales.quotes.adjustments.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = quoteAdjustmentDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const filtered = adjustments.filter((adj) => adj.id !== parsed.id);\n if (filtered.length === adjustments.length) {\n throw new CrudHttpError(404, { error: \"Adjustment not found\" });\n }\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = filtered.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? quote.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n quote.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, adjustmentId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.adjustments.delete\",\n \"Delete quote adjustment\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nregisterCommand(updateQuoteCommand);\nregisterCommand(createQuoteCommand);\nregisterCommand(deleteQuoteCommand);\nregisterCommand(convertQuoteToOrderCommand);\nregisterCommand(updateOrderCommand);\nregisterCommand(createOrderCommand);\nregisterCommand(deleteOrderCommand);\nregisterCommand(orderLineUpsertCommand);\nregisterCommand(orderLineDeleteCommand);\nregisterCommand(quoteLineUpsertCommand);\nregisterCommand(quoteLineDeleteCommand);\nregisterCommand(orderAdjustmentUpsertCommand);\nregisterCommand(orderAdjustmentDeleteCommand);\nregisterCommand(quoteAdjustmentUpsertCommand);\nregisterCommand(quoteAdjustmentDeleteCommand);\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// @ts-nocheck\n\nimport { randomUUID } from \"crypto\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"@open-mercato/shared/lib/commands\";\nimport type { CommandHandler } from \"@open-mercato/shared/lib/commands\";\nimport {\n buildChanges,\n emitCrudSideEffects,\n requireId,\n type CrudEventsConfig,\n} from \"@open-mercato/shared/lib/commands/helpers\";\nimport type { EntityManager } from \"@mikro-orm/postgresql\";\nimport type { EventBus } from \"@open-mercato/events\";\nimport type { DataEngine } from \"@open-mercato/shared/lib/data/engine\";\nimport { CrudHttpError } from \"@open-mercato/shared/lib/crud/errors\";\nimport {\n deriveResourceFromCommandId,\n invalidateCrudCache,\n} from \"@open-mercato/shared/lib/crud/cache\";\nimport { resolveTranslations } from \"@open-mercato/shared/lib/i18n/server\";\nimport { resolveNotificationService } from \"../../notifications/lib/notificationService\";\nimport { buildFeatureNotificationFromType } from \"../../notifications/lib/notificationBuilder\";\nimport { setRecordCustomFields } from \"@open-mercato/core/modules/entities/lib/helpers\";\nimport { loadCustomFieldValues } from \"@open-mercato/shared/lib/crud/custom-fields\";\nimport { normalizeCustomFieldValues } from \"@open-mercato/shared/lib/custom-fields/normalize\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport { findWithDecryption, findOneWithDecryption } from \"@open-mercato/shared/lib/encryption/find\";\nimport {\n SalesQuote,\n SalesQuoteLine,\n SalesQuoteAdjustment,\n SalesOrder,\n SalesOrderLine,\n SalesOrderAdjustment,\n SalesShipment,\n SalesShipmentItem,\n SalesPayment,\n SalesPaymentAllocation,\n SalesDocumentAddress,\n SalesNote,\n SalesChannel,\n SalesShippingMethod,\n SalesDeliveryWindow,\n SalesPaymentMethod,\n SalesDocumentTag,\n SalesDocumentTagAssignment,\n type SalesLineKind,\n type SalesAdjustmentKind,\n type SalesSettings,\n} from \"../data/entities\";\nimport {\n CatalogProduct,\n CatalogProductUnitConversion,\n} from \"../../catalog/data/entities\";\nimport { Dictionary, DictionaryEntry } from \"../../dictionaries/data/entities\";\nimport { CustomFieldValue } from \"@open-mercato/core/modules/entities/data/entities\";\nimport {\n CustomerAddress,\n CustomerEntity,\n CustomerPersonProfile,\n} from \"../../customers/data/entities\";\nimport {\n quoteCreateSchema,\n quoteLineCreateSchema,\n quoteAdjustmentCreateSchema,\n orderCreateSchema,\n orderLineCreateSchema,\n orderAdjustmentCreateSchema,\n type QuoteCreateInput,\n type QuoteLineCreateInput,\n type QuoteAdjustmentCreateInput,\n type OrderCreateInput,\n type OrderLineCreateInput,\n type OrderAdjustmentCreateInput,\n} from \"../data/validators\";\nimport {\n ensureOrganizationScope,\n ensureTenantScope,\n extractUndoPayload,\n toNumericString,\n} from \"./shared\";\nimport {\n loadShipmentSnapshot,\n restoreShipmentSnapshot,\n type ShipmentSnapshot,\n} from \"./shipments\";\nimport {\n loadPaymentSnapshot,\n restorePaymentSnapshot,\n type PaymentSnapshot,\n} from \"./payments\";\nimport type { SalesCalculationService } from \"../services/salesCalculationService\";\nimport type { TaxCalculationService } from \"../services/taxCalculationService\";\nimport type {\n PaymentMethodContext,\n ShippingMethodContext,\n} from \"../lib/providers\";\nimport {\n type SalesLineSnapshot,\n type SalesLineUomSnapshot,\n type SalesAdjustmentDraft,\n type SalesLineCalculationResult,\n type SalesDocumentCalculationResult,\n} from \"../lib/types\";\nimport { resolveDictionaryEntryValue } from \"../lib/dictionaries\";\nimport { resolveStatusEntryIdByValue } from \"../lib/statusHelpers\";\nimport { SalesDocumentNumberGenerator } from \"../services/salesDocumentNumberGenerator\";\nimport { loadSalesSettings } from \"./settings\";\nimport { notificationTypes } from \"../notifications\";\nimport {\n REFERENCE_UNIT_CODES,\n canonicalizeUnitCode,\n toUnitLookupKey,\n} from \"@open-mercato/shared/lib/units/unitCodes\";\nimport type { AuthContext } from \"@open-mercato/shared/lib/auth/server\";\nimport type { TranslateWithFallbackFn } from \"@open-mercato/shared/lib/i18n/translate\";\n\n// CRUD events configuration for workflow triggers\nconst orderCrudEvents: CrudEventsConfig<SalesOrder> = {\n module: \"sales\",\n entity: \"order\",\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n};\n\nconst quoteCrudEvents: CrudEventsConfig<SalesQuote> = {\n module: \"sales\",\n entity: \"quote\",\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n};\n\ntype DocumentAddressSnapshot = {\n id: string;\n organizationId: string;\n tenantId: string;\n documentId: string;\n documentKind: \"order\" | \"quote\";\n customerAddressId: string | null;\n name: string | null;\n purpose: string | null;\n companyName: string | null;\n addressLine1: string;\n addressLine2: string | null;\n city: string | null;\n region: string | null;\n postalCode: string | null;\n country: string | null;\n buildingNumber: string | null;\n flatNumber: string | null;\n latitude: number | null;\n longitude: number | null;\n};\n\ntype NoteSnapshot = {\n id: string;\n organizationId: string;\n tenantId: string;\n contextType: \"order\" | \"quote\";\n contextId: string;\n orderId: string | null;\n quoteId: string | null;\n body: string;\n authorUserId: string | null;\n appearanceIcon: string | null;\n appearanceColor: string | null;\n};\n\ntype TagAssignmentSnapshot = {\n id: string;\n tagId: string;\n organizationId: string;\n tenantId: string;\n documentId: string;\n documentKind: \"order\" | \"quote\";\n};\n\ntype QuoteGraphSnapshot = {\n quote: {\n id: string;\n organizationId: string;\n tenantId: string;\n quoteNumber: string;\n statusEntryId: string | null;\n status: string | null;\n customerEntityId: string | null;\n customerContactId: string | null;\n customerSnapshot: Record<string, unknown> | null;\n billingAddressId: string | null;\n shippingAddressId: string | null;\n billingAddressSnapshot: Record<string, unknown> | null;\n shippingAddressSnapshot: Record<string, unknown> | null;\n currencyCode: string;\n validFrom: string | null;\n validUntil: string | null;\n comments: string | null;\n taxInfo: Record<string, unknown> | null;\n shippingMethodId: string | null;\n shippingMethodCode: string | null;\n deliveryWindowId: string | null;\n deliveryWindowCode: string | null;\n paymentMethodId: string | null;\n paymentMethodCode: string | null;\n channelId: string | null;\n shippingMethodSnapshot: Record<string, unknown> | null;\n deliveryWindowSnapshot: Record<string, unknown> | null;\n paymentMethodSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n subtotalNetAmount: string;\n subtotalGrossAmount: string;\n discountTotalAmount: string;\n taxTotalAmount: string;\n grandTotalNetAmount: string;\n grandTotalGrossAmount: string;\n totalsSnapshot: Record<string, unknown> | null;\n lineItemCount: number;\n };\n lines: QuoteLineSnapshot[];\n adjustments: QuoteAdjustmentSnapshot[];\n addresses: DocumentAddressSnapshot[];\n notes: NoteSnapshot[];\n tags: TagAssignmentSnapshot[];\n};\n\ntype QuoteLineSnapshot = {\n id: string;\n lineNumber: number;\n kind: string;\n statusEntryId: string | null;\n status: string | null;\n productId: string | null;\n productVariantId: string | null;\n catalogSnapshot: Record<string, unknown> | null;\n name: string | null;\n description: string | null;\n comment: string | null;\n quantity: string;\n quantityUnit: string | null;\n normalizedQuantity: string;\n normalizedUnit: string | null;\n uomSnapshot: SalesLineUomSnapshot | null;\n currencyCode: string;\n unitPriceNet: string;\n unitPriceGross: string;\n discountAmount: string;\n discountPercent: string;\n taxRate: string;\n taxAmount: string;\n totalNetAmount: string;\n totalGrossAmount: string;\n configuration: Record<string, unknown> | null;\n promotionCode: string | null;\n promotionSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype QuoteAdjustmentSnapshot = {\n id: string;\n scope: \"order\" | \"line\";\n kind: string;\n code: string | null;\n label: string | null;\n calculatorKey: string | null;\n promotionId: string | null;\n rate: string;\n amountNet: string;\n amountGross: string;\n currencyCode: string | null;\n metadata: Record<string, unknown> | null;\n position: number;\n quoteLineId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype OrderGraphSnapshot = {\n order: {\n id: string;\n organizationId: string;\n tenantId: string;\n orderNumber: string;\n statusEntryId: string | null;\n status: string | null;\n fulfillmentStatusEntryId: string | null;\n fulfillmentStatus: string | null;\n paymentStatusEntryId: string | null;\n paymentStatus: string | null;\n customerEntityId: string | null;\n customerContactId: string | null;\n customerSnapshot: Record<string, unknown> | null;\n billingAddressId: string | null;\n shippingAddressId: string | null;\n billingAddressSnapshot: Record<string, unknown> | null;\n shippingAddressSnapshot: Record<string, unknown> | null;\n currencyCode: string;\n exchangeRate: string | null;\n taxStrategyKey: string | null;\n discountStrategyKey: string | null;\n taxInfo: Record<string, unknown> | null;\n shippingMethodId: string | null;\n shippingMethodCode: string | null;\n deliveryWindowId: string | null;\n deliveryWindowCode: string | null;\n paymentMethodId: string | null;\n paymentMethodCode: string | null;\n channelId: string | null;\n placedAt: string | null;\n expectedDeliveryAt: string | null;\n dueAt: string | null;\n comments: string | null;\n internalNotes: string | null;\n shippingMethodSnapshot: Record<string, unknown> | null;\n deliveryWindowSnapshot: Record<string, unknown> | null;\n paymentMethodSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n subtotalNetAmount: string;\n subtotalGrossAmount: string;\n discountTotalAmount: string;\n taxTotalAmount: string;\n shippingNetAmount: string;\n shippingGrossAmount: string;\n surchargeTotalAmount: string;\n grandTotalNetAmount: string;\n grandTotalGrossAmount: string;\n paidTotalAmount: string;\n refundedTotalAmount: string;\n outstandingAmount: string;\n totalsSnapshot: Record<string, unknown> | null;\n lineItemCount: number;\n };\n lines: OrderLineSnapshot[];\n adjustments: OrderAdjustmentSnapshot[];\n addresses: DocumentAddressSnapshot[];\n notes: NoteSnapshot[];\n tags: TagAssignmentSnapshot[];\n shipments: ShipmentSnapshot[];\n payments: PaymentSnapshot[];\n};\n\ntype OrderLineSnapshot = {\n id: string;\n lineNumber: number;\n kind: string;\n statusEntryId: string | null;\n status: string | null;\n productId: string | null;\n productVariantId: string | null;\n catalogSnapshot: Record<string, unknown> | null;\n name: string | null;\n description: string | null;\n comment: string | null;\n quantity: string;\n quantityUnit: string | null;\n normalizedQuantity: string;\n normalizedUnit: string | null;\n uomSnapshot: SalesLineUomSnapshot | null;\n reservedQuantity: string;\n fulfilledQuantity: string;\n invoicedQuantity: string;\n returnedQuantity: string;\n currencyCode: string;\n unitPriceNet: string;\n unitPriceGross: string;\n discountAmount: string;\n discountPercent: string;\n taxRate: string;\n taxAmount: string;\n totalNetAmount: string;\n totalGrossAmount: string;\n configuration: Record<string, unknown> | null;\n promotionCode: string | null;\n promotionSnapshot: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n customFieldSetId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype OrderAdjustmentSnapshot = {\n id: string;\n scope: \"order\" | \"line\";\n kind: string;\n code: string | null;\n label: string | null;\n calculatorKey: string | null;\n promotionId: string | null;\n rate: string;\n amountNet: string;\n amountGross: string;\n currencyCode: string | null;\n metadata: Record<string, unknown> | null;\n position: number;\n orderLineId: string | null;\n customFields: Record<string, unknown> | null;\n};\n\ntype OrderUndoPayload = {\n before?: OrderGraphSnapshot | null;\n after?: OrderGraphSnapshot | null;\n};\n\ntype QuoteUndoPayload = {\n before?: QuoteGraphSnapshot | null;\n after?: QuoteGraphSnapshot | null;\n};\n\ntype QuoteConvertUndoPayload = {\n quote?: QuoteGraphSnapshot | null;\n order?: OrderGraphSnapshot | null;\n};\n\nconst currencyCodeSchema = z\n .string()\n .trim()\n .toUpperCase()\n .regex(/^[A-Z]{3}$/, { message: \"currency_code_invalid\" });\n\nconst dateOnlySchema = z\n .string()\n .trim()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: \"invalid_date\" })\n .refine((value) => !Number.isNaN(new Date(value).getTime()), {\n message: \"invalid_date\",\n });\n\nconst addressSnapshotSchema = z\n .record(z.string(), z.unknown())\n .nullable()\n .optional();\n\nexport const documentUpdateSchema = z\n .object({\n id: z.string().uuid(),\n customerEntityId: z.string().uuid().nullable().optional(),\n customerContactId: z.string().uuid().nullable().optional(),\n customerSnapshot: z.record(z.string(), z.unknown()).nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n customerReference: z.string().nullable().optional(),\n externalReference: z.string().nullable().optional(),\n comment: z.string().nullable().optional(),\n orderNumber: z.string().trim().min(1).max(191).optional(),\n quoteNumber: z.string().trim().min(1).max(191).optional(),\n currencyCode: currencyCodeSchema.optional(),\n channelId: z.string().uuid().nullable().optional(),\n statusEntryId: z.string().uuid().nullable().optional(),\n placedAt: z.union([dateOnlySchema, z.null()]).optional(),\n expectedDeliveryAt: z.union([dateOnlySchema, z.null()]).optional(),\n shippingAddressId: z.string().uuid().nullable().optional(),\n billingAddressId: z.string().uuid().nullable().optional(),\n shippingAddressSnapshot: addressSnapshotSchema,\n billingAddressSnapshot: addressSnapshotSchema,\n shippingMethodId: z.string().uuid().nullable().optional(),\n shippingMethodCode: z.string().nullable().optional(),\n shippingMethodSnapshot: z\n .record(z.string(), z.unknown())\n .nullable()\n .optional(),\n paymentMethodId: z.string().uuid().nullable().optional(),\n paymentMethodCode: z.string().nullable().optional(),\n paymentMethodSnapshot: z\n .record(z.string(), z.unknown())\n .nullable()\n .optional(),\n tags: z.array(z.string().uuid()).optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n customFieldSetId: z.string().uuid().nullable().optional(),\n })\n .refine(\n (input) =>\n typeof input.currencyCode === \"string\" ||\n input.placedAt !== undefined ||\n input.expectedDeliveryAt !== undefined ||\n input.channelId !== undefined ||\n input.statusEntryId !== undefined ||\n input.shippingAddressId !== undefined ||\n input.billingAddressId !== undefined ||\n input.customerEntityId !== undefined ||\n input.customerContactId !== undefined ||\n input.customerSnapshot !== undefined ||\n input.metadata !== undefined ||\n input.customerReference !== undefined ||\n input.externalReference !== undefined ||\n input.comment !== undefined ||\n input.orderNumber !== undefined ||\n input.quoteNumber !== undefined ||\n input.shippingAddressSnapshot !== undefined ||\n input.billingAddressSnapshot !== undefined ||\n input.shippingMethodId !== undefined ||\n input.shippingMethodCode !== undefined ||\n input.shippingMethodSnapshot !== undefined ||\n input.paymentMethodId !== undefined ||\n input.paymentMethodCode !== undefined ||\n input.paymentMethodSnapshot !== undefined ||\n input.tags !== undefined ||\n input.customFields !== undefined ||\n input.customFieldSetId !== undefined,\n { message: \"update_payload_empty\" },\n );\n\nexport type DocumentUpdateInput = z.infer<typeof documentUpdateSchema>;\n\ntype DocumentLineCreateInput = QuoteLineCreateInput | OrderLineCreateInput;\ntype DocumentAdjustmentCreateInput =\n | QuoteAdjustmentCreateInput\n | OrderAdjustmentCreateInput;\n\nfunction cloneJson<T>(value: T): T {\n if (value === null || value === undefined) return value;\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nasync function resolveCustomerSnapshot(\n em: EntityManager,\n organizationId: string,\n tenantId: string,\n customerEntityId?: string | null,\n customerContactId?: string | null,\n): Promise<Record<string, unknown> | null> {\n if (!customerEntityId) return null;\n const customer = await em.findOne(\n CustomerEntity,\n { id: customerEntityId, organizationId, tenantId },\n { populate: [\"personProfile\", \"companyProfile\"] },\n );\n if (!customer) return null;\n\n const contact = customerContactId\n ? await em.findOne(CustomerPersonProfile, {\n id: customerContactId,\n organizationId,\n tenantId,\n })\n : null;\n\n return {\n customer: {\n id: customer.id,\n kind: customer.kind,\n displayName: customer.displayName,\n primaryEmail: customer.primaryEmail ?? null,\n primaryPhone: customer.primaryPhone ?? null,\n personProfile: customer.personProfile\n ? {\n id: customer.personProfile.id,\n firstName: customer.personProfile.firstName ?? null,\n lastName: customer.personProfile.lastName ?? null,\n preferredName: customer.personProfile.preferredName ?? null,\n }\n : null,\n companyProfile: customer.companyProfile\n ? {\n id: customer.companyProfile.id,\n legalName: customer.companyProfile.legalName ?? null,\n brandName: customer.companyProfile.brandName ?? null,\n domain: customer.companyProfile.domain ?? null,\n websiteUrl: customer.companyProfile.websiteUrl ?? null,\n }\n : null,\n },\n contact: contact\n ? {\n id: contact.id,\n firstName: contact.firstName ?? null,\n lastName: contact.lastName ?? null,\n preferredName: contact.preferredName ?? null,\n jobTitle: contact.jobTitle ?? null,\n department: contact.department ?? null,\n }\n : null,\n };\n}\n\nasync function resolveAddressSnapshot(\n em: EntityManager,\n organizationId: string,\n tenantId: string,\n addressId?: string | null,\n): Promise<Record<string, unknown> | null> {\n if (!addressId) return null;\n const address = await em.findOne(CustomerAddress, {\n id: addressId,\n organizationId,\n tenantId,\n });\n if (!address) return null;\n\n return {\n id: address.id,\n name: address.name ?? null,\n purpose: address.purpose ?? null,\n companyName: address.companyName ?? null,\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2 ?? null,\n buildingNumber: address.buildingNumber ?? null,\n flatNumber: address.flatNumber ?? null,\n city: address.city ?? null,\n region: address.region ?? null,\n postalCode: address.postalCode ?? null,\n country: address.country ?? null,\n latitude: address.latitude ?? null,\n longitude: address.longitude ?? null,\n isPrimary: address.isPrimary,\n };\n}\n\nasync function resolveDocumentReferences(\n em: EntityManager,\n parsed: {\n organizationId: string;\n tenantId: string;\n customerEntityId?: string | null;\n customerContactId?: string | null;\n customerSnapshot?: Record<string, unknown> | null;\n billingAddressId?: string | null;\n shippingAddressId?: string | null;\n billingAddressSnapshot?: Record<string, unknown> | null;\n shippingAddressSnapshot?: Record<string, unknown> | null;\n shippingMethodId?: string | null;\n deliveryWindowId?: string | null;\n paymentMethodId?: string | null;\n },\n): Promise<{\n customerSnapshot: Record<string, unknown> | null;\n billingAddressSnapshot: Record<string, unknown> | null;\n shippingAddressSnapshot: Record<string, unknown> | null;\n shippingMethod: SalesShippingMethod | null;\n deliveryWindow: SalesDeliveryWindow | null;\n paymentMethod: SalesPaymentMethod | null;\n}> {\n const [\n resolvedCustomerSnapshot,\n resolvedBillingSnapshot,\n resolvedShippingSnapshot,\n shippingMethod,\n deliveryWindow,\n paymentMethod,\n ] = await Promise.all([\n parsed.customerSnapshot\n ? Promise.resolve(cloneJson(parsed.customerSnapshot))\n : resolveCustomerSnapshot(\n em,\n parsed.organizationId,\n parsed.tenantId,\n parsed.customerEntityId ?? null,\n parsed.customerContactId ?? null,\n ),\n parsed.billingAddressSnapshot\n ? Promise.resolve(cloneJson(parsed.billingAddressSnapshot))\n : resolveAddressSnapshot(\n em,\n parsed.organizationId,\n parsed.tenantId,\n parsed.billingAddressId ?? null,\n ),\n parsed.shippingAddressSnapshot\n ? Promise.resolve(cloneJson(parsed.shippingAddressSnapshot))\n : resolveAddressSnapshot(\n em,\n parsed.organizationId,\n parsed.tenantId,\n parsed.shippingAddressId ?? null,\n ),\n parsed.shippingMethodId\n ? em.findOne(SalesShippingMethod, {\n id: parsed.shippingMethodId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n })\n : Promise.resolve(null),\n parsed.deliveryWindowId\n ? em.findOne(SalesDeliveryWindow, {\n id: parsed.deliveryWindowId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n })\n : Promise.resolve(null),\n parsed.paymentMethodId\n ? em.findOne(SalesPaymentMethod, {\n id: parsed.paymentMethodId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n })\n : Promise.resolve(null),\n ]);\n\n return {\n customerSnapshot: resolvedCustomerSnapshot\n ? cloneJson(resolvedCustomerSnapshot)\n : null,\n billingAddressSnapshot: resolvedBillingSnapshot\n ? cloneJson(resolvedBillingSnapshot)\n : null,\n shippingAddressSnapshot: resolvedShippingSnapshot\n ? cloneJson(resolvedShippingSnapshot)\n : null,\n shippingMethod: shippingMethod ?? null,\n deliveryWindow: deliveryWindow ?? null,\n paymentMethod: paymentMethod ?? null,\n };\n}\n\nfunction normalizeStatusValue(raw: unknown): string | null {\n if (typeof raw !== \"string\") return null;\n const trimmed = raw.trim();\n return trimmed.length ? trimmed : null;\n}\n\nfunction resolveNoteAuthorFromAuth(auth: AuthContext | null): string | null {\n if (!auth || auth.isApiKey) return null;\n const sub = typeof auth.sub === \"string\" ? auth.sub.trim() : \"\";\n const uuidRegex =\n /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;\n return uuidRegex.test(sub) ? sub : null;\n}\n\nfunction resolveStatusChangeActor(auth: AuthContext | null, translate: TranslateWithFallbackFn): string {\n const unknownLabel = translate(\n \"sales.orders.status_change.actor_unknown\",\n \"unknown user\",\n );\n if (!auth) return unknownLabel;\n if (auth.isApiKey) {\n const keyName = typeof auth.keyName === \"string\" ? auth.keyName.trim() : \"\";\n const keyId = typeof auth.keyId === \"string\" ? auth.keyId.trim() : \"\";\n const label =\n keyName || keyId || (typeof auth.sub === \"string\" ? auth.sub : \"\");\n return label\n ? translate(\n \"sales.orders.status_change.actor_api_key\",\n \"API key {name}\",\n { name: label },\n )\n : unknownLabel;\n }\n const email = typeof auth.email === \"string\" ? auth.email.trim() : \"\";\n if (email) return email;\n const sub = typeof auth.sub === \"string\" ? auth.sub.trim() : \"\";\n if (sub) return sub;\n return unknownLabel;\n}\n\nfunction formatStatusLabel(status: string | null, translate: TranslateWithFallbackFn): string {\n if (status && status.trim().length) return status.trim();\n return translate(\"sales.orders.status_change.empty\", \"unset\");\n}\n\nasync function appendOrderStatusChangeNote({\n em,\n order,\n previousStatus,\n auth,\n}: {\n em: EntityManager;\n order: SalesOrder;\n previousStatus: string | null;\n auth: AuthContext | null;\n}): Promise<SalesNote | null> {\n const nextStatus = normalizeStatusValue(order.status);\n if (previousStatus === nextStatus) return null;\n const { translate } = await resolveTranslations();\n const body = translate(\n \"sales.orders.status_change.note\",\n \"Status changed from {from} to {to} by {actor}.\",\n {\n from: formatStatusLabel(previousStatus, translate),\n to: formatStatusLabel(nextStatus, translate),\n actor: resolveStatusChangeActor(auth, translate),\n },\n );\n const note = em.create(SalesNote, {\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n contextType: \"order\",\n contextId: order.id,\n order,\n authorUserId: resolveNoteAuthorFromAuth(auth),\n appearanceIcon: null,\n appearanceColor: null,\n body,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(note);\n return note;\n}\n\nasync function applyDocumentUpdate({\n kind,\n entity,\n input,\n em,\n}: {\n kind: \"order\" | \"quote\";\n entity: SalesOrder | SalesQuote;\n input: DocumentUpdateInput;\n em: EntityManager;\n}): Promise<void> {\n const organizationId = (entity as any).organizationId as string;\n const tenantId = (entity as any).tenantId as string;\n const status =\n typeof (entity as any).status === \"string\" ? (entity as any).status : null;\n const { translate } = await resolveTranslations();\n\n const wantsCustomerChange =\n input.customerEntityId !== undefined ||\n input.customerContactId !== undefined ||\n input.customerSnapshot !== undefined ||\n input.metadata !== undefined;\n const wantsAddressChange =\n input.shippingAddressId !== undefined ||\n input.billingAddressId !== undefined ||\n input.shippingAddressSnapshot !== undefined ||\n input.billingAddressSnapshot !== undefined;\n\n let settings: SalesSettings | null = null;\n if (kind === \"order\" && (wantsCustomerChange || wantsAddressChange)) {\n settings = await loadSalesSettings(em, { organizationId, tenantId });\n }\n\n const guardStatus = (\n allowed: string[] | null | undefined,\n errorKey: string,\n fallback: string,\n ) => {\n if (!Array.isArray(allowed)) return;\n if (allowed.length === 0) {\n throw new CrudHttpError(400, { error: translate(errorKey, fallback) });\n }\n if (!status || !allowed.includes(status)) {\n throw new CrudHttpError(400, { error: translate(errorKey, fallback) });\n }\n };\n\n if (kind === \"order\" && wantsCustomerChange) {\n guardStatus(\n settings?.orderCustomerEditableStatuses ?? null,\n \"sales.orders.edit_customer_blocked\",\n \"Editing the customer is blocked for this status.\",\n );\n }\n if (kind === \"order\" && wantsAddressChange) {\n guardStatus(\n settings?.orderAddressEditableStatuses ?? null,\n \"sales.orders.edit_addresses_blocked\",\n \"Editing addresses is blocked for this status.\",\n );\n }\n\n if (kind === \"order\" && typeof input.orderNumber === \"string\") {\n (entity as SalesOrder).orderNumber = input.orderNumber;\n }\n if (kind === \"quote\" && typeof input.quoteNumber === \"string\") {\n (entity as SalesQuote).quoteNumber = input.quoteNumber;\n }\n\n if (input.customerEntityId !== undefined) {\n entity.customerEntityId = input.customerEntityId ?? null;\n entity.customerSnapshot = await resolveCustomerSnapshot(\n em,\n organizationId,\n tenantId,\n input.customerEntityId,\n input.customerContactId ?? entity.customerContactId ?? null,\n );\n entity.customerContactId = input.customerContactId ?? null;\n entity.billingAddressId = null;\n entity.shippingAddressId = null;\n entity.billingAddressSnapshot = null;\n entity.shippingAddressSnapshot = null;\n }\n if (input.customerContactId !== undefined) {\n entity.customerContactId = input.customerContactId ?? null;\n if (entity.customerEntityId) {\n entity.customerSnapshot = await resolveCustomerSnapshot(\n em,\n organizationId,\n tenantId,\n entity.customerEntityId,\n input.customerContactId,\n );\n }\n }\n if (input.customerSnapshot !== undefined) {\n entity.customerSnapshot = input.customerSnapshot ?? null;\n }\n if (input.metadata !== undefined) {\n entity.metadata = input.metadata ?? null;\n }\n if (input.externalReference !== undefined) {\n const normalized =\n typeof input.externalReference === \"string\"\n ? input.externalReference.trim()\n : \"\";\n entity.externalReference = normalized.length ? normalized : null;\n }\n if (input.customerReference !== undefined) {\n const normalized =\n typeof input.customerReference === \"string\"\n ? input.customerReference.trim()\n : \"\";\n entity.customerReference = normalized.length ? normalized : null;\n }\n if (input.comment !== undefined) {\n const normalized =\n typeof input.comment === \"string\" ? input.comment.trim() : \"\";\n entity.comments = normalized.length ? normalized : null;\n }\n if (typeof input.currencyCode === \"string\") {\n entity.currencyCode = input.currencyCode;\n }\n if (input.channelId !== undefined) {\n if (input.channelId === null) {\n entity.channelId = null;\n } else {\n const channel = await em.findOne(SalesChannel, {\n id: input.channelId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!channel) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.channelInvalid\",\n \"Selected channel could not be found.\",\n ),\n });\n }\n entity.channelId = channel.id;\n }\n }\n if (input.statusEntryId !== undefined) {\n const statusValue = await resolveDictionaryEntryValue(\n em,\n input.statusEntryId,\n );\n if (input.statusEntryId && !statusValue) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.statusInvalid\",\n \"Selected status could not be found.\",\n ),\n });\n }\n (entity as any).statusEntryId = input.statusEntryId ?? null;\n (entity as any).status = statusValue;\n }\n if (input.placedAt !== undefined) {\n if (input.placedAt === null) {\n entity.placedAt = null;\n } else {\n const parsed = new Date(input.placedAt);\n entity.placedAt = Number.isNaN(parsed.getTime())\n ? entity.placedAt\n : parsed;\n }\n }\n if (\n input.expectedDeliveryAt !== undefined &&\n \"expectedDeliveryAt\" in entity\n ) {\n if (input.expectedDeliveryAt === null) {\n (entity as SalesOrder).expectedDeliveryAt = null;\n } else {\n const parsed = new Date(input.expectedDeliveryAt);\n (entity as SalesOrder).expectedDeliveryAt = Number.isNaN(parsed.getTime())\n ? (entity as SalesOrder).expectedDeliveryAt\n : parsed;\n }\n }\n if (input.shippingAddressId !== undefined) {\n entity.shippingAddressId = input.shippingAddressId ?? null;\n if (input.shippingAddressSnapshot === undefined) {\n entity.shippingAddressSnapshot = await resolveAddressSnapshot(\n em,\n organizationId,\n tenantId,\n input.shippingAddressId,\n );\n }\n }\n if (input.billingAddressId !== undefined) {\n entity.billingAddressId = input.billingAddressId ?? null;\n if (input.billingAddressSnapshot === undefined) {\n entity.billingAddressSnapshot = await resolveAddressSnapshot(\n em,\n organizationId,\n tenantId,\n input.billingAddressId,\n );\n }\n }\n if (input.shippingAddressSnapshot !== undefined) {\n entity.shippingAddressSnapshot = input.shippingAddressSnapshot ?? null;\n }\n if (input.billingAddressSnapshot !== undefined) {\n entity.billingAddressSnapshot = input.billingAddressSnapshot ?? null;\n }\n if (\n input.shippingMethodId !== undefined ||\n input.shippingMethodSnapshot !== undefined ||\n input.shippingMethodCode !== undefined\n ) {\n let shippingMethod: SalesShippingMethod | null = null;\n if (input.shippingMethodId) {\n shippingMethod = await em.findOne(SalesShippingMethod, {\n id: input.shippingMethodId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!shippingMethod) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.shippingMethodInvalid\",\n \"Selected shipping method could not be found.\",\n ),\n });\n }\n }\n (entity as any).shippingMethodId = input.shippingMethodId ?? null;\n (entity as any).shippingMethod = shippingMethod ?? null;\n (entity as any).shippingMethodCode =\n input.shippingMethodCode ?? shippingMethod?.code ?? null;\n if (input.shippingMethodSnapshot !== undefined) {\n (entity as any).shippingMethodSnapshot =\n input.shippingMethodSnapshot ?? null;\n } else {\n (entity as any).shippingMethodSnapshot = shippingMethod\n ? {\n id: shippingMethod.id,\n code: shippingMethod.code,\n name: shippingMethod.name,\n description: shippingMethod.description ?? null,\n carrierCode: shippingMethod.carrierCode ?? null,\n providerKey: shippingMethod.providerKey ?? null,\n serviceLevel: shippingMethod.serviceLevel ?? null,\n estimatedTransitDays: shippingMethod.estimatedTransitDays ?? null,\n baseRateNet: shippingMethod.baseRateNet,\n baseRateGross: shippingMethod.baseRateGross,\n currencyCode: shippingMethod.currencyCode ?? null,\n metadata: shippingMethod.metadata\n ? cloneJson(shippingMethod.metadata)\n : null,\n providerSettings:\n shippingMethod.metadata &&\n typeof shippingMethod.metadata === \"object\"\n ? cloneJson(\n (shippingMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null;\n }\n }\n if (\n input.paymentMethodId !== undefined ||\n input.paymentMethodSnapshot !== undefined ||\n input.paymentMethodCode !== undefined\n ) {\n let paymentMethod: SalesPaymentMethod | null = null;\n if (input.paymentMethodId) {\n paymentMethod = await em.findOne(SalesPaymentMethod, {\n id: input.paymentMethodId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!paymentMethod) {\n throw new CrudHttpError(400, {\n error: translate(\n \"sales.documents.detail.paymentMethodInvalid\",\n \"Selected payment method could not be found.\",\n ),\n });\n }\n }\n (entity as any).paymentMethodId = input.paymentMethodId ?? null;\n (entity as any).paymentMethod = paymentMethod ?? null;\n (entity as any).paymentMethodCode =\n input.paymentMethodCode ?? paymentMethod?.code ?? null;\n if (input.paymentMethodSnapshot !== undefined) {\n (entity as any).paymentMethodSnapshot =\n input.paymentMethodSnapshot ?? null;\n } else {\n (entity as any).paymentMethodSnapshot = paymentMethod\n ? {\n id: paymentMethod.id,\n code: paymentMethod.code,\n name: paymentMethod.name,\n description: paymentMethod.description ?? null,\n providerKey: paymentMethod.providerKey ?? null,\n terms: paymentMethod.terms ?? null,\n metadata: paymentMethod.metadata\n ? cloneJson(paymentMethod.metadata)\n : null,\n providerSettings:\n paymentMethod.metadata &&\n typeof paymentMethod.metadata === \"object\"\n ? cloneJson(\n (paymentMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null;\n }\n }\n\n if (input.tags !== undefined) {\n await syncSalesDocumentTags(em, {\n documentId: entity.id,\n kind,\n organizationId,\n tenantId,\n tagIds: input.tags,\n });\n }\n\n if (input.customFieldSetId !== undefined) {\n (entity as any).customFieldSetId = input.customFieldSetId ?? null;\n }\n\n if (input.customFields !== undefined) {\n const values =\n input.customFields &&\n typeof input.customFields === \"object\" &&\n !Array.isArray(input.customFields)\n ? (input.customFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: kind === \"order\" ? E.sales.sales_order : E.sales.sales_quote,\n recordId: entity.id,\n organizationId,\n tenantId,\n values,\n });\n }\n}\n\nasync function loadQuoteSnapshot(\n em: EntityManager,\n id: string,\n): Promise<QuoteGraphSnapshot | null> {\n const quote = await em.findOne(SalesQuote, { id, deletedAt: null });\n if (!quote) return null;\n const lines = await em.find(\n SalesQuoteLine,\n { quote: quote },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesQuoteAdjustment,\n { quote: quote },\n { orderBy: { position: \"asc\" } },\n );\n const [\n addresses,\n notes,\n tags,\n quoteCustomFields,\n lineCustomFields,\n adjustmentCustomFields,\n ] = await Promise.all([\n em.find(SalesDocumentAddress, { documentId: id, documentKind: \"quote\" }),\n em.find(SalesNote, { contextType: \"quote\", contextId: id }),\n findWithDecryption(\n em,\n SalesDocumentTagAssignment,\n { documentId: id, documentKind: \"quote\" },\n { populate: [\"tag\"] },\n { tenantId: quote.tenantId, organizationId: quote.organizationId },\n ),\n loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote,\n recordIds: [quote.id],\n tenantIdByRecord: { [quote.id]: quote.tenantId },\n organizationIdByRecord: { [quote.id]: quote.organizationId },\n }),\n lines.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote_line,\n recordIds: lines.map((line) => line.id),\n tenantIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, quote.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, quote.organizationId]),\n ),\n })\n : Promise.resolve({}),\n adjustments.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote_adjustment,\n recordIds: adjustments.map((adj) => adj.id),\n tenantIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, quote.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, quote.organizationId]),\n ),\n })\n : Promise.resolve({}),\n ]);\n const addressSnapshots: DocumentAddressSnapshot[] = addresses.map(\n (entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: entry.documentId,\n documentKind: \"quote\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n }),\n );\n const noteSnapshots: NoteSnapshot[] = notes.map((entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: entry.contextType as \"order\" | \"quote\",\n contextId: entry.contextId,\n orderId: entry.order\n ? typeof entry.order === \"string\"\n ? entry.order\n : entry.order.id\n : null,\n quoteId: entry.quote\n ? typeof entry.quote === \"string\"\n ? entry.quote\n : entry.quote.id\n : null,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n }));\n const tagSnapshots: TagAssignmentSnapshot[] = tags\n .map((assignment) => {\n const tagId =\n typeof assignment.tag === \"string\"\n ? assignment.tag\n : (assignment.tag?.id ?? (assignment as any)?.tag_id ?? null);\n if (!tagId) return null;\n return {\n id: assignment.id,\n tagId,\n organizationId: assignment.organizationId,\n tenantId: assignment.tenantId,\n documentId: assignment.documentId,\n documentKind: \"quote\",\n };\n })\n .filter((entry): entry is TagAssignmentSnapshot => !!entry);\n\n return {\n quote: {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteNumber: quote.quoteNumber,\n statusEntryId: quote.statusEntryId ?? null,\n status: quote.status ?? null,\n customerEntityId: quote.customerEntityId ?? null,\n customerContactId: quote.customerContactId ?? null,\n customerSnapshot: quote.customerSnapshot\n ? cloneJson(quote.customerSnapshot)\n : null,\n billingAddressId: quote.billingAddressId ?? null,\n shippingAddressId: quote.shippingAddressId ?? null,\n billingAddressSnapshot: quote.billingAddressSnapshot\n ? cloneJson(quote.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: quote.shippingAddressSnapshot\n ? cloneJson(quote.shippingAddressSnapshot)\n : null,\n currencyCode: quote.currencyCode,\n validFrom: quote.validFrom ? quote.validFrom.toISOString() : null,\n validUntil: quote.validUntil ? quote.validUntil.toISOString() : null,\n comments: quote.comments ?? null,\n taxInfo: quote.taxInfo ? cloneJson(quote.taxInfo) : null,\n shippingMethodId: quote.shippingMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n deliveryWindowId: quote.deliveryWindowId ?? null,\n deliveryWindowCode: quote.deliveryWindowCode ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n channelId: quote.channelId ?? null,\n shippingMethodSnapshot: quote.shippingMethodSnapshot\n ? cloneJson(quote.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: quote.deliveryWindowSnapshot\n ? cloneJson(quote.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: quote.paymentMethodSnapshot\n ? cloneJson(quote.paymentMethodSnapshot)\n : null,\n metadata: quote.metadata ? cloneJson(quote.metadata) : null,\n customFieldSetId: quote.customFieldSetId ?? null,\n customFields: quoteCustomFields[quote.id]\n ? cloneJson(quoteCustomFields[quote.id])\n : null,\n subtotalNetAmount: quote.subtotalNetAmount,\n subtotalGrossAmount: quote.subtotalGrossAmount,\n discountTotalAmount: quote.discountTotalAmount,\n taxTotalAmount: quote.taxTotalAmount,\n grandTotalNetAmount: quote.grandTotalNetAmount,\n grandTotalGrossAmount: quote.grandTotalGrossAmount,\n totalsSnapshot: quote.totalsSnapshot\n ? cloneJson(quote.totalsSnapshot)\n : null,\n lineItemCount: quote.lineItemCount,\n },\n lines: lines.map((line) => ({\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n customFields: lineCustomFields[line.id]\n ? cloneJson(lineCustomFields[line.id])\n : null,\n })),\n adjustments: adjustments.map((adj) => ({\n id: adj.id,\n scope: adj.scope,\n kind: adj.kind,\n code: adj.code ?? null,\n label: adj.label ?? null,\n calculatorKey: adj.calculatorKey ?? null,\n promotionId: adj.promotionId ?? null,\n rate: adj.rate,\n amountNet: adj.amountNet,\n amountGross: adj.amountGross,\n currencyCode: adj.currencyCode ?? null,\n metadata: adj.metadata ? cloneJson(adj.metadata) : null,\n position: adj.position,\n quoteLineId:\n typeof adj.quoteLine === \"string\"\n ? adj.quoteLine\n : (adj.quoteLine?.id ?? null),\n customFields: adjustmentCustomFields[adj.id]\n ? cloneJson(adjustmentCustomFields[adj.id])\n : null,\n })),\n addresses: addressSnapshots,\n notes: noteSnapshots,\n tags: tagSnapshots,\n };\n}\n\nasync function loadOrderSnapshot(\n em: EntityManager,\n id: string,\n): Promise<OrderGraphSnapshot | null> {\n const order = await em.findOne(SalesOrder, { id, deletedAt: null });\n if (!order) return null;\n const lines = await em.find(\n SalesOrderLine,\n { order: order },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesOrderAdjustment,\n { order: order },\n { orderBy: { position: \"asc\" } },\n );\n const [\n addresses,\n notes,\n tags,\n shipments,\n payments,\n orderCustomFields,\n lineCustomFields,\n adjustmentCustomFields,\n ] = await Promise.all([\n em.find(SalesDocumentAddress, { documentId: id, documentKind: \"order\" }),\n em.find(SalesNote, { contextType: \"order\", contextId: id }),\n findWithDecryption(\n em,\n SalesDocumentTagAssignment,\n { documentId: id, documentKind: \"order\" },\n { populate: [\"tag\"] },\n { tenantId: order.tenantId, organizationId: order.organizationId },\n ),\n em.find(SalesShipment, { order: order }),\n em.find(SalesPayment, { order: order }),\n loadCustomFieldValues({\n em,\n entityId: E.sales.sales_order,\n recordIds: [order.id],\n tenantIdByRecord: { [order.id]: order.tenantId },\n organizationIdByRecord: { [order.id]: order.organizationId },\n }),\n lines.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_order_line,\n recordIds: lines.map((line) => line.id),\n tenantIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, order.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n lines.map((line) => [line.id, order.organizationId]),\n ),\n })\n : Promise.resolve({}),\n adjustments.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_order_adjustment,\n recordIds: adjustments.map((adj) => adj.id),\n tenantIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, order.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n adjustments.map((adj) => [adj.id, order.organizationId]),\n ),\n })\n : Promise.resolve({}),\n ]);\n const shipmentSnapshots = (\n await Promise.all(\n shipments.map((entry) => loadShipmentSnapshot(em, entry.id)),\n )\n ).filter((entry): entry is ShipmentSnapshot => !!entry);\n const paymentSnapshots = (\n await Promise.all(\n payments.map((entry) => loadPaymentSnapshot(em, entry.id)),\n )\n ).filter((entry): entry is PaymentSnapshot => !!entry);\n const addressSnapshots: DocumentAddressSnapshot[] = addresses.map(\n (entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: entry.documentId,\n documentKind: \"order\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n }),\n );\n const noteSnapshots: NoteSnapshot[] = notes.map((entry) => ({\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: entry.contextType as \"order\" | \"quote\",\n contextId: entry.contextId,\n orderId: entry.order\n ? typeof entry.order === \"string\"\n ? entry.order\n : entry.order.id\n : null,\n quoteId: entry.quote\n ? typeof entry.quote === \"string\"\n ? entry.quote\n : entry.quote.id\n : null,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n }));\n const tagSnapshots: TagAssignmentSnapshot[] = tags\n .map((assignment) => {\n const tagId =\n typeof assignment.tag === \"string\"\n ? assignment.tag\n : (assignment.tag?.id ?? (assignment as any)?.tag_id ?? null);\n if (!tagId) return null;\n return {\n id: assignment.id,\n tagId,\n organizationId: assignment.organizationId,\n tenantId: assignment.tenantId,\n documentId: assignment.documentId,\n documentKind: \"order\",\n };\n })\n .filter((entry): entry is TagAssignmentSnapshot => !!entry);\n\n return {\n order: {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderNumber: order.orderNumber,\n statusEntryId: order.statusEntryId ?? null,\n status: order.status ?? null,\n fulfillmentStatusEntryId: order.fulfillmentStatusEntryId ?? null,\n fulfillmentStatus: order.fulfillmentStatus ?? null,\n paymentStatusEntryId: order.paymentStatusEntryId ?? null,\n paymentStatus: order.paymentStatus ?? null,\n customerEntityId: order.customerEntityId ?? null,\n customerContactId: order.customerContactId ?? null,\n customerSnapshot: order.customerSnapshot\n ? cloneJson(order.customerSnapshot)\n : null,\n billingAddressId: order.billingAddressId ?? null,\n shippingAddressId: order.shippingAddressId ?? null,\n billingAddressSnapshot: order.billingAddressSnapshot\n ? cloneJson(order.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: order.shippingAddressSnapshot\n ? cloneJson(order.shippingAddressSnapshot)\n : null,\n currencyCode: order.currencyCode,\n exchangeRate: order.exchangeRate ?? null,\n taxStrategyKey: order.taxStrategyKey ?? null,\n discountStrategyKey: order.discountStrategyKey ?? null,\n taxInfo: order.taxInfo ? cloneJson(order.taxInfo) : null,\n shippingMethodId: order.shippingMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n deliveryWindowId: order.deliveryWindowId ?? null,\n deliveryWindowCode: order.deliveryWindowCode ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n channelId: order.channelId ?? null,\n placedAt: order.placedAt ? order.placedAt.toISOString() : null,\n expectedDeliveryAt: order.expectedDeliveryAt\n ? order.expectedDeliveryAt.toISOString()\n : null,\n dueAt: order.dueAt ? order.dueAt.toISOString() : null,\n comments: order.comments ?? null,\n internalNotes: order.internalNotes ?? null,\n shippingMethodSnapshot: order.shippingMethodSnapshot\n ? cloneJson(order.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: order.deliveryWindowSnapshot\n ? cloneJson(order.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: order.paymentMethodSnapshot\n ? cloneJson(order.paymentMethodSnapshot)\n : null,\n metadata: order.metadata ? cloneJson(order.metadata) : null,\n customFieldSetId: order.customFieldSetId ?? null,\n customFields: orderCustomFields[order.id]\n ? cloneJson(orderCustomFields[order.id])\n : null,\n subtotalNetAmount: order.subtotalNetAmount,\n subtotalGrossAmount: order.subtotalGrossAmount,\n discountTotalAmount: order.discountTotalAmount,\n taxTotalAmount: order.taxTotalAmount,\n shippingNetAmount: order.shippingNetAmount,\n shippingGrossAmount: order.shippingGrossAmount,\n surchargeTotalAmount: order.surchargeTotalAmount,\n grandTotalNetAmount: order.grandTotalNetAmount,\n grandTotalGrossAmount: order.grandTotalGrossAmount,\n paidTotalAmount: order.paidTotalAmount,\n refundedTotalAmount: order.refundedTotalAmount,\n outstandingAmount: order.outstandingAmount,\n totalsSnapshot: order.totalsSnapshot\n ? cloneJson(order.totalsSnapshot)\n : null,\n lineItemCount: order.lineItemCount,\n },\n lines: lines.map((line) => ({\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n reservedQuantity: line.reservedQuantity,\n fulfilledQuantity: line.fulfilledQuantity,\n invoicedQuantity: line.invoicedQuantity,\n returnedQuantity: line.returnedQuantity,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n customFields: lineCustomFields[line.id]\n ? cloneJson(lineCustomFields[line.id])\n : null,\n })),\n adjustments: adjustments.map((adj) => ({\n id: adj.id,\n scope: adj.scope,\n kind: adj.kind,\n code: adj.code ?? null,\n label: adj.label ?? null,\n calculatorKey: adj.calculatorKey ?? null,\n promotionId: adj.promotionId ?? null,\n rate: adj.rate,\n amountNet: adj.amountNet,\n amountGross: adj.amountGross,\n currencyCode: adj.currencyCode ?? null,\n metadata: adj.metadata ? cloneJson(adj.metadata) : null,\n position: adj.position,\n orderLineId:\n typeof adj.orderLine === \"string\"\n ? adj.orderLine\n : (adj.orderLine?.id ?? null),\n customFields: adjustmentCustomFields[adj.id]\n ? cloneJson(adjustmentCustomFields[adj.id])\n : null,\n })),\n addresses: addressSnapshots,\n notes: noteSnapshots,\n tags: tagSnapshots,\n shipments: shipmentSnapshots,\n payments: paymentSnapshots,\n };\n}\n\ntype DeletableEntity = {\n id?: string;\n organizationId?: string | null;\n tenantId?: string | null;\n};\n\nasync function queueDeletionSideEffects(\n dataEngine: DataEngine,\n entities: DeletableEntity[] | DeletableEntity | null | undefined,\n entityType: string,\n): Promise<void> {\n if (!entities) return;\n const list = Array.isArray(entities) ? entities : [entities];\n const tasks: Array<Promise<void>> = [];\n for (const entity of list) {\n if (!entity) continue;\n const id = typeof entity.id === \"string\" ? entity.id : null;\n if (!id) continue;\n tasks.push(\n emitCrudSideEffects({\n dataEngine,\n action: \"deleted\",\n entity,\n identifiers: {\n id,\n organizationId: entity.organizationId ?? null,\n tenantId: entity.tenantId ?? null,\n },\n indexer: { entityType },\n }),\n );\n }\n if (tasks.length) await Promise.all(tasks);\n}\n\nfunction toNumeric(value: string | number | null | undefined): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.trim().length) {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return 0;\n}\n\nconst UNIT_DICTIONARY_KEYS = [\"unit\", \"units\", \"measurement_units\"] as const;\nconst UOM_REFERENCE_UNITS = new Set<string>(REFERENCE_UNIT_CODES);\nconst UOM_NORMALIZED_SCALE = 6;\nconst UOM_NORMALIZED_MAX = 1_000_000_000_000;\nconst UNIT_PRICE_AUTOCONVERT_SCALE = 4;\n\ntype ProductUomState = {\n productId: string;\n baseUnitCode: string | null;\n defaultSalesUnit: string | null;\n unitPriceEnabled: boolean;\n unitPriceReferenceUnit: \"kg\" | \"l\" | \"m2\" | \"m3\" | \"pc\" | null;\n unitPriceBaseQuantity: string | null;\n conversionsByUnitKey: Map<string, CatalogProductUnitConversion>;\n};\n\ntype UomResolver = {\n dictionaryPromise: Promise<Dictionary | null> | null;\n unitExistsCache: Map<string, boolean>;\n productCache: Map<string, ProductUomState | null>;\n};\n\ntype NormalizeLineUomInput = {\n em: EntityManager;\n resolver: UomResolver;\n organizationId: string;\n tenantId: string;\n line: {\n productId?: string | null;\n productVariantId?: string | null;\n quantity?: number | string | null;\n quantityUnit?: string | null;\n unitPriceNet?: number | null;\n unitPriceGross?: number | null;\n normalizedQuantity?: number | string | null;\n normalizedUnit?: string | null;\n uomSnapshot?: Record<string, unknown> | null;\n };\n};\n\nfunction createUomResolver(): UomResolver {\n return {\n dictionaryPromise: null,\n unitExistsCache: new Map<string, boolean>(),\n productCache: new Map<string, ProductUomState | null>(),\n };\n}\n\nfunction normalizeUnitCode(value: unknown): string | null {\n return canonicalizeUnitCode(value);\n}\n\nfunction unitLookupKey(value: string | null | undefined): string | null {\n return toUnitLookupKey(value);\n}\n\nfunction roundNormalizedQuantity(value: number): number {\n const factor = 10 ** UOM_NORMALIZED_SCALE;\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * factor) / factor;\n}\n\nfunction assertNormalizedPrecision(value: number) {\n if (!Number.isFinite(value) || Math.abs(value) >= UOM_NORMALIZED_MAX) {\n throw new CrudHttpError(422, { error: \"uom.precision_overflow\" });\n }\n}\n\nfunction toOptionalNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"string\" && value.trim().length) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction resolveSnapshotToBaseFactor(snapshot: unknown): number {\n if (!snapshot || typeof snapshot !== \"object\") return 1;\n const payload = snapshot as Record<string, unknown>;\n const factor = toOptionalNumber(payload.toBaseFactor ?? payload.to_base_factor);\n if (!Number.isFinite(factor) || !factor || factor <= 0) return 1;\n return factor;\n}\n\nfunction roundAutoConvertedUnitPrice(value: number): number | null {\n if (!Number.isFinite(value) || value < 0) return null;\n const factor = 10 ** UNIT_PRICE_AUTOCONVERT_SCALE;\n const rounded = Math.round((value + Number.EPSILON) * factor) / factor;\n return Number.isFinite(rounded) ? rounded : null;\n}\n\nfunction convertLineUnitPricesOnUnitChange(params: {\n existingSnapshot: SalesLineSnapshot | null;\n nextQuantityUnit: string | null;\n nextUomSnapshot: SalesLineUomSnapshot | Record<string, unknown> | null;\n unitPriceNet: number | null;\n unitPriceGross: number | null;\n}): {\n unitPriceNet: number | null;\n unitPriceGross: number | null;\n didConvert: boolean;\n} {\n if (!params.existingSnapshot) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const existingUnitPriceNet =\n typeof params.existingSnapshot.unitPriceNet === \"number\" &&\n Number.isFinite(params.existingSnapshot.unitPriceNet)\n ? params.existingSnapshot.unitPriceNet\n : null;\n const existingUnitPriceGross =\n typeof params.existingSnapshot.unitPriceGross === \"number\" &&\n Number.isFinite(params.existingSnapshot.unitPriceGross)\n ? params.existingSnapshot.unitPriceGross\n : null;\n const sameNumber = (left: number | null, right: number | null): boolean => {\n if (left === null || right === null) return left === right;\n return Math.abs(left - right) < 0.000001;\n };\n const shouldConvertNet =\n params.unitPriceNet === null ||\n sameNumber(params.unitPriceNet, existingUnitPriceNet);\n const shouldConvertGross =\n params.unitPriceGross === null ||\n sameNumber(params.unitPriceGross, existingUnitPriceGross);\n if (!shouldConvertNet && !shouldConvertGross) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const previousUnit = normalizeUnitCode(params.existingSnapshot?.quantityUnit ?? null);\n const nextUnit = normalizeUnitCode(params.nextQuantityUnit);\n if (!previousUnit || !nextUnit || previousUnit === nextUnit) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const previousFactor = resolveSnapshotToBaseFactor(\n params.existingSnapshot?.uomSnapshot ?? null,\n );\n const nextFactor = resolveSnapshotToBaseFactor(params.nextUomSnapshot);\n if (\n !Number.isFinite(previousFactor) ||\n previousFactor <= 0 ||\n !Number.isFinite(nextFactor) ||\n nextFactor <= 0\n ) {\n return {\n unitPriceNet: params.unitPriceNet,\n unitPriceGross: params.unitPriceGross,\n didConvert: false,\n };\n }\n const convertAmount = (\n value: number | null,\n shouldConvert: boolean,\n ): number | null => {\n if (!shouldConvert) return value;\n if (value === null || !Number.isFinite(value)) return value;\n const converted = roundAutoConvertedUnitPrice((value / previousFactor) * nextFactor);\n return converted ?? value;\n };\n const nextUnitPriceNet = convertAmount(params.unitPriceNet, shouldConvertNet);\n const nextUnitPriceGross = convertAmount(\n params.unitPriceGross,\n shouldConvertGross,\n );\n const didConvert =\n nextUnitPriceNet !== params.unitPriceNet ||\n nextUnitPriceGross !== params.unitPriceGross;\n return {\n unitPriceNet: nextUnitPriceNet,\n unitPriceGross: nextUnitPriceGross,\n didConvert,\n };\n}\n\nfunction resolveReferenceUnit(\n value: unknown,\n): \"kg\" | \"l\" | \"m2\" | \"m3\" | \"pc\" | null {\n const normalized = toUnitLookupKey(value);\n if (!normalized) return null;\n if (!UOM_REFERENCE_UNITS.has(normalized)) return null;\n return normalized as \"kg\" | \"l\" | \"m2\" | \"m3\" | \"pc\";\n}\n\nasync function resolveUnitDictionaryScoped(\n em: EntityManager,\n organizationId: string,\n tenantId: string,\n): Promise<Dictionary | null> {\n return findOneWithDecryption(\n em,\n Dictionary,\n {\n organizationId,\n tenantId,\n key: { $in: [...UNIT_DICTIONARY_KEYS] },\n deletedAt: null,\n isActive: true,\n },\n { orderBy: { createdAt: \"asc\" } },\n );\n}\n\nasync function assertUnitExists(\n em: EntityManager,\n resolver: UomResolver,\n organizationId: string,\n tenantId: string,\n unitCode: string,\n): Promise<void> {\n const normalizedCode = unitLookupKey(unitCode);\n if (!normalizedCode) return;\n const rawUnitCode = unitCode.trim();\n if (!resolver.dictionaryPromise) {\n resolver.dictionaryPromise = resolveUnitDictionaryScoped(\n em,\n organizationId,\n tenantId,\n );\n }\n const dictionary = await resolver.dictionaryPromise;\n if (!dictionary) {\n throw new CrudHttpError(400, { error: \"uom.unit_not_found\" });\n }\n const cacheKey = `${dictionary.id}:${normalizedCode}`;\n if (resolver.unitExistsCache.has(cacheKey)) {\n if (!resolver.unitExistsCache.get(cacheKey)) {\n throw new CrudHttpError(400, { error: \"uom.unit_not_found\" });\n }\n return;\n }\n const entry = await findOneWithDecryption(em, DictionaryEntry, {\n dictionary,\n organizationId: dictionary.organizationId,\n tenantId: dictionary.tenantId,\n $or: [{ normalizedValue: normalizedCode }, { value: rawUnitCode }],\n });\n const exists = !!entry;\n resolver.unitExistsCache.set(cacheKey, exists);\n if (!exists) {\n throw new CrudHttpError(400, { error: \"uom.unit_not_found\" });\n }\n}\n\nasync function resolveProductUomState(\n em: EntityManager,\n resolver: UomResolver,\n organizationId: string,\n tenantId: string,\n productId: string,\n): Promise<ProductUomState | null> {\n if (resolver.productCache.has(productId)) {\n return resolver.productCache.get(productId) ?? null;\n }\n const product = await findOneWithDecryption(em, CatalogProduct, {\n id: productId,\n organizationId,\n tenantId,\n deletedAt: null,\n });\n if (!product) {\n resolver.productCache.set(productId, null);\n return null;\n }\n const conversions = await findWithDecryption(em, CatalogProductUnitConversion, {\n product: product.id,\n organizationId,\n tenantId,\n deletedAt: null,\n isActive: true,\n });\n const conversionsByUnitKey = new Map<string, CatalogProductUnitConversion>();\n for (const conversion of conversions) {\n const key = unitLookupKey(conversion.unitCode);\n if (!key) continue;\n conversionsByUnitKey.set(key, conversion);\n }\n const state: ProductUomState = {\n productId: product.id,\n baseUnitCode: normalizeUnitCode(product.defaultUnit ?? null),\n defaultSalesUnit: normalizeUnitCode(product.defaultSalesUnit ?? null),\n unitPriceEnabled: Boolean(product.unitPriceEnabled),\n unitPriceReferenceUnit: resolveReferenceUnit(\n product.unitPriceReferenceUnit,\n ),\n unitPriceBaseQuantity: product.unitPriceBaseQuantity ?? null,\n conversionsByUnitKey,\n };\n resolver.productCache.set(productId, state);\n return state;\n}\n\nfunction buildUnitPriceReferenceSnapshot(params: {\n product: ProductUomState;\n toBaseFactor: number;\n unitPriceNet: number | null;\n unitPriceGross: number | null;\n}) {\n if (!params.product.unitPriceEnabled) return undefined;\n const baseQuantityNumber = toNumeric(params.product.unitPriceBaseQuantity);\n const output: NonNullable<SalesLineUomSnapshot[\"unitPriceReference\"]> = {\n enabled: true,\n referenceUnitCode: params.product.unitPriceReferenceUnit ?? null,\n baseQuantity: params.product.unitPriceBaseQuantity ?? null,\n };\n if (\n !params.product.unitPriceReferenceUnit ||\n params.toBaseFactor <= 0 ||\n baseQuantityNumber <= 0\n ) {\n return output;\n }\n if (\n typeof params.unitPriceGross === \"number\" &&\n Number.isFinite(params.unitPriceGross)\n ) {\n output.grossPerReference = toNumericString(\n (params.unitPriceGross / params.toBaseFactor) * baseQuantityNumber,\n );\n }\n if (\n typeof params.unitPriceNet === \"number\" &&\n Number.isFinite(params.unitPriceNet)\n ) {\n output.netPerReference = toNumericString(\n (params.unitPriceNet / params.toBaseFactor) * baseQuantityNumber,\n );\n }\n return output;\n}\n\nasync function normalizeLineUom(input: NormalizeLineUomInput): Promise<{\n quantity: number;\n quantityUnit: string | null;\n normalizedQuantity: number;\n normalizedUnit: string | null;\n uomSnapshot: SalesLineUomSnapshot | null;\n}> {\n const quantity = toNumeric(input.line.quantity);\n const existingSnapshot =\n input.line.uomSnapshot && typeof input.line.uomSnapshot === \"object\"\n ? (cloneJson(input.line.uomSnapshot) as SalesLineUomSnapshot)\n : null;\n const productId =\n typeof input.line.productId === \"string\" ? input.line.productId : null;\n const variantId =\n typeof input.line.productVariantId === \"string\"\n ? input.line.productVariantId\n : null;\n const enteredUnitInput = normalizeUnitCode(input.line.quantityUnit);\n if (!productId) {\n if (enteredUnitInput) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n enteredUnitInput,\n );\n }\n const normalizedQuantity = toNumeric(\n input.line.normalizedQuantity ?? quantity,\n );\n assertNormalizedPrecision(normalizedQuantity);\n return {\n quantity,\n quantityUnit: enteredUnitInput ?? null,\n normalizedQuantity,\n normalizedUnit:\n normalizeUnitCode(input.line.normalizedUnit) ??\n enteredUnitInput ??\n null,\n uomSnapshot: existingSnapshot ?? {\n version: 1,\n productId: null,\n productVariantId: variantId,\n baseUnitCode:\n normalizeUnitCode(input.line.normalizedUnit) ??\n enteredUnitInput ??\n null,\n enteredUnitCode: enteredUnitInput,\n enteredQuantity: toNumericString(quantity) ?? \"0\",\n toBaseFactor: \"1\",\n normalizedQuantity: toNumericString(normalizedQuantity) ?? \"0\",\n rounding: { mode: \"half_up\", scale: UOM_NORMALIZED_SCALE },\n source: { conversionId: null, resolvedAt: new Date().toISOString() },\n },\n };\n }\n\n const productState = await resolveProductUomState(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n productId,\n );\n if (!productState) {\n if (enteredUnitInput) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n enteredUnitInput,\n );\n }\n const normalizedQuantity = toNumeric(\n input.line.normalizedQuantity ?? quantity,\n );\n assertNormalizedPrecision(normalizedQuantity);\n return {\n quantity,\n quantityUnit: enteredUnitInput ?? null,\n normalizedQuantity,\n normalizedUnit:\n normalizeUnitCode(input.line.normalizedUnit) ??\n enteredUnitInput ??\n null,\n uomSnapshot: existingSnapshot,\n };\n }\n\n const baseUnitCode = productState.baseUnitCode;\n const enteredUnitCode =\n enteredUnitInput ??\n productState.defaultSalesUnit ??\n baseUnitCode ??\n normalizeUnitCode(input.line.normalizedUnit);\n if (enteredUnitCode) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n enteredUnitCode,\n );\n }\n if (baseUnitCode) {\n await assertUnitExists(\n input.em,\n input.resolver,\n input.organizationId,\n input.tenantId,\n baseUnitCode,\n );\n }\n\n if (!baseUnitCode) {\n const requiresBase =\n Boolean(enteredUnitCode) ||\n productState.conversionsByUnitKey.size > 0 ||\n Boolean(productState.defaultSalesUnit);\n if (requiresBase) {\n throw new CrudHttpError(400, { error: \"uom.default_unit_missing\" });\n }\n const normalizedQuantity = toNumeric(\n input.line.normalizedQuantity ?? quantity,\n );\n assertNormalizedPrecision(normalizedQuantity);\n return {\n quantity,\n quantityUnit: enteredUnitCode ?? null,\n normalizedQuantity,\n normalizedUnit:\n normalizeUnitCode(input.line.normalizedUnit) ?? enteredUnitCode ?? null,\n uomSnapshot: existingSnapshot,\n };\n }\n\n const resolvedEnteredUnit = enteredUnitCode ?? baseUnitCode;\n const enteredKey = unitLookupKey(resolvedEnteredUnit);\n const baseKey = unitLookupKey(baseUnitCode);\n let toBaseFactor = 1;\n let conversionId: string | null = null;\n if (enteredKey && baseKey && enteredKey !== baseKey) {\n const conversion = productState.conversionsByUnitKey.get(enteredKey);\n if (!conversion) {\n throw new CrudHttpError(400, { error: \"uom.conversion_not_found\" });\n }\n toBaseFactor = toNumeric(conversion.toBaseFactor);\n conversionId = conversion.id;\n }\n if (!Number.isFinite(toBaseFactor) || toBaseFactor <= 0) {\n throw new CrudHttpError(400, { error: \"uom.invalid_factor\" });\n }\n const normalizedQuantity = roundNormalizedQuantity(quantity * toBaseFactor);\n assertNormalizedPrecision(normalizedQuantity);\n const unitPriceReference = buildUnitPriceReferenceSnapshot({\n product: productState,\n toBaseFactor,\n unitPriceNet: toOptionalNumber(input.line.unitPriceNet),\n unitPriceGross: toOptionalNumber(input.line.unitPriceGross),\n });\n const snapshot: SalesLineUomSnapshot = {\n version: 1,\n productId,\n productVariantId: variantId,\n baseUnitCode,\n enteredUnitCode: resolvedEnteredUnit,\n enteredQuantity: toNumericString(quantity) ?? \"0\",\n toBaseFactor: toNumericString(toBaseFactor) ?? \"1\",\n normalizedQuantity: toNumericString(normalizedQuantity) ?? \"0\",\n rounding: {\n mode: \"half_up\",\n scale: UOM_NORMALIZED_SCALE,\n },\n source: {\n conversionId,\n resolvedAt: new Date().toISOString(),\n },\n ...(unitPriceReference ? { unitPriceReference } : {}),\n };\n\n return {\n quantity,\n quantityUnit: resolvedEnteredUnit,\n normalizedQuantity,\n normalizedUnit: baseUnitCode,\n uomSnapshot: snapshot,\n };\n}\n\nfunction normalizeShippingMethodContext(\n snapshot: Record<string, unknown> | null | undefined,\n id?: string | null,\n code?: string | null,\n currencyCode?: string,\n): ShippingMethodContext | null {\n if (!snapshot || typeof snapshot !== \"object\") return null;\n const metadata = (snapshot as Record<string, unknown>).metadata;\n const providerSettings =\n (snapshot as Record<string, unknown>).providerSettings ??\n (metadata && typeof metadata === \"object\"\n ? ((metadata as Record<string, unknown>).providerSettings ?? null)\n : null);\n return {\n id:\n ((snapshot as Record<string, unknown>).id as string | undefined) ??\n id ??\n null,\n code:\n typeof (snapshot as Record<string, unknown>).code === \"string\"\n ? ((snapshot as Record<string, unknown>).code as string)\n : (code ?? null),\n name:\n typeof (snapshot as Record<string, unknown>).name === \"string\"\n ? ((snapshot as Record<string, unknown>).name as string)\n : null,\n providerKey:\n typeof (snapshot as Record<string, unknown>).providerKey === \"string\"\n ? ((snapshot as Record<string, unknown>).providerKey as string)\n : null,\n currencyCode:\n typeof (snapshot as Record<string, unknown>).currencyCode === \"string\"\n ? ((snapshot as Record<string, unknown>).currencyCode as string)\n : (currencyCode ?? null),\n baseRateNet: toNumeric(\n ((snapshot as Record<string, unknown>).baseRateNet ??\n (snapshot as Record<string, unknown>).base_rate_net) as\n | string\n | number\n | null,\n ),\n baseRateGross: toNumeric(\n ((snapshot as Record<string, unknown>).baseRateGross ??\n (snapshot as Record<string, unknown>).base_rate_gross) as\n | string\n | number\n | null,\n ),\n metadata:\n metadata && typeof metadata === \"object\"\n ? cloneJson(metadata as Record<string, unknown>)\n : null,\n providerSettings:\n providerSettings && typeof providerSettings === \"object\"\n ? cloneJson(providerSettings as Record<string, unknown>)\n : null,\n };\n}\n\nfunction normalizePaymentMethodContext(\n snapshot: Record<string, unknown> | null | undefined,\n id?: string | null,\n code?: string | null,\n): PaymentMethodContext | null {\n if (!snapshot || typeof snapshot !== \"object\") return null;\n const metadata = (snapshot as Record<string, unknown>).metadata;\n const providerSettings =\n (snapshot as Record<string, unknown>).providerSettings ??\n (metadata && typeof metadata === \"object\"\n ? ((metadata as Record<string, unknown>).providerSettings ?? null)\n : null);\n return {\n id:\n ((snapshot as Record<string, unknown>).id as string | undefined) ??\n id ??\n null,\n code:\n typeof (snapshot as Record<string, unknown>).code === \"string\"\n ? ((snapshot as Record<string, unknown>).code as string)\n : (code ?? null),\n name:\n typeof (snapshot as Record<string, unknown>).name === \"string\"\n ? ((snapshot as Record<string, unknown>).name as string)\n : null,\n providerKey:\n typeof (snapshot as Record<string, unknown>).providerKey === \"string\"\n ? ((snapshot as Record<string, unknown>).providerKey as string)\n : null,\n terms:\n typeof (snapshot as Record<string, unknown>).terms === \"string\"\n ? ((snapshot as Record<string, unknown>).terms as string)\n : null,\n metadata:\n metadata && typeof metadata === \"object\"\n ? cloneJson(metadata as Record<string, unknown>)\n : null,\n providerSettings:\n providerSettings && typeof providerSettings === \"object\"\n ? cloneJson(providerSettings as Record<string, unknown>)\n : null,\n };\n}\n\nfunction buildProviderContext(params: {\n shippingSnapshot?: Record<string, unknown> | null;\n paymentSnapshot?: Record<string, unknown> | null;\n shippingMethodId?: string | null;\n paymentMethodId?: string | null;\n shippingMethodCode?: string | null;\n paymentMethodCode?: string | null;\n currencyCode: string;\n}) {\n return {\n shippingMethod: normalizeShippingMethodContext(\n params.shippingSnapshot,\n params.shippingMethodId,\n params.shippingMethodCode,\n params.currencyCode,\n ),\n paymentMethod: normalizePaymentMethodContext(\n params.paymentSnapshot,\n params.paymentMethodId,\n params.paymentMethodCode,\n ),\n };\n}\n\nfunction buildCalculationContext(params: {\n tenantId: string;\n organizationId: string;\n currencyCode: string;\n shippingSnapshot?: Record<string, unknown> | null;\n paymentSnapshot?: Record<string, unknown> | null;\n shippingMethodId?: string | null;\n paymentMethodId?: string | null;\n shippingMethodCode?: string | null;\n paymentMethodCode?: string | null;\n}) {\n return {\n tenantId: params.tenantId,\n organizationId: params.organizationId,\n currencyCode: params.currencyCode,\n metadata: buildProviderContext({\n shippingSnapshot: params.shippingSnapshot,\n paymentSnapshot: params.paymentSnapshot,\n shippingMethodId: params.shippingMethodId,\n paymentMethodId: params.paymentMethodId,\n shippingMethodCode: params.shippingMethodCode,\n paymentMethodCode: params.paymentMethodCode,\n currencyCode: params.currencyCode,\n }),\n };\n}\n\nfunction mapOrderLineEntityToSnapshot(line: SalesOrderLine): SalesLineSnapshot {\n return {\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: toNumeric(line.quantity),\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: toNumeric(line.normalizedQuantity ?? line.quantity),\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: toNumeric(line.unitPriceNet),\n unitPriceGross: toNumeric(line.unitPriceGross),\n discountAmount: toNumeric(line.discountAmount),\n discountPercent: toNumeric(line.discountPercent),\n taxRate: toNumeric(line.taxRate),\n taxAmount: toNumeric(line.taxAmount),\n totalNetAmount: toNumeric(line.totalNetAmount),\n totalGrossAmount: toNumeric(line.totalGrossAmount),\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n };\n}\n\nfunction mapQuoteLineEntityToSnapshot(line: SalesQuoteLine): SalesLineSnapshot {\n return {\n id: line.id,\n lineNumber: line.lineNumber,\n kind: line.kind,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: toNumeric(line.quantity),\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: toNumeric(line.normalizedQuantity ?? line.quantity),\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: toNumeric(line.unitPriceNet),\n unitPriceGross: toNumeric(line.unitPriceGross),\n discountAmount: toNumeric(line.discountAmount),\n discountPercent: toNumeric(line.discountPercent),\n taxRate: toNumeric(line.taxRate),\n taxAmount: toNumeric(line.taxAmount),\n totalNetAmount: toNumeric(line.totalNetAmount),\n totalGrossAmount: toNumeric(line.totalGrossAmount),\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n };\n}\n\nfunction mapOrderAdjustmentToDraft(\n adjustment: SalesOrderAdjustment,\n): SalesAdjustmentDraft {\n return {\n id: adjustment.id,\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: toNumeric(adjustment.rate),\n amountNet: toNumeric(adjustment.amountNet),\n amountGross: toNumeric(adjustment.amountGross),\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? 0,\n };\n}\n\nfunction mapQuoteAdjustmentToDraft(\n adjustment: SalesQuoteAdjustment,\n): SalesAdjustmentDraft {\n return {\n id: adjustment.id,\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: toNumeric(adjustment.rate),\n amountNet: toNumeric(adjustment.amountNet),\n amountGross: toNumeric(adjustment.amountGross),\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? 0,\n };\n}\n\nasync function emitTotalsCalculated(\n eventBus: EventBus | null | undefined,\n payload: {\n documentKind: SalesDocumentKind;\n documentId: string;\n organizationId: string;\n tenantId: string;\n customerId?: string | null;\n totals: SalesDocumentCalculationResult[\"totals\"];\n lineCount: number;\n },\n): Promise<void> {\n if (!eventBus) return;\n await eventBus.emitEvent(\"sales.document.totals.calculated\", payload);\n}\n\nfunction createLineSnapshotFromInput(\n line: DocumentLineCreateInput,\n lineNumber: number,\n): SalesLineSnapshot {\n const quantity = Number(line.quantity ?? 0);\n const normalizedQuantity = toNumeric(\n line.normalizedQuantity ?? quantity,\n );\n return {\n lineNumber,\n kind: line.kind ?? \"product\",\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity,\n normalizedUnit:\n typeof line.normalizedUnit === \"string\"\n ? line.normalizedUnit\n : (line.quantityUnit ?? null),\n uomSnapshot:\n line.uomSnapshot && typeof line.uomSnapshot === \"object\"\n ? cloneJson(line.uomSnapshot as Record<string, unknown>)\n : null,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet ?? null,\n unitPriceGross: line.unitPriceGross ?? null,\n discountAmount: line.discountAmount ?? null,\n discountPercent: line.discountPercent ?? null,\n taxRate: line.taxRate ?? null,\n taxAmount: line.taxAmount ?? null,\n totalNetAmount: line.totalNetAmount ?? null,\n totalGrossAmount: line.totalGrossAmount ?? null,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId:\n \"customFieldSetId\" in line\n ? ((line as any).customFieldSetId ?? null)\n : null,\n customFields:\n \"customFields\" in line && line.customFields\n ? cloneJson((line as any).customFields)\n : null,\n };\n}\n\nfunction createAdjustmentDraftFromInput(\n adjustment: DocumentAdjustmentCreateInput & { id?: string | null },\n): SalesAdjustmentDraft {\n const lineRef =\n \"quoteLineId\" in adjustment\n ? (adjustment as any).quoteLineId\n : (adjustment as any).orderLineId;\n if (adjustment.scope === \"line\" && lineRef) {\n throw new CrudHttpError(400, {\n error: \"Line-scoped adjustments are not supported yet.\",\n });\n }\n return {\n id: typeof adjustment.id === \"string\" ? adjustment.id : undefined,\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind ?? \"custom\",\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: adjustment.rate ?? null,\n amountNet: adjustment.amountNet ?? null,\n amountGross: adjustment.amountGross ?? null,\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? 0,\n };\n}\n\nfunction convertLineCalculationToEntityInput(\n lineResult: SalesLineCalculationResult,\n sourceLine: DocumentLineCreateInput,\n document: { organizationId: string; tenantId: string },\n index: number,\n) {\n const line = lineResult.line;\n return {\n lineNumber: line.lineNumber ?? index + 1,\n kind: line.kind ?? \"product\",\n statusEntryId: sourceLine.statusEntryId ?? null,\n productId: sourceLine.productId ?? null,\n productVariantId: sourceLine.productVariantId ?? null,\n catalogSnapshot: sourceLine.catalogSnapshot\n ? cloneJson(sourceLine.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: toNumericString(line.quantity) ?? \"0\",\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity:\n toNumericString(line.normalizedQuantity ?? line.quantity) ?? \"0\",\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot:\n line.uomSnapshot && typeof line.uomSnapshot === \"object\"\n ? cloneJson(line.uomSnapshot as Record<string, unknown>)\n : null,\n currencyCode: line.currencyCode,\n unitPriceNet:\n toNumericString(\n line.unitPriceNet ??\n lineResult.netAmount / Math.max(line.quantity || 1, 1),\n ) ?? \"0\",\n unitPriceGross:\n toNumericString(\n line.unitPriceGross ??\n lineResult.grossAmount / Math.max(line.quantity || 1, 1),\n ) ?? \"0\",\n discountAmount: toNumericString(lineResult.discountAmount) ?? \"0\",\n discountPercent: toNumericString(line.discountPercent) ?? \"0\",\n taxRate: toNumericString(line.taxRate) ?? \"0\",\n taxAmount: toNumericString(lineResult.taxAmount) ?? \"0\",\n totalNetAmount: toNumericString(lineResult.netAmount) ?? \"0\",\n totalGrossAmount: toNumericString(lineResult.grossAmount) ?? \"0\",\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: sourceLine.promotionSnapshot\n ? cloneJson(sourceLine.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: sourceLine.customFieldSetId ?? null,\n organizationId: document.organizationId,\n tenantId: document.tenantId,\n };\n}\n\nfunction convertAdjustmentResultToEntityInput(\n adjustment: SalesAdjustmentDraft,\n sourceAdjustment: DocumentAdjustmentCreateInput | null,\n document: { organizationId: string; tenantId: string },\n index: number,\n) {\n const metadata = adjustment.metadata ? cloneJson(adjustment.metadata) : null;\n const resolvedPosition =\n sourceAdjustment?.position ??\n (adjustment.position !== null && adjustment.position !== undefined\n ? adjustment.position\n : index);\n return {\n scope: adjustment.scope ?? \"order\",\n kind: adjustment.kind ?? \"custom\",\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: toNumericString(adjustment.rate) ?? \"0\",\n amountNet: toNumericString(adjustment.amountNet) ?? \"0\",\n amountGross:\n toNumericString(adjustment.amountGross ?? adjustment.amountNet) ?? \"0\",\n currencyCode: adjustment.currencyCode ?? null,\n metadata,\n position: resolvedPosition,\n organizationId: document.organizationId,\n tenantId: document.tenantId,\n };\n}\n\nasync function applyOrderLineResults(params: {\n em: EntityManager;\n order: SalesOrder;\n calculation: SalesDocumentCalculationResult;\n sourceLines: Array<DocumentLineCreateInput & { id?: string }>;\n existingLines: SalesOrderLine[];\n}): Promise<void> {\n const { em, order, calculation, sourceLines, existingLines } = params;\n const existingMap = new Map(existingLines.map((line) => [line.id, line]));\n const persisted = new Set<string>();\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = sourceLines[index];\n const statusEntryId = (sourceLine as any).statusEntryId ?? null;\n const statusValue = await resolveStatus(statusEntryId ?? null);\n const payload = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n order,\n index,\n );\n const existing = sourceLine.id\n ? (existingMap.get(sourceLine.id) ?? null)\n : null;\n const lineEntity =\n existing ??\n em.create(SalesOrderLine, {\n order,\n id: sourceLine.id ?? undefined,\n reservedQuantity: existing?.reservedQuantity ?? \"0\",\n fulfilledQuantity: existing?.fulfilledQuantity ?? \"0\",\n invoicedQuantity: existing?.invoicedQuantity ?? \"0\",\n returnedQuantity: existing?.returnedQuantity ?? \"0\",\n createdAt: existing?.createdAt ?? new Date(),\n updatedAt: new Date(),\n });\n Object.assign(lineEntity, {\n ...payload,\n order,\n statusEntryId,\n status: statusValue,\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: lineEntity.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n persisted.add(lineEntity.id);\n }\n for (const [id, line] of existingMap.entries()) {\n if (!persisted.has(id)) {\n em.remove(line);\n }\n }\n}\n\nasync function applyQuoteLineResults(params: {\n em: EntityManager;\n quote: SalesQuote;\n calculation: SalesDocumentCalculationResult;\n sourceLines: Array<DocumentLineCreateInput & { id?: string }>;\n existingLines: SalesQuoteLine[];\n}): Promise<void> {\n const { em, quote, calculation, sourceLines, existingLines } = params;\n const existingMap = new Map(existingLines.map((line) => [line.id, line]));\n const persisted = new Set<string>();\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = sourceLines[index];\n const statusEntryId = (sourceLine as any).statusEntryId ?? null;\n const statusValue = await resolveStatus(statusEntryId ?? null);\n const payload = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n quote,\n index,\n );\n const existing = sourceLine.id\n ? (existingMap.get(sourceLine.id) ?? null)\n : null;\n const lineEntity =\n existing ??\n em.create(SalesQuoteLine, {\n quote,\n id: sourceLine.id ?? undefined,\n createdAt: existing?.createdAt ?? new Date(),\n updatedAt: new Date(),\n });\n Object.assign(lineEntity, {\n ...payload,\n quote,\n statusEntryId,\n status: statusValue,\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_line,\n recordId: lineEntity.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n persisted.add(lineEntity.id);\n }\n for (const [id, line] of existingMap.entries()) {\n if (!persisted.has(id)) {\n em.remove(line);\n }\n }\n}\n\nasync function replaceQuoteLines(\n em: EntityManager,\n quote: SalesQuote,\n calculation: SalesDocumentCalculationResult,\n lineInputs: QuoteLineCreateInput[],\n): Promise<void> {\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = lineInputs[index];\n const entityInput = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n quote,\n index,\n );\n const statusValue = await resolveStatus(sourceLine.statusEntryId ?? null);\n const lineEntity = em.create(SalesQuoteLine, {\n quote,\n ...entityInput,\n status: statusValue,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_line,\n recordId: lineEntity.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n }\n}\n\nasync function replaceQuoteAdjustments(\n em: EntityManager,\n quote: SalesQuote,\n calculation: SalesDocumentCalculationResult,\n adjustmentInputs: QuoteAdjustmentCreateInput[] | null,\n): Promise<void> {\n const existing = await em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n );\n const existingMap = new Map<string, SalesQuoteAdjustment>();\n existing.forEach((adj) => existingMap.set(adj.id, adj));\n const seen = new Set<string>();\n const adjustmentDrafts = calculation.adjustments;\n for (let index = 0; index < adjustmentDrafts.length; index += 1) {\n const draft = adjustmentDrafts[index];\n const sourceById =\n adjustmentInputs?.find((adj) => (adj as any).id === draft.id) ?? null;\n const source =\n sourceById ??\n (adjustmentInputs ? (adjustmentInputs[index] ?? null) : null);\n const entityInput = convertAdjustmentResultToEntityInput(\n draft,\n source,\n quote,\n index,\n );\n const adjustmentId =\n (draft as any).id ?? (source as any)?.id ?? randomUUID();\n const existingEntity = existingMap.get(adjustmentId);\n const entity =\n existingEntity ??\n em.create(SalesQuoteAdjustment, {\n id: adjustmentId,\n quote,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n createdAt: new Date(),\n });\n entity.scope = entityInput.scope;\n entity.kind = entityInput.kind;\n entity.code = entityInput.code ?? null;\n entity.label = entityInput.label ?? null;\n entity.calculatorKey = entityInput.calculatorKey ?? null;\n entity.promotionId = entityInput.promotionId ?? null;\n entity.rate = entityInput.rate ?? \"0\";\n entity.amountNet = entityInput.amountNet ?? \"0\";\n entity.amountGross =\n entityInput.amountGross ?? entityInput.amountNet ?? \"0\";\n entity.currencyCode = entityInput.currencyCode ?? quote.currencyCode;\n entity.metadata = entityInput.metadata ?? null;\n entity.position = entityInput.position ?? index;\n entity.updatedAt = new Date();\n entity.quoteLine = null;\n seen.add(adjustmentId);\n if (source?.customFields !== undefined) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_adjustment,\n recordId: adjustmentId,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values:\n source.customFields && typeof source.customFields === \"object\"\n ? (source.customFields as Record<string, unknown>)\n : {},\n });\n }\n em.persist(entity);\n }\n\n existing.forEach((adj) => {\n if (!seen.has(adj.id)) {\n em.remove(adj);\n }\n });\n}\n\nasync function replaceOrderLines(\n em: EntityManager,\n order: SalesOrder,\n calculation: SalesDocumentCalculationResult,\n lineInputs: OrderLineCreateInput[],\n): Promise<void> {\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n const statusCache = new Map<string, string | null>();\n const resolveStatus = async (entryId?: string | null) => {\n if (!entryId) return null;\n if (statusCache.has(entryId)) return statusCache.get(entryId) ?? null;\n const value = await resolveDictionaryEntryValue(em, entryId);\n statusCache.set(entryId, value);\n return value;\n };\n for (let index = 0; index < calculation.lines.length; index += 1) {\n const lineResult = calculation.lines[index];\n const sourceLine = lineInputs[index];\n const entityInput = convertLineCalculationToEntityInput(\n lineResult,\n sourceLine,\n order,\n index,\n );\n const statusValue = await resolveStatus(sourceLine.statusEntryId ?? null);\n const lineEntity = em.create(SalesOrderLine, {\n order,\n ...entityInput,\n reservedQuantity: \"0\",\n fulfilledQuantity: \"0\",\n invoicedQuantity: \"0\",\n returnedQuantity: \"0\",\n status: statusValue,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n const rawCustomFields = (sourceLine as any).customFields;\n if (rawCustomFields !== undefined && rawCustomFields !== null) {\n const customValues =\n rawCustomFields && typeof rawCustomFields === \"object\"\n ? (rawCustomFields as Record<string, unknown>)\n : {};\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: lineEntity.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(customValues),\n });\n }\n }\n}\n\nasync function replaceOrderAdjustments(\n em: EntityManager,\n order: SalesOrder,\n calculation: SalesDocumentCalculationResult,\n adjustmentInputs: OrderAdjustmentCreateInput[] | null,\n): Promise<void> {\n const existing = await em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n );\n const existingMap = new Map<string, SalesOrderAdjustment>();\n existing.forEach((adj) => existingMap.set(adj.id, adj));\n const seen = new Set<string>();\n const adjustmentDrafts = calculation.adjustments;\n for (let index = 0; index < adjustmentDrafts.length; index += 1) {\n const draft = adjustmentDrafts[index];\n const sourceById =\n adjustmentInputs?.find((adj) => (adj as any).id === draft.id) ?? null;\n const source =\n sourceById ??\n (adjustmentInputs ? (adjustmentInputs[index] ?? null) : null);\n const entityInput = convertAdjustmentResultToEntityInput(\n draft,\n source,\n order,\n index,\n );\n const adjustmentId =\n (draft as any).id ?? (source as any)?.id ?? randomUUID();\n const existingEntity = existingMap.get(adjustmentId);\n const entity =\n existingEntity ??\n em.create(SalesOrderAdjustment, {\n id: adjustmentId,\n order,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n createdAt: new Date(),\n });\n entity.scope = entityInput.scope;\n entity.kind = entityInput.kind;\n entity.code = entityInput.code ?? null;\n entity.label = entityInput.label ?? null;\n entity.calculatorKey = entityInput.calculatorKey ?? null;\n entity.promotionId = entityInput.promotionId ?? null;\n entity.rate = entityInput.rate ?? \"0\";\n entity.amountNet = entityInput.amountNet ?? \"0\";\n entity.amountGross =\n entityInput.amountGross ?? entityInput.amountNet ?? \"0\";\n entity.currencyCode = entityInput.currencyCode ?? order.currencyCode;\n entity.metadata = entityInput.metadata ?? null;\n entity.position = entityInput.position ?? index;\n entity.updatedAt = new Date();\n entity.orderLine = null;\n seen.add(adjustmentId);\n if (source?.customFields !== undefined) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_adjustment,\n recordId: adjustmentId,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values:\n source.customFields && typeof source.customFields === \"object\"\n ? (source.customFields as Record<string, unknown>)\n : {},\n });\n }\n em.persist(entity);\n }\n\n existing.forEach((adj) => {\n if (!seen.has(adj.id)) {\n em.remove(adj);\n }\n });\n}\n\nfunction applyQuoteTotals(\n quote: SalesQuote,\n totals: SalesDocumentCalculationResult[\"totals\"],\n lineCount: number,\n): void {\n quote.subtotalNetAmount = toNumericString(totals.subtotalNetAmount) ?? \"0\";\n quote.subtotalGrossAmount =\n toNumericString(totals.subtotalGrossAmount) ?? \"0\";\n quote.discountTotalAmount =\n toNumericString(totals.discountTotalAmount) ?? \"0\";\n quote.taxTotalAmount = toNumericString(totals.taxTotalAmount) ?? \"0\";\n quote.grandTotalNetAmount =\n toNumericString(totals.grandTotalNetAmount) ?? \"0\";\n quote.grandTotalGrossAmount =\n toNumericString(totals.grandTotalGrossAmount) ?? \"0\";\n quote.totalsSnapshot = cloneJson(totals);\n quote.lineItemCount = lineCount;\n}\n\nfunction applyOrderTotals(\n order: SalesOrder,\n totals: SalesDocumentCalculationResult[\"totals\"],\n lineCount: number,\n): void {\n order.subtotalNetAmount = toNumericString(totals.subtotalNetAmount) ?? \"0\";\n order.subtotalGrossAmount =\n toNumericString(totals.subtotalGrossAmount) ?? \"0\";\n order.discountTotalAmount =\n toNumericString(totals.discountTotalAmount) ?? \"0\";\n order.taxTotalAmount = toNumericString(totals.taxTotalAmount) ?? \"0\";\n order.shippingNetAmount = toNumericString(totals.shippingNetAmount) ?? \"0\";\n order.shippingGrossAmount =\n toNumericString(totals.shippingGrossAmount) ?? \"0\";\n order.surchargeTotalAmount =\n toNumericString(totals.surchargeTotalAmount) ?? \"0\";\n order.grandTotalNetAmount =\n toNumericString(totals.grandTotalNetAmount) ?? \"0\";\n order.grandTotalGrossAmount =\n toNumericString(totals.grandTotalGrossAmount) ?? \"0\";\n order.paidTotalAmount = toNumericString(totals.paidTotalAmount) ?? \"0\";\n order.refundedTotalAmount =\n toNumericString(totals.refundedTotalAmount) ?? \"0\";\n order.outstandingAmount = toNumericString(totals.outstandingAmount) ?? \"0\";\n order.totalsSnapshot = cloneJson(totals);\n order.lineItemCount = lineCount;\n}\n\nfunction normalizePaymentTotal(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value))\n return Math.max(value, 0);\n if (typeof value === \"string\" && value.trim().length) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? Math.max(parsed, 0) : 0;\n }\n return 0;\n}\n\nfunction resolveExistingPaymentTotals(order: SalesOrder) {\n return {\n paidTotalAmount: normalizePaymentTotal(order.paidTotalAmount),\n refundedTotalAmount: normalizePaymentTotal(order.refundedTotalAmount),\n };\n}\n\nfunction ensureQuoteScope(\n ctx: Parameters<typeof ensureTenantScope>[0],\n organizationId: string,\n tenantId: string,\n): void {\n ensureTenantScope(ctx, tenantId);\n ensureOrganizationScope(ctx, organizationId);\n}\n\nfunction ensureOrderScope(\n ctx: Parameters<typeof ensureTenantScope>[0],\n organizationId: string,\n tenantId: string,\n): void {\n ensureTenantScope(ctx, tenantId);\n ensureOrganizationScope(ctx, organizationId);\n}\n\nfunction normalizeTagIds(tags?: Array<string | null | undefined>): string[] {\n if (!Array.isArray(tags)) return [];\n const set = new Set<string>();\n tags.forEach((id) => {\n if (typeof id === \"string\" && id.trim().length > 0) set.add(id.trim());\n });\n return Array.from(set);\n}\n\nfunction buildTagChange(\n beforeTags: TagAssignmentSnapshot[] | undefined,\n afterTags: TagAssignmentSnapshot[] | undefined,\n): { from: string[]; to: string[] } | null {\n const beforeIds = normalizeTagIds(beforeTags?.map((tag) => tag.tagId));\n const afterIds = normalizeTagIds(afterTags?.map((tag) => tag.tagId));\n beforeIds.sort();\n afterIds.sort();\n if (\n beforeIds.length === afterIds.length &&\n beforeIds.every((id, index) => id === afterIds[index])\n ) {\n return null;\n }\n return { from: beforeIds, to: afterIds };\n}\n\nfunction buildDocumentUpdateChangeKeys(kind: SalesDocumentKind, input: DocumentUpdateInput): string[] {\n const keys = new Set<string>();\n if (kind === \"order\") {\n if (input.orderNumber !== undefined) keys.add(\"orderNumber\");\n } else {\n if (input.quoteNumber !== undefined) keys.add(\"quoteNumber\");\n }\n if (input.statusEntryId !== undefined) {\n keys.add(\"statusEntryId\");\n keys.add(\"status\");\n }\n if (input.customerEntityId !== undefined) {\n keys.add(\"customerEntityId\");\n keys.add(\"customerContactId\");\n keys.add(\"customerSnapshot\");\n keys.add(\"billingAddressId\");\n keys.add(\"shippingAddressId\");\n keys.add(\"billingAddressSnapshot\");\n keys.add(\"shippingAddressSnapshot\");\n }\n if (input.customerContactId !== undefined) {\n keys.add(\"customerContactId\");\n keys.add(\"customerSnapshot\");\n }\n if (input.customerSnapshot !== undefined) keys.add(\"customerSnapshot\");\n if (input.metadata !== undefined) keys.add(\"metadata\");\n if (input.comment !== undefined) keys.add(\"comments\");\n if (input.currencyCode !== undefined) keys.add(\"currencyCode\");\n if (input.channelId !== undefined) keys.add(\"channelId\");\n if (kind === \"order\") {\n if (input.placedAt !== undefined) keys.add(\"placedAt\");\n if (input.expectedDeliveryAt !== undefined) keys.add(\"expectedDeliveryAt\");\n }\n if (\n input.shippingAddressId !== undefined ||\n input.shippingAddressSnapshot !== undefined\n ) {\n keys.add(\"shippingAddressId\");\n keys.add(\"shippingAddressSnapshot\");\n }\n if (\n input.billingAddressId !== undefined ||\n input.billingAddressSnapshot !== undefined\n ) {\n keys.add(\"billingAddressId\");\n keys.add(\"billingAddressSnapshot\");\n }\n if (\n input.shippingMethodId !== undefined ||\n input.shippingMethodCode !== undefined ||\n input.shippingMethodSnapshot !== undefined\n ) {\n keys.add(\"shippingMethodId\");\n keys.add(\"shippingMethodCode\");\n keys.add(\"shippingMethodSnapshot\");\n }\n if (\n input.paymentMethodId !== undefined ||\n input.paymentMethodCode !== undefined ||\n input.paymentMethodSnapshot !== undefined\n ) {\n keys.add(\"paymentMethodId\");\n keys.add(\"paymentMethodCode\");\n keys.add(\"paymentMethodSnapshot\");\n }\n if (input.customFieldSetId !== undefined) keys.add(\"customFieldSetId\");\n if (input.customFields !== undefined) keys.add(\"customFields\");\n return Array.from(keys);\n}\n\nasync function syncSalesDocumentTags(\n em: EntityManager,\n params: {\n documentId: string;\n kind: SalesDocumentKind;\n organizationId: string;\n tenantId: string;\n tagIds?: Array<string | null | undefined> | null;\n },\n) {\n if (params.tagIds === undefined) return;\n const tagIds = normalizeTagIds(params.tagIds);\n if (tagIds.length === 0) {\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: params.documentId,\n documentKind: params.kind,\n });\n return;\n }\n const tagsInScope = await em.find(SalesDocumentTag, {\n id: { $in: tagIds },\n organizationId: params.organizationId,\n tenantId: params.tenantId,\n });\n if (tagsInScope.length !== tagIds.length) {\n throw new CrudHttpError(400, {\n error: \"One or more tags not found for this scope\",\n });\n }\n const byId = new Map(tagsInScope.map((tag) => [tag.id, tag]));\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: params.documentId,\n documentKind: params.kind,\n });\n for (const tagId of tagIds) {\n const tag = byId.get(tagId);\n if (!tag) continue;\n const assignment = em.create(SalesDocumentTagAssignment, {\n organizationId: params.organizationId,\n tenantId: params.tenantId,\n documentId: params.documentId,\n documentKind: params.kind,\n tag,\n order:\n params.kind === \"order\"\n ? em.getReference(SalesOrder, params.documentId)\n : null,\n quote:\n params.kind === \"quote\"\n ? em.getReference(SalesQuote, params.documentId)\n : null,\n });\n em.persist(assignment);\n }\n}\n\nfunction applyQuoteSnapshot(\n quote: SalesQuote,\n snapshot: QuoteGraphSnapshot[\"quote\"],\n): void {\n quote.organizationId = snapshot.organizationId;\n quote.tenantId = snapshot.tenantId;\n quote.quoteNumber = snapshot.quoteNumber;\n quote.statusEntryId = snapshot.statusEntryId ?? null;\n quote.status = snapshot.status ?? null;\n quote.customerEntityId = snapshot.customerEntityId ?? null;\n quote.customerContactId = snapshot.customerContactId ?? null;\n quote.customerSnapshot = snapshot.customerSnapshot\n ? cloneJson(snapshot.customerSnapshot)\n : null;\n quote.billingAddressId = snapshot.billingAddressId ?? null;\n quote.shippingAddressId = snapshot.shippingAddressId ?? null;\n quote.billingAddressSnapshot = snapshot.billingAddressSnapshot\n ? cloneJson(snapshot.billingAddressSnapshot)\n : null;\n quote.shippingAddressSnapshot = snapshot.shippingAddressSnapshot\n ? cloneJson(snapshot.shippingAddressSnapshot)\n : null;\n quote.currencyCode = snapshot.currencyCode;\n quote.validFrom = snapshot.validFrom ? new Date(snapshot.validFrom) : null;\n quote.validUntil = snapshot.validUntil ? new Date(snapshot.validUntil) : null;\n quote.comments = snapshot.comments ?? null;\n quote.taxInfo = snapshot.taxInfo ? cloneJson(snapshot.taxInfo) : null;\n quote.shippingMethodId = snapshot.shippingMethodId ?? null;\n quote.shippingMethodCode = snapshot.shippingMethodCode ?? null;\n quote.deliveryWindowId = snapshot.deliveryWindowId ?? null;\n quote.deliveryWindowCode = snapshot.deliveryWindowCode ?? null;\n quote.paymentMethodId = snapshot.paymentMethodId ?? null;\n quote.paymentMethodCode = snapshot.paymentMethodCode ?? null;\n quote.shippingMethodSnapshot = snapshot.shippingMethodSnapshot\n ? cloneJson(snapshot.shippingMethodSnapshot)\n : null;\n quote.deliveryWindowSnapshot = snapshot.deliveryWindowSnapshot\n ? cloneJson(snapshot.deliveryWindowSnapshot)\n : null;\n quote.paymentMethodSnapshot = snapshot.paymentMethodSnapshot\n ? cloneJson(snapshot.paymentMethodSnapshot)\n : null;\n quote.metadata = snapshot.metadata ? cloneJson(snapshot.metadata) : null;\n quote.channelId = snapshot.channelId ?? null;\n quote.customFieldSetId = snapshot.customFieldSetId ?? null;\n quote.subtotalNetAmount = snapshot.subtotalNetAmount;\n quote.subtotalGrossAmount = snapshot.subtotalGrossAmount;\n quote.discountTotalAmount = snapshot.discountTotalAmount;\n quote.taxTotalAmount = snapshot.taxTotalAmount;\n quote.grandTotalNetAmount = snapshot.grandTotalNetAmount;\n quote.grandTotalGrossAmount = snapshot.grandTotalGrossAmount;\n quote.totalsSnapshot = snapshot.totalsSnapshot\n ? cloneJson(snapshot.totalsSnapshot)\n : null;\n quote.lineItemCount = snapshot.lineItemCount;\n}\n\nfunction applyOrderSnapshot(\n order: SalesOrder,\n snapshot: OrderGraphSnapshot[\"order\"],\n): void {\n order.organizationId = snapshot.organizationId;\n order.tenantId = snapshot.tenantId;\n order.orderNumber = snapshot.orderNumber;\n order.statusEntryId = snapshot.statusEntryId ?? null;\n order.status = snapshot.status ?? null;\n order.fulfillmentStatusEntryId = snapshot.fulfillmentStatusEntryId ?? null;\n order.fulfillmentStatus = snapshot.fulfillmentStatus ?? null;\n order.paymentStatusEntryId = snapshot.paymentStatusEntryId ?? null;\n order.paymentStatus = snapshot.paymentStatus ?? null;\n order.customerEntityId = snapshot.customerEntityId ?? null;\n order.customerContactId = snapshot.customerContactId ?? null;\n order.customerSnapshot = snapshot.customerSnapshot\n ? cloneJson(snapshot.customerSnapshot)\n : null;\n order.billingAddressId = snapshot.billingAddressId ?? null;\n order.shippingAddressId = snapshot.shippingAddressId ?? null;\n order.billingAddressSnapshot = snapshot.billingAddressSnapshot\n ? cloneJson(snapshot.billingAddressSnapshot)\n : null;\n order.shippingAddressSnapshot = snapshot.shippingAddressSnapshot\n ? cloneJson(snapshot.shippingAddressSnapshot)\n : null;\n order.currencyCode = snapshot.currencyCode;\n order.exchangeRate = snapshot.exchangeRate ?? null;\n order.taxStrategyKey = snapshot.taxStrategyKey ?? null;\n order.discountStrategyKey = snapshot.discountStrategyKey ?? null;\n order.taxInfo = snapshot.taxInfo ? cloneJson(snapshot.taxInfo) : null;\n order.shippingMethodId = snapshot.shippingMethodId ?? null;\n order.shippingMethodCode = snapshot.shippingMethodCode ?? null;\n order.deliveryWindowId = snapshot.deliveryWindowId ?? null;\n order.deliveryWindowCode = snapshot.deliveryWindowCode ?? null;\n order.paymentMethodId = snapshot.paymentMethodId ?? null;\n order.paymentMethodCode = snapshot.paymentMethodCode ?? null;\n order.channelId = snapshot.channelId ?? null;\n order.placedAt = snapshot.placedAt ? new Date(snapshot.placedAt) : null;\n order.expectedDeliveryAt = snapshot.expectedDeliveryAt\n ? new Date(snapshot.expectedDeliveryAt)\n : null;\n order.dueAt = snapshot.dueAt ? new Date(snapshot.dueAt) : null;\n order.comments = snapshot.comments ?? null;\n order.internalNotes = snapshot.internalNotes ?? null;\n order.shippingMethodSnapshot = snapshot.shippingMethodSnapshot\n ? cloneJson(snapshot.shippingMethodSnapshot)\n : null;\n order.deliveryWindowSnapshot = snapshot.deliveryWindowSnapshot\n ? cloneJson(snapshot.deliveryWindowSnapshot)\n : null;\n order.paymentMethodSnapshot = snapshot.paymentMethodSnapshot\n ? cloneJson(snapshot.paymentMethodSnapshot)\n : null;\n order.metadata = snapshot.metadata ? cloneJson(snapshot.metadata) : null;\n order.customFieldSetId = snapshot.customFieldSetId ?? null;\n order.subtotalNetAmount = snapshot.subtotalNetAmount;\n order.subtotalGrossAmount = snapshot.subtotalGrossAmount;\n order.discountTotalAmount = snapshot.discountTotalAmount;\n order.taxTotalAmount = snapshot.taxTotalAmount;\n order.shippingNetAmount = snapshot.shippingNetAmount;\n order.shippingGrossAmount = snapshot.shippingGrossAmount;\n order.surchargeTotalAmount = snapshot.surchargeTotalAmount;\n order.grandTotalNetAmount = snapshot.grandTotalNetAmount;\n order.grandTotalGrossAmount = snapshot.grandTotalGrossAmount;\n order.paidTotalAmount = snapshot.paidTotalAmount;\n order.refundedTotalAmount = snapshot.refundedTotalAmount;\n order.outstandingAmount = snapshot.outstandingAmount;\n order.totalsSnapshot = snapshot.totalsSnapshot\n ? cloneJson(snapshot.totalsSnapshot)\n : null;\n order.lineItemCount = snapshot.lineItemCount;\n}\n\nasync function restoreQuoteGraph(\n em: EntityManager,\n snapshot: QuoteGraphSnapshot,\n): Promise<SalesQuote> {\n let quote = await em.findOne(SalesQuote, { id: snapshot.quote.id });\n if (!quote) {\n quote = em.create(SalesQuote, {\n id: snapshot.quote.id,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n quoteNumber: snapshot.quote.quoteNumber,\n statusEntryId: snapshot.quote.statusEntryId ?? null,\n status: snapshot.quote.status ?? null,\n customerEntityId: snapshot.quote.customerEntityId ?? null,\n customerContactId: snapshot.quote.customerContactId ?? null,\n customerSnapshot: snapshot.quote.customerSnapshot\n ? cloneJson(snapshot.quote.customerSnapshot)\n : null,\n billingAddressId: snapshot.quote.billingAddressId ?? null,\n shippingAddressId: snapshot.quote.shippingAddressId ?? null,\n billingAddressSnapshot: snapshot.quote.billingAddressSnapshot\n ? cloneJson(snapshot.quote.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: snapshot.quote.shippingAddressSnapshot\n ? cloneJson(snapshot.quote.shippingAddressSnapshot)\n : null,\n currencyCode: snapshot.quote.currencyCode,\n validFrom: snapshot.quote.validFrom\n ? new Date(snapshot.quote.validFrom)\n : null,\n validUntil: snapshot.quote.validUntil\n ? new Date(snapshot.quote.validUntil)\n : null,\n comments: snapshot.quote.comments ?? null,\n taxInfo: snapshot.quote.taxInfo\n ? cloneJson(snapshot.quote.taxInfo)\n : null,\n shippingMethodId: snapshot.quote.shippingMethodId ?? null,\n shippingMethodCode: snapshot.quote.shippingMethodCode ?? null,\n deliveryWindowId: snapshot.quote.deliveryWindowId ?? null,\n deliveryWindowCode: snapshot.quote.deliveryWindowCode ?? null,\n paymentMethodId: snapshot.quote.paymentMethodId ?? null,\n paymentMethodCode: snapshot.quote.paymentMethodCode ?? null,\n shippingMethodSnapshot: snapshot.quote.shippingMethodSnapshot\n ? cloneJson(snapshot.quote.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: snapshot.quote.deliveryWindowSnapshot\n ? cloneJson(snapshot.quote.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: snapshot.quote.paymentMethodSnapshot\n ? cloneJson(snapshot.quote.paymentMethodSnapshot)\n : null,\n metadata: snapshot.quote.metadata\n ? cloneJson(snapshot.quote.metadata)\n : null,\n channelId: snapshot.quote.channelId ?? null,\n customFieldSetId: snapshot.quote.customFieldSetId ?? null,\n subtotalNetAmount: snapshot.quote.subtotalNetAmount,\n subtotalGrossAmount: snapshot.quote.subtotalGrossAmount,\n discountTotalAmount: snapshot.quote.discountTotalAmount,\n taxTotalAmount: snapshot.quote.taxTotalAmount,\n grandTotalNetAmount: snapshot.quote.grandTotalNetAmount,\n grandTotalGrossAmount: snapshot.quote.grandTotalGrossAmount,\n totalsSnapshot: snapshot.quote.totalsSnapshot\n ? cloneJson(snapshot.quote.totalsSnapshot)\n : null,\n lineItemCount: snapshot.quote.lineItemCount,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(quote);\n }\n applyQuoteSnapshot(quote, snapshot.quote);\n await em.flush();\n const existingLines = await em.find(\n SalesQuoteLine,\n { quote: quote.id },\n { fields: [\"id\"] },\n );\n const existingAdjustments = await em.find(\n SalesQuoteAdjustment,\n { quote: quote.id },\n { fields: [\"id\"] },\n );\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_quote,\n recordId: quote.id,\n });\n if (existingLines.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_quote_line,\n recordId: { $in: existingLines.map((line) => line.id) },\n });\n }\n if (existingAdjustments.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_quote_adjustment,\n recordId: { $in: existingAdjustments.map((adj) => adj.id) },\n });\n }\n const addressSnapshots = Array.isArray(snapshot.addresses)\n ? snapshot.addresses\n : [];\n const noteSnapshots = Array.isArray(snapshot.notes) ? snapshot.notes : [];\n const tagSnapshots = Array.isArray(snapshot.tags) ? snapshot.tags : [];\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"quote\",\n contextId: quote.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n await em.nativeDelete(SalesQuoteAdjustment, { quote: quote.id });\n existingLines.forEach((entry) => em.getUnitOfWork().unsetIdentity(entry));\n existingAdjustments.forEach((entry) =>\n em.getUnitOfWork().unsetIdentity(entry),\n );\n\n snapshot.lines.forEach((line) => {\n const lineEntity = em.create(SalesQuoteLine, {\n id: line.id,\n quote,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n lineNumber: line.lineNumber,\n kind: line.kind as SalesLineKind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n });\n\n snapshot.adjustments.forEach((adjustment, index) => {\n const adjustmentEntity = em.create(SalesQuoteAdjustment, {\n id: adjustment.id,\n quote,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n scope: adjustment.scope,\n kind: adjustment.kind as SalesAdjustmentKind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: adjustment.rate,\n amountNet: adjustment.amountNet,\n amountGross: adjustment.amountGross,\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? index,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n adjustmentEntity.quoteLine = null;\n em.persist(adjustmentEntity);\n });\n\n addressSnapshots.forEach((entry) => {\n const entity = em.create(SalesDocumentAddress, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: quote.id,\n documentKind: \"quote\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n quote,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n noteSnapshots.forEach((entry) => {\n const entity = em.create(SalesNote, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: \"quote\",\n contextId: quote.id,\n order: null,\n quote,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n tagSnapshots.forEach((entry) => {\n const tag = em.getReference(SalesDocumentTag, entry.tagId);\n const assignment = em.create(SalesDocumentTagAssignment, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: quote.id,\n documentKind: \"quote\",\n tag,\n quote,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(assignment);\n });\n\n if (snapshot.quote.customFields) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote,\n recordId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(snapshot.quote.customFields),\n });\n }\n for (const line of snapshot.lines) {\n if (!line.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_line,\n recordId: line.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(line.customFields),\n });\n }\n for (const adjustment of snapshot.adjustments) {\n if (!adjustment.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_quote_adjustment,\n recordId: adjustment.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n values: normalizeCustomFieldValues(adjustment.customFields),\n });\n }\n\n return quote;\n}\n\nasync function restoreOrderGraph(\n em: EntityManager,\n snapshot: OrderGraphSnapshot,\n): Promise<SalesOrder> {\n let order = await em.findOne(SalesOrder, { id: snapshot.order.id });\n if (!order) {\n order = em.create(SalesOrder, {\n id: snapshot.order.id,\n organizationId: snapshot.order.organizationId,\n tenantId: snapshot.order.tenantId,\n orderNumber: snapshot.order.orderNumber,\n statusEntryId: snapshot.order.statusEntryId ?? null,\n status: snapshot.order.status ?? null,\n fulfillmentStatusEntryId: snapshot.order.fulfillmentStatusEntryId ?? null,\n fulfillmentStatus: snapshot.order.fulfillmentStatus ?? null,\n paymentStatusEntryId: snapshot.order.paymentStatusEntryId ?? null,\n paymentStatus: snapshot.order.paymentStatus ?? null,\n customerEntityId: snapshot.order.customerEntityId ?? null,\n customerContactId: snapshot.order.customerContactId ?? null,\n customerSnapshot: snapshot.order.customerSnapshot\n ? cloneJson(snapshot.order.customerSnapshot)\n : null,\n billingAddressId: snapshot.order.billingAddressId ?? null,\n shippingAddressId: snapshot.order.shippingAddressId ?? null,\n billingAddressSnapshot: snapshot.order.billingAddressSnapshot\n ? cloneJson(snapshot.order.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: snapshot.order.shippingAddressSnapshot\n ? cloneJson(snapshot.order.shippingAddressSnapshot)\n : null,\n currencyCode: snapshot.order.currencyCode,\n exchangeRate: snapshot.order.exchangeRate ?? null,\n taxStrategyKey: snapshot.order.taxStrategyKey ?? null,\n discountStrategyKey: snapshot.order.discountStrategyKey ?? null,\n taxInfo: snapshot.order.taxInfo\n ? cloneJson(snapshot.order.taxInfo)\n : null,\n shippingMethodId: snapshot.order.shippingMethodId ?? null,\n shippingMethodCode: snapshot.order.shippingMethodCode ?? null,\n deliveryWindowId: snapshot.order.deliveryWindowId ?? null,\n deliveryWindowCode: snapshot.order.deliveryWindowCode ?? null,\n paymentMethodId: snapshot.order.paymentMethodId ?? null,\n paymentMethodCode: snapshot.order.paymentMethodCode ?? null,\n channelId: snapshot.order.channelId ?? null,\n placedAt: snapshot.order.placedAt\n ? new Date(snapshot.order.placedAt)\n : null,\n expectedDeliveryAt: snapshot.order.expectedDeliveryAt\n ? new Date(snapshot.order.expectedDeliveryAt)\n : null,\n dueAt: snapshot.order.dueAt ? new Date(snapshot.order.dueAt) : null,\n comments: snapshot.order.comments ?? null,\n internalNotes: snapshot.order.internalNotes ?? null,\n shippingMethodSnapshot: snapshot.order.shippingMethodSnapshot\n ? cloneJson(snapshot.order.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: snapshot.order.deliveryWindowSnapshot\n ? cloneJson(snapshot.order.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: snapshot.order.paymentMethodSnapshot\n ? cloneJson(snapshot.order.paymentMethodSnapshot)\n : null,\n metadata: snapshot.order.metadata\n ? cloneJson(snapshot.order.metadata)\n : null,\n customFieldSetId: snapshot.order.customFieldSetId ?? null,\n subtotalNetAmount: snapshot.order.subtotalNetAmount,\n subtotalGrossAmount: snapshot.order.subtotalGrossAmount,\n discountTotalAmount: snapshot.order.discountTotalAmount,\n taxTotalAmount: snapshot.order.taxTotalAmount,\n shippingNetAmount: snapshot.order.shippingNetAmount,\n shippingGrossAmount: snapshot.order.shippingGrossAmount,\n surchargeTotalAmount: snapshot.order.surchargeTotalAmount,\n grandTotalNetAmount: snapshot.order.grandTotalNetAmount,\n grandTotalGrossAmount: snapshot.order.grandTotalGrossAmount,\n paidTotalAmount: snapshot.order.paidTotalAmount,\n refundedTotalAmount: snapshot.order.refundedTotalAmount,\n outstandingAmount: snapshot.order.outstandingAmount,\n totalsSnapshot: snapshot.order.totalsSnapshot\n ? cloneJson(snapshot.order.totalsSnapshot)\n : null,\n lineItemCount: snapshot.order.lineItemCount,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(order);\n }\n applyOrderSnapshot(order, snapshot.order);\n await em.flush();\n const existingLines = await em.find(\n SalesOrderLine,\n { order: order.id },\n { fields: [\"id\"] },\n );\n const existingAdjustments = await em.find(\n SalesOrderAdjustment,\n { order: order.id },\n { fields: [\"id\"] },\n );\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order,\n recordId: order.id,\n });\n if (existingLines.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order_line,\n recordId: { $in: existingLines.map((line) => line.id) },\n });\n }\n if (existingAdjustments.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order_adjustment,\n recordId: { $in: existingAdjustments.map((adj) => adj.id) },\n });\n }\n const addressSnapshots = Array.isArray(snapshot.addresses)\n ? snapshot.addresses\n : [];\n const noteSnapshots = Array.isArray(snapshot.notes) ? snapshot.notes : [];\n const tagSnapshots = Array.isArray(snapshot.tags) ? snapshot.tags : [];\n const shipmentSnapshots = Array.isArray(snapshot.shipments)\n ? snapshot.shipments\n : [];\n const paymentSnapshots = Array.isArray(snapshot.payments)\n ? snapshot.payments\n : [];\n const existingShipments = await em.find(SalesShipment, { order: order.id });\n const shipmentIds = existingShipments.map((entry) => entry.id);\n if (shipmentIds.length) {\n await em.nativeDelete(SalesShipmentItem, {\n shipment: { $in: shipmentIds },\n });\n await em.nativeDelete(SalesShipment, { id: { $in: shipmentIds } });\n existingShipments.forEach((entry) =>\n em.getUnitOfWork().unsetIdentity(entry),\n );\n }\n await em.nativeDelete(SalesPaymentAllocation, { order: order.id });\n await em.nativeDelete(SalesPayment, { order: order.id });\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"order\",\n contextId: order.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesOrderAdjustment, { order: order.id });\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n existingLines.forEach((entry) => em.getUnitOfWork().unsetIdentity(entry));\n existingAdjustments.forEach((entry) =>\n em.getUnitOfWork().unsetIdentity(entry),\n );\n\n snapshot.lines.forEach((line) => {\n const lineEntity = em.create(SalesOrderLine, {\n id: line.id,\n order,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n lineNumber: line.lineNumber,\n kind: line.kind as SalesLineKind,\n statusEntryId: line.statusEntryId ?? null,\n status: line.status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n reservedQuantity: line.reservedQuantity,\n fulfilledQuantity: line.fulfilledQuantity,\n invoicedQuantity: line.invoicedQuantity,\n returnedQuantity: line.returnedQuantity,\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration ? cloneJson(line.configuration) : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(lineEntity);\n });\n\n snapshot.adjustments.forEach((adjustment, index) => {\n const adjustmentEntity = em.create(SalesOrderAdjustment, {\n id: adjustment.id,\n order,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n scope: adjustment.scope,\n kind: adjustment.kind as SalesAdjustmentKind,\n code: adjustment.code ?? null,\n label: adjustment.label ?? null,\n calculatorKey: adjustment.calculatorKey ?? null,\n promotionId: adjustment.promotionId ?? null,\n rate: adjustment.rate,\n amountNet: adjustment.amountNet,\n amountGross: adjustment.amountGross,\n currencyCode: adjustment.currencyCode ?? null,\n metadata: adjustment.metadata ? cloneJson(adjustment.metadata) : null,\n position: adjustment.position ?? index,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n adjustmentEntity.orderLine = null;\n em.persist(adjustmentEntity);\n });\n\n addressSnapshots.forEach((entry) => {\n const entity = em.create(SalesDocumentAddress, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: order.id,\n documentKind: \"order\",\n customerAddressId: entry.customerAddressId ?? null,\n name: entry.name ?? null,\n purpose: entry.purpose ?? null,\n companyName: entry.companyName ?? null,\n addressLine1: entry.addressLine1,\n addressLine2: entry.addressLine2 ?? null,\n city: entry.city ?? null,\n region: entry.region ?? null,\n postalCode: entry.postalCode ?? null,\n country: entry.country ?? null,\n buildingNumber: entry.buildingNumber ?? null,\n flatNumber: entry.flatNumber ?? null,\n latitude: entry.latitude ?? null,\n longitude: entry.longitude ?? null,\n order,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n noteSnapshots.forEach((entry) => {\n const entity = em.create(SalesNote, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n contextType: \"order\",\n contextId: order.id,\n order,\n quote: null,\n body: entry.body,\n authorUserId: entry.authorUserId ?? null,\n appearanceIcon: entry.appearanceIcon ?? null,\n appearanceColor: entry.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n tagSnapshots.forEach((entry) => {\n const tag = em.getReference(SalesDocumentTag, entry.tagId);\n const assignment = em.create(SalesDocumentTagAssignment, {\n id: entry.id,\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n documentId: order.id,\n documentKind: \"order\",\n tag,\n order,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(assignment);\n });\n\n if (snapshot.order.customFields) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order,\n recordId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(snapshot.order.customFields),\n });\n }\n for (const line of snapshot.lines) {\n if (!line.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: line.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(line.customFields),\n });\n }\n for (const adjustment of snapshot.adjustments) {\n if (!adjustment.customFields) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_adjustment,\n recordId: adjustment.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n values: normalizeCustomFieldValues(adjustment.customFields),\n });\n }\n\n for (const shipment of shipmentSnapshots) {\n await restoreShipmentSnapshot(em, shipment);\n }\n\n for (const payment of paymentSnapshots) {\n await restorePaymentSnapshot(em, payment);\n }\n\n return order;\n}\n\nconst createQuoteCommand: CommandHandler<\n QuoteCreateInput,\n { quoteId: string }\n> = {\n id: \"sales.quotes.create\",\n async execute(rawInput, ctx) {\n const generator = ctx.container.resolve(\n \"salesDocumentNumberGenerator\",\n ) as SalesDocumentNumberGenerator;\n const initial = quoteCreateSchema.parse(rawInput ?? {});\n const quoteNumber =\n typeof initial.quoteNumber === \"string\" &&\n initial.quoteNumber.trim().length\n ? initial.quoteNumber.trim()\n : (\n await generator.generate({\n kind: \"quote\",\n organizationId: initial.organizationId,\n tenantId: initial.tenantId,\n })\n ).number;\n const parsed = quoteCreateSchema.parse({ ...initial, quoteNumber });\n const ensuredQuoteNumber = parsed.quoteNumber ?? quoteNumber;\n if (!ensuredQuoteNumber) {\n throw new CrudHttpError(400, { error: \"Quote number is required.\" });\n }\n ensureQuoteScope(ctx, parsed.organizationId, parsed.tenantId);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const {\n customerSnapshot: resolvedCustomerSnapshot,\n billingAddressSnapshot: resolvedBillingSnapshot,\n shippingAddressSnapshot: resolvedShippingSnapshot,\n shippingMethod,\n deliveryWindow,\n paymentMethod,\n } = await resolveDocumentReferences(em, parsed);\n const quoteStatus = await resolveDictionaryEntryValue(\n em,\n parsed.statusEntryId ?? null,\n );\n const quoteId = randomUUID();\n const quote = em.create(SalesQuote, {\n id: quoteId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n quoteNumber: ensuredQuoteNumber,\n statusEntryId: parsed.statusEntryId ?? null,\n status: quoteStatus,\n customerEntityId: parsed.customerEntityId ?? null,\n customerContactId: parsed.customerContactId ?? null,\n customerSnapshot: resolvedCustomerSnapshot\n ? cloneJson(resolvedCustomerSnapshot)\n : null,\n billingAddressId: parsed.billingAddressId ?? null,\n shippingAddressId: parsed.shippingAddressId ?? null,\n billingAddressSnapshot: resolvedBillingSnapshot\n ? cloneJson(resolvedBillingSnapshot)\n : null,\n shippingAddressSnapshot: resolvedShippingSnapshot\n ? cloneJson(resolvedShippingSnapshot)\n : null,\n currencyCode: parsed.currencyCode,\n validFrom: parsed.validFrom ?? null,\n validUntil: parsed.validUntil ?? null,\n comments: parsed.comments ?? null,\n taxInfo: parsed.taxInfo ? cloneJson(parsed.taxInfo) : null,\n shippingMethodId: parsed.shippingMethodId ?? null,\n shippingMethod: shippingMethod ?? null,\n shippingMethodCode:\n parsed.shippingMethodCode ?? shippingMethod?.code ?? null,\n deliveryWindowId: parsed.deliveryWindowId ?? null,\n deliveryWindow: deliveryWindow ?? null,\n deliveryWindowCode:\n parsed.deliveryWindowCode ?? deliveryWindow?.code ?? null,\n paymentMethodId: parsed.paymentMethodId ?? null,\n paymentMethod: paymentMethod ?? null,\n paymentMethodCode:\n parsed.paymentMethodCode ?? paymentMethod?.code ?? null,\n shippingMethodSnapshot: parsed.shippingMethodSnapshot\n ? cloneJson(parsed.shippingMethodSnapshot)\n : shippingMethod\n ? {\n id: shippingMethod.id,\n code: shippingMethod.code,\n name: shippingMethod.name,\n description: shippingMethod.description ?? null,\n carrierCode: shippingMethod.carrierCode ?? null,\n providerKey: shippingMethod.providerKey ?? null,\n serviceLevel: shippingMethod.serviceLevel ?? null,\n estimatedTransitDays: shippingMethod.estimatedTransitDays ?? null,\n baseRateNet: shippingMethod.baseRateNet,\n baseRateGross: shippingMethod.baseRateGross,\n currencyCode: shippingMethod.currencyCode ?? null,\n metadata: shippingMethod.metadata\n ? cloneJson(shippingMethod.metadata)\n : null,\n providerSettings:\n shippingMethod.metadata &&\n typeof shippingMethod.metadata === \"object\"\n ? cloneJson(\n (shippingMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n deliveryWindowSnapshot: parsed.deliveryWindowSnapshot\n ? cloneJson(parsed.deliveryWindowSnapshot)\n : deliveryWindow\n ? {\n id: deliveryWindow.id,\n code: deliveryWindow.code,\n name: deliveryWindow.name,\n description: deliveryWindow.description ?? null,\n leadTimeDays: deliveryWindow.leadTimeDays ?? null,\n cutoffTime: deliveryWindow.cutoffTime ?? null,\n timezone: deliveryWindow.timezone ?? null,\n }\n : null,\n paymentMethodSnapshot: parsed.paymentMethodSnapshot\n ? cloneJson(parsed.paymentMethodSnapshot)\n : paymentMethod\n ? {\n id: paymentMethod.id,\n code: paymentMethod.code,\n name: paymentMethod.name,\n description: paymentMethod.description ?? null,\n providerKey: paymentMethod.providerKey ?? null,\n terms: paymentMethod.terms ?? null,\n metadata: paymentMethod.metadata\n ? cloneJson(paymentMethod.metadata)\n : null,\n providerSettings:\n paymentMethod.metadata &&\n typeof paymentMethod.metadata === \"object\"\n ? cloneJson(\n (paymentMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n metadata: parsed.metadata ? cloneJson(parsed.metadata) : null,\n channelId: parsed.channelId ?? null,\n customFieldSetId: parsed.customFieldSetId ?? null,\n subtotalNetAmount: \"0\",\n subtotalGrossAmount: \"0\",\n discountTotalAmount: \"0\",\n taxTotalAmount: \"0\",\n grandTotalNetAmount: \"0\",\n grandTotalGrossAmount: \"0\",\n lineItemCount: 0,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(quote);\n\n const lineInputs = (parsed.lines ?? []).map((line, index) =>\n quoteLineCreateSchema.parse({\n ...line,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n }),\n );\n const uomResolver = createUomResolver();\n const normalizedLineInputs = await Promise.all(\n lineInputs.map(async (line) => {\n const normalized = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n line,\n });\n return {\n ...line,\n quantity: normalized.quantity,\n quantityUnit: normalized.quantityUnit,\n normalizedQuantity: normalized.normalizedQuantity,\n normalizedUnit: normalized.normalizedUnit,\n uomSnapshot: normalized.uomSnapshot,\n };\n }),\n );\n const adjustmentInputs = parsed.adjustments\n ? parsed.adjustments.map((adj) =>\n quoteAdjustmentCreateSchema.parse({\n ...adj,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n quoteId: quote.id,\n }),\n )\n : null;\n\n const lineSnapshots: SalesLineSnapshot[] = normalizedLineInputs.map(\n (line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts: SalesAdjustmentDraft[] = adjustmentInputs\n ? adjustmentInputs.map((adj) => createAdjustmentDraftFromInput(adj))\n : [];\n\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: lineSnapshots,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n\n await replaceQuoteLines(em, quote, calculation, normalizedLineInputs);\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await syncSalesDocumentTags(em, {\n documentId: quote.id,\n kind: \"quote\",\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n tagIds: parsed.tags,\n });\n await em.flush();\n\n // Create notification for users with sales.quotes.manage feature\n try {\n const notificationService = resolveNotificationService(ctx.container);\n const typeDef = notificationTypes.find(\n (type) => type.type === \"sales.quote.created\",\n );\n if (typeDef) {\n const totalAmount =\n quote.grandTotalGrossAmount && quote.currencyCode\n ? `${quote.grandTotalGrossAmount} ${quote.currencyCode}`\n : \"\";\n const totalDisplay = totalAmount ? ` (${totalAmount})` : \"\";\n const notificationInput = buildFeatureNotificationFromType(typeDef, {\n requiredFeature: \"sales.quotes.manage\",\n bodyVariables: {\n quoteNumber: quote.quoteNumber,\n total: totalDisplay,\n totalAmount,\n },\n sourceEntityType: \"sales:quote\",\n sourceEntityId: quote.id,\n linkHref: `/backend/sales/quotes/${quote.id}`,\n });\n\n await notificationService.createForFeature(notificationInput, {\n tenantId: quote.tenantId,\n organizationId: quote.organizationId ?? null,\n });\n }\n } catch (err) {\n // Notification creation is non-critical, don't fail the command\n console.error(\n \"[sales.quotes.create] Failed to create notification:\",\n err,\n );\n }\n\n // Emit CRUD side effects to trigger workflow event listeners\n const dataEngine = ctx.container.resolve(\"dataEngine\") as DataEngine;\n await emitCrudSideEffects({\n dataEngine,\n action: \"created\",\n entity: quote,\n identifiers: {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n },\n events: quoteCrudEvents,\n indexer: { entityType: E.sales.sales_quote },\n });\n\n // Invalidate cache\n const resourceKind =\n deriveResourceFromCommandId(createQuoteCommand.id) ?? \"sales.quote\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"created\",\n );\n\n return { quoteId: quote.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.quotes.create\", \"Create sales quote\"),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotAfter: after,\n payload: {\n undo: {\n after,\n } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const after = payload?.after;\n if (!after) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, { id: after.quote.id });\n if (!quote) return;\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n await em.nativeDelete(SalesQuoteAdjustment, { quote: quote.id });\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n em.remove(quote);\n await em.flush();\n },\n};\n\nconst deleteQuoteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string }\n> = {\n id: \"sales.quotes.delete\",\n async prepare(input, ctx) {\n const id = requireId(input, \"Quote id is required\");\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, id);\n if (snapshot) {\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const id = requireId(input, \"Quote id is required\");\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, { id });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const [addresses, notes, tags, adjustments, lines] = await Promise.all([\n em.find(SalesDocumentAddress, {\n documentId: quote.id,\n documentKind: \"quote\",\n }),\n em.find(SalesNote, { contextType: \"quote\", contextId: quote.id }),\n em.find(SalesDocumentTagAssignment, {\n documentId: quote.id,\n documentKind: \"quote\",\n }),\n em.find(SalesQuoteAdjustment, { quote: quote.id }),\n em.find(SalesQuoteLine, { quote: quote.id }),\n ]);\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"quote\",\n contextId: quote.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: quote.id,\n documentKind: \"quote\",\n });\n await em.nativeDelete(SalesQuoteAdjustment, { quote: quote.id });\n await em.nativeDelete(SalesQuoteLine, { quote: quote.id });\n em.remove(quote);\n await em.flush();\n const dataEngine = ctx.container.resolve<DataEngine>(\"dataEngine\");\n await Promise.all([\n queueDeletionSideEffects(dataEngine, quote, E.sales.sales_quote),\n queueDeletionSideEffects(dataEngine, lines, E.sales.sales_quote_line),\n queueDeletionSideEffects(\n dataEngine,\n adjustments,\n E.sales.sales_quote_adjustment,\n ),\n queueDeletionSideEffects(\n dataEngine,\n addresses,\n E.sales.sales_document_address,\n ),\n queueDeletionSideEffects(dataEngine, notes, E.sales.sales_note),\n queueDeletionSideEffects(\n dataEngine,\n tags,\n E.sales.sales_document_tag_assignment,\n ),\n ]);\n return { quoteId: id };\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n if (!before) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.quotes.delete\", \"Delete sales quote\"),\n resourceKind: \"sales.quote\",\n resourceId: before.quote.id,\n tenantId: before.quote.tenantId,\n organizationId: before.quote.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst updateQuoteCommand: CommandHandler<\n DocumentUpdateInput,\n { quote: SalesQuote }\n> = {\n id: \"sales.quotes.update\",\n async prepare(input, ctx) {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, parsed.id);\n if (snapshot) {\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(rawInput, ctx) {\n const parsed = documentUpdateSchema.parse(rawInput ?? {});\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.id,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const shouldInvalidateSentToken = (quote.status ?? null) === \"sent\";\n if (shouldInvalidateSentToken) {\n quote.acceptanceToken = null;\n quote.sentAt = null;\n }\n const shouldRecalculateTotals =\n parsed.shippingMethodId !== undefined ||\n parsed.shippingMethodSnapshot !== undefined ||\n parsed.shippingMethodCode !== undefined ||\n parsed.paymentMethodId !== undefined ||\n parsed.paymentMethodSnapshot !== undefined ||\n parsed.paymentMethodCode !== undefined ||\n parsed.currencyCode !== undefined;\n await applyDocumentUpdate({\n kind: \"quote\",\n entity: quote,\n input: parsed,\n em,\n });\n await em.flush();\n if (shouldInvalidateSentToken) {\n quote.status = \"draft\";\n quote.statusEntryId = await resolveStatusEntryIdByValue(em, {\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n value: \"draft\",\n });\n }\n if (shouldRecalculateTotals) {\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = adjustments.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\n \"salesCalculationService\",\n );\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals(\n {\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n },\n );\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? quote.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n }\n quote.updatedAt = new Date();\n await em.flush();\n const resourceKind =\n deriveResourceFromCommandId(updateQuoteCommand.id) ?? \"sales.quote\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"updated\",\n );\n return { quote };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quote.id);\n },\n buildLog: async ({ input, snapshots, result }) => {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n const changes = before\n ? buildChanges(\n before.quote as unknown as Record<string, unknown>,\n after.quote as unknown as Record<string, unknown>,\n buildDocumentUpdateChangeKeys(\"quote\", parsed),\n )\n : {};\n if (parsed.tags !== undefined) {\n const tagChange = buildTagChange(before?.tags, after.tags);\n if (tagChange) changes.tags = tagChange;\n }\n return {\n actionLabel: translate(\"sales.audit.quotes.update\", \"Update sales quote\"),\n resourceKind: \"sales.quote\",\n resourceId: result.quote.id,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n changes: Object.keys(changes).length ? changes : null,\n payload: {\n undo: {\n before,\n after,\n } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst updateOrderCommand: CommandHandler<\n DocumentUpdateInput,\n { order: SalesOrder }\n> = {\n id: \"sales.orders.update\",\n async prepare(input, ctx) {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, parsed.id);\n if (snapshot) {\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(rawInput, ctx) {\n const parsed = documentUpdateSchema.parse(rawInput ?? {});\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.id,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n const previousStatus = normalizeStatusValue(order.status);\n let statusChangeNote: SalesNote | null = null;\n const shouldRecalculateTotals =\n parsed.shippingMethodId !== undefined ||\n parsed.shippingMethodSnapshot !== undefined ||\n parsed.shippingMethodCode !== undefined ||\n parsed.paymentMethodId !== undefined ||\n parsed.paymentMethodSnapshot !== undefined ||\n parsed.paymentMethodCode !== undefined ||\n parsed.currencyCode !== undefined;\n await applyDocumentUpdate({\n kind: \"order\",\n entity: order,\n input: parsed,\n em,\n });\n await em.flush();\n if (shouldRecalculateTotals) {\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = adjustments.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\n \"salesCalculationService\",\n );\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals(\n {\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n },\n );\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? order.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n }\n statusChangeNote = await appendOrderStatusChangeNote({\n em,\n order,\n previousStatus,\n auth: ctx.auth ?? null,\n });\n order.updatedAt = new Date();\n await em.flush();\n if (statusChangeNote) {\n const dataEngine = ctx.container.resolve(\"dataEngine\");\n await emitCrudSideEffects({\n dataEngine,\n action: \"created\",\n entity: statusChangeNote,\n identifiers: {\n id: statusChangeNote.id,\n organizationId: statusChangeNote.organizationId,\n tenantId: statusChangeNote.tenantId,\n },\n indexer: { entityType: E.sales.sales_note },\n });\n }\n const resourceKind =\n deriveResourceFromCommandId(updateOrderCommand.id) ?? \"sales.order\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"updated\",\n );\n return { order };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.order.id);\n },\n buildLog: async ({ input, snapshots, result }) => {\n const parsed = documentUpdateSchema.parse(input ?? {});\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n const changes = before\n ? buildChanges(\n before.order as unknown as Record<string, unknown>,\n after.order as unknown as Record<string, unknown>,\n buildDocumentUpdateChangeKeys(\"order\", parsed),\n )\n : {};\n if (parsed.tags !== undefined) {\n const tagChange = buildTagChange(before?.tags, after.tags);\n if (tagChange) changes.tags = tagChange;\n }\n return {\n actionLabel: translate(\"sales.audit.orders.update\", \"Update sales order\"),\n resourceKind: \"sales.order\",\n resourceId: result.order.id,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n changes: Object.keys(changes).length ? changes : null,\n payload: {\n undo: {\n before,\n after,\n } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst createOrderCommand: CommandHandler<\n OrderCreateInput,\n { orderId: string }\n> = {\n id: \"sales.orders.create\",\n async execute(rawInput, ctx) {\n const generator = ctx.container.resolve(\n \"salesDocumentNumberGenerator\",\n ) as SalesDocumentNumberGenerator;\n const initial = orderCreateSchema.parse(rawInput ?? {});\n const orderNumber =\n typeof initial.orderNumber === \"string\" &&\n initial.orderNumber.trim().length\n ? initial.orderNumber.trim()\n : (\n await generator.generate({\n kind: \"order\",\n organizationId: initial.organizationId,\n tenantId: initial.tenantId,\n })\n ).number;\n const parsed = orderCreateSchema.parse({ ...initial, orderNumber });\n const ensuredOrderNumber = parsed.orderNumber ?? orderNumber;\n if (!ensuredOrderNumber) {\n throw new CrudHttpError(400, { error: \"Order number is required.\" });\n }\n ensureOrderScope(ctx, parsed.organizationId, parsed.tenantId);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const [status, fulfillmentStatus, paymentStatus] = await Promise.all([\n resolveDictionaryEntryValue(em, parsed.statusEntryId ?? null),\n resolveDictionaryEntryValue(em, parsed.fulfillmentStatusEntryId ?? null),\n resolveDictionaryEntryValue(em, parsed.paymentStatusEntryId ?? null),\n ]);\n const {\n customerSnapshot: resolvedCustomerSnapshot,\n billingAddressSnapshot: resolvedBillingSnapshot,\n shippingAddressSnapshot: resolvedShippingSnapshot,\n shippingMethod,\n deliveryWindow,\n paymentMethod,\n } = await resolveDocumentReferences(em, parsed);\n\n const orderId = randomUUID()\n const order = em.create(SalesOrder, {\n id: orderId,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n orderNumber: ensuredOrderNumber,\n externalReference: parsed.externalReference ?? null,\n customerReference: parsed.customerReference ?? null,\n statusEntryId: parsed.statusEntryId ?? null,\n status,\n fulfillmentStatusEntryId: parsed.fulfillmentStatusEntryId ?? null,\n fulfillmentStatus,\n paymentStatusEntryId: parsed.paymentStatusEntryId ?? null,\n paymentStatus,\n customerEntityId: parsed.customerEntityId ?? null,\n customerContactId: parsed.customerContactId ?? null,\n customerSnapshot: resolvedCustomerSnapshot\n ? cloneJson(resolvedCustomerSnapshot)\n : null,\n billingAddressId: parsed.billingAddressId ?? null,\n shippingAddressId: parsed.shippingAddressId ?? null,\n billingAddressSnapshot: resolvedBillingSnapshot\n ? cloneJson(resolvedBillingSnapshot)\n : null,\n shippingAddressSnapshot: resolvedShippingSnapshot\n ? cloneJson(resolvedShippingSnapshot)\n : null,\n currencyCode: parsed.currencyCode,\n exchangeRate:\n typeof parsed.exchangeRate === \"number\"\n ? toNumericString(parsed.exchangeRate)\n : null,\n taxStrategyKey: parsed.taxStrategyKey ?? null,\n discountStrategyKey: parsed.discountStrategyKey ?? null,\n taxInfo: parsed.taxInfo ? cloneJson(parsed.taxInfo) : null,\n shippingMethodId: parsed.shippingMethodId ?? null,\n shippingMethod: shippingMethod ?? null,\n shippingMethodCode:\n parsed.shippingMethodCode ?? shippingMethod?.code ?? null,\n deliveryWindowId: parsed.deliveryWindowId ?? null,\n deliveryWindow: deliveryWindow ?? null,\n deliveryWindowCode:\n parsed.deliveryWindowCode ?? deliveryWindow?.code ?? null,\n paymentMethodId: parsed.paymentMethodId ?? null,\n paymentMethod: paymentMethod ?? null,\n paymentMethodCode:\n parsed.paymentMethodCode ?? paymentMethod?.code ?? null,\n channelId: parsed.channelId ?? null,\n placedAt: parsed.placedAt ?? null,\n expectedDeliveryAt: parsed.expectedDeliveryAt ?? null,\n dueAt: parsed.dueAt ?? null,\n comments: parsed.comments ?? null,\n internalNotes: parsed.internalNotes ?? null,\n shippingMethodSnapshot: parsed.shippingMethodSnapshot\n ? cloneJson(parsed.shippingMethodSnapshot)\n : shippingMethod\n ? {\n id: shippingMethod.id,\n code: shippingMethod.code,\n name: shippingMethod.name,\n description: shippingMethod.description ?? null,\n carrierCode: shippingMethod.carrierCode ?? null,\n providerKey: shippingMethod.providerKey ?? null,\n serviceLevel: shippingMethod.serviceLevel ?? null,\n estimatedTransitDays: shippingMethod.estimatedTransitDays ?? null,\n baseRateNet: shippingMethod.baseRateNet,\n baseRateGross: shippingMethod.baseRateGross,\n currencyCode: shippingMethod.currencyCode ?? null,\n metadata: shippingMethod.metadata\n ? cloneJson(shippingMethod.metadata)\n : null,\n providerSettings:\n shippingMethod.metadata &&\n typeof shippingMethod.metadata === \"object\"\n ? cloneJson(\n (shippingMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n deliveryWindowSnapshot: parsed.deliveryWindowSnapshot\n ? cloneJson(parsed.deliveryWindowSnapshot)\n : deliveryWindow\n ? {\n id: deliveryWindow.id,\n code: deliveryWindow.code,\n name: deliveryWindow.name,\n description: deliveryWindow.description ?? null,\n leadTimeDays: deliveryWindow.leadTimeDays ?? null,\n cutoffTime: deliveryWindow.cutoffTime ?? null,\n timezone: deliveryWindow.timezone ?? null,\n }\n : null,\n paymentMethodSnapshot: parsed.paymentMethodSnapshot\n ? cloneJson(parsed.paymentMethodSnapshot)\n : paymentMethod\n ? {\n id: paymentMethod.id,\n code: paymentMethod.code,\n name: paymentMethod.name,\n description: paymentMethod.description ?? null,\n providerKey: paymentMethod.providerKey ?? null,\n terms: paymentMethod.terms ?? null,\n metadata: paymentMethod.metadata\n ? cloneJson(paymentMethod.metadata)\n : null,\n providerSettings:\n paymentMethod.metadata &&\n typeof paymentMethod.metadata === \"object\"\n ? cloneJson(\n (paymentMethod.metadata as Record<string, unknown>)\n .providerSettings ?? null,\n )\n : null,\n }\n : null,\n metadata: parsed.metadata ? cloneJson(parsed.metadata) : null,\n customFieldSetId: parsed.customFieldSetId ?? null,\n subtotalNetAmount: \"0\",\n subtotalGrossAmount: \"0\",\n discountTotalAmount: \"0\",\n taxTotalAmount: \"0\",\n shippingNetAmount: \"0\",\n shippingGrossAmount: \"0\",\n surchargeTotalAmount: \"0\",\n grandTotalNetAmount: \"0\",\n grandTotalGrossAmount: \"0\",\n paidTotalAmount: \"0\",\n refundedTotalAmount: \"0\",\n outstandingAmount: \"0\",\n lineItemCount: 0,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(order);\n\n const lineInputs = (parsed.lines ?? []).map((line, index) =>\n orderLineCreateSchema.parse({\n ...line,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n }),\n );\n const uomResolver = createUomResolver();\n const normalizedLineInputs = await Promise.all(\n lineInputs.map(async (line) => {\n const normalized = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n line,\n });\n return {\n ...line,\n quantity: normalized.quantity,\n quantityUnit: normalized.quantityUnit,\n normalizedQuantity: normalized.normalizedQuantity,\n normalizedUnit: normalized.normalizedUnit,\n uomSnapshot: normalized.uomSnapshot,\n };\n }),\n );\n const adjustmentInputs = parsed.adjustments\n ? parsed.adjustments.map((adj) =>\n orderAdjustmentCreateSchema.parse({\n ...adj,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n orderId: order.id,\n }),\n )\n : null;\n\n const lineSnapshots: SalesLineSnapshot[] = normalizedLineInputs.map(\n (line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts: SalesAdjustmentDraft[] = adjustmentInputs\n ? adjustmentInputs.map((adj) => createAdjustmentDraftFromInput(adj))\n : [];\n\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: lineSnapshots,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n\n await replaceOrderLines(em, order, calculation, normalizedLineInputs);\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await syncSalesDocumentTags(em, {\n documentId: order.id,\n kind: \"order\",\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n tagIds: parsed.tags,\n });\n await em.flush();\n\n // Create notification for users with sales.orders.manage feature\n try {\n const notificationService = resolveNotificationService(ctx.container);\n const typeDef = notificationTypes.find(\n (type) => type.type === \"sales.order.created\",\n );\n if (typeDef) {\n const totalAmount =\n order.grandTotalGrossAmount && order.currencyCode\n ? `${order.grandTotalGrossAmount} ${order.currencyCode}`\n : \"\";\n const totalDisplay = totalAmount ? ` (${totalAmount})` : \"\";\n const notificationInput = buildFeatureNotificationFromType(typeDef, {\n requiredFeature: \"sales.orders.manage\",\n bodyVariables: {\n orderNumber: order.orderNumber,\n total: totalDisplay,\n totalAmount,\n },\n sourceEntityType: \"sales:order\",\n sourceEntityId: order.id,\n linkHref: `/backend/sales/orders/${order.id}`,\n });\n\n await notificationService.createForFeature(notificationInput, {\n tenantId: order.tenantId,\n organizationId: order.organizationId ?? null,\n });\n }\n } catch (err) {\n // Notification creation is non-critical, don't fail the command\n console.error(\n \"[sales.orders.create] Failed to create notification:\",\n err,\n );\n }\n\n // Emit CRUD side effects to trigger workflow event listeners\n const dataEngine = ctx.container.resolve(\"dataEngine\") as DataEngine;\n await emitCrudSideEffects({\n dataEngine,\n action: \"created\",\n entity: order,\n identifiers: {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n },\n events: orderCrudEvents,\n indexer: { entityType: E.sales.sales_order },\n });\n\n // Invalidate cache\n const resourceKind =\n deriveResourceFromCommandId(createOrderCommand.id) ?? \"sales.order\";\n await invalidateCrudCache(\n ctx.container,\n resourceKind,\n {\n id: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n },\n ctx.auth?.tenantId ?? null,\n \"created\",\n );\n\n return { orderId: order.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.orders.create\", \"Create sales order\"),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotAfter: after,\n payload: {\n undo: {\n after,\n } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const after = payload?.after;\n if (!after) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, { id: after.order.id });\n if (!order) return;\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n await em.nativeDelete(SalesOrderAdjustment, { order: order.id });\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n em.remove(order);\n await em.flush();\n },\n};\n\nconst deleteOrderCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string }\n> = {\n id: \"sales.orders.delete\",\n async prepare(input, ctx) {\n const id = requireId(input, \"Order id is required\");\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, id);\n if (snapshot) {\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n }\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const id = requireId(input, \"Order id is required\");\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, { id });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n const shipments = await em.find(SalesShipment, { order: order.id });\n const shipmentIds = shipments.map((entry) => entry.id);\n const [\n shipmentItems,\n payments,\n paymentAllocations,\n addresses,\n notes,\n tags,\n adjustments,\n lines,\n ] = await Promise.all([\n shipmentIds.length\n ? em.find(SalesShipmentItem, { shipment: { $in: shipmentIds } })\n : Promise.resolve([]),\n em.find(SalesPayment, { order: order.id }),\n em.find(SalesPaymentAllocation, { order: order.id }),\n em.find(SalesDocumentAddress, {\n documentId: order.id,\n documentKind: \"order\",\n }),\n em.find(SalesNote, { contextType: \"order\", contextId: order.id }),\n em.find(SalesDocumentTagAssignment, {\n documentId: order.id,\n documentKind: \"order\",\n }),\n em.find(SalesOrderAdjustment, { order: order.id }),\n em.find(SalesOrderLine, { order: order.id }),\n ]);\n if (shipmentIds.length) {\n await em.nativeDelete(SalesShipmentItem, {\n shipment: { $in: shipmentIds },\n });\n await em.nativeDelete(SalesShipment, { id: { $in: shipmentIds } });\n }\n await em.nativeDelete(SalesPaymentAllocation, { order: order.id });\n await em.nativeDelete(SalesPayment, { order: order.id });\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesNote, {\n contextType: \"order\",\n contextId: order.id,\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: order.id,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesOrderAdjustment, { order: order.id });\n await em.nativeDelete(SalesOrderLine, { order: order.id });\n em.remove(order);\n await em.flush();\n const dataEngine = ctx.container.resolve<DataEngine>(\"dataEngine\");\n await Promise.all([\n queueDeletionSideEffects(dataEngine, order, E.sales.sales_order),\n queueDeletionSideEffects(dataEngine, lines, E.sales.sales_order_line),\n queueDeletionSideEffects(\n dataEngine,\n adjustments,\n E.sales.sales_order_adjustment,\n ),\n queueDeletionSideEffects(dataEngine, shipments, E.sales.sales_shipment),\n queueDeletionSideEffects(\n dataEngine,\n shipmentItems,\n E.sales.sales_shipment_item,\n ),\n queueDeletionSideEffects(dataEngine, payments, E.sales.sales_payment),\n queueDeletionSideEffects(\n dataEngine,\n paymentAllocations,\n E.sales.sales_payment_allocation,\n ),\n queueDeletionSideEffects(\n dataEngine,\n addresses,\n E.sales.sales_document_address,\n ),\n queueDeletionSideEffects(dataEngine, notes, E.sales.sales_note),\n queueDeletionSideEffects(\n dataEngine,\n tags,\n E.sales.sales_document_tag_assignment,\n ),\n ]);\n return { orderId: id };\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n if (!before) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\"sales.audit.orders.delete\", \"Delete sales order\"),\n resourceKind: \"sales.order\",\n resourceId: before.order.id,\n tenantId: before.order.tenantId,\n organizationId: before.order.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteConvertToOrderSchema = z.object({\n quoteId: z.string().uuid(),\n orderId: z.string().uuid().optional(),\n orderNumber: z.string().trim().max(191).optional(),\n});\n\nconst convertQuoteToOrderCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string }\n> = {\n id: \"sales.quotes.convert_to_order\",\n async prepare(input, ctx) {\n const parsed = quoteConvertToOrderSchema.safeParse(input ?? {});\n const quoteId = parsed.success\n ? parsed.data.quoteId\n : typeof (input as any)?.quoteId === \"string\"\n ? (input as any).quoteId\n : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(rawInput, ctx) {\n const payload = quoteConvertToOrderSchema.parse(rawInput ?? {});\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: payload.quoteId,\n deletedAt: null,\n });\n const { translate } = await resolveTranslations();\n if (!quote)\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const snapshot = await loadQuoteSnapshot(em, payload.quoteId);\n if (!snapshot)\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n const orderId = payload.orderId ?? quote.id;\n const existingOrder = await em.findOne(SalesOrder, {\n id: orderId,\n deletedAt: null,\n });\n if (existingOrder) {\n throw new CrudHttpError(409, {\n error: translate(\n \"sales.documents.detail.convertExists\",\n \"Order already exists for this quote.\",\n ),\n });\n }\n\n const generator = ctx.container.resolve(\n \"salesDocumentNumberGenerator\",\n ) as SalesDocumentNumberGenerator;\n const generatedNumber =\n snapshot.quote.quoteNumber && snapshot.quote.quoteNumber.trim().length\n ? snapshot.quote.quoteNumber\n : (\n await generator.generate({\n kind: \"order\",\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n })\n ).number;\n const orderNumber =\n typeof payload.orderNumber === \"string\" &&\n payload.orderNumber.trim().length\n ? payload.orderNumber.trim()\n : generatedNumber;\n\n const [quoteCustomFields, quoteLineCustomFields] = await Promise.all([\n loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote,\n recordIds: [snapshot.quote.id],\n tenantIdByRecord: { [snapshot.quote.id]: snapshot.quote.tenantId },\n organizationIdByRecord: {\n [snapshot.quote.id]: snapshot.quote.organizationId,\n },\n }),\n snapshot.lines.length\n ? loadCustomFieldValues({\n em,\n entityId: E.sales.sales_quote_line,\n recordIds: snapshot.lines.map((line) => line.id),\n tenantIdByRecord: Object.fromEntries(\n snapshot.lines.map((line) => [line.id, snapshot.quote.tenantId]),\n ),\n organizationIdByRecord: Object.fromEntries(\n snapshot.lines.map((line) => [\n line.id,\n snapshot.quote.organizationId,\n ]),\n ),\n })\n : Promise.resolve({}),\n ]);\n\n const order = em.create(SalesOrder, {\n id: orderId,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n orderNumber,\n statusEntryId: snapshot.quote.statusEntryId ?? null,\n status: snapshot.quote.status ?? null,\n fulfillmentStatusEntryId: null,\n fulfillmentStatus: null,\n paymentStatusEntryId: null,\n paymentStatus: null,\n customerEntityId: snapshot.quote.customerEntityId ?? null,\n customerContactId: snapshot.quote.customerContactId ?? null,\n customerSnapshot: snapshot.quote.customerSnapshot\n ? cloneJson(snapshot.quote.customerSnapshot)\n : null,\n billingAddressId: snapshot.quote.billingAddressId ?? null,\n shippingAddressId: snapshot.quote.shippingAddressId ?? null,\n billingAddressSnapshot: snapshot.quote.billingAddressSnapshot\n ? cloneJson(snapshot.quote.billingAddressSnapshot)\n : null,\n shippingAddressSnapshot: snapshot.quote.shippingAddressSnapshot\n ? cloneJson(snapshot.quote.shippingAddressSnapshot)\n : null,\n currencyCode: snapshot.quote.currencyCode,\n exchangeRate: null,\n taxStrategyKey: null,\n discountStrategyKey: null,\n taxInfo: snapshot.quote.taxInfo\n ? cloneJson(snapshot.quote.taxInfo)\n : null,\n shippingMethodId: snapshot.quote.shippingMethodId ?? null,\n shippingMethodCode: snapshot.quote.shippingMethodCode ?? null,\n deliveryWindowId: snapshot.quote.deliveryWindowId ?? null,\n deliveryWindowCode: snapshot.quote.deliveryWindowCode ?? null,\n paymentMethodId: snapshot.quote.paymentMethodId ?? null,\n paymentMethodCode: snapshot.quote.paymentMethodCode ?? null,\n channelId: snapshot.quote.channelId ?? null,\n placedAt: snapshot.quote.validFrom\n ? new Date(snapshot.quote.validFrom)\n : quote.createdAt,\n expectedDeliveryAt: snapshot.quote.validUntil\n ? new Date(snapshot.quote.validUntil)\n : null,\n dueAt: null,\n comments: snapshot.quote.comments ?? null,\n internalNotes: null,\n shippingMethodSnapshot: snapshot.quote.shippingMethodSnapshot\n ? cloneJson(snapshot.quote.shippingMethodSnapshot)\n : null,\n deliveryWindowSnapshot: snapshot.quote.deliveryWindowSnapshot\n ? cloneJson(snapshot.quote.deliveryWindowSnapshot)\n : null,\n paymentMethodSnapshot: snapshot.quote.paymentMethodSnapshot\n ? cloneJson(snapshot.quote.paymentMethodSnapshot)\n : null,\n metadata: snapshot.quote.metadata\n ? cloneJson(snapshot.quote.metadata)\n : null,\n customFieldSetId: snapshot.quote.customFieldSetId ?? null,\n subtotalNetAmount: snapshot.quote.subtotalNetAmount,\n subtotalGrossAmount: snapshot.quote.subtotalGrossAmount,\n discountTotalAmount: snapshot.quote.discountTotalAmount,\n taxTotalAmount: snapshot.quote.taxTotalAmount,\n shippingNetAmount: \"0\",\n shippingGrossAmount: \"0\",\n surchargeTotalAmount: \"0\",\n grandTotalNetAmount: snapshot.quote.grandTotalNetAmount,\n grandTotalGrossAmount: snapshot.quote.grandTotalGrossAmount,\n paidTotalAmount: \"0\",\n refundedTotalAmount: \"0\",\n outstandingAmount: snapshot.quote.grandTotalGrossAmount,\n totalsSnapshot: snapshot.quote.totalsSnapshot\n ? cloneJson(snapshot.quote.totalsSnapshot)\n : null,\n lineItemCount: snapshot.quote.lineItemCount,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(order);\n\n const orderLineMap = new Map<string, SalesOrderLine>();\n snapshot.lines.forEach((line, index) => {\n const orderLine = em.create(SalesOrderLine, {\n id: line.id,\n order,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n lineNumber: line.lineNumber ?? index + 1,\n kind: line.kind as SalesLineKind,\n statusEntryId: (line as any).statusEntryId ?? null,\n status: (line as any).status ?? null,\n productId: line.productId ?? null,\n productVariantId: line.productVariantId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n name: line.name ?? null,\n description: line.description ?? null,\n comment: line.comment ?? null,\n quantity: line.quantity,\n quantityUnit: line.quantityUnit ?? null,\n normalizedQuantity: line.normalizedQuantity ?? line.quantity,\n normalizedUnit: line.normalizedUnit ?? line.quantityUnit ?? null,\n uomSnapshot: line.uomSnapshot ? cloneJson(line.uomSnapshot) : null,\n reservedQuantity: \"0\",\n fulfilledQuantity: \"0\",\n invoicedQuantity: \"0\",\n returnedQuantity: \"0\",\n currencyCode: line.currencyCode,\n unitPriceNet: line.unitPriceNet,\n unitPriceGross: line.unitPriceGross,\n discountAmount: line.discountAmount,\n discountPercent: line.discountPercent,\n taxRate: line.taxRate,\n taxAmount: line.taxAmount,\n totalNetAmount: line.totalNetAmount,\n totalGrossAmount: line.totalGrossAmount,\n configuration: line.configuration\n ? cloneJson(line.configuration)\n : null,\n promotionCode: line.promotionCode ?? null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n metadata: line.metadata ? cloneJson(line.metadata) : null,\n customFieldSetId: line.customFieldSetId ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(orderLine);\n orderLineMap.set(orderLine.id, orderLine);\n });\n\n snapshot.adjustments.forEach((adj, index) => {\n const orderLineId = adj.quoteLineId ?? null;\n const orderLine = orderLineId\n ? (orderLineMap.get(orderLineId) ?? null)\n : null;\n const entity = em.create(SalesOrderAdjustment, {\n id: adj.id,\n order,\n orderLine: orderLine ?? null,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n scope: adj.scope,\n kind: adj.kind as SalesAdjustmentKind,\n code: adj.code ?? null,\n label: adj.label ?? null,\n calculatorKey: adj.calculatorKey ?? null,\n promotionId: adj.promotionId ?? null,\n rate: adj.rate,\n amountNet: adj.amountNet,\n amountGross: adj.amountGross,\n currencyCode: adj.currencyCode ?? null,\n metadata: adj.metadata ? cloneJson(adj.metadata) : null,\n position: adj.position ?? index,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n em.persist(entity);\n });\n\n const [addresses, notes, tags] = await Promise.all([\n em.find(SalesDocumentAddress, {\n documentId: snapshot.quote.id,\n documentKind: \"quote\",\n }),\n em.find(SalesNote, {\n contextType: \"quote\",\n contextId: snapshot.quote.id,\n }),\n em.find(SalesDocumentTagAssignment, {\n documentId: snapshot.quote.id,\n documentKind: \"quote\",\n }),\n ]);\n addresses.forEach((entry) => {\n entry.documentKind = \"order\";\n entry.documentId = order.id;\n entry.order = order;\n entry.quote = null;\n entry.updatedAt = new Date();\n });\n notes.forEach((note) => {\n note.contextType = \"order\";\n note.contextId = order.id;\n note.order = order;\n note.quote = null;\n note.updatedAt = new Date();\n });\n tags.forEach((assignment) => {\n assignment.documentKind = \"order\";\n assignment.documentId = order.id;\n assignment.order = order;\n assignment.quote = null;\n assignment.updatedAt = new Date();\n });\n\n const documentCustomValues = quoteCustomFields[snapshot.quote.id];\n if (documentCustomValues && Object.keys(documentCustomValues).length) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order,\n recordId: order.id,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n values: documentCustomValues,\n });\n }\n const lineCustomEntries = quoteLineCustomFields as Record<\n string,\n Record<string, unknown>\n >;\n if (lineCustomEntries && Object.keys(lineCustomEntries).length) {\n for (const [lineId, values] of Object.entries(lineCustomEntries)) {\n if (!values || !Object.keys(values).length) continue;\n if (!orderLineMap.has(lineId)) continue;\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_order_line,\n recordId: lineId,\n organizationId: snapshot.quote.organizationId,\n tenantId: snapshot.quote.tenantId,\n values,\n });\n }\n }\n\n await em.nativeDelete(SalesQuoteAdjustment, { quote: snapshot.quote.id });\n await em.nativeDelete(SalesQuoteLine, { quote: snapshot.quote.id });\n em.remove(quote);\n await em.flush();\n\n return { orderId: order.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!before) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.convert\",\n \"Convert quote to order\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: before.quote.tenantId,\n organizationId: before.quote.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: {\n quote: before,\n order: after ?? null,\n } satisfies QuoteConvertUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteConvertUndoPayload>(logEntry);\n const quoteSnapshot = payload?.quote;\n const orderSnapshot = payload?.order;\n if (!quoteSnapshot) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(\n ctx,\n quoteSnapshot.quote.organizationId,\n quoteSnapshot.quote.tenantId,\n );\n if (orderSnapshot) {\n const orderId = orderSnapshot.order.id;\n const orderLineIds = orderSnapshot.lines.map((line) => line.id);\n const existingOrder = await em.findOne(SalesOrder, { id: orderId });\n if (existingOrder) {\n const shipments = await em.find(SalesShipment, { order: orderId });\n const shipmentIds = shipments.map((entry) => entry.id);\n if (shipmentIds.length) {\n await em.nativeDelete(SalesShipmentItem, {\n shipment: { $in: shipmentIds },\n });\n await em.nativeDelete(SalesShipment, { id: { $in: shipmentIds } });\n }\n await em.nativeDelete(SalesPaymentAllocation, { order: orderId });\n await em.nativeDelete(SalesPayment, { order: orderId });\n await em.nativeDelete(SalesDocumentAddress, {\n documentId: orderId,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesDocumentTagAssignment, {\n documentId: orderId,\n documentKind: \"order\",\n });\n await em.nativeDelete(SalesOrderAdjustment, { order: orderId });\n await em.nativeDelete(SalesOrderLine, { order: orderId });\n em.remove(existingOrder);\n }\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order,\n recordId: orderId,\n });\n if (orderLineIds.length) {\n await em.nativeDelete(CustomFieldValue, {\n entityId: E.sales.sales_order_line,\n recordId: { $in: orderLineIds } as any,\n });\n }\n }\n const noteIds = quoteSnapshot.notes.map((note) => note.id);\n if (noteIds.length) {\n await em.nativeDelete(SalesNote, { id: { $in: noteIds } });\n }\n await restoreQuoteGraph(em, quoteSnapshot);\n await em.flush();\n },\n};\n\nconst orderLineUpsertSchema = orderLineCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst orderLineDeleteSchema = z.object({\n id: z.string().uuid(),\n orderId: z.string().uuid(),\n});\n\nconst quoteLineUpsertSchema = quoteLineCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst quoteLineDeleteSchema = z.object({\n id: z.string().uuid(),\n quoteId: z.string().uuid(),\n});\n\nconst orderAdjustmentUpsertSchema = orderAdjustmentCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst orderAdjustmentDeleteSchema = z.object({\n id: z.string().uuid(),\n orderId: z.string().uuid(),\n});\n\nconst quoteAdjustmentUpsertSchema = quoteAdjustmentCreateSchema.extend({\n id: z.string().uuid().optional(),\n});\n\nconst quoteAdjustmentDeleteSchema = z.object({\n id: z.string().uuid(),\n quoteId: z.string().uuid(),\n});\n\nconst orderLineUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; lineId: string }\n> = {\n id: \"sales.orders.lines.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const rawBody = (input?.body as Record<string, unknown> | undefined) ?? {};\n const parsed = orderLineUpsertSchema.parse(rawBody);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const existingSnapshot = parsed.id\n ? (lineSnapshots.find((line) => line.id === parsed.id) ?? null)\n : null;\n const priceMode =\n parsed.priceMode === \"gross\"\n ? \"gross\"\n : parsed.priceMode === \"net\"\n ? \"net\"\n : null;\n let unitPriceNet =\n parsed.unitPriceNet ?? existingSnapshot?.unitPriceNet ?? null;\n let unitPriceGross =\n parsed.unitPriceGross ?? existingSnapshot?.unitPriceGross ?? null;\n let taxRate = parsed.taxRate ?? existingSnapshot?.taxRate ?? null;\n if (priceMode && (unitPriceNet === null || unitPriceGross === null)) {\n let taxService: TaxCalculationService | null = null;\n try {\n taxService = ctx.container.resolve(\n \"taxCalculationService\",\n ) as TaxCalculationService;\n } catch {\n taxService = null;\n }\n if (taxService) {\n const taxResult = await taxService.calculateUnitAmounts({\n amount:\n priceMode === \"gross\"\n ? (unitPriceGross ?? unitPriceNet ?? 0)\n : (unitPriceNet ?? unitPriceGross ?? 0),\n mode: priceMode,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n taxRateId: parsed.taxRateId ?? undefined,\n taxRate: taxRate ?? undefined,\n });\n unitPriceNet = unitPriceNet ?? taxResult.netAmount;\n unitPriceGross = unitPriceGross ?? taxResult.grossAmount;\n taxRate = taxResult.taxRate ?? taxRate;\n }\n }\n\n const metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? { ...parsed.metadata }\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : {};\n if (parsed.priceId) metadata.priceId = parsed.priceId;\n if (priceMode) metadata.priceMode = priceMode;\n\n const statusEntryId =\n parsed.statusEntryId ?? (existingSnapshot as any)?.statusEntryId ?? null;\n const lineId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n const lineUomInput = {\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n quantity: parsed.quantity ?? existingSnapshot?.quantity ?? 0,\n quantityUnit: parsed.quantityUnit ?? existingSnapshot?.quantityUnit ?? null,\n normalizedQuantity: existingSnapshot?.normalizedQuantity ?? null,\n normalizedUnit: existingSnapshot?.normalizedUnit ?? null,\n uomSnapshot: existingSnapshot?.uomSnapshot ?? null,\n };\n const uomResolver = createUomResolver();\n let normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n const convertedPrices = convertLineUnitPricesOnUnitChange({\n existingSnapshot,\n nextQuantityUnit: normalizedUom.quantityUnit,\n nextUomSnapshot: normalizedUom.uomSnapshot,\n unitPriceNet,\n unitPriceGross,\n });\n if (convertedPrices.didConvert) {\n unitPriceNet = convertedPrices.unitPriceNet;\n unitPriceGross = convertedPrices.unitPriceGross;\n normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n }\n const updatedSnapshot: SalesLineSnapshot & {\n statusEntryId?: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n promotionSnapshot?: Record<string, unknown> | null;\n } = {\n id: lineId,\n lineNumber:\n parsed.lineNumber ??\n existingSnapshot?.lineNumber ??\n lineSnapshots.length + 1,\n kind: parsed.kind ?? existingSnapshot?.kind ?? \"product\",\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n name: parsed.name ?? existingSnapshot?.name ?? null,\n description: parsed.description ?? existingSnapshot?.description ?? null,\n comment: parsed.comment ?? existingSnapshot?.comment ?? null,\n quantity: normalizedUom.quantity,\n quantityUnit: normalizedUom.quantityUnit,\n normalizedQuantity: normalizedUom.normalizedQuantity,\n normalizedUnit: normalizedUom.normalizedUnit,\n uomSnapshot: normalizedUom.uomSnapshot\n ? cloneJson(normalizedUom.uomSnapshot)\n : null,\n currencyCode:\n parsed.currencyCode ??\n existingSnapshot?.currencyCode ??\n order.currencyCode,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n discountAmount:\n parsed.discountAmount ?? existingSnapshot?.discountAmount ?? 0,\n discountPercent:\n parsed.discountPercent ?? existingSnapshot?.discountPercent ?? 0,\n taxRate: taxRate ?? 0,\n taxAmount: parsed.taxAmount ?? existingSnapshot?.taxAmount ?? null,\n totalNetAmount:\n parsed.totalNetAmount ?? existingSnapshot?.totalNetAmount ?? null,\n totalGrossAmount:\n parsed.totalGrossAmount ?? existingSnapshot?.totalGrossAmount ?? null,\n configuration:\n parsed.configuration ?? existingSnapshot?.configuration ?? null,\n promotionCode:\n parsed.promotionCode ?? existingSnapshot?.promotionCode ?? null,\n metadata,\n customFieldSetId:\n parsed.customFieldSetId ?? existingSnapshot?.customFieldSetId ?? null,\n customFields:\n parsed.customFields && typeof parsed.customFields === \"object\"\n ? cloneJson(parsed.customFields)\n : ((existingSnapshot as any)?.customFields ?? null),\n };\n (updatedSnapshot as any).statusEntryId = statusEntryId;\n (updatedSnapshot as any).catalogSnapshot =\n parsed.catalogSnapshot ??\n (existingSnapshot as any)?.catalogSnapshot ??\n null;\n (updatedSnapshot as any).promotionSnapshot =\n parsed.promotionSnapshot ??\n (existingSnapshot as any)?.promotionSnapshot ??\n null;\n\n let nextLines = parsed.id\n ? lineSnapshots.map((line) =>\n line.id === parsed.id ? updatedSnapshot : line,\n )\n : [...lineSnapshots, updatedSnapshot];\n nextLines = nextLines\n .sort((a, b) => (a.lineNumber ?? 0) - (b.lineNumber ?? 0))\n .map((line, index) => ({ ...line, lineNumber: index + 1 }));\n\n const sourceInputs = nextLines.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines: SalesLineSnapshot[] = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n await applyOrderLineResults({\n em,\n order,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, lineId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.lines.upsert\",\n \"Upsert order line\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst orderLineDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; lineId: string }\n> = {\n id: \"sales.orders.lines.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const { translate } = await resolveTranslations();\n const parsed = orderLineDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n const shipmentCount = await em.count(SalesShipmentItem, {\n orderLine: parsed.id,\n shipment: { deletedAt: null },\n });\n if (shipmentCount > 0) {\n throw new CrudHttpError(409, {\n error: translate(\n \"sales.documents.items.errorDeleteShipped\",\n \"Cannot delete a line that has shipped items.\",\n ),\n });\n }\n const existingLines = await em.find(\n SalesOrderLine,\n { order },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n );\n const filtered = existingLines.filter((line) => line.id !== parsed.id);\n if (filtered.length === existingLines.length) {\n throw new CrudHttpError(404, {\n error: translate(\n \"sales.documents.detail.error\",\n \"Document not found or inaccessible.\",\n ),\n });\n }\n const sourceInputs = filtered.map((line, index) => ({\n ...mapOrderLineEntityToSnapshot(line),\n statusEntryId: line.statusEntryId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: index + 1,\n }));\n const calcLines = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n await applyOrderLineResults({\n em,\n order,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, lineId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.lines.delete\",\n \"Delete order line\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteLineUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; lineId: string }\n> = {\n id: \"sales.quotes.lines.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const rawBody = (input?.body as Record<string, unknown> | undefined) ?? {};\n const parsed = quoteLineUpsertSchema.parse(rawBody);\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const existingSnapshot = parsed.id\n ? (lineSnapshots.find((line) => line.id === parsed.id) ?? null)\n : null;\n const priceMode =\n parsed.priceMode === \"gross\"\n ? \"gross\"\n : parsed.priceMode === \"net\"\n ? \"net\"\n : null;\n let unitPriceNet =\n parsed.unitPriceNet ?? existingSnapshot?.unitPriceNet ?? null;\n let unitPriceGross =\n parsed.unitPriceGross ?? existingSnapshot?.unitPriceGross ?? null;\n let taxRate = parsed.taxRate ?? existingSnapshot?.taxRate ?? null;\n if (priceMode && (unitPriceNet === null || unitPriceGross === null)) {\n let taxService: TaxCalculationService | null = null;\n try {\n taxService = ctx.container.resolve(\n \"taxCalculationService\",\n ) as TaxCalculationService;\n } catch {\n taxService = null;\n }\n if (taxService) {\n const taxResult = await taxService.calculateUnitAmounts({\n amount:\n priceMode === \"gross\"\n ? (unitPriceGross ?? unitPriceNet ?? 0)\n : (unitPriceNet ?? unitPriceGross ?? 0),\n mode: priceMode,\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n taxRateId: parsed.taxRateId ?? undefined,\n taxRate: taxRate ?? undefined,\n });\n unitPriceNet = unitPriceNet ?? taxResult.netAmount;\n unitPriceGross = unitPriceGross ?? taxResult.grossAmount;\n taxRate = taxResult.taxRate ?? taxRate;\n }\n }\n const metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? { ...parsed.metadata }\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : {};\n if (parsed.priceId) metadata.priceId = parsed.priceId;\n if (priceMode) metadata.priceMode = priceMode;\n\n const statusEntryId =\n parsed.statusEntryId ?? (existingSnapshot as any)?.statusEntryId ?? null;\n const lineId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n const lineUomInput = {\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n quantity: parsed.quantity ?? existingSnapshot?.quantity ?? 0,\n quantityUnit: parsed.quantityUnit ?? existingSnapshot?.quantityUnit ?? null,\n normalizedQuantity: existingSnapshot?.normalizedQuantity ?? null,\n normalizedUnit: existingSnapshot?.normalizedUnit ?? null,\n uomSnapshot: existingSnapshot?.uomSnapshot ?? null,\n };\n const uomResolver = createUomResolver();\n let normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n const convertedPrices = convertLineUnitPricesOnUnitChange({\n existingSnapshot,\n nextQuantityUnit: normalizedUom.quantityUnit,\n nextUomSnapshot: normalizedUom.uomSnapshot,\n unitPriceNet,\n unitPriceGross,\n });\n if (convertedPrices.didConvert) {\n unitPriceNet = convertedPrices.unitPriceNet;\n unitPriceGross = convertedPrices.unitPriceGross;\n normalizedUom = await normalizeLineUom({\n em,\n resolver: uomResolver,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n line: {\n ...lineUomInput,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n },\n });\n }\n const updatedSnapshot: SalesLineSnapshot & {\n statusEntryId?: string | null;\n catalogSnapshot?: Record<string, unknown> | null;\n promotionSnapshot?: Record<string, unknown> | null;\n } = {\n id: lineId,\n lineNumber:\n parsed.lineNumber ??\n existingSnapshot?.lineNumber ??\n lineSnapshots.length + 1,\n kind: parsed.kind ?? existingSnapshot?.kind ?? \"product\",\n productId: parsed.productId ?? existingSnapshot?.productId ?? null,\n productVariantId:\n parsed.productVariantId ?? existingSnapshot?.productVariantId ?? null,\n name: parsed.name ?? existingSnapshot?.name ?? null,\n description: parsed.description ?? existingSnapshot?.description ?? null,\n comment: parsed.comment ?? existingSnapshot?.comment ?? null,\n quantity: normalizedUom.quantity,\n quantityUnit: normalizedUom.quantityUnit,\n normalizedQuantity: normalizedUom.normalizedQuantity,\n normalizedUnit: normalizedUom.normalizedUnit,\n uomSnapshot: normalizedUom.uomSnapshot\n ? cloneJson(normalizedUom.uomSnapshot)\n : null,\n currencyCode:\n parsed.currencyCode ??\n existingSnapshot?.currencyCode ??\n quote.currencyCode,\n unitPriceNet: unitPriceNet ?? 0,\n unitPriceGross: unitPriceGross ?? unitPriceNet ?? 0,\n discountAmount:\n parsed.discountAmount ?? existingSnapshot?.discountAmount ?? 0,\n discountPercent:\n parsed.discountPercent ?? existingSnapshot?.discountPercent ?? 0,\n taxRate: taxRate ?? 0,\n taxAmount: parsed.taxAmount ?? existingSnapshot?.taxAmount ?? null,\n totalNetAmount:\n parsed.totalNetAmount ?? existingSnapshot?.totalNetAmount ?? null,\n totalGrossAmount:\n parsed.totalGrossAmount ?? existingSnapshot?.totalGrossAmount ?? null,\n configuration:\n parsed.configuration ?? existingSnapshot?.configuration ?? null,\n promotionCode:\n parsed.promotionCode ?? existingSnapshot?.promotionCode ?? null,\n metadata,\n customFieldSetId:\n parsed.customFieldSetId ?? existingSnapshot?.customFieldSetId ?? null,\n customFields:\n parsed.customFields && typeof parsed.customFields === \"object\"\n ? cloneJson(parsed.customFields)\n : ((existingSnapshot as any)?.customFields ?? null),\n };\n (updatedSnapshot as any).statusEntryId = statusEntryId;\n (updatedSnapshot as any).catalogSnapshot =\n parsed.catalogSnapshot ??\n (existingSnapshot as any)?.catalogSnapshot ??\n null;\n (updatedSnapshot as any).promotionSnapshot =\n parsed.promotionSnapshot ??\n (existingSnapshot as any)?.promotionSnapshot ??\n null;\n\n let nextLines = parsed.id\n ? lineSnapshots.map((line) =>\n line.id === parsed.id ? updatedSnapshot : line,\n )\n : [...lineSnapshots, updatedSnapshot];\n nextLines = nextLines\n .sort((a, b) => (a.lineNumber ?? 0) - (b.lineNumber ?? 0))\n .map((line, index) => ({ ...line, lineNumber: index + 1 }));\n\n const sourceInputs = nextLines.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines: SalesLineSnapshot[] = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n await applyQuoteLineResults({\n em,\n quote,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, lineId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.lines.upsert\",\n \"Upsert quote line\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteLineDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; lineId: string }\n> = {\n id: \"sales.quotes.lines.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = quoteLineDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n const existingLines = await em.find(\n SalesQuoteLine,\n { quote },\n { orderBy: { lineNumber: \"asc\" } },\n );\n const adjustments = await em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n );\n const filtered = existingLines.filter((line) => line.id !== parsed.id);\n if (filtered.length === existingLines.length) {\n throw new CrudHttpError(404, { error: \"Quote line not found\" });\n }\n const sourceInputs = filtered.map((line, index) => ({\n ...mapQuoteLineEntityToSnapshot(line),\n statusEntryId: line.statusEntryId ?? null,\n catalogSnapshot: line.catalogSnapshot\n ? cloneJson(line.catalogSnapshot)\n : null,\n promotionSnapshot: line.promotionSnapshot\n ? cloneJson(line.promotionSnapshot)\n : null,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: index + 1,\n }));\n const calcLines = sourceInputs.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const adjustmentDrafts = adjustments.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n await applyQuoteLineResults({\n em,\n quote,\n calculation,\n sourceLines: sourceInputs,\n existingLines,\n });\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, lineId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.lines.delete\",\n \"Delete quote line\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst orderAdjustmentUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; adjustmentId: string }\n> = {\n id: \"sales.orders.adjustments.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = orderAdjustmentUpsertSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n if (parsed.scope === \"line\") {\n throw new CrudHttpError(400, {\n error: \"Line-scoped adjustments are not supported yet.\",\n });\n }\n\n const [existingLines, existingAdjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const adjustmentDrafts = existingAdjustments.map(mapOrderAdjustmentToDraft);\n const existingSnapshot = parsed.id\n ? (adjustmentDrafts.find((adj) => adj.id === parsed.id) ?? null)\n : null;\n const adjustmentId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n let metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? cloneJson(parsed.metadata)\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : null;\n const calculatorKey =\n parsed.calculatorKey ?? existingSnapshot?.calculatorKey ?? null;\n if (\n parsed.id &&\n calculatorKey &&\n (calculatorKey.startsWith(\"shipping-provider:\") ||\n calculatorKey.startsWith(\"payment-provider:\"))\n ) {\n metadata = { ...(metadata ?? {}), manualOverride: true };\n }\n let nextAdjustments = parsed.id\n ? adjustmentDrafts.map((adj) =>\n adj.id === parsed.id\n ? {\n ...adj,\n id: adjustmentId,\n scope: parsed.scope ?? adj.scope ?? \"order\",\n kind: parsed.kind ?? adj.kind ?? \"custom\",\n code: parsed.code ?? adj.code ?? null,\n label: parsed.label ?? adj.label ?? null,\n calculatorKey:\n parsed.calculatorKey ?? adj.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? adj.promotionId ?? null,\n rate: parsed.rate ?? adj.rate ?? null,\n amountNet: parsed.amountNet ?? adj.amountNet ?? null,\n amountGross: parsed.amountGross ?? adj.amountGross ?? null,\n currencyCode:\n parsed.currencyCode ?? adj.currencyCode ?? order.currencyCode,\n metadata,\n customFields:\n parsed.customFields !== undefined\n ? parsed.customFields\n : ((adj as any).customFields ?? null),\n position:\n parsed.position ?? adj.position ?? adjustmentDrafts.length,\n }\n : adj,\n )\n : [\n ...adjustmentDrafts,\n {\n id: adjustmentId,\n scope: parsed.scope ?? \"order\",\n kind: parsed.kind ?? \"custom\",\n code: parsed.code ?? null,\n label: parsed.label ?? null,\n calculatorKey: parsed.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? null,\n rate: parsed.rate ?? null,\n amountNet: parsed.amountNet ?? null,\n amountGross: parsed.amountGross ?? null,\n currencyCode: parsed.currencyCode ?? order.currencyCode,\n metadata,\n customFields: parsed.customFields ?? null,\n position: parsed.position ?? adjustmentDrafts.length,\n },\n ];\n\n nextAdjustments = nextAdjustments\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((adj, index) => ({ ...adj, position: adj.position ?? index }));\n\n const sourceLines = lineSnapshots.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines = sourceLines.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: nextAdjustments,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n const adjustmentInputs = nextAdjustments.map((adj, index) => ({\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? order.currencyCode,\n metadata: adj.metadata ?? undefined,\n customFields: (adj as any).customFields ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n order.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, adjustmentId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.adjustments.upsert\",\n \"Upsert order adjustment\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst orderAdjustmentDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { orderId: string; adjustmentId: string }\n> = {\n id: \"sales.orders.adjustments.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const orderId = typeof raw.orderId === \"string\" ? raw.orderId : null;\n if (!orderId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadOrderSnapshot(em, orderId);\n if (snapshot)\n ensureOrderScope(\n ctx,\n snapshot.order.organizationId,\n snapshot.order.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = orderAdjustmentDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const order = await em.findOne(SalesOrder, {\n id: parsed.orderId,\n deletedAt: null,\n });\n if (!order)\n throw new CrudHttpError(404, { error: \"Sales order not found\" });\n ensureOrderScope(ctx, order.organizationId, order.tenantId);\n\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesOrderLine, { order }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesOrderAdjustment,\n { order },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const filtered = adjustments.filter((adj) => adj.id !== parsed.id);\n if (filtered.length === adjustments.length) {\n throw new CrudHttpError(404, { error: \"Adjustment not found\" });\n }\n const lineSnapshots = existingLines.map(mapOrderLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = filtered.map(mapOrderAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: order.tenantId,\n organizationId: order.organizationId,\n currencyCode: order.currencyCode,\n shippingSnapshot: order.shippingMethodSnapshot,\n paymentSnapshot: order.paymentMethodSnapshot,\n shippingMethodId: order.shippingMethodId ?? null,\n paymentMethodId: order.paymentMethodId ?? null,\n shippingMethodCode: order.shippingMethodCode ?? null,\n paymentMethodCode: order.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"order\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n existingTotals: resolveExistingPaymentTotals(order),\n });\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n orderId: order.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? order.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceOrderAdjustments(em, order, calculation, adjustmentInputs);\n applyOrderTotals(order, calculation.totals, calculation.lines.length);\n order.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"order\",\n documentId: order.id,\n organizationId: order.organizationId,\n tenantId: order.tenantId,\n customerId: order.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { orderId: order.id, adjustmentId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadOrderSnapshot(em, result.orderId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as OrderGraphSnapshot | undefined;\n const after = snapshots.after as OrderGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.orders.adjustments.delete\",\n \"Delete order adjustment\",\n ),\n resourceKind: \"sales.order\",\n resourceId: result.orderId,\n tenantId: after.order.tenantId,\n organizationId: after.order.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies OrderUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<OrderUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureOrderScope(ctx, before.order.organizationId, before.order.tenantId);\n await restoreOrderGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteAdjustmentUpsertCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; adjustmentId: string }\n> = {\n id: \"sales.quotes.adjustments.upsert\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = quoteAdjustmentUpsertSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n if (parsed.scope === \"line\") {\n throw new CrudHttpError(400, {\n error: \"Line-scoped adjustments are not supported yet.\",\n });\n }\n\n const [existingLines, existingAdjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const adjustmentDrafts = existingAdjustments.map(mapQuoteAdjustmentToDraft);\n const existingSnapshot = parsed.id\n ? (adjustmentDrafts.find((adj) => adj.id === parsed.id) ?? null)\n : null;\n const adjustmentId = parsed.id ?? existingSnapshot?.id ?? randomUUID();\n let metadata =\n typeof parsed.metadata === \"object\" && parsed.metadata\n ? cloneJson(parsed.metadata)\n : existingSnapshot?.metadata\n ? cloneJson(existingSnapshot.metadata)\n : null;\n const calculatorKey =\n parsed.calculatorKey ?? existingSnapshot?.calculatorKey ?? null;\n if (\n parsed.id &&\n calculatorKey &&\n (calculatorKey.startsWith(\"shipping-provider:\") ||\n calculatorKey.startsWith(\"payment-provider:\"))\n ) {\n metadata = { ...(metadata ?? {}), manualOverride: true };\n }\n let nextAdjustments = parsed.id\n ? adjustmentDrafts.map((adj) =>\n adj.id === parsed.id\n ? {\n ...adj,\n id: adjustmentId,\n scope: parsed.scope ?? adj.scope ?? \"order\",\n kind: parsed.kind ?? adj.kind ?? \"custom\",\n code: parsed.code ?? adj.code ?? null,\n label: parsed.label ?? adj.label ?? null,\n calculatorKey:\n parsed.calculatorKey ?? adj.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? adj.promotionId ?? null,\n rate: parsed.rate ?? adj.rate ?? null,\n amountNet: parsed.amountNet ?? adj.amountNet ?? null,\n amountGross: parsed.amountGross ?? adj.amountGross ?? null,\n currencyCode:\n parsed.currencyCode ?? adj.currencyCode ?? quote.currencyCode,\n metadata,\n customFields:\n parsed.customFields !== undefined\n ? parsed.customFields\n : ((adj as any).customFields ?? null),\n position:\n parsed.position ?? adj.position ?? adjustmentDrafts.length,\n }\n : adj,\n )\n : [\n ...adjustmentDrafts,\n {\n id: adjustmentId,\n scope: parsed.scope ?? \"order\",\n kind: parsed.kind ?? \"custom\",\n code: parsed.code ?? null,\n label: parsed.label ?? null,\n calculatorKey: parsed.calculatorKey ?? null,\n promotionId: parsed.promotionId ?? null,\n rate: parsed.rate ?? null,\n amountNet: parsed.amountNet ?? null,\n amountGross: parsed.amountGross ?? null,\n currencyCode: parsed.currencyCode ?? quote.currencyCode,\n metadata,\n customFields: parsed.customFields ?? null,\n position: parsed.position ?? adjustmentDrafts.length,\n },\n ];\n\n nextAdjustments = nextAdjustments\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((adj, index) => ({ ...adj, position: adj.position ?? index }));\n\n const sourceLines = lineSnapshots.map((line, index) => ({\n ...line,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n }));\n const calcLines = sourceLines.map((line, index) =>\n createLineSnapshotFromInput(line, line.lineNumber ?? index + 1),\n );\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: nextAdjustments,\n context: calculationContext,\n });\n const adjustmentInputs = nextAdjustments.map((adj, index) => ({\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? quote.currencyCode,\n metadata: adj.metadata ?? undefined,\n customFields: (adj as any).customFields ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n quote.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, adjustmentId };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.adjustments.upsert\",\n \"Upsert quote adjustment\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nconst quoteAdjustmentDeleteCommand: CommandHandler<\n { body?: Record<string, unknown>; query?: Record<string, unknown> },\n { quoteId: string; adjustmentId: string }\n> = {\n id: \"sales.quotes.adjustments.delete\",\n async prepare(input, ctx) {\n const raw = (input?.body as Record<string, unknown> | undefined) ?? {};\n const quoteId = typeof raw.quoteId === \"string\" ? raw.quoteId : null;\n if (!quoteId) return {};\n const em = ctx.container.resolve(\"em\") as EntityManager;\n const snapshot = await loadQuoteSnapshot(em, quoteId);\n if (snapshot)\n ensureQuoteScope(\n ctx,\n snapshot.quote.organizationId,\n snapshot.quote.tenantId,\n );\n return snapshot ? { before: snapshot } : {};\n },\n async execute(input, ctx) {\n const parsed = quoteAdjustmentDeleteSchema.parse(\n (input?.body as Record<string, unknown> | undefined) ?? {},\n );\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n const quote = await em.findOne(SalesQuote, {\n id: parsed.quoteId,\n deletedAt: null,\n });\n if (!quote)\n throw new CrudHttpError(404, { error: \"Sales quote not found\" });\n ensureQuoteScope(ctx, quote.organizationId, quote.tenantId);\n\n const [existingLines, adjustments] = await Promise.all([\n em.find(SalesQuoteLine, { quote }, { orderBy: { lineNumber: \"asc\" } }),\n em.find(\n SalesQuoteAdjustment,\n { quote },\n { orderBy: { position: \"asc\" } },\n ),\n ]);\n const filtered = adjustments.filter((adj) => adj.id !== parsed.id);\n if (filtered.length === adjustments.length) {\n throw new CrudHttpError(404, { error: \"Adjustment not found\" });\n }\n const lineSnapshots = existingLines.map(mapQuoteLineEntityToSnapshot);\n const calcLines = lineSnapshots.map((line, index) =>\n createLineSnapshotFromInput(\n {\n ...line,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n lineNumber: line.lineNumber ?? index + 1,\n statusEntryId: (line as any).statusEntryId ?? null,\n catalogSnapshot: (line as any).catalogSnapshot ?? null,\n promotionSnapshot: (line as any).promotionSnapshot ?? null,\n },\n line.lineNumber ?? index + 1,\n ),\n );\n const adjustmentDrafts = filtered.map(mapQuoteAdjustmentToDraft);\n const salesCalculationService =\n ctx.container.resolve<SalesCalculationService>(\"salesCalculationService\");\n const calculationContext = buildCalculationContext({\n tenantId: quote.tenantId,\n organizationId: quote.organizationId,\n currencyCode: quote.currencyCode,\n shippingSnapshot: quote.shippingMethodSnapshot,\n paymentSnapshot: quote.paymentMethodSnapshot,\n shippingMethodId: quote.shippingMethodId ?? null,\n paymentMethodId: quote.paymentMethodId ?? null,\n shippingMethodCode: quote.shippingMethodCode ?? null,\n paymentMethodCode: quote.paymentMethodCode ?? null,\n });\n const calculation = await salesCalculationService.calculateDocumentTotals({\n documentKind: \"quote\",\n lines: calcLines,\n adjustments: adjustmentDrafts,\n context: calculationContext,\n });\n const adjustmentInputs = adjustmentDrafts.map((adj, index) => ({\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n quoteId: quote.id,\n scope: adj.scope ?? \"order\",\n kind: adj.kind ?? \"custom\",\n code: adj.code ?? undefined,\n label: adj.label ?? undefined,\n calculatorKey: adj.calculatorKey ?? undefined,\n promotionId: adj.promotionId ?? undefined,\n rate: adj.rate ?? undefined,\n amountNet: adj.amountNet ?? undefined,\n amountGross: adj.amountGross ?? undefined,\n currencyCode: adj.currencyCode ?? quote.currencyCode,\n metadata: adj.metadata ?? undefined,\n position: adj.position ?? index,\n }));\n await replaceQuoteAdjustments(em, quote, calculation, adjustmentInputs);\n applyQuoteTotals(quote, calculation.totals, calculation.lines.length);\n quote.updatedAt = new Date();\n let eventBus: EventBus | null = null;\n try {\n eventBus = ctx.container.resolve(\"eventBus\") as EventBus;\n } catch {\n eventBus = null;\n }\n await emitTotalsCalculated(eventBus, {\n documentKind: \"quote\",\n documentId: quote.id,\n organizationId: quote.organizationId,\n tenantId: quote.tenantId,\n customerId: quote.customerEntityId ?? null,\n totals: calculation.totals,\n lineCount: calculation.lines.length,\n });\n await em.flush();\n return { quoteId: quote.id, adjustmentId: parsed.id };\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n return loadQuoteSnapshot(em, result.quoteId);\n },\n buildLog: async ({ snapshots, result }) => {\n const before = snapshots.before as QuoteGraphSnapshot | undefined;\n const after = snapshots.after as QuoteGraphSnapshot | undefined;\n if (!after) return null;\n const { translate } = await resolveTranslations();\n return {\n actionLabel: translate(\n \"sales.audit.quotes.adjustments.delete\",\n \"Delete quote adjustment\",\n ),\n resourceKind: \"sales.quote\",\n resourceId: result.quoteId,\n tenantId: after.quote.tenantId,\n organizationId: after.quote.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: {\n undo: { before, after } satisfies QuoteUndoPayload,\n },\n };\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<QuoteUndoPayload>(logEntry);\n const before = payload?.before;\n if (!before) return;\n const em = (ctx.container.resolve(\"em\") as EntityManager).fork();\n ensureQuoteScope(ctx, before.quote.organizationId, before.quote.tenantId);\n await restoreQuoteGraph(em, before);\n await em.flush();\n },\n};\n\nregisterCommand(updateQuoteCommand);\nregisterCommand(createQuoteCommand);\nregisterCommand(deleteQuoteCommand);\nregisterCommand(convertQuoteToOrderCommand);\nregisterCommand(updateOrderCommand);\nregisterCommand(createOrderCommand);\nregisterCommand(deleteOrderCommand);\nregisterCommand(orderLineUpsertCommand);\nregisterCommand(orderLineDeleteCommand);\nregisterCommand(quoteLineUpsertCommand);\nregisterCommand(quoteLineDeleteCommand);\nregisterCommand(orderAdjustmentUpsertCommand);\nregisterCommand(orderAdjustmentDeleteCommand);\nregisterCommand(quoteAdjustmentUpsertCommand);\nregisterCommand(quoteAdjustmentDeleteCommand);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["normalizedQuantity"]
|
|
7
7
|
}
|