@open-mercato/core 0.6.7-develop.6706.1.b3a4c759bb → 0.6.7-develop.6725.1.07a748cfc2

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.
Files changed (111) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/auth/api/admin/nav.js +14 -4
  3. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  4. package/dist/modules/auth/api/users/route.js +8 -19
  5. package/dist/modules/auth/api/users/route.js.map +2 -2
  6. package/dist/modules/auth/lib/backendChrome.js +31 -14
  7. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  8. package/dist/modules/customers/api/utils.js +12 -18
  9. package/dist/modules/customers/api/utils.js.map +2 -2
  10. package/dist/modules/customers/cli.js +11 -4
  11. package/dist/modules/customers/cli.js.map +2 -2
  12. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +4 -2
  13. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
  14. package/dist/modules/customers/components/formConfig.js +14 -10
  15. package/dist/modules/customers/components/formConfig.js.map +2 -2
  16. package/dist/modules/dashboards/api/widgets/data/batch/route.js +4 -2
  17. package/dist/modules/dashboards/api/widgets/data/batch/route.js.map +2 -2
  18. package/dist/modules/dashboards/api/widgets/data/route.js +20 -2
  19. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  20. package/dist/modules/dashboards/lib/aggregations.js +76 -40
  21. package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
  22. package/dist/modules/dashboards/lib/exactDecimal.js +69 -0
  23. package/dist/modules/dashboards/lib/exactDecimal.js.map +7 -0
  24. package/dist/modules/dashboards/services/widgetDataService.js +228 -5
  25. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  26. package/dist/modules/feature_toggles/components/FeatureGuard.js +3 -2
  27. package/dist/modules/feature_toggles/components/FeatureGuard.js.map +2 -2
  28. package/dist/modules/feature_toggles/components/hooks/staleTime.js +5 -0
  29. package/dist/modules/feature_toggles/components/hooks/staleTime.js.map +7 -0
  30. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js +5 -2
  31. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js.map +2 -2
  32. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js +5 -2
  33. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js.map +2 -2
  34. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js +5 -2
  35. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js.map +2 -2
  36. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js +5 -2
  37. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js.map +2 -2
  38. package/dist/modules/inbox_ops/api/proposals/route.js +16 -1
  39. package/dist/modules/inbox_ops/api/proposals/route.js.map +2 -2
  40. package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js +32 -0
  41. package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js.map +7 -0
  42. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -5
  43. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +2 -2
  44. package/dist/modules/integrations/widgets/injection/external-ids/widget.js +14 -0
  45. package/dist/modules/integrations/widgets/injection/external-ids/widget.js.map +7 -0
  46. package/dist/modules/messages/lib/searchLookup.js +8 -16
  47. package/dist/modules/messages/lib/searchLookup.js.map +2 -2
  48. package/dist/modules/query_index/api/openapi.js +13 -1
  49. package/dist/modules/query_index/api/openapi.js.map +2 -2
  50. package/dist/modules/query_index/api/status.js +165 -105
  51. package/dist/modules/query_index/api/status.js.map +2 -2
  52. package/dist/modules/query_index/components/QueryIndexesTable.js +128 -41
  53. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  54. package/dist/modules/query_index/lib/batch.js +11 -4
  55. package/dist/modules/query_index/lib/batch.js.map +2 -2
  56. package/dist/modules/query_index/lib/document.js +12 -5
  57. package/dist/modules/query_index/lib/document.js.map +2 -2
  58. package/dist/modules/query_index/lib/engine.js +36 -4
  59. package/dist/modules/query_index/lib/engine.js.map +2 -2
  60. package/dist/modules/query_index/lib/indexer.js +1 -1
  61. package/dist/modules/query_index/lib/indexer.js.map +2 -2
  62. package/dist/modules/query_index/lib/search-tokens.js +7 -4
  63. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  64. package/dist/modules/sales/api/documents/factory.js +14 -3
  65. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  66. package/dist/modules/sales/commands/documents.js +22 -1
  67. package/dist/modules/sales/commands/documents.js.map +2 -2
  68. package/dist/modules/sales/components/useSalesChannelsEnabled.js +2 -35
  69. package/dist/modules/sales/components/useSalesChannelsEnabled.js.map +2 -2
  70. package/dist/modules/sales/data/validators.js +25 -4
  71. package/dist/modules/sales/data/validators.js.map +2 -2
  72. package/package.json +7 -7
  73. package/src/modules/auth/api/admin/nav.ts +24 -4
  74. package/src/modules/auth/api/users/route.ts +8 -28
  75. package/src/modules/auth/lib/backendChrome.tsx +51 -13
  76. package/src/modules/customers/api/utils.ts +12 -31
  77. package/src/modules/customers/cli.ts +11 -4
  78. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +4 -0
  79. package/src/modules/customers/components/formConfig.tsx +12 -8
  80. package/src/modules/dashboards/api/widgets/data/batch/route.ts +4 -0
  81. package/src/modules/dashboards/api/widgets/data/route.ts +21 -0
  82. package/src/modules/dashboards/lib/aggregations.ts +122 -43
  83. package/src/modules/dashboards/lib/exactDecimal.ts +96 -0
  84. package/src/modules/dashboards/services/widgetDataService.ts +342 -4
  85. package/src/modules/feature_toggles/components/FeatureGuard.tsx +9 -2
  86. package/src/modules/feature_toggles/components/hooks/staleTime.ts +5 -0
  87. package/src/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.ts +13 -1
  88. package/src/modules/feature_toggles/components/hooks/useFeatureFlagJson.ts +12 -3
  89. package/src/modules/feature_toggles/components/hooks/useFeatureFlagNumber.ts +10 -1
  90. package/src/modules/feature_toggles/components/hooks/useFeatureFlagString.ts +10 -1
  91. package/src/modules/inbox_ops/api/proposals/route.ts +20 -1
  92. package/src/modules/inbox_ops/subscribers/search-reindex-proposal-created.ts +39 -0
  93. package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -5
  94. package/src/modules/integrations/widgets/injection/external-ids/widget.ts +13 -0
  95. package/src/modules/messages/lib/searchLookup.ts +11 -34
  96. package/src/modules/query_index/api/openapi.ts +12 -0
  97. package/src/modules/query_index/api/status.ts +238 -136
  98. package/src/modules/query_index/components/QueryIndexesTable.tsx +192 -46
  99. package/src/modules/query_index/i18n/de.json +5 -3
  100. package/src/modules/query_index/i18n/en.json +5 -3
  101. package/src/modules/query_index/i18n/es.json +5 -3
  102. package/src/modules/query_index/i18n/pl.json +5 -3
  103. package/src/modules/query_index/lib/batch.ts +11 -4
  104. package/src/modules/query_index/lib/document.ts +35 -4
  105. package/src/modules/query_index/lib/engine.ts +53 -5
  106. package/src/modules/query_index/lib/indexer.ts +1 -1
  107. package/src/modules/query_index/lib/search-tokens.ts +13 -4
  108. package/src/modules/sales/api/documents/factory.ts +28 -3
  109. package/src/modules/sales/commands/documents.ts +26 -2
  110. package/src/modules/sales/components/useSalesChannelsEnabled.ts +2 -48
  111. package/src/modules/sales/data/validators.ts +50 -5
@@ -1,41 +1,8 @@
1
1
  "use client";
2
- import * as React from "react";
3
- import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
2
+ import { useFeatureFlagBoolean } from "@open-mercato/core/modules/feature_toggles/components/hooks/useFeatureFlagBoolean";
4
3
  import { SALES_CHANNELS_TOGGLE_ID } from "../lib/salesChannelsToggleId.js";
5
- const CACHE_TTL_MS = 6e4;
6
- async function fetchSalesChannelsEnabled() {
7
- try {
8
- const call = await apiCall(
9
- `/api/feature_toggles/check/boolean?identifier=${SALES_CHANNELS_TOGGLE_ID}`
10
- );
11
- if (!call.ok) return true;
12
- return !(call.result?.ok === true && call.result.value === false);
13
- } catch {
14
- return true;
15
- }
16
- }
17
- let cache = null;
18
- function getSalesChannelsEnabled() {
19
- const now = Date.now();
20
- if (!cache || now - cache.at > CACHE_TTL_MS) {
21
- cache = { value: fetchSalesChannelsEnabled(), at: now };
22
- }
23
- return cache.value;
24
- }
25
4
  function useSalesChannelsEnabled() {
26
- const [resolved, setResolved] = React.useState(null);
27
- React.useEffect(() => {
28
- let active = true;
29
- getSalesChannelsEnabled().then((value) => {
30
- if (active) setResolved(value);
31
- }).catch(() => {
32
- if (active) setResolved(true);
33
- });
34
- return () => {
35
- active = false;
36
- };
37
- }, []);
38
- return { enabled: resolved !== false, isLoading: resolved === null };
5
+ return useFeatureFlagBoolean({ id: SALES_CHANNELS_TOGGLE_ID, defaultValue: true });
39
6
  }
40
7
  export {
41
8
  SALES_CHANNELS_TOGGLE_ID,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/sales/components/useSalesChannelsEnabled.ts"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { SALES_CHANNELS_TOGGLE_ID } from '../lib/salesChannelsToggleId'\n\nexport { SALES_CHANNELS_TOGGLE_ID }\n\nconst CACHE_TTL_MS = 60_000\n\ntype FeatureToggleCheckResponse = {\n ok?: boolean\n value?: unknown\n}\n\n// Fails open: channels stay visible unless the toggle explicitly resolves to\n// false. A missing toggle definition (404) or an absent feature_toggles module\n// must not hide sales channel UI.\nasync function fetchSalesChannelsEnabled(): Promise<boolean> {\n try {\n const call = await apiCall<FeatureToggleCheckResponse>(\n `/api/feature_toggles/check/boolean?identifier=${SALES_CHANNELS_TOGGLE_ID}`,\n )\n if (!call.ok) return true\n return !(call.result?.ok === true && call.result.value === false)\n } catch {\n return true\n }\n}\n\nlet cache: { value: Promise<boolean>; at: number } | null = null\n\nfunction getSalesChannelsEnabled(): Promise<boolean> {\n const now = Date.now()\n if (!cache || now - cache.at > CACHE_TTL_MS) {\n cache = { value: fetchSalesChannelsEnabled(), at: now }\n }\n return cache.value\n}\n\nexport function useSalesChannelsEnabled(): { enabled: boolean; isLoading: boolean } {\n const [resolved, setResolved] = React.useState<boolean | null>(null)\n\n React.useEffect(() => {\n let active = true\n getSalesChannelsEnabled()\n .then((value) => {\n if (active) setResolved(value)\n })\n .catch(() => {\n if (active) setResolved(true)\n })\n return () => {\n active = false\n }\n }, [])\n\n return { enabled: resolved !== false, isLoading: resolved === null }\n}\n"],
5
- "mappings": ";AAEA,YAAY,WAAW;AACvB,SAAS,eAAe;AACxB,SAAS,gCAAgC;AAIzC,MAAM,eAAe;AAUrB,eAAe,4BAA8C;AAC3D,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,iDAAiD,wBAAwB;AAAA,IAC3E;AACA,QAAI,CAAC,KAAK,GAAI,QAAO;AACrB,WAAO,EAAE,KAAK,QAAQ,OAAO,QAAQ,KAAK,OAAO,UAAU;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAI,QAAwD;AAE5D,SAAS,0BAA4C;AACnD,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,CAAC,SAAS,MAAM,MAAM,KAAK,cAAc;AAC3C,YAAQ,EAAE,OAAO,0BAA0B,GAAG,IAAI,IAAI;AAAA,EACxD;AACA,SAAO,MAAM;AACf;AAEO,SAAS,0BAAoE;AAClF,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAyB,IAAI;AAEnE,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS;AACb,4BAAwB,EACrB,KAAK,CAAC,UAAU;AACf,UAAI,OAAQ,aAAY,KAAK;AAAA,IAC/B,CAAC,EACA,MAAM,MAAM;AACX,UAAI,OAAQ,aAAY,IAAI;AAAA,IAC9B,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,aAAa,OAAO,WAAW,aAAa,KAAK;AACrE;",
4
+ "sourcesContent": ["\"use client\"\n\nimport { useFeatureFlagBoolean } from '@open-mercato/core/modules/feature_toggles/components/hooks/useFeatureFlagBoolean'\nimport { SALES_CHANNELS_TOGGLE_ID } from '../lib/salesChannelsToggleId'\n\nexport { SALES_CHANNELS_TOGGLE_ID }\n\n// Fails open: channels stay visible unless the toggle explicitly resolves to\n// false. A missing toggle definition (404) or an absent feature_toggles module\n// must not hide sales channel UI.\nexport function useSalesChannelsEnabled(): { enabled: boolean; isLoading: boolean } {\n return useFeatureFlagBoolean({ id: SALES_CHANNELS_TOGGLE_ID, defaultValue: true })\n}\n"],
5
+ "mappings": ";AAEA,SAAS,6BAA6B;AACtC,SAAS,gCAAgC;AAOlC,SAAS,0BAAoE;AAClF,SAAO,sBAAsB,EAAE,IAAI,0BAA0B,cAAc,KAAK,CAAC;AACnF;",
6
6
  "names": []
7
7
  }
@@ -419,6 +419,26 @@ const quoteAdjustmentCreateSchema = scoped.extend({
419
419
  const quoteAdjustmentUpdateSchema = z.object({
420
420
  id: uuid()
421
421
  }).merge(quoteAdjustmentCreateSchema.partial());
422
+ const ORDER_PAYMENT_LEDGER_FIELDS = [
423
+ "paidTotalAmount",
424
+ "refundedTotalAmount",
425
+ "outstandingAmount"
426
+ ];
427
+ const ORDER_PAYMENT_LEDGER_WARNING_CODE = "sales.order.payment_ledger_input_deprecated";
428
+ function resolveSuppliedOrderPaymentLedgerFields(value) {
429
+ if (!value || typeof value !== "object" || Array.isArray(value)) return [];
430
+ return ORDER_PAYMENT_LEDGER_FIELDS.filter(
431
+ (field) => Object.prototype.hasOwnProperty.call(value, field)
432
+ );
433
+ }
434
+ const orderPaymentLedgerShape = {
435
+ /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */
436
+ paidTotalAmount: decimal({ min: 0 }).optional(),
437
+ /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */
438
+ refundedTotalAmount: decimal({ min: 0 }).optional(),
439
+ /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */
440
+ outstandingAmount: decimal().optional()
441
+ };
422
442
  const orderTotalsSchema = z.object({
423
443
  subtotalNetAmount: decimal({ min: 0 }).optional(),
424
444
  subtotalGrossAmount: decimal({ min: 0 }).optional(),
@@ -429,9 +449,6 @@ const orderTotalsSchema = z.object({
429
449
  surchargeTotalAmount: decimal({ min: 0 }).optional(),
430
450
  grandTotalNetAmount: decimal({ min: 0 }).optional(),
431
451
  grandTotalGrossAmount: decimal({ min: 0 }).optional(),
432
- paidTotalAmount: decimal({ min: 0 }).optional(),
433
- refundedTotalAmount: decimal({ min: 0 }).optional(),
434
- outstandingAmount: decimal().optional(),
435
452
  lineItemCount: z.coerce.number().int().min(0).optional()
436
453
  });
437
454
  const quoteTotalsSchema = z.object({
@@ -482,7 +499,8 @@ const orderCreateSchema = scoped.extend({
482
499
  lines: z.array(orderLineCreateSchema.omit({ organizationId: true, tenantId: true, orderId: true })).optional(),
483
500
  adjustments: z.array(orderAdjustmentCreateSchema.omit({ organizationId: true, tenantId: true, orderId: true })).optional(),
484
501
  tags: z.array(uuid()).optional(),
485
- ...orderTotalsSchema.shape
502
+ ...orderTotalsSchema.shape,
503
+ ...orderPaymentLedgerShape
486
504
  });
487
505
  const orderUpdateSchema = z.object({
488
506
  id: uuid()
@@ -761,6 +779,8 @@ const quoteAcceptSchema = z.object({
761
779
  export {
762
780
  DISCOUNT_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,
763
781
  DISCOUNT_ADJUSTMENT_NEGATIVE_NET_MESSAGE,
782
+ ORDER_PAYMENT_LEDGER_FIELDS,
783
+ ORDER_PAYMENT_LEDGER_WARNING_CODE,
764
784
  RETURN_ADJUSTMENT_EXCEEDS_REMAINING_GROSS_MESSAGE,
765
785
  RETURN_ADJUSTMENT_EXCEEDS_REMAINING_NET_MESSAGE,
766
786
  RETURN_ADJUSTMENT_POSITIVE_GROSS_MESSAGE,
@@ -809,6 +829,7 @@ export {
809
829
  quoteLineUpdateSchema,
810
830
  quoteSendSchema,
811
831
  quoteUpdateSchema,
832
+ resolveSuppliedOrderPaymentLedgerFields,
812
833
  returnCreateSchema,
813
834
  returnDeleteSchema,
814
835
  returnUpdateSchema,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/sales/data/validators.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport {\n createDictionaryEntrySchema,\n updateDictionaryEntrySchema,\n} from '@open-mercato/core/modules/dictionaries/data/validators'\nimport { getPaymentProvider, getShippingProvider } from '../lib/providers'\nimport { REFERENCE_UNIT_CODES } from '@open-mercato/shared/lib/units/unitCodes'\nimport { isValidPhoneNumber } from '@open-mercato/shared/lib/phone'\n\nexport const SALES_PHONE_INVALID_MESSAGE_KEY = 'customers.people.form.primaryPhone.invalid'\n\nconst optionalPhoneField = (max = 50) =>\n z\n .string()\n .trim()\n .max(max)\n .refine((val) => isValidPhoneNumber(val), { message: SALES_PHONE_INVALID_MESSAGE_KEY })\n .optional()\n\nconst optionalNullablePhoneField = (max = 50) =>\n z\n .union([\n z\n .string()\n .trim()\n .max(max)\n .refine((val) => isValidPhoneNumber(val), { message: SALES_PHONE_INVALID_MESSAGE_KEY }),\n z.literal(''),\n z.null(),\n ])\n .optional()\n\nexport const customerSnapshotSchema = z\n .object({\n customer: z\n .object({\n primaryPhone: optionalNullablePhoneField(),\n })\n .passthrough()\n .nullable()\n .optional(),\n contact: z.unknown().optional(),\n })\n .passthrough()\n\nconst uuid = () => z.string().uuid()\n\nconst scoped = z.object({\n organizationId: uuid(),\n tenantId: uuid(),\n})\n\nconst currencyCode = z\n .string()\n .trim()\n .regex(/^[A-Z]{3}$/, 'currency code must be a three-letter ISO code')\n\nconst decimal = (opts?: { min?: number; max?: number; message?: string }) => {\n let schema = z.coerce.number()\n if (typeof opts?.min === 'number') schema = schema.min(opts.min)\n if (typeof opts?.max === 'number') schema = schema.max(opts.max, opts.message)\n return schema\n}\n\nconst MAX_QUANTITY = 999_999_999\n\nconst percentage = () => decimal({ min: 0, max: 100 })\n\nconst jsonRecord = z.record(z.string(), z.unknown())\n\nconst metadata = jsonRecord.optional()\nconst providerSettings = jsonRecord.optional()\n\nconst channelCodeSchema = z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120)\n\nconst numberFormatSchema = z.string().trim().min(1).max(191)\nconst statusListSchema = z\n .array(z.string().trim().min(1).max(120))\n .max(200)\n .optional()\n .nullable()\n\nexport const salesSettingsUpsertSchema = scoped.extend({\n orderNumberFormat: numberFormatSchema,\n quoteNumberFormat: numberFormatSchema,\n orderNextNumber: z.coerce.number().int().min(1).max(1_000_000_000).optional(),\n quoteNextNumber: z.coerce.number().int().min(1).max(1_000_000_000).optional(),\n orderCustomerEditableStatuses: statusListSchema,\n orderAddressEditableStatuses: statusListSchema,\n})\n\nexport type SalesSettingsUpsertInput = z.infer<typeof salesSettingsUpsertSchema>\n\nexport const salesEditingSettingsSchema = scoped.extend({\n orderNumberFormat: numberFormatSchema.optional(),\n quoteNumberFormat: numberFormatSchema.optional(),\n orderCustomerEditableStatuses: statusListSchema,\n orderAddressEditableStatuses: statusListSchema,\n})\n\nexport type SalesEditingSettingsInput = z.infer<typeof salesEditingSettingsSchema>\n\nexport const channelCreateSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: channelCodeSchema,\n description: z.string().trim().max(2000).optional(),\n statusEntryId: uuid().optional(),\n websiteUrl: z.string().trim().url().max(300).optional(),\n contactEmail: z.string().trim().email().max(320).optional(),\n contactPhone: optionalPhoneField(),\n addressLine1: z.string().trim().max(255).optional(),\n addressLine2: z.string().trim().max(255).optional(),\n city: z.string().trim().max(120).optional(),\n region: z.string().trim().max(120).optional(),\n postalCode: z.string().trim().max(30).optional(),\n country: z.string().trim().max(2).optional(),\n latitude: decimal().optional(),\n longitude: decimal().optional(),\n isActive: z.boolean().optional(),\n metadata,\n})\n\nexport const channelUpdateSchema = z\n .object({\n id: uuid(),\n code: channelCodeSchema,\n })\n .merge(channelCreateSchema.omit({ code: true }).partial())\n\n// Base schema without refinements (used for .partial() in update schema)\nconst shippingMethodBaseSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n description: z.string().trim().max(2000).optional(),\n carrierCode: z.string().trim().max(120).optional(),\n providerKey: z.string().trim().max(120).optional(),\n serviceLevel: z.string().trim().max(120).optional(),\n estimatedTransitDays: z.coerce.number().int().min(0).max(365).optional(),\n baseRateNet: decimal({ min: 0 }).optional(),\n baseRateGross: decimal({ min: 0 }).optional(),\n currencyCode: currencyCode.optional(),\n isActive: z.boolean().optional(),\n providerSettings,\n metadata,\n})\n\n// Refinement for provider settings validation\nconst shippingMethodRefine = (value: { providerKey?: string; providerSettings?: Record<string, unknown> }, ctx: z.RefinementCtx) => {\n if (value.providerKey) {\n const provider = getShippingProvider(value.providerKey)\n const schema = provider?.settings?.schema\n if (schema) {\n const parsed = schema.safeParse(value.providerSettings ?? {})\n if (!parsed.success) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: parsed.error.issues?.[0]?.message ?? 'Invalid provider configuration',\n path: ['providerSettings'],\n })\n }\n }\n }\n}\n\nexport const shippingMethodCreateSchema = shippingMethodBaseSchema.superRefine(shippingMethodRefine)\n\nexport const shippingMethodUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(shippingMethodBaseSchema.partial())\n .superRefine(shippingMethodRefine)\n\nexport const deliveryWindowCreateSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n description: z.string().trim().max(2000).optional(),\n leadTimeDays: z.coerce.number().int().min(0).max(365).optional(),\n cutoffTime: z.string().trim().regex(/^\\d{2}:\\d{2}$/).optional(),\n timezone: z.string().trim().max(120).optional(),\n isActive: z.boolean().optional(),\n metadata,\n})\n\nexport const deliveryWindowUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(deliveryWindowCreateSchema.partial())\n\n// Base schema without refinements (used for .partial() in update schema)\nconst paymentMethodBaseSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n description: z.string().trim().max(2000).optional(),\n providerKey: z.string().trim().max(120).optional(),\n terms: z.string().trim().max(4000).optional(),\n isActive: z.boolean().optional(),\n providerSettings,\n metadata,\n})\n\n// Refinement for provider settings validation\nconst paymentMethodRefine = (value: { providerKey?: string; providerSettings?: Record<string, unknown> }, ctx: z.RefinementCtx) => {\n if (value.providerKey) {\n const provider = getPaymentProvider(value.providerKey)\n const schema = provider?.settings?.schema\n if (schema) {\n const parsed = schema.safeParse(value.providerSettings ?? {})\n if (!parsed.success) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: parsed.error.issues?.[0]?.message ?? 'Invalid provider configuration',\n path: ['providerSettings'],\n })\n }\n }\n }\n}\n\nexport const paymentMethodCreateSchema = paymentMethodBaseSchema.superRefine(paymentMethodRefine)\n\nexport const paymentMethodUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(paymentMethodBaseSchema.partial())\n .superRefine(paymentMethodRefine)\n\nexport const salesTagCreateSchema = scoped.extend({\n slug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9_-]+$/, 'Slug must be lowercase and may contain dashes or underscores'),\n label: z.string().trim().min(1).max(120),\n color: z.string().trim().max(30).optional(),\n description: z.string().trim().max(400).optional(),\n})\n\nexport const salesTagUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(salesTagCreateSchema.partial())\n\nexport const taxRateCreateSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n rate: percentage(),\n countryCode: z.string().trim().length(2).optional(),\n regionCode: z.string().trim().max(6).optional(),\n postalCode: z.string().trim().max(30).optional(),\n city: z.string().trim().max(120).optional(),\n customerGroupId: uuid().optional(),\n productCategoryId: uuid().optional(),\n channelId: uuid().optional(),\n priority: z.coerce.number().int().min(0).max(10).optional(),\n isCompound: z.boolean().optional(),\n isDefault: z.boolean().optional(),\n metadata,\n startsAt: z.coerce.date().optional(),\n endsAt: z.coerce.date().optional(),\n})\n\nexport const taxRateUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(taxRateCreateSchema.partial())\n\nconst statusDictionaryEntryCreateSchema = z.object({\n value: createDictionaryEntrySchema.shape.value,\n label: z.string().trim().min(1).max(150).optional(),\n color: createDictionaryEntrySchema.shape.color,\n icon: createDictionaryEntrySchema.shape.icon,\n})\n\nconst statusDictionaryEntryUpdateFieldsSchema = z.object({\n value: updateDictionaryEntrySchema.shape.value,\n label: z.string().trim().min(1).max(150).optional(),\n color: updateDictionaryEntrySchema.shape.color,\n icon: updateDictionaryEntrySchema.shape.icon,\n})\n\nconst validateStatusDictionaryUpdate = (\n payload: z.infer<typeof statusDictionaryEntryUpdateFieldsSchema>,\n) => Object.values(payload).some((value) => value !== undefined)\n\nconst statusDictionaryEntryUpdateSchema = statusDictionaryEntryUpdateFieldsSchema.refine(\n validateStatusDictionaryUpdate,\n { message: 'Provide at least one field to update.' },\n)\n\nexport const statusDictionaryCreateSchema = scoped.merge(statusDictionaryEntryCreateSchema)\n\nexport const statusDictionaryUpdateSchema = scoped\n .merge(statusDictionaryEntryUpdateFieldsSchema)\n .safeExtend({ id: uuid() })\n .refine(validateStatusDictionaryUpdate, { message: 'Provide at least one field to update.' })\n\nconst lineKindSchema = z.enum(['product', 'service', 'shipping', 'discount', 'adjustment'])\n\nconst adjustmentKindSchema = z.string().trim().min(1).max(150)\n\nconst linePricingSchema = z.object({\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }),\n quantityUnit: z.string().trim().max(25).optional(),\n normalizedQuantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).optional(),\n normalizedUnit: z.string().trim().max(25).nullable().optional(),\n unitPriceNet: decimal({ min: 0 }).optional(),\n unitPriceGross: decimal({ min: 0 }).optional(),\n priceId: uuid().optional(),\n priceMode: z.enum(['net', 'gross']).optional(),\n taxRateId: uuid().optional(),\n discountAmount: decimal({ min: 0 }).optional(),\n discountPercent: percentage().optional(),\n taxRate: percentage().optional(),\n taxAmount: decimal({ min: 0 }).optional(),\n totalNetAmount: decimal({ min: 0 }).optional(),\n totalGrossAmount: decimal({ min: 0 }).optional(),\n})\n\nconst uomSnapshotSchema = z.object({\n version: z.literal(1),\n productId: z.string().nullable(),\n productVariantId: z.string().nullable(),\n baseUnitCode: z.string().nullable(),\n enteredUnitCode: z.string().nullable(),\n enteredQuantity: z.string(),\n toBaseFactor: z.string(),\n normalizedQuantity: z.string(),\n rounding: z.object({\n mode: z.enum(['half_up', 'down', 'up']),\n scale: z.number().int(),\n }),\n source: z.object({\n conversionId: z.string().nullable(),\n resolvedAt: z.string(),\n }),\n unitPriceReference: z.object({\n enabled: z.boolean(),\n referenceUnitCode: z.enum(REFERENCE_UNIT_CODES).nullable(),\n baseQuantity: z.string().nullable(),\n grossPerReference: z.string().nullable().optional(),\n netPerReference: z.string().nullable().optional(),\n }).optional(),\n}).nullable().optional()\n\nconst lineSharedSchema = z.object({\n kind: lineKindSchema.optional(),\n statusEntryId: uuid().optional(),\n productId: uuid().optional(),\n productVariantId: uuid().optional(),\n name: z.string().trim().max(255).optional(),\n description: z.string().trim().max(4000).optional(),\n comment: z.string().trim().max(2000).optional(),\n currencyCode,\n configuration: z.record(z.string(), z.unknown()).optional(),\n promotionCode: z.string().trim().max(120).optional(),\n promotionSnapshot: z.record(z.string(), z.unknown()).optional(),\n uomSnapshot: uomSnapshotSchema,\n metadata,\n customFieldSetId: uuid().optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const orderLineCreateSchema = scoped.extend({\n orderId: uuid(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n ...lineSharedSchema.shape,\n ...linePricingSchema.shape,\n catalogSnapshot: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const orderLineUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(orderLineCreateSchema.partial())\n\nexport const quoteLineCreateSchema = scoped.extend({\n quoteId: uuid(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n ...lineSharedSchema.shape,\n ...linePricingSchema.shape,\n catalogSnapshot: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const quoteLineUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(quoteLineCreateSchema.partial())\n\n// Each adjustment kind has an intrinsic sign convention so the grand total\n// stays semantically correct regardless of operator input. The calculation\n// engine normalizes signs defensively, but the API edge rejects values that\n// would invert the kind's meaning so bad data never reaches storage.\n//\n// - `return`: non-positive \u2014 returns reduce the total (see #1705).\n// - `discount`: non-negative \u2014 discounts reduce the total.\n// - `surcharge`/`shipping`/`tax`: non-negative \u2014 they add to the total.\n// - `custom` and unknown kinds: unconstrained (operator-controlled).\n//\n// See #1905.\nexport const RETURN_ADJUSTMENT_POSITIVE_NET_MESSAGE =\n 'Return adjustments must use a non-positive amountNet (returns reduce the total).'\nexport const RETURN_ADJUSTMENT_POSITIVE_GROSS_MESSAGE =\n 'Return adjustments must use a non-positive amountGross (returns reduce the total).'\nexport const RETURN_ADJUSTMENT_ZERO_MESSAGE =\n 'Return adjustments must use a non-zero amount. Create the return through the Returns tab instead of recording a zero-value Return adjustment.'\nexport const DISCOUNT_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Discount adjustments must use a non-negative amountNet (discounts reduce the total).'\nexport const DISCOUNT_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Discount adjustments must use a non-negative amountGross (discounts reduce the total).'\nexport const SURCHARGE_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Surcharge adjustments must use a non-negative amountNet (surcharges add to the total).'\nexport const SURCHARGE_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Surcharge adjustments must use a non-negative amountGross (surcharges add to the total).'\nexport const SHIPPING_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Shipping adjustments must use a non-negative amountNet (shipping adds to the total).'\nexport const SHIPPING_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Shipping adjustments must use a non-negative amountGross (shipping adds to the total).'\nexport const TAX_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Tax adjustments must use a non-negative amountNet (taxes add to the total).'\nexport const TAX_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Tax adjustments must use a non-negative amountGross (taxes add to the total).'\n\ntype AdjustmentSignInput = {\n kind?: string\n amountNet?: number\n amountGross?: number\n}\n\nconst NON_NEGATIVE_SIGN_MESSAGES: Record<string, { net: string; gross: string }> = {\n discount: {\n net: DISCOUNT_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: DISCOUNT_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n surcharge: {\n net: SURCHARGE_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: SURCHARGE_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n shipping: {\n net: SHIPPING_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: SHIPPING_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n tax: {\n net: TAX_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: TAX_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n}\n\nexport const enforceAdjustmentSign = (\n value: AdjustmentSignInput,\n ctx: z.RefinementCtx\n) => {\n if (!value.kind) return\n if (value.kind === 'return') {\n const netIsPositive = typeof value.amountNet === 'number' && value.amountNet > 0\n const grossIsPositive = typeof value.amountGross === 'number' && value.amountGross > 0\n if (netIsPositive) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: RETURN_ADJUSTMENT_POSITIVE_NET_MESSAGE,\n path: ['amountNet'],\n })\n }\n if (grossIsPositive) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: RETURN_ADJUSTMENT_POSITIVE_GROSS_MESSAGE,\n path: ['amountGross'],\n })\n }\n if (!netIsPositive && !grossIsPositive) {\n const netIsNegative = typeof value.amountNet === 'number' && value.amountNet < 0\n const grossIsNegative = typeof value.amountGross === 'number' && value.amountGross < 0\n if (!netIsNegative && !grossIsNegative) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: RETURN_ADJUSTMENT_ZERO_MESSAGE,\n path: ['amountNet'],\n })\n }\n }\n return\n }\n const messages = NON_NEGATIVE_SIGN_MESSAGES[value.kind]\n if (!messages) return\n if (typeof value.amountNet === 'number' && value.amountNet < 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: messages.net,\n path: ['amountNet'],\n })\n }\n if (typeof value.amountGross === 'number' && value.amountGross < 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: messages.gross,\n path: ['amountGross'],\n })\n }\n}\n\n/**\n * @deprecated Use `enforceAdjustmentSign` \u2014 it enforces the sign convention\n * for every adjustment kind, not just `return`. Kept for backward compatibility\n * with third-party code that imported the original helper.\n */\nexport const enforceReturnAdjustmentSign = enforceAdjustmentSign\n\nexport const RETURN_ADJUSTMENT_EXCEEDS_REMAINING_NET_MESSAGE =\n 'Return adjustment amountNet exceeds the remaining grand total. Reduce the amount or remove existing returns first.'\nexport const RETURN_ADJUSTMENT_EXCEEDS_REMAINING_GROSS_MESSAGE =\n 'Return adjustment amountGross exceeds the remaining grand total. Reduce the amount or remove existing returns first.'\n\nexport type ReturnAdjustmentRemainingCheck = {\n kind?: string | null\n amountNet?: number | null\n amountGross?: number | null\n remainingNet: number\n remainingGross: number\n}\n\nexport type ReturnAdjustmentRemainingIssue = {\n path: 'amountNet' | 'amountGross'\n message: string\n}\n\n// Inclusive: abs(amount) === remaining is allowed. Tiny epsilon absorbs\n// floating-point rounding from upstream tax/rate adjustments.\nconst RETURN_REMAINING_EPSILON = 0.005\n\nexport const validateReturnAdjustmentWithinRemaining = (\n value: ReturnAdjustmentRemainingCheck\n): ReturnAdjustmentRemainingIssue[] => {\n if (value.kind !== 'return') return []\n const absNet = typeof value.amountNet === 'number' ? Math.abs(value.amountNet) : 0\n const absGross = typeof value.amountGross === 'number' ? Math.abs(value.amountGross) : 0\n const issues: ReturnAdjustmentRemainingIssue[] = []\n if (absGross > value.remainingGross + RETURN_REMAINING_EPSILON) {\n issues.push({ path: 'amountGross', message: RETURN_ADJUSTMENT_EXCEEDS_REMAINING_GROSS_MESSAGE })\n }\n if (absNet > value.remainingNet + RETURN_REMAINING_EPSILON) {\n issues.push({ path: 'amountNet', message: RETURN_ADJUSTMENT_EXCEEDS_REMAINING_NET_MESSAGE })\n }\n return issues\n}\n\nexport const orderAdjustmentCreateSchema = scoped.extend({\n orderId: uuid(),\n orderLineId: uuid().optional(),\n scope: z.enum(['order', 'line']).optional(),\n kind: adjustmentKindSchema.optional(),\n code: z.string().trim().max(120).optional(),\n label: z.string().trim().max(255).optional(),\n calculatorKey: z.string().trim().max(120).optional(),\n promotionId: uuid().optional(),\n rate: percentage().optional(),\n amountNet: decimal().optional(),\n amountGross: decimal().optional(),\n currencyCode: currencyCode.optional(),\n metadata,\n customFields: z.record(z.string(), z.unknown()).optional(),\n position: z.coerce.number().int().min(0).optional(),\n})\n\nexport const orderAdjustmentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(orderAdjustmentCreateSchema.partial())\n\nexport const quoteAdjustmentCreateSchema = scoped.extend({\n quoteId: uuid(),\n quoteLineId: uuid().optional(),\n scope: z.enum(['order', 'line']).optional(),\n kind: adjustmentKindSchema.optional(),\n code: z.string().trim().max(120).optional(),\n label: z.string().trim().max(255).optional(),\n calculatorKey: z.string().trim().max(120).optional(),\n promotionId: uuid().optional(),\n rate: percentage().optional(),\n amountNet: decimal().optional(),\n amountGross: decimal().optional(),\n currencyCode: currencyCode.optional(),\n metadata,\n customFields: z.record(z.string(), z.unknown()).optional(),\n position: z.coerce.number().int().min(0).optional(),\n})\n\nexport const quoteAdjustmentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(quoteAdjustmentCreateSchema.partial())\n\nconst orderTotalsSchema = z.object({\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n discountTotalAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n shippingNetAmount: decimal({ min: 0 }).optional(),\n shippingGrossAmount: decimal({ min: 0 }).optional(),\n surchargeTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n paidTotalAmount: decimal({ min: 0 }).optional(),\n refundedTotalAmount: decimal({ min: 0 }).optional(),\n outstandingAmount: decimal().optional(),\n lineItemCount: z.coerce.number().int().min(0).optional(),\n})\n\nconst quoteTotalsSchema = z.object({\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n discountTotalAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n lineItemCount: z.coerce.number().int().min(0).optional(),\n})\n\nexport const orderCreateSchema = scoped.extend({\n orderNumber: z.string().trim().min(1).max(191).optional(),\n externalReference: z.string().trim().max(191).optional(),\n customerReference: z.string().trim().max(191).optional(),\n customerEntityId: uuid().optional(),\n customerContactId: uuid().optional(),\n customerSnapshot: customerSnapshotSchema.optional(),\n billingAddressId: uuid().optional(),\n shippingAddressId: uuid().optional(),\n billingAddressSnapshot: jsonRecord.optional(),\n shippingAddressSnapshot: jsonRecord.optional(),\n currencyCode,\n exchangeRate: decimal({ min: 0 }).optional(),\n statusEntryId: uuid().optional(),\n fulfillmentStatusEntryId: uuid().optional(),\n paymentStatusEntryId: uuid().optional(),\n taxStrategyKey: z.string().trim().max(120).optional(),\n discountStrategyKey: z.string().trim().max(120).optional(),\n taxInfo: jsonRecord.optional(),\n shippingMethodId: uuid().optional(),\n shippingMethodCode: z.string().trim().max(120).optional(),\n deliveryWindowId: uuid().optional(),\n deliveryWindowCode: z.string().trim().max(120).optional(),\n paymentMethodId: uuid().optional(),\n paymentMethodCode: z.string().trim().max(120).optional(),\n channelId: uuid().optional(),\n placedAt: z.coerce.date().optional(),\n expectedDeliveryAt: z.coerce.date().optional(),\n dueAt: z.coerce.date().optional(),\n comments: z.string().trim().max(4000).optional(),\n internalNotes: z.string().trim().max(4000).optional(),\n shippingMethodSnapshot: jsonRecord.optional(),\n deliveryWindowSnapshot: jsonRecord.optional(),\n paymentMethodSnapshot: jsonRecord.optional(),\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z.array(orderLineCreateSchema.omit({ organizationId: true, tenantId: true, orderId: true })).optional(),\n adjustments: z.array(orderAdjustmentCreateSchema.omit({ organizationId: true, tenantId: true, orderId: true })).optional(),\n tags: z.array(uuid()).optional(),\n ...orderTotalsSchema.shape,\n})\n\nexport const orderUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(orderCreateSchema.partial())\n\nexport const quoteCreateSchema = scoped.extend({\n quoteNumber: z.string().trim().min(1).max(191).optional(),\n statusEntryId: uuid().optional(),\n customerEntityId: uuid().optional(),\n customerContactId: uuid().optional(),\n channelId: uuid().optional(),\n customerSnapshot: customerSnapshotSchema.optional(),\n billingAddressId: uuid().optional(),\n shippingAddressId: uuid().optional(),\n billingAddressSnapshot: jsonRecord.optional(),\n shippingAddressSnapshot: jsonRecord.optional(),\n currencyCode,\n validFrom: z.coerce.date().optional(),\n validUntil: z.coerce.date().optional(),\n comments: z.string().trim().max(4000).optional(),\n taxInfo: jsonRecord.optional(),\n shippingMethodId: uuid().optional(),\n shippingMethodCode: z.string().trim().max(120).optional(),\n deliveryWindowId: uuid().optional(),\n deliveryWindowCode: z.string().trim().max(120).optional(),\n paymentMethodId: uuid().optional(),\n paymentMethodCode: z.string().trim().max(120).optional(),\n shippingMethodSnapshot: jsonRecord.optional(),\n deliveryWindowSnapshot: jsonRecord.optional(),\n paymentMethodSnapshot: jsonRecord.optional(),\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z\n .array(quoteLineCreateSchema.omit({ organizationId: true, tenantId: true, quoteId: true }))\n .optional(),\n adjustments: z\n .array(quoteAdjustmentCreateSchema.omit({ organizationId: true, tenantId: true, quoteId: true }))\n .optional(),\n tags: z.array(uuid()).optional(),\n ...quoteTotalsSchema.shape,\n})\n\nexport const quoteUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(quoteCreateSchema.partial())\n\nconst documentKind = z.enum(['order', 'quote'])\n\nconst documentAddressFields = {\n documentId: uuid(),\n documentKind,\n customerAddressId: uuid().optional(),\n name: z.string().trim().max(255).nullable().optional(),\n purpose: z.string().trim().max(120).nullable().optional(),\n companyName: z.string().trim().max(255).nullable().optional(),\n addressLine1: z.string().trim().min(1).max(255),\n addressLine2: z.string().trim().max(255).nullable().optional(),\n city: z.string().trim().max(120).nullable().optional(),\n region: z.string().trim().max(120).nullable().optional(),\n postalCode: z.string().trim().max(60).nullable().optional(),\n country: z.string().trim().max(2).nullable().optional(),\n buildingNumber: z.string().trim().max(60).nullable().optional(),\n flatNumber: z.string().trim().max(60).nullable().optional(),\n latitude: z.coerce.number().optional().nullable(),\n longitude: z.coerce.number().optional().nullable(),\n}\n\nexport const documentAddressCreateSchema = scoped.extend(documentAddressFields)\n\nexport const documentAddressUpdateSchema = scoped.extend({\n id: uuid(),\n ...documentAddressFields,\n})\n\nexport const documentAddressDeleteSchema = scoped.extend({\n id: uuid(),\n documentId: uuid(),\n documentKind,\n})\n\nexport const shipmentCreateSchema = scoped.extend({\n orderId: uuid(),\n shipmentNumber: z.string().trim().max(191).optional(),\n shippingMethodId: uuid().optional(),\n statusEntryId: uuid().optional(),\n documentStatusEntryId: uuid().optional(),\n lineStatusEntryId: uuid().optional(),\n carrierName: z.string().trim().max(191).optional(),\n trackingNumbers: z.array(z.string().trim().max(191)).optional(),\n shippedAt: z.coerce.date().optional(),\n deliveredAt: z.coerce.date().optional(),\n weightValue: decimal({ min: 0 }).optional(),\n weightUnit: z.string().trim().max(25).optional(),\n declaredValueNet: decimal({ min: 0 }).optional(),\n declaredValueGross: decimal({ min: 0 }).optional(),\n currencyCode: currencyCode.optional(),\n notes: z.string().trim().max(4000).optional(),\n metadata,\n shipmentAddressSnapshot: jsonRecord.optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n items: z\n .array(\n z.object({\n orderLineId: uuid(),\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).int('Quantity must be a whole number.'),\n metadata,\n })\n )\n .optional(),\n})\n\nexport const shipmentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(shipmentCreateSchema.partial())\n\nconst returnLineQuantitySchema = z.coerce\n .number()\n .int('Return quantity must be a whole number.')\n .min(1, 'Return quantity must be at least 1.')\n .max(MAX_QUANTITY, 'Quantity is too large.')\n\nexport const RETURN_DATE_IN_FUTURE_MESSAGE = 'Return date cannot be in the future.'\n\n// A return records when goods physically came back to the seller, so a future\n// date is not yet a fact. Evaluate \"now\" at parse time (not module-load time)\n// so a long-running server never rejects legitimate same-day returns.\nconst returnedAtSchema = z.coerce\n .date()\n .refine((value) => value.getTime() <= Date.now(), {\n message: RETURN_DATE_IN_FUTURE_MESSAGE,\n })\n .optional()\n\nexport const returnCreateSchema = scoped.extend({\n orderId: uuid(),\n reason: z.string().trim().max(4000).optional(),\n notes: z.string().trim().max(4000).optional(),\n returnedAt: returnedAtSchema,\n lines: z\n .array(\n z.object({\n orderLineId: uuid(),\n quantity: returnLineQuantitySchema,\n })\n )\n .min(1),\n})\n\nexport const returnUpdateSchema = scoped.extend({\n id: uuid(),\n orderId: uuid(),\n reason: z.string().trim().max(4000).optional(),\n notes: z.string().trim().max(4000).optional(),\n returnedAt: returnedAtSchema,\n})\n\nexport const returnDeleteSchema = scoped.extend({\n id: uuid(),\n orderId: uuid(),\n})\n\nexport const invoiceCreateSchema = scoped.extend({\n orderId: uuid().optional(),\n invoiceNumber: z.string().trim().min(1).max(191).optional(),\n statusEntryId: uuid().optional(),\n issueDate: z.coerce.date().optional(),\n dueDate: z.coerce.date().optional(),\n currencyCode,\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z\n .array(\n z.object({\n orderLineId: uuid().optional(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n kind: lineKindSchema.optional(),\n name: z.string().trim().max(500).optional(),\n sku: z.string().trim().max(191).optional(),\n description: z.string().trim().max(4000).optional(),\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }),\n quantityUnit: z.string().trim().max(25).optional(),\n normalizedQuantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).optional(),\n normalizedUnit: z.string().trim().max(25).nullable().optional(),\n uomSnapshot: uomSnapshotSchema,\n currencyCode,\n unitPriceNet: decimal({ min: 0 }).optional(),\n unitPriceGross: decimal({ min: 0 }).optional(),\n discountAmount: decimal({ min: 0 }).optional(),\n discountPercent: percentage().optional(),\n taxRate: percentage().optional(),\n taxAmount: decimal({ min: 0 }).optional(),\n totalNetAmount: decimal({ min: 0 }).optional(),\n totalGrossAmount: decimal({ min: 0 }).optional(),\n metadata,\n })\n )\n .optional(),\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n discountTotalAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n paidTotalAmount: decimal({ min: 0 }).optional(),\n outstandingAmount: decimal().optional(),\n})\n\nexport const invoiceUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(invoiceCreateSchema.partial())\n\nexport const creditMemoCreateSchema = scoped.extend({\n orderId: uuid().optional(),\n invoiceId: uuid().optional(),\n creditMemoNumber: z.string().trim().min(1).max(191).optional(),\n statusEntryId: uuid().optional(),\n issueDate: z.coerce.date().optional(),\n reason: z.string().trim().max(4000).optional(),\n currencyCode,\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z\n .array(\n z.object({\n orderLineId: uuid().optional(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n name: z.string().trim().max(500).optional(),\n sku: z.string().trim().max(191).optional(),\n description: z.string().trim().max(4000).optional(),\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }),\n quantityUnit: z.string().trim().max(25).optional(),\n normalizedQuantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).optional(),\n normalizedUnit: z.string().trim().max(25).nullable().optional(),\n uomSnapshot: uomSnapshotSchema,\n currencyCode,\n unitPriceNet: decimal({ min: 0 }).optional(),\n unitPriceGross: decimal({ min: 0 }).optional(),\n taxRate: percentage().optional(),\n taxAmount: decimal({ min: 0 }).optional(),\n totalNetAmount: decimal({ min: 0 }).optional(),\n totalGrossAmount: decimal({ min: 0 }).optional(),\n metadata,\n })\n )\n .optional(),\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n})\n\nexport const creditMemoUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(creditMemoCreateSchema.partial())\n\nexport const paymentCreateSchema = scoped.extend({\n orderId: uuid().optional(),\n paymentMethodId: uuid().optional(),\n paymentReference: z.string().trim().max(191).optional(),\n statusEntryId: uuid().optional(),\n documentStatusEntryId: uuid().optional(),\n lineStatusEntryId: uuid().optional(),\n amount: decimal({ min: 0 }),\n currencyCode,\n capturedAmount: decimal({ min: 0 }).optional(),\n refundedAmount: decimal({ min: 0 }).optional(),\n receivedAt: z.coerce.date().optional(),\n capturedAt: z.coerce.date().optional(),\n metadata,\n customFieldSetId: uuid().optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n allocations: z\n .array(\n z.object({\n orderId: uuid().optional(),\n invoiceId: uuid().optional(),\n amount: decimal({ min: 0 }),\n currencyCode,\n metadata,\n })\n )\n .optional(),\n})\n\nexport const paymentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(paymentCreateSchema.partial())\n\nexport const noteCreateSchema = scoped.extend({\n contextType: z.enum(['order', 'quote', 'invoice', 'credit_memo']),\n contextId: uuid(),\n orderId: uuid().optional(),\n quoteId: uuid().optional(),\n authorUserId: uuid().optional(),\n body: z.string().trim().min(1).max(8000),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const noteUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(\n z\n .object({\n body: z.string().trim().min(1).max(8000).optional(),\n })\n .extend({\n authorUserId: uuid().optional(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n })\n )\n\nexport const documentNumberRequestSchema = scoped.extend({\n kind: z.enum(['order', 'quote', 'invoice', 'credit_memo']),\n format: numberFormatSchema.optional(),\n})\n\nexport type DocumentNumberRequestInput = z.infer<typeof documentNumberRequestSchema>\n\nexport type ChannelCreateInput = z.infer<typeof channelCreateSchema>\nexport type ChannelUpdateInput = z.infer<typeof channelUpdateSchema>\nexport type ShippingMethodCreateInput = z.infer<typeof shippingMethodCreateSchema>\nexport type ShippingMethodUpdateInput = z.infer<typeof shippingMethodUpdateSchema>\nexport type DeliveryWindowCreateInput = z.infer<typeof deliveryWindowCreateSchema>\nexport type DeliveryWindowUpdateInput = z.infer<typeof deliveryWindowUpdateSchema>\nexport type PaymentMethodCreateInput = z.infer<typeof paymentMethodCreateSchema>\nexport type PaymentMethodUpdateInput = z.infer<typeof paymentMethodUpdateSchema>\nexport type TaxRateCreateInput = z.infer<typeof taxRateCreateSchema>\nexport type TaxRateUpdateInput = z.infer<typeof taxRateUpdateSchema>\nexport type OrderCreateInput = z.infer<typeof orderCreateSchema>\nexport type OrderUpdateInput = z.infer<typeof orderUpdateSchema>\nexport type OrderLineCreateInput = z.infer<typeof orderLineCreateSchema>\nexport type OrderLineUpdateInput = z.infer<typeof orderLineUpdateSchema>\nexport type OrderAdjustmentCreateInput = z.infer<typeof orderAdjustmentCreateSchema>\nexport type OrderAdjustmentUpdateInput = z.infer<typeof orderAdjustmentUpdateSchema>\nexport type QuoteCreateInput = z.infer<typeof quoteCreateSchema>\nexport type QuoteUpdateInput = z.infer<typeof quoteUpdateSchema>\nexport type QuoteLineCreateInput = z.infer<typeof quoteLineCreateSchema>\nexport type QuoteLineUpdateInput = z.infer<typeof quoteLineUpdateSchema>\nexport type QuoteAdjustmentCreateInput = z.infer<typeof quoteAdjustmentCreateSchema>\nexport type QuoteAdjustmentUpdateInput = z.infer<typeof quoteAdjustmentUpdateSchema>\nexport type ShipmentCreateInput = z.infer<typeof shipmentCreateSchema>\nexport type ShipmentUpdateInput = z.infer<typeof shipmentUpdateSchema>\nexport type ReturnCreateInput = z.infer<typeof returnCreateSchema>\nexport type ReturnUpdateInput = z.infer<typeof returnUpdateSchema>\nexport type ReturnDeleteInput = z.infer<typeof returnDeleteSchema>\nexport type InvoiceCreateInput = z.infer<typeof invoiceCreateSchema>\nexport type InvoiceUpdateInput = z.infer<typeof invoiceUpdateSchema>\nexport type CreditMemoCreateInput = z.infer<typeof creditMemoCreateSchema>\nexport type CreditMemoUpdateInput = z.infer<typeof creditMemoUpdateSchema>\nexport const quoteSendSchema = z.object({\n quoteId: z.string().uuid(),\n validForDays: z.coerce.number().int().min(1).max(365).default(14),\n})\n\nexport const quoteAcceptSchema = z.object({\n token: z.string().uuid(),\n})\n\nexport type PaymentCreateInput = z.infer<typeof paymentCreateSchema>\nexport type PaymentUpdateInput = z.infer<typeof paymentUpdateSchema>\nexport type NoteCreateInput = z.infer<typeof noteCreateSchema>\nexport type NoteUpdateInput = z.infer<typeof noteUpdateSchema>\nexport type SalesTagCreateInput = z.infer<typeof salesTagCreateSchema>\nexport type SalesTagUpdateInput = z.infer<typeof salesTagUpdateSchema>\nexport type DocumentAddressCreateInput = z.infer<typeof documentAddressCreateSchema>\nexport type DocumentAddressUpdateInput = z.infer<typeof documentAddressUpdateSchema>\nexport type DocumentAddressDeleteInput = z.infer<typeof documentAddressDeleteSchema>\nexport type QuoteSendInput = z.infer<typeof quoteSendSchema>\nexport type QuoteAcceptInput = z.infer<typeof quoteAcceptSchema>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport {\n createDictionaryEntrySchema,\n updateDictionaryEntrySchema,\n} from '@open-mercato/core/modules/dictionaries/data/validators'\nimport { getPaymentProvider, getShippingProvider } from '../lib/providers'\nimport { REFERENCE_UNIT_CODES } from '@open-mercato/shared/lib/units/unitCodes'\nimport { isValidPhoneNumber } from '@open-mercato/shared/lib/phone'\n\nexport const SALES_PHONE_INVALID_MESSAGE_KEY = 'customers.people.form.primaryPhone.invalid'\n\nconst optionalPhoneField = (max = 50) =>\n z\n .string()\n .trim()\n .max(max)\n .refine((val) => isValidPhoneNumber(val), { message: SALES_PHONE_INVALID_MESSAGE_KEY })\n .optional()\n\nconst optionalNullablePhoneField = (max = 50) =>\n z\n .union([\n z\n .string()\n .trim()\n .max(max)\n .refine((val) => isValidPhoneNumber(val), { message: SALES_PHONE_INVALID_MESSAGE_KEY }),\n z.literal(''),\n z.null(),\n ])\n .optional()\n\nexport const customerSnapshotSchema = z\n .object({\n customer: z\n .object({\n primaryPhone: optionalNullablePhoneField(),\n })\n .passthrough()\n .nullable()\n .optional(),\n contact: z.unknown().optional(),\n })\n .passthrough()\n\nconst uuid = () => z.string().uuid()\n\nconst scoped = z.object({\n organizationId: uuid(),\n tenantId: uuid(),\n})\n\nconst currencyCode = z\n .string()\n .trim()\n .regex(/^[A-Z]{3}$/, 'currency code must be a three-letter ISO code')\n\nconst decimal = (opts?: { min?: number; max?: number; message?: string }) => {\n let schema = z.coerce.number()\n if (typeof opts?.min === 'number') schema = schema.min(opts.min)\n if (typeof opts?.max === 'number') schema = schema.max(opts.max, opts.message)\n return schema\n}\n\nconst MAX_QUANTITY = 999_999_999\n\nconst percentage = () => decimal({ min: 0, max: 100 })\n\nconst jsonRecord = z.record(z.string(), z.unknown())\n\nconst metadata = jsonRecord.optional()\nconst providerSettings = jsonRecord.optional()\n\nconst channelCodeSchema = z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120)\n\nconst numberFormatSchema = z.string().trim().min(1).max(191)\nconst statusListSchema = z\n .array(z.string().trim().min(1).max(120))\n .max(200)\n .optional()\n .nullable()\n\nexport const salesSettingsUpsertSchema = scoped.extend({\n orderNumberFormat: numberFormatSchema,\n quoteNumberFormat: numberFormatSchema,\n orderNextNumber: z.coerce.number().int().min(1).max(1_000_000_000).optional(),\n quoteNextNumber: z.coerce.number().int().min(1).max(1_000_000_000).optional(),\n orderCustomerEditableStatuses: statusListSchema,\n orderAddressEditableStatuses: statusListSchema,\n})\n\nexport type SalesSettingsUpsertInput = z.infer<typeof salesSettingsUpsertSchema>\n\nexport const salesEditingSettingsSchema = scoped.extend({\n orderNumberFormat: numberFormatSchema.optional(),\n quoteNumberFormat: numberFormatSchema.optional(),\n orderCustomerEditableStatuses: statusListSchema,\n orderAddressEditableStatuses: statusListSchema,\n})\n\nexport type SalesEditingSettingsInput = z.infer<typeof salesEditingSettingsSchema>\n\nexport const channelCreateSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: channelCodeSchema,\n description: z.string().trim().max(2000).optional(),\n statusEntryId: uuid().optional(),\n websiteUrl: z.string().trim().url().max(300).optional(),\n contactEmail: z.string().trim().email().max(320).optional(),\n contactPhone: optionalPhoneField(),\n addressLine1: z.string().trim().max(255).optional(),\n addressLine2: z.string().trim().max(255).optional(),\n city: z.string().trim().max(120).optional(),\n region: z.string().trim().max(120).optional(),\n postalCode: z.string().trim().max(30).optional(),\n country: z.string().trim().max(2).optional(),\n latitude: decimal().optional(),\n longitude: decimal().optional(),\n isActive: z.boolean().optional(),\n metadata,\n})\n\nexport const channelUpdateSchema = z\n .object({\n id: uuid(),\n code: channelCodeSchema,\n })\n .merge(channelCreateSchema.omit({ code: true }).partial())\n\n// Base schema without refinements (used for .partial() in update schema)\nconst shippingMethodBaseSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n description: z.string().trim().max(2000).optional(),\n carrierCode: z.string().trim().max(120).optional(),\n providerKey: z.string().trim().max(120).optional(),\n serviceLevel: z.string().trim().max(120).optional(),\n estimatedTransitDays: z.coerce.number().int().min(0).max(365).optional(),\n baseRateNet: decimal({ min: 0 }).optional(),\n baseRateGross: decimal({ min: 0 }).optional(),\n currencyCode: currencyCode.optional(),\n isActive: z.boolean().optional(),\n providerSettings,\n metadata,\n})\n\n// Refinement for provider settings validation\nconst shippingMethodRefine = (value: { providerKey?: string; providerSettings?: Record<string, unknown> }, ctx: z.RefinementCtx) => {\n if (value.providerKey) {\n const provider = getShippingProvider(value.providerKey)\n const schema = provider?.settings?.schema\n if (schema) {\n const parsed = schema.safeParse(value.providerSettings ?? {})\n if (!parsed.success) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: parsed.error.issues?.[0]?.message ?? 'Invalid provider configuration',\n path: ['providerSettings'],\n })\n }\n }\n }\n}\n\nexport const shippingMethodCreateSchema = shippingMethodBaseSchema.superRefine(shippingMethodRefine)\n\nexport const shippingMethodUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(shippingMethodBaseSchema.partial())\n .superRefine(shippingMethodRefine)\n\nexport const deliveryWindowCreateSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n description: z.string().trim().max(2000).optional(),\n leadTimeDays: z.coerce.number().int().min(0).max(365).optional(),\n cutoffTime: z.string().trim().regex(/^\\d{2}:\\d{2}$/).optional(),\n timezone: z.string().trim().max(120).optional(),\n isActive: z.boolean().optional(),\n metadata,\n})\n\nexport const deliveryWindowUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(deliveryWindowCreateSchema.partial())\n\n// Base schema without refinements (used for .partial() in update schema)\nconst paymentMethodBaseSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n description: z.string().trim().max(2000).optional(),\n providerKey: z.string().trim().max(120).optional(),\n terms: z.string().trim().max(4000).optional(),\n isActive: z.boolean().optional(),\n providerSettings,\n metadata,\n})\n\n// Refinement for provider settings validation\nconst paymentMethodRefine = (value: { providerKey?: string; providerSettings?: Record<string, unknown> }, ctx: z.RefinementCtx) => {\n if (value.providerKey) {\n const provider = getPaymentProvider(value.providerKey)\n const schema = provider?.settings?.schema\n if (schema) {\n const parsed = schema.safeParse(value.providerSettings ?? {})\n if (!parsed.success) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: parsed.error.issues?.[0]?.message ?? 'Invalid provider configuration',\n path: ['providerSettings'],\n })\n }\n }\n }\n}\n\nexport const paymentMethodCreateSchema = paymentMethodBaseSchema.superRefine(paymentMethodRefine)\n\nexport const paymentMethodUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(paymentMethodBaseSchema.partial())\n .superRefine(paymentMethodRefine)\n\nexport const salesTagCreateSchema = scoped.extend({\n slug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9_-]+$/, 'Slug must be lowercase and may contain dashes or underscores'),\n label: z.string().trim().min(1).max(120),\n color: z.string().trim().max(30).optional(),\n description: z.string().trim().max(400).optional(),\n})\n\nexport const salesTagUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(salesTagCreateSchema.partial())\n\nexport const taxRateCreateSchema = scoped.extend({\n name: z.string().trim().min(1).max(255),\n code: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z0-9\\-_]+$/)\n .max(120),\n rate: percentage(),\n countryCode: z.string().trim().length(2).optional(),\n regionCode: z.string().trim().max(6).optional(),\n postalCode: z.string().trim().max(30).optional(),\n city: z.string().trim().max(120).optional(),\n customerGroupId: uuid().optional(),\n productCategoryId: uuid().optional(),\n channelId: uuid().optional(),\n priority: z.coerce.number().int().min(0).max(10).optional(),\n isCompound: z.boolean().optional(),\n isDefault: z.boolean().optional(),\n metadata,\n startsAt: z.coerce.date().optional(),\n endsAt: z.coerce.date().optional(),\n})\n\nexport const taxRateUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(taxRateCreateSchema.partial())\n\nconst statusDictionaryEntryCreateSchema = z.object({\n value: createDictionaryEntrySchema.shape.value,\n label: z.string().trim().min(1).max(150).optional(),\n color: createDictionaryEntrySchema.shape.color,\n icon: createDictionaryEntrySchema.shape.icon,\n})\n\nconst statusDictionaryEntryUpdateFieldsSchema = z.object({\n value: updateDictionaryEntrySchema.shape.value,\n label: z.string().trim().min(1).max(150).optional(),\n color: updateDictionaryEntrySchema.shape.color,\n icon: updateDictionaryEntrySchema.shape.icon,\n})\n\nconst validateStatusDictionaryUpdate = (\n payload: z.infer<typeof statusDictionaryEntryUpdateFieldsSchema>,\n) => Object.values(payload).some((value) => value !== undefined)\n\nconst statusDictionaryEntryUpdateSchema = statusDictionaryEntryUpdateFieldsSchema.refine(\n validateStatusDictionaryUpdate,\n { message: 'Provide at least one field to update.' },\n)\n\nexport const statusDictionaryCreateSchema = scoped.merge(statusDictionaryEntryCreateSchema)\n\nexport const statusDictionaryUpdateSchema = scoped\n .merge(statusDictionaryEntryUpdateFieldsSchema)\n .safeExtend({ id: uuid() })\n .refine(validateStatusDictionaryUpdate, { message: 'Provide at least one field to update.' })\n\nconst lineKindSchema = z.enum(['product', 'service', 'shipping', 'discount', 'adjustment'])\n\nconst adjustmentKindSchema = z.string().trim().min(1).max(150)\n\nconst linePricingSchema = z.object({\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }),\n quantityUnit: z.string().trim().max(25).optional(),\n normalizedQuantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).optional(),\n normalizedUnit: z.string().trim().max(25).nullable().optional(),\n unitPriceNet: decimal({ min: 0 }).optional(),\n unitPriceGross: decimal({ min: 0 }).optional(),\n priceId: uuid().optional(),\n priceMode: z.enum(['net', 'gross']).optional(),\n taxRateId: uuid().optional(),\n discountAmount: decimal({ min: 0 }).optional(),\n discountPercent: percentage().optional(),\n taxRate: percentage().optional(),\n taxAmount: decimal({ min: 0 }).optional(),\n totalNetAmount: decimal({ min: 0 }).optional(),\n totalGrossAmount: decimal({ min: 0 }).optional(),\n})\n\nconst uomSnapshotSchema = z.object({\n version: z.literal(1),\n productId: z.string().nullable(),\n productVariantId: z.string().nullable(),\n baseUnitCode: z.string().nullable(),\n enteredUnitCode: z.string().nullable(),\n enteredQuantity: z.string(),\n toBaseFactor: z.string(),\n normalizedQuantity: z.string(),\n rounding: z.object({\n mode: z.enum(['half_up', 'down', 'up']),\n scale: z.number().int(),\n }),\n source: z.object({\n conversionId: z.string().nullable(),\n resolvedAt: z.string(),\n }),\n unitPriceReference: z.object({\n enabled: z.boolean(),\n referenceUnitCode: z.enum(REFERENCE_UNIT_CODES).nullable(),\n baseQuantity: z.string().nullable(),\n grossPerReference: z.string().nullable().optional(),\n netPerReference: z.string().nullable().optional(),\n }).optional(),\n}).nullable().optional()\n\nconst lineSharedSchema = z.object({\n kind: lineKindSchema.optional(),\n statusEntryId: uuid().optional(),\n productId: uuid().optional(),\n productVariantId: uuid().optional(),\n name: z.string().trim().max(255).optional(),\n description: z.string().trim().max(4000).optional(),\n comment: z.string().trim().max(2000).optional(),\n currencyCode,\n configuration: z.record(z.string(), z.unknown()).optional(),\n promotionCode: z.string().trim().max(120).optional(),\n promotionSnapshot: z.record(z.string(), z.unknown()).optional(),\n uomSnapshot: uomSnapshotSchema,\n metadata,\n customFieldSetId: uuid().optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const orderLineCreateSchema = scoped.extend({\n orderId: uuid(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n ...lineSharedSchema.shape,\n ...linePricingSchema.shape,\n catalogSnapshot: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const orderLineUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(orderLineCreateSchema.partial())\n\nexport const quoteLineCreateSchema = scoped.extend({\n quoteId: uuid(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n ...lineSharedSchema.shape,\n ...linePricingSchema.shape,\n catalogSnapshot: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const quoteLineUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(quoteLineCreateSchema.partial())\n\n// Each adjustment kind has an intrinsic sign convention so the grand total\n// stays semantically correct regardless of operator input. The calculation\n// engine normalizes signs defensively, but the API edge rejects values that\n// would invert the kind's meaning so bad data never reaches storage.\n//\n// - `return`: non-positive \u2014 returns reduce the total (see #1705).\n// - `discount`: non-negative \u2014 discounts reduce the total.\n// - `surcharge`/`shipping`/`tax`: non-negative \u2014 they add to the total.\n// - `custom` and unknown kinds: unconstrained (operator-controlled).\n//\n// See #1905.\nexport const RETURN_ADJUSTMENT_POSITIVE_NET_MESSAGE =\n 'Return adjustments must use a non-positive amountNet (returns reduce the total).'\nexport const RETURN_ADJUSTMENT_POSITIVE_GROSS_MESSAGE =\n 'Return adjustments must use a non-positive amountGross (returns reduce the total).'\nexport const RETURN_ADJUSTMENT_ZERO_MESSAGE =\n 'Return adjustments must use a non-zero amount. Create the return through the Returns tab instead of recording a zero-value Return adjustment.'\nexport const DISCOUNT_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Discount adjustments must use a non-negative amountNet (discounts reduce the total).'\nexport const DISCOUNT_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Discount adjustments must use a non-negative amountGross (discounts reduce the total).'\nexport const SURCHARGE_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Surcharge adjustments must use a non-negative amountNet (surcharges add to the total).'\nexport const SURCHARGE_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Surcharge adjustments must use a non-negative amountGross (surcharges add to the total).'\nexport const SHIPPING_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Shipping adjustments must use a non-negative amountNet (shipping adds to the total).'\nexport const SHIPPING_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Shipping adjustments must use a non-negative amountGross (shipping adds to the total).'\nexport const TAX_ADJUSTMENT_NEGATIVE_NET_MESSAGE =\n 'Tax adjustments must use a non-negative amountNet (taxes add to the total).'\nexport const TAX_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE =\n 'Tax adjustments must use a non-negative amountGross (taxes add to the total).'\n\ntype AdjustmentSignInput = {\n kind?: string\n amountNet?: number\n amountGross?: number\n}\n\nconst NON_NEGATIVE_SIGN_MESSAGES: Record<string, { net: string; gross: string }> = {\n discount: {\n net: DISCOUNT_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: DISCOUNT_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n surcharge: {\n net: SURCHARGE_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: SURCHARGE_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n shipping: {\n net: SHIPPING_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: SHIPPING_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n tax: {\n net: TAX_ADJUSTMENT_NEGATIVE_NET_MESSAGE,\n gross: TAX_ADJUSTMENT_NEGATIVE_GROSS_MESSAGE,\n },\n}\n\nexport const enforceAdjustmentSign = (\n value: AdjustmentSignInput,\n ctx: z.RefinementCtx\n) => {\n if (!value.kind) return\n if (value.kind === 'return') {\n const netIsPositive = typeof value.amountNet === 'number' && value.amountNet > 0\n const grossIsPositive = typeof value.amountGross === 'number' && value.amountGross > 0\n if (netIsPositive) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: RETURN_ADJUSTMENT_POSITIVE_NET_MESSAGE,\n path: ['amountNet'],\n })\n }\n if (grossIsPositive) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: RETURN_ADJUSTMENT_POSITIVE_GROSS_MESSAGE,\n path: ['amountGross'],\n })\n }\n if (!netIsPositive && !grossIsPositive) {\n const netIsNegative = typeof value.amountNet === 'number' && value.amountNet < 0\n const grossIsNegative = typeof value.amountGross === 'number' && value.amountGross < 0\n if (!netIsNegative && !grossIsNegative) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: RETURN_ADJUSTMENT_ZERO_MESSAGE,\n path: ['amountNet'],\n })\n }\n }\n return\n }\n const messages = NON_NEGATIVE_SIGN_MESSAGES[value.kind]\n if (!messages) return\n if (typeof value.amountNet === 'number' && value.amountNet < 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: messages.net,\n path: ['amountNet'],\n })\n }\n if (typeof value.amountGross === 'number' && value.amountGross < 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: messages.gross,\n path: ['amountGross'],\n })\n }\n}\n\n/**\n * @deprecated Use `enforceAdjustmentSign` \u2014 it enforces the sign convention\n * for every adjustment kind, not just `return`. Kept for backward compatibility\n * with third-party code that imported the original helper.\n */\nexport const enforceReturnAdjustmentSign = enforceAdjustmentSign\n\nexport const RETURN_ADJUSTMENT_EXCEEDS_REMAINING_NET_MESSAGE =\n 'Return adjustment amountNet exceeds the remaining grand total. Reduce the amount or remove existing returns first.'\nexport const RETURN_ADJUSTMENT_EXCEEDS_REMAINING_GROSS_MESSAGE =\n 'Return adjustment amountGross exceeds the remaining grand total. Reduce the amount or remove existing returns first.'\n\nexport type ReturnAdjustmentRemainingCheck = {\n kind?: string | null\n amountNet?: number | null\n amountGross?: number | null\n remainingNet: number\n remainingGross: number\n}\n\nexport type ReturnAdjustmentRemainingIssue = {\n path: 'amountNet' | 'amountGross'\n message: string\n}\n\n// Inclusive: abs(amount) === remaining is allowed. Tiny epsilon absorbs\n// floating-point rounding from upstream tax/rate adjustments.\nconst RETURN_REMAINING_EPSILON = 0.005\n\nexport const validateReturnAdjustmentWithinRemaining = (\n value: ReturnAdjustmentRemainingCheck\n): ReturnAdjustmentRemainingIssue[] => {\n if (value.kind !== 'return') return []\n const absNet = typeof value.amountNet === 'number' ? Math.abs(value.amountNet) : 0\n const absGross = typeof value.amountGross === 'number' ? Math.abs(value.amountGross) : 0\n const issues: ReturnAdjustmentRemainingIssue[] = []\n if (absGross > value.remainingGross + RETURN_REMAINING_EPSILON) {\n issues.push({ path: 'amountGross', message: RETURN_ADJUSTMENT_EXCEEDS_REMAINING_GROSS_MESSAGE })\n }\n if (absNet > value.remainingNet + RETURN_REMAINING_EPSILON) {\n issues.push({ path: 'amountNet', message: RETURN_ADJUSTMENT_EXCEEDS_REMAINING_NET_MESSAGE })\n }\n return issues\n}\n\nexport const orderAdjustmentCreateSchema = scoped.extend({\n orderId: uuid(),\n orderLineId: uuid().optional(),\n scope: z.enum(['order', 'line']).optional(),\n kind: adjustmentKindSchema.optional(),\n code: z.string().trim().max(120).optional(),\n label: z.string().trim().max(255).optional(),\n calculatorKey: z.string().trim().max(120).optional(),\n promotionId: uuid().optional(),\n rate: percentage().optional(),\n amountNet: decimal().optional(),\n amountGross: decimal().optional(),\n currencyCode: currencyCode.optional(),\n metadata,\n customFields: z.record(z.string(), z.unknown()).optional(),\n position: z.coerce.number().int().min(0).optional(),\n})\n\nexport const orderAdjustmentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(orderAdjustmentCreateSchema.partial())\n\nexport const quoteAdjustmentCreateSchema = scoped.extend({\n quoteId: uuid(),\n quoteLineId: uuid().optional(),\n scope: z.enum(['order', 'line']).optional(),\n kind: adjustmentKindSchema.optional(),\n code: z.string().trim().max(120).optional(),\n label: z.string().trim().max(255).optional(),\n calculatorKey: z.string().trim().max(120).optional(),\n promotionId: uuid().optional(),\n rate: percentage().optional(),\n amountNet: decimal().optional(),\n amountGross: decimal().optional(),\n currencyCode: currencyCode.optional(),\n metadata,\n customFields: z.record(z.string(), z.unknown()).optional(),\n position: z.coerce.number().int().min(0).optional(),\n})\n\nexport const quoteAdjustmentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(quoteAdjustmentCreateSchema.partial())\n\nexport const ORDER_PAYMENT_LEDGER_FIELDS = [\n 'paidTotalAmount',\n 'refundedTotalAmount',\n 'outstandingAmount',\n] as const\n\nexport type OrderPaymentLedgerField = (typeof ORDER_PAYMENT_LEDGER_FIELDS)[number]\n\nexport const ORDER_PAYMENT_LEDGER_WARNING_CODE =\n 'sales.order.payment_ledger_input_deprecated' as const\n\nexport type OrderPaymentLedgerWarning = {\n code: typeof ORDER_PAYMENT_LEDGER_WARNING_CODE\n fields: OrderPaymentLedgerField[]\n}\n\nexport function resolveSuppliedOrderPaymentLedgerFields(value: unknown): OrderPaymentLedgerField[] {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return []\n return ORDER_PAYMENT_LEDGER_FIELDS.filter((field) =>\n Object.prototype.hasOwnProperty.call(value, field),\n )\n}\n\nconst orderPaymentLedgerShape = {\n /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */\n paidTotalAmount: decimal({ min: 0 }).optional(),\n /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */\n refundedTotalAmount: decimal({ min: 0 }).optional(),\n /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */\n outstandingAmount: decimal().optional(),\n}\n\nconst orderTotalsSchema = z.object({\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n discountTotalAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n shippingNetAmount: decimal({ min: 0 }).optional(),\n shippingGrossAmount: decimal({ min: 0 }).optional(),\n surchargeTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n lineItemCount: z.coerce.number().int().min(0).optional(),\n})\n\nconst quoteTotalsSchema = z.object({\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n discountTotalAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n lineItemCount: z.coerce.number().int().min(0).optional(),\n})\n\nexport const orderCreateSchema = scoped.extend({\n orderNumber: z.string().trim().min(1).max(191).optional(),\n externalReference: z.string().trim().max(191).optional(),\n customerReference: z.string().trim().max(191).optional(),\n customerEntityId: uuid().optional(),\n customerContactId: uuid().optional(),\n customerSnapshot: customerSnapshotSchema.optional(),\n billingAddressId: uuid().optional(),\n shippingAddressId: uuid().optional(),\n billingAddressSnapshot: jsonRecord.optional(),\n shippingAddressSnapshot: jsonRecord.optional(),\n currencyCode,\n exchangeRate: decimal({ min: 0 }).optional(),\n statusEntryId: uuid().optional(),\n fulfillmentStatusEntryId: uuid().optional(),\n paymentStatusEntryId: uuid().optional(),\n taxStrategyKey: z.string().trim().max(120).optional(),\n discountStrategyKey: z.string().trim().max(120).optional(),\n taxInfo: jsonRecord.optional(),\n shippingMethodId: uuid().optional(),\n shippingMethodCode: z.string().trim().max(120).optional(),\n deliveryWindowId: uuid().optional(),\n deliveryWindowCode: z.string().trim().max(120).optional(),\n paymentMethodId: uuid().optional(),\n paymentMethodCode: z.string().trim().max(120).optional(),\n channelId: uuid().optional(),\n placedAt: z.coerce.date().optional(),\n expectedDeliveryAt: z.coerce.date().optional(),\n dueAt: z.coerce.date().optional(),\n comments: z.string().trim().max(4000).optional(),\n internalNotes: z.string().trim().max(4000).optional(),\n shippingMethodSnapshot: jsonRecord.optional(),\n deliveryWindowSnapshot: jsonRecord.optional(),\n paymentMethodSnapshot: jsonRecord.optional(),\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z.array(orderLineCreateSchema.omit({ organizationId: true, tenantId: true, orderId: true })).optional(),\n adjustments: z.array(orderAdjustmentCreateSchema.omit({ organizationId: true, tenantId: true, orderId: true })).optional(),\n tags: z.array(uuid()).optional(),\n ...orderTotalsSchema.shape,\n ...orderPaymentLedgerShape,\n})\n\nexport const orderUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(orderCreateSchema.partial())\n\nexport const quoteCreateSchema = scoped.extend({\n quoteNumber: z.string().trim().min(1).max(191).optional(),\n statusEntryId: uuid().optional(),\n customerEntityId: uuid().optional(),\n customerContactId: uuid().optional(),\n channelId: uuid().optional(),\n customerSnapshot: customerSnapshotSchema.optional(),\n billingAddressId: uuid().optional(),\n shippingAddressId: uuid().optional(),\n billingAddressSnapshot: jsonRecord.optional(),\n shippingAddressSnapshot: jsonRecord.optional(),\n currencyCode,\n validFrom: z.coerce.date().optional(),\n validUntil: z.coerce.date().optional(),\n comments: z.string().trim().max(4000).optional(),\n taxInfo: jsonRecord.optional(),\n shippingMethodId: uuid().optional(),\n shippingMethodCode: z.string().trim().max(120).optional(),\n deliveryWindowId: uuid().optional(),\n deliveryWindowCode: z.string().trim().max(120).optional(),\n paymentMethodId: uuid().optional(),\n paymentMethodCode: z.string().trim().max(120).optional(),\n shippingMethodSnapshot: jsonRecord.optional(),\n deliveryWindowSnapshot: jsonRecord.optional(),\n paymentMethodSnapshot: jsonRecord.optional(),\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z\n .array(quoteLineCreateSchema.omit({ organizationId: true, tenantId: true, quoteId: true }))\n .optional(),\n adjustments: z\n .array(quoteAdjustmentCreateSchema.omit({ organizationId: true, tenantId: true, quoteId: true }))\n .optional(),\n tags: z.array(uuid()).optional(),\n ...quoteTotalsSchema.shape,\n})\n\nexport const quoteUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(quoteCreateSchema.partial())\n\nconst documentKind = z.enum(['order', 'quote'])\n\nconst documentAddressFields = {\n documentId: uuid(),\n documentKind,\n customerAddressId: uuid().optional(),\n name: z.string().trim().max(255).nullable().optional(),\n purpose: z.string().trim().max(120).nullable().optional(),\n companyName: z.string().trim().max(255).nullable().optional(),\n addressLine1: z.string().trim().min(1).max(255),\n addressLine2: z.string().trim().max(255).nullable().optional(),\n city: z.string().trim().max(120).nullable().optional(),\n region: z.string().trim().max(120).nullable().optional(),\n postalCode: z.string().trim().max(60).nullable().optional(),\n country: z.string().trim().max(2).nullable().optional(),\n buildingNumber: z.string().trim().max(60).nullable().optional(),\n flatNumber: z.string().trim().max(60).nullable().optional(),\n latitude: z.coerce.number().optional().nullable(),\n longitude: z.coerce.number().optional().nullable(),\n}\n\nexport const documentAddressCreateSchema = scoped.extend(documentAddressFields)\n\nexport const documentAddressUpdateSchema = scoped.extend({\n id: uuid(),\n ...documentAddressFields,\n})\n\nexport const documentAddressDeleteSchema = scoped.extend({\n id: uuid(),\n documentId: uuid(),\n documentKind,\n})\n\nexport const shipmentCreateSchema = scoped.extend({\n orderId: uuid(),\n shipmentNumber: z.string().trim().max(191).optional(),\n shippingMethodId: uuid().optional(),\n statusEntryId: uuid().optional(),\n documentStatusEntryId: uuid().optional(),\n lineStatusEntryId: uuid().optional(),\n carrierName: z.string().trim().max(191).optional(),\n trackingNumbers: z.array(z.string().trim().max(191)).optional(),\n shippedAt: z.coerce.date().optional(),\n deliveredAt: z.coerce.date().optional(),\n weightValue: decimal({ min: 0 }).optional(),\n weightUnit: z.string().trim().max(25).optional(),\n declaredValueNet: decimal({ min: 0 }).optional(),\n declaredValueGross: decimal({ min: 0 }).optional(),\n currencyCode: currencyCode.optional(),\n notes: z.string().trim().max(4000).optional(),\n metadata,\n shipmentAddressSnapshot: jsonRecord.optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n items: z\n .array(\n z.object({\n orderLineId: uuid(),\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).int('Quantity must be a whole number.'),\n metadata,\n })\n )\n .optional(),\n})\n\nexport const shipmentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(shipmentCreateSchema.partial())\n\nconst returnLineQuantitySchema = z.coerce\n .number()\n .int('Return quantity must be a whole number.')\n .min(1, 'Return quantity must be at least 1.')\n .max(MAX_QUANTITY, 'Quantity is too large.')\n\nexport const RETURN_DATE_IN_FUTURE_MESSAGE = 'Return date cannot be in the future.'\n\n// A return records when goods physically came back to the seller, so a future\n// date is not yet a fact. Evaluate \"now\" at parse time (not module-load time)\n// so a long-running server never rejects legitimate same-day returns.\nconst returnedAtSchema = z.coerce\n .date()\n .refine((value) => value.getTime() <= Date.now(), {\n message: RETURN_DATE_IN_FUTURE_MESSAGE,\n })\n .optional()\n\nexport const returnCreateSchema = scoped.extend({\n orderId: uuid(),\n reason: z.string().trim().max(4000).optional(),\n notes: z.string().trim().max(4000).optional(),\n returnedAt: returnedAtSchema,\n lines: z\n .array(\n z.object({\n orderLineId: uuid(),\n quantity: returnLineQuantitySchema,\n })\n )\n .min(1),\n})\n\nexport const returnUpdateSchema = scoped.extend({\n id: uuid(),\n orderId: uuid(),\n reason: z.string().trim().max(4000).optional(),\n notes: z.string().trim().max(4000).optional(),\n returnedAt: returnedAtSchema,\n})\n\nexport const returnDeleteSchema = scoped.extend({\n id: uuid(),\n orderId: uuid(),\n})\n\nexport const invoiceCreateSchema = scoped.extend({\n orderId: uuid().optional(),\n invoiceNumber: z.string().trim().min(1).max(191).optional(),\n statusEntryId: uuid().optional(),\n issueDate: z.coerce.date().optional(),\n dueDate: z.coerce.date().optional(),\n currencyCode,\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z\n .array(\n z.object({\n orderLineId: uuid().optional(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n kind: lineKindSchema.optional(),\n name: z.string().trim().max(500).optional(),\n sku: z.string().trim().max(191).optional(),\n description: z.string().trim().max(4000).optional(),\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }),\n quantityUnit: z.string().trim().max(25).optional(),\n normalizedQuantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).optional(),\n normalizedUnit: z.string().trim().max(25).nullable().optional(),\n uomSnapshot: uomSnapshotSchema,\n currencyCode,\n unitPriceNet: decimal({ min: 0 }).optional(),\n unitPriceGross: decimal({ min: 0 }).optional(),\n discountAmount: decimal({ min: 0 }).optional(),\n discountPercent: percentage().optional(),\n taxRate: percentage().optional(),\n taxAmount: decimal({ min: 0 }).optional(),\n totalNetAmount: decimal({ min: 0 }).optional(),\n totalGrossAmount: decimal({ min: 0 }).optional(),\n metadata,\n })\n )\n .optional(),\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n discountTotalAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n paidTotalAmount: decimal({ min: 0 }).optional(),\n outstandingAmount: decimal().optional(),\n})\n\nexport const invoiceUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(invoiceCreateSchema.partial())\n\nexport const creditMemoCreateSchema = scoped.extend({\n orderId: uuid().optional(),\n invoiceId: uuid().optional(),\n creditMemoNumber: z.string().trim().min(1).max(191).optional(),\n statusEntryId: uuid().optional(),\n issueDate: z.coerce.date().optional(),\n reason: z.string().trim().max(4000).optional(),\n currencyCode,\n metadata,\n customFieldSetId: uuid().optional(),\n lines: z\n .array(\n z.object({\n orderLineId: uuid().optional(),\n lineNumber: z.coerce.number().int().min(0).optional(),\n name: z.string().trim().max(500).optional(),\n sku: z.string().trim().max(191).optional(),\n description: z.string().trim().max(4000).optional(),\n quantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }),\n quantityUnit: z.string().trim().max(25).optional(),\n normalizedQuantity: decimal({ min: 0, max: MAX_QUANTITY, message: 'Quantity is too large.' }).optional(),\n normalizedUnit: z.string().trim().max(25).nullable().optional(),\n uomSnapshot: uomSnapshotSchema,\n currencyCode,\n unitPriceNet: decimal({ min: 0 }).optional(),\n unitPriceGross: decimal({ min: 0 }).optional(),\n taxRate: percentage().optional(),\n taxAmount: decimal({ min: 0 }).optional(),\n totalNetAmount: decimal({ min: 0 }).optional(),\n totalGrossAmount: decimal({ min: 0 }).optional(),\n metadata,\n })\n )\n .optional(),\n subtotalNetAmount: decimal({ min: 0 }).optional(),\n subtotalGrossAmount: decimal({ min: 0 }).optional(),\n taxTotalAmount: decimal({ min: 0 }).optional(),\n grandTotalNetAmount: decimal({ min: 0 }).optional(),\n grandTotalGrossAmount: decimal({ min: 0 }).optional(),\n})\n\nexport const creditMemoUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(creditMemoCreateSchema.partial())\n\nexport const paymentCreateSchema = scoped.extend({\n orderId: uuid().optional(),\n paymentMethodId: uuid().optional(),\n paymentReference: z.string().trim().max(191).optional(),\n statusEntryId: uuid().optional(),\n documentStatusEntryId: uuid().optional(),\n lineStatusEntryId: uuid().optional(),\n amount: decimal({ min: 0 }),\n currencyCode,\n capturedAmount: decimal({ min: 0 }).optional(),\n refundedAmount: decimal({ min: 0 }).optional(),\n receivedAt: z.coerce.date().optional(),\n capturedAt: z.coerce.date().optional(),\n metadata,\n customFieldSetId: uuid().optional(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n allocations: z\n .array(\n z.object({\n orderId: uuid().optional(),\n invoiceId: uuid().optional(),\n amount: decimal({ min: 0 }),\n currencyCode,\n metadata,\n })\n )\n .optional(),\n})\n\nexport const paymentUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(paymentCreateSchema.partial())\n\nexport const noteCreateSchema = scoped.extend({\n contextType: z.enum(['order', 'quote', 'invoice', 'credit_memo']),\n contextId: uuid(),\n orderId: uuid().optional(),\n quoteId: uuid().optional(),\n authorUserId: uuid().optional(),\n body: z.string().trim().min(1).max(8000),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const noteUpdateSchema = z\n .object({\n id: uuid(),\n })\n .merge(\n z\n .object({\n body: z.string().trim().min(1).max(8000).optional(),\n })\n .extend({\n authorUserId: uuid().optional(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n })\n )\n\nexport const documentNumberRequestSchema = scoped.extend({\n kind: z.enum(['order', 'quote', 'invoice', 'credit_memo']),\n format: numberFormatSchema.optional(),\n})\n\nexport type DocumentNumberRequestInput = z.infer<typeof documentNumberRequestSchema>\n\nexport type ChannelCreateInput = z.infer<typeof channelCreateSchema>\nexport type ChannelUpdateInput = z.infer<typeof channelUpdateSchema>\nexport type ShippingMethodCreateInput = z.infer<typeof shippingMethodCreateSchema>\nexport type ShippingMethodUpdateInput = z.infer<typeof shippingMethodUpdateSchema>\nexport type DeliveryWindowCreateInput = z.infer<typeof deliveryWindowCreateSchema>\nexport type DeliveryWindowUpdateInput = z.infer<typeof deliveryWindowUpdateSchema>\nexport type PaymentMethodCreateInput = z.infer<typeof paymentMethodCreateSchema>\nexport type PaymentMethodUpdateInput = z.infer<typeof paymentMethodUpdateSchema>\nexport type TaxRateCreateInput = z.infer<typeof taxRateCreateSchema>\nexport type TaxRateUpdateInput = z.infer<typeof taxRateUpdateSchema>\nexport type DeprecatedOrderPaymentLedgerInput = {\n /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */\n paidTotalAmount?: number\n /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */\n refundedTotalAmount?: number\n /** @deprecated Derived from recorded payments. Use sales.payments.create or POST /api/sales/payments. */\n outstandingAmount?: number\n}\n\nexport type OrderCreateInput = Omit<\n z.infer<typeof orderCreateSchema>,\n OrderPaymentLedgerField\n> & DeprecatedOrderPaymentLedgerInput\nexport type OrderUpdateInput = Omit<\n z.infer<typeof orderUpdateSchema>,\n OrderPaymentLedgerField\n> & DeprecatedOrderPaymentLedgerInput\nexport type OrderLineCreateInput = z.infer<typeof orderLineCreateSchema>\nexport type OrderLineUpdateInput = z.infer<typeof orderLineUpdateSchema>\nexport type OrderAdjustmentCreateInput = z.infer<typeof orderAdjustmentCreateSchema>\nexport type OrderAdjustmentUpdateInput = z.infer<typeof orderAdjustmentUpdateSchema>\nexport type QuoteCreateInput = z.infer<typeof quoteCreateSchema>\nexport type QuoteUpdateInput = z.infer<typeof quoteUpdateSchema>\nexport type QuoteLineCreateInput = z.infer<typeof quoteLineCreateSchema>\nexport type QuoteLineUpdateInput = z.infer<typeof quoteLineUpdateSchema>\nexport type QuoteAdjustmentCreateInput = z.infer<typeof quoteAdjustmentCreateSchema>\nexport type QuoteAdjustmentUpdateInput = z.infer<typeof quoteAdjustmentUpdateSchema>\nexport type ShipmentCreateInput = z.infer<typeof shipmentCreateSchema>\nexport type ShipmentUpdateInput = z.infer<typeof shipmentUpdateSchema>\nexport type ReturnCreateInput = z.infer<typeof returnCreateSchema>\nexport type ReturnUpdateInput = z.infer<typeof returnUpdateSchema>\nexport type ReturnDeleteInput = z.infer<typeof returnDeleteSchema>\nexport type InvoiceCreateInput = z.infer<typeof invoiceCreateSchema>\nexport type InvoiceUpdateInput = z.infer<typeof invoiceUpdateSchema>\nexport type CreditMemoCreateInput = z.infer<typeof creditMemoCreateSchema>\nexport type CreditMemoUpdateInput = z.infer<typeof creditMemoUpdateSchema>\nexport const quoteSendSchema = z.object({\n quoteId: z.string().uuid(),\n validForDays: z.coerce.number().int().min(1).max(365).default(14),\n})\n\nexport const quoteAcceptSchema = z.object({\n token: z.string().uuid(),\n})\n\nexport type PaymentCreateInput = z.infer<typeof paymentCreateSchema>\nexport type PaymentUpdateInput = z.infer<typeof paymentUpdateSchema>\nexport type NoteCreateInput = z.infer<typeof noteCreateSchema>\nexport type NoteUpdateInput = z.infer<typeof noteUpdateSchema>\nexport type SalesTagCreateInput = z.infer<typeof salesTagCreateSchema>\nexport type SalesTagUpdateInput = z.infer<typeof salesTagUpdateSchema>\nexport type DocumentAddressCreateInput = z.infer<typeof documentAddressCreateSchema>\nexport type DocumentAddressUpdateInput = z.infer<typeof documentAddressUpdateSchema>\nexport type DocumentAddressDeleteInput = z.infer<typeof documentAddressDeleteSchema>\nexport type QuoteSendInput = z.infer<typeof quoteSendSchema>\nexport type QuoteAcceptInput = z.infer<typeof quoteAcceptSchema>\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.6.7-develop.6706.1.b3a4c759bb",
3
+ "version": "0.6.7-develop.6725.1.07a748cfc2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -254,16 +254,16 @@
254
254
  "zod": "^4.4.3"
255
255
  },
256
256
  "peerDependencies": {
257
- "@open-mercato/ai-assistant": "0.6.7-develop.6706.1.b3a4c759bb",
258
- "@open-mercato/shared": "0.6.7-develop.6706.1.b3a4c759bb",
259
- "@open-mercato/ui": "0.6.7-develop.6706.1.b3a4c759bb",
257
+ "@open-mercato/ai-assistant": "0.6.7-develop.6725.1.07a748cfc2",
258
+ "@open-mercato/shared": "0.6.7-develop.6725.1.07a748cfc2",
259
+ "@open-mercato/ui": "0.6.7-develop.6725.1.07a748cfc2",
260
260
  "react": "^19.0.0",
261
261
  "react-dom": "^19.0.0"
262
262
  },
263
263
  "devDependencies": {
264
- "@open-mercato/ai-assistant": "0.6.7-develop.6706.1.b3a4c759bb",
265
- "@open-mercato/shared": "0.6.7-develop.6706.1.b3a4c759bb",
266
- "@open-mercato/ui": "0.6.7-develop.6706.1.b3a4c759bb",
264
+ "@open-mercato/ai-assistant": "0.6.7-develop.6725.1.07a748cfc2",
265
+ "@open-mercato/shared": "0.6.7-develop.6725.1.07a748cfc2",
266
+ "@open-mercato/ui": "0.6.7-develop.6725.1.07a748cfc2",
267
267
  "@testing-library/dom": "^10.4.1",
268
268
  "@testing-library/jest-dom": "^6.9.1",
269
269
  "@testing-library/react": "^16.3.1",
@@ -5,6 +5,7 @@ import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
5
5
  import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
6
6
  import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
7
7
  import { getBackendRouteManifests } from '@open-mercato/shared/modules/registry'
8
+ import { getModuleSurfaceFingerprint } from '@open-mercato/shared/lib/modules/surfaceFingerprint'
8
9
  import { resolveFeatureCheckContext } from '@open-mercato/core/modules/directory/utils/organizationScope'
9
10
  import { groupBackendRoutesByModule, resolveBackendChromePayload } from '../../lib/backendChrome'
10
11
 
@@ -12,6 +13,13 @@ export const metadata = {
12
13
  GET: { requireAuth: true },
13
14
  }
14
15
 
16
+ // The fingerprint covers the module set, each module's declared features and
17
+ // the serializable route manifest, so the TTL only has to bound what it cannot
18
+ // see — chiefly a route `icon` swap, which serializes identically. Rebuilding
19
+ // this payload is expensive (a `renderToStaticMarkup` per nav icon plus several
20
+ // scoped queries), so the bound is generous rather than aggressive.
21
+ const NAV_CACHE_TTL_MS = 30 * 60 * 1000
22
+
15
23
  const sidebarNavItemSchema: z.ZodType<{
16
24
  id?: string
17
25
  href: string
@@ -90,6 +98,13 @@ const adminNavResponseSchema = z.object({
90
98
  profilePathPrefixes: z.array(z.string()),
91
99
  grantedFeatures: z.array(z.string()),
92
100
  roles: z.array(z.string()),
101
+ // Present when a single organization is in scope; `null` under an all-organizations selection or
102
+ // when the lookup fails. Declared optional so the response contract stays additive for clients
103
+ // generated against an older schema.
104
+ currentOrganization: z.object({
105
+ id: z.string(),
106
+ name: z.string(),
107
+ }).nullable().optional(),
93
108
  })
94
109
 
95
110
  const adminNavErrorSchema = z.object({
@@ -104,7 +119,7 @@ export async function GET(req: Request) {
104
119
  const container = await createRequestContainer()
105
120
  const cache = container.resolve('cache') as {
106
121
  get?: (key: string) => Promise<unknown>
107
- set?: (key: string, value: unknown, options?: { tags?: string[] }) => Promise<void>
122
+ set?: (key: string, value: unknown, options?: { tags?: string[]; ttl?: number }) => Promise<void>
108
123
  } | null
109
124
  let selectedOrganizationId: string | null | undefined
110
125
  let selectedTenantId: string | null | undefined
@@ -138,8 +153,13 @@ export async function GET(req: Request) {
138
153
  selectedTenantId = auth.tenantId ?? null
139
154
  }
140
155
 
141
- const cacheVersion = 'v4'
142
- const cacheKey = `nav:sidebar:${cacheVersion}:${locale}:${auth.sub}:${cacheScopeTenantId || 'null'}:${cacheScopeOrganizationId || 'null'}`
156
+ // v6: the payload gained `currentOrganization`, and the payload also embeds the enabled-module set,
157
+ // its declared features, and the backend route manifest. The selection is part of the key because
158
+ // the resolved organization cannot distinguish "all organizations" from "my own organization".
159
+ // The fingerprint invalidates module-surface changes; the TTL bounds anything it cannot observe.
160
+ const cacheVersion = `v6:${getModuleSurfaceFingerprint()}`
161
+ const cacheSelection = selectedOrganizationId === undefined ? 'default' : (selectedOrganizationId ?? 'null')
162
+ const cacheKey = `nav:sidebar:${cacheVersion}:${locale}:${auth.sub}:${cacheScopeTenantId || 'null'}:${cacheScopeOrganizationId || 'null'}:${cacheSelection}`
143
163
  try {
144
164
  if (cache?.get) {
145
165
  const cached = await cache.get(cacheKey)
@@ -172,7 +192,7 @@ export async function GET(req: Request) {
172
192
  `nav:sidebar:scope:${auth.sub}:${cacheScopeTenantId || 'null'}:${cacheScopeOrganizationId || 'null'}:${locale}`,
173
193
  ...((Array.isArray(auth.roles) ? auth.roles : []).map((role) => `nav:sidebar:role:${role}`)),
174
194
  ].filter(Boolean) as string[]
175
- await cache.set(cacheKey, payload, { tags })
195
+ await cache.set(cacheKey, payload, { tags, ttl: NAV_CACHE_TTL_MS })
176
196
  }
177
197
  } catch {
178
198
  // ignore cache write failures
@@ -23,9 +23,7 @@ import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/
23
23
  import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
24
24
  import { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'
25
25
  import { parseBooleanFlag } from '@open-mercato/shared/lib/boolean'
26
- import { resolveSearchConfig } from '@open-mercato/shared/lib/search/config'
27
- import { tokenizeText } from '@open-mercato/shared/lib/search/tokenize'
28
- import { sql } from 'kysely'
26
+ import { findEntityIdsBySearchTokensCompat, type SearchTokenDatabase } from '@open-mercato/shared/lib/search/tokenLookup'
29
27
  import { normalizeDisplayNameInput } from '@open-mercato/core/modules/auth/lib/displayName'
30
28
  import {
31
29
  getSelectedTenantFromRequest,
@@ -504,31 +502,13 @@ async function findUserIdsBySearchTokens(
504
502
  tenantScope: string | null | undefined,
505
503
  field?: string,
506
504
  ): Promise<string[] | null> {
507
- const trimmed = search.trim()
508
- if (!trimmed) return null
509
- const searchConfig = resolveSearchConfig()
510
- if (!searchConfig.enabled) return []
511
- const { hashes } = tokenizeText(trimmed, searchConfig)
512
- if (!hashes.length) return []
513
-
514
- const db = (em as any).getKysely() as any
515
- let query = db
516
- .selectFrom('search_tokens')
517
- .select('entity_id')
518
- .where('entity_type', '=', entityType)
519
- .where('token_hash', 'in', hashes)
520
- .groupBy('entity_id')
521
- .having(sql<boolean>`count(distinct token_hash) >= ${hashes.length}`)
522
- if (field) {
523
- query = query.where('field', '=', field)
524
- }
525
- if (tenantScope !== undefined) {
526
- query = query.where(sql<boolean>`tenant_id is not distinct from ${tenantScope}`)
527
- }
528
- const rows = (await query.execute()) as Array<{ entity_id?: unknown }>
529
- return rows
530
- .map((row) => (typeof row.entity_id === 'string' ? row.entity_id : null))
531
- .filter((id): id is string => typeof id === 'string' && id.length > 0)
505
+ return findEntityIdsBySearchTokensCompat({
506
+ db: em.getKysely<SearchTokenDatabase>(),
507
+ entityType,
508
+ query: search,
509
+ fields: field ? [field] : undefined,
510
+ scope: { tenantId: tenantScope },
511
+ })
532
512
  }
533
513
 
534
514
  async function assertCanModifySuperAdminTarget(req: Request, targetUserId: string) {