@openlup/platform 0.25.0 → 0.27.0

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 (524) hide show
  1. package/CHANGELOG.md +156 -440
  2. package/README.md +230 -11
  3. package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
  4. package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
  5. package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
  6. package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
  7. package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
  8. package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
  9. package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
  10. package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
  11. package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
  12. package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
  13. package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
  14. package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
  15. package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
  16. package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
  17. package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
  18. package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
  19. package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
  20. package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
  21. package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
  22. package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
  23. package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
  24. package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
  25. package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
  26. package/dist/commerce/adapters/managed/oms/types.js +7 -0
  27. package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
  28. package/dist/commerce/checkoutCommandSchemas.js +70 -0
  29. package/dist/commerce/checkoutHelpers.d.ts +21 -0
  30. package/dist/commerce/checkoutHelpers.js +29 -0
  31. package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
  32. package/dist/commerce/checkoutResumeSchemas.js +145 -0
  33. package/dist/commerce/checkoutSchemas.d.ts +158 -0
  34. package/dist/commerce/checkoutSchemas.js +161 -0
  35. package/dist/commerce/commerceReturnsPort.d.ts +97 -0
  36. package/dist/commerce/commerceReturnsPort.js +39 -0
  37. package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
  38. package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
  39. package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
  40. package/dist/commerce/configuratorIntentSchemas.js +43 -0
  41. package/dist/commerce/contractPrimitives.d.ts +50 -0
  42. package/dist/commerce/contractPrimitives.js +25 -0
  43. package/dist/commerce/contracts/availability.d.ts +23 -0
  44. package/dist/commerce/contracts/availability.js +1 -0
  45. package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
  46. package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
  47. package/dist/commerce/contracts/index.d.ts +13 -0
  48. package/dist/commerce/contracts/index.js +1 -0
  49. package/dist/commerce/contracts/intent.d.ts +86 -0
  50. package/dist/commerce/contracts/intent.js +1 -0
  51. package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
  52. package/dist/commerce/contracts/omsTypes.js +1 -0
  53. package/dist/commerce/contracts/order.d.ts +39 -0
  54. package/dist/commerce/contracts/order.js +1 -0
  55. package/dist/commerce/contracts/orderMoney.d.ts +52 -0
  56. package/dist/commerce/contracts/orderMoney.js +1 -0
  57. package/dist/commerce/contracts/ports.d.ts +113 -0
  58. package/dist/commerce/contracts/ports.js +1 -0
  59. package/dist/commerce/contracts/recovery.d.ts +11 -0
  60. package/dist/commerce/contracts/recovery.js +1 -0
  61. package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
  62. package/dist/commerce/contracts/runtimePorts.js +1 -0
  63. package/dist/commerce/contracts/state.d.ts +26 -0
  64. package/dist/commerce/contracts/state.js +43 -0
  65. package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
  66. package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
  67. package/dist/commerce/errors.d.ts +18 -0
  68. package/dist/commerce/errors.js +36 -0
  69. package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
  70. package/dist/commerce/fulfillmentEligibility.js +31 -0
  71. package/dist/commerce/index.d.ts +72 -0
  72. package/dist/commerce/index.js +67 -0
  73. package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
  74. package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
  75. package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
  76. package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
  77. package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
  78. package/dist/commerce/model/omsAccountingVisibility.js +118 -0
  79. package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
  80. package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
  81. package/dist/commerce/model/omsCurrency.d.ts +4 -0
  82. package/dist/commerce/model/omsCurrency.js +5 -0
  83. package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
  84. package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
  85. package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
  86. package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
  87. package/dist/commerce/model/omsListTotals.d.ts +13 -0
  88. package/dist/commerce/model/omsListTotals.js +32 -0
  89. package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
  90. package/dist/commerce/model/omsOperationalLadder.js +158 -0
  91. package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
  92. package/dist/commerce/model/omsOrderLineMoney.js +25 -0
  93. package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
  94. package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
  95. package/dist/commerce/model/omsReadModel.d.ts +43 -0
  96. package/dist/commerce/model/omsReadModel.js +211 -0
  97. package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
  98. package/dist/commerce/model/omsReadModelCommunication.js +29 -0
  99. package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
  100. package/dist/commerce/model/omsReadModelHelpers.js +212 -0
  101. package/dist/commerce/model/omsReadModelList.d.ts +33 -0
  102. package/dist/commerce/model/omsReadModelList.js +50 -0
  103. package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
  104. package/dist/commerce/model/omsReadModelListSummary.js +13 -0
  105. package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
  106. package/dist/commerce/model/omsReadModelPricing.js +36 -0
  107. package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
  108. package/dist/commerce/model/omsReadModelProjections.js +1 -0
  109. package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
  110. package/dist/commerce/model/omsReadModelRowCore.js +149 -0
  111. package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
  112. package/dist/commerce/model/omsReadModelRows.js +6 -0
  113. package/dist/commerce/offerAvailability.d.ts +18 -0
  114. package/dist/commerce/offerAvailability.js +53 -0
  115. package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
  116. package/dist/commerce/offerAvailabilitySchemas.js +42 -0
  117. package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
  118. package/dist/commerce/offerEvidenceSchemas.js +13 -0
  119. package/dist/commerce/oms/omsContractBase.d.ts +130 -0
  120. package/dist/commerce/oms/omsContractBase.js +86 -0
  121. package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
  122. package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
  123. package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
  124. package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
  125. package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
  126. package/dist/commerce/oms/omsContractRequests.js +118 -0
  127. package/dist/commerce/oms/omsContracts.d.ts +5 -0
  128. package/dist/commerce/oms/omsContracts.js +4 -0
  129. package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
  130. package/dist/commerce/oms/omsControlPlane.js +72 -0
  131. package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
  132. package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
  133. package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
  134. package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
  135. package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
  136. package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
  137. package/dist/commerce/oms/omsPorts.d.ts +84 -0
  138. package/dist/commerce/oms/omsPorts.js +148 -0
  139. package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
  140. package/dist/commerce/oms/omsPrimitives.js +3 -0
  141. package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
  142. package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
  143. package/dist/commerce/orderDraftErrors.d.ts +13 -0
  144. package/dist/commerce/orderDraftErrors.js +20 -0
  145. package/dist/commerce/orderEmailEligibility.d.ts +54 -0
  146. package/dist/commerce/orderEmailEligibility.js +123 -0
  147. package/dist/commerce/orderEmailLines.d.ts +12 -0
  148. package/dist/commerce/orderEmailLines.js +8 -0
  149. package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
  150. package/dist/commerce/orderFeedbackContracts.js +33 -0
  151. package/dist/commerce/orderMoney.d.ts +6 -0
  152. package/dist/commerce/orderMoney.js +168 -0
  153. package/dist/commerce/orderReviewContracts.d.ts +475 -0
  154. package/dist/commerce/orderReviewContracts.js +94 -0
  155. package/dist/commerce/orderReviewPorts.d.ts +140 -0
  156. package/dist/commerce/orderReviewPorts.js +1 -0
  157. package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
  158. package/dist/commerce/outboxDispatchContracts.js +1 -0
  159. package/dist/commerce/outboxEventSchemas.d.ts +162 -0
  160. package/dist/commerce/outboxEventSchemas.js +164 -0
  161. package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
  162. package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
  163. package/dist/commerce/paymentContinuation.d.ts +4 -0
  164. package/dist/commerce/paymentContinuation.js +4 -0
  165. package/dist/commerce/ports.d.ts +8 -0
  166. package/dist/commerce/ports.js +1 -0
  167. package/dist/commerce/recoveryDestination.d.ts +3 -0
  168. package/dist/commerce/recoveryDestination.js +17 -0
  169. package/dist/commerce/runtimeErrors.d.ts +8 -0
  170. package/dist/commerce/runtimeErrors.js +16 -0
  171. package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
  172. package/dist/commerce/salesChannelEnvelope.js +7 -0
  173. package/dist/commerce/schemas.d.ts +174 -0
  174. package/dist/commerce/schemas.js +84 -0
  175. package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
  176. package/dist/commerce/server/checkoutCompensation.js +32 -0
  177. package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
  178. package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
  179. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
  180. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
  181. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
  182. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
  183. package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
  184. package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
  185. package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
  186. package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
  187. package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
  188. package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
  189. package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
  190. package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
  191. package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
  192. package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
  193. package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
  194. package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
  195. package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
  196. package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
  197. package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
  198. package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
  199. package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
  200. package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
  201. package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
  202. package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
  203. package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
  204. package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
  205. package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
  206. package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
  207. package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
  208. package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
  209. package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
  210. package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
  211. package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
  212. package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
  213. package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
  214. package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
  215. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
  216. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
  217. package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
  218. package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
  219. package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
  220. package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
  221. package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
  222. package/dist/commerce/server/commerceCheckoutResume.js +81 -0
  223. package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
  224. package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
  225. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
  226. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
  227. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
  228. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
  229. package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
  230. package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
  231. package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
  232. package/dist/commerce/server/commerceDiagnostics.js +31 -0
  233. package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
  234. package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
  235. package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
  236. package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
  237. package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
  238. package/dist/commerce/server/commerceOmsHandlers.js +176 -0
  239. package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
  240. package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
  241. package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
  242. package/dist/commerce/server/commerceOrderDraft.js +92 -0
  243. package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
  244. package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
  245. package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
  246. package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
  247. package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
  248. package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
  249. package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
  250. package/dist/commerce/server/commerceRuntimePort.js +57 -0
  251. package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
  252. package/dist/commerce/server/commerceRuntimeService.js +186 -0
  253. package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
  254. package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
  255. package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
  256. package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
  257. package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
  258. package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
  259. package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
  260. package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
  261. package/dist/commerce/server/emailRuntime.d.ts +47 -0
  262. package/dist/commerce/server/emailRuntime.js +1 -0
  263. package/dist/commerce/server/handlerSupport.d.ts +68 -0
  264. package/dist/commerce/server/handlerSupport.js +1 -0
  265. package/dist/commerce/server/index.d.ts +178 -0
  266. package/dist/commerce/server/index.js +127 -0
  267. package/dist/commerce/server/offerAvailability.d.ts +21 -0
  268. package/dist/commerce/server/offerAvailability.js +163 -0
  269. package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
  270. package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
  271. package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
  272. package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
  273. package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
  274. package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
  275. package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
  276. package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
  277. package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
  278. package/dist/commerce/server/orderReviewHandlers.js +42 -0
  279. package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
  280. package/dist/commerce/server/orderReviewLifecycle.js +121 -0
  281. package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
  282. package/dist/commerce/server/orderReviewMedia.js +172 -0
  283. package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
  284. package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
  285. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
  286. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
  287. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
  288. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
  289. package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
  290. package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
  291. package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
  292. package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
  293. package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
  294. package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
  295. package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
  296. package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
  297. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
  298. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
  299. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
  300. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
  301. package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
  302. package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
  303. package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
  304. package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
  305. package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
  306. package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
  307. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
  308. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
  309. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
  310. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
  311. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
  312. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
  313. package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
  314. package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
  315. package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
  316. package/dist/commerce/server/reservationSweepPort.js +45 -0
  317. package/dist/commerce/server/starterTermsPort.d.ts +22 -0
  318. package/dist/commerce/server/starterTermsPort.js +1 -0
  319. package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
  320. package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
  321. package/dist/communications/consentPurposeRegistry.d.ts +1 -1
  322. package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
  323. package/dist/composition/commerceContribution.d.ts +21 -0
  324. package/dist/composition/commerceContribution.js +27 -0
  325. package/dist/composition/index.d.ts +1 -0
  326. package/dist/composition/index.js +1 -0
  327. package/dist/fulfillment/handlerSchemas.d.ts +41 -41
  328. package/dist/fulfillment/index.d.ts +1 -1
  329. package/dist/fulfillment/index.js +1 -1
  330. package/dist/fulfillment/paidHandoff.d.ts +12 -1
  331. package/dist/fulfillment/paidHandoff.js +2 -2
  332. package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
  333. package/dist/identity/customerContracts.d.ts +2 -2
  334. package/dist/inventory/bindings.d.ts +3 -0
  335. package/dist/inventory/bindings.js +10 -4
  336. package/dist/inventory/index.d.ts +1 -0
  337. package/dist/inventory/index.js +1 -0
  338. package/dist/inventory/managedStockAvailability.d.ts +15 -0
  339. package/dist/inventory/managedStockAvailability.js +16 -0
  340. package/dist/inventory/postgresStockAvailability.js +2 -25
  341. package/dist/inventory/schemas.d.ts +1 -1
  342. package/dist/inventory/stockReadResponse.d.ts +4 -0
  343. package/dist/inventory/stockReadResponse.js +27 -0
  344. package/dist/pricing/browser/index.d.ts +6 -0
  345. package/dist/pricing/browser/index.js +6 -0
  346. package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
  347. package/dist/subscriptions/contracts/renewal.d.ts +2 -0
  348. package/dist/subscriptions/index.d.ts +3 -2
  349. package/dist/subscriptions/index.js +3 -2
  350. package/dist/subscriptions/renewalCycleFailureMechanism.js +3 -2
  351. package/package.json +22 -2
  352. package/release-gates.json +63 -8
  353. package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
  354. package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
  355. package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
  356. package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
  357. package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
  358. package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
  359. package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
  360. package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
  361. package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
  362. package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
  363. package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
  364. package/src/commerce/adapters/managed/oms/types.ts +9 -0
  365. package/src/commerce/checkoutCommandSchemas.ts +93 -0
  366. package/src/commerce/checkoutHelpers.ts +47 -0
  367. package/src/commerce/checkoutResumeSchemas.ts +164 -0
  368. package/src/commerce/checkoutSchemas.ts +182 -0
  369. package/src/commerce/commerceReturnsPort.ts +67 -0
  370. package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
  371. package/src/commerce/configuratorIntentSchemas.ts +47 -0
  372. package/src/commerce/contractPrimitives.ts +30 -0
  373. package/src/commerce/contracts/availability.ts +21 -0
  374. package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
  375. package/src/commerce/contracts/index.ts +17 -0
  376. package/src/commerce/contracts/intent.ts +58 -0
  377. package/src/commerce/contracts/omsTypes.ts +1217 -0
  378. package/src/commerce/contracts/order.ts +44 -0
  379. package/src/commerce/contracts/orderMoney.ts +75 -0
  380. package/src/commerce/contracts/ports.ts +124 -0
  381. package/src/commerce/contracts/recovery.ts +24 -0
  382. package/src/commerce/contracts/runtimePorts.ts +201 -0
  383. package/src/commerce/contracts/state.ts +64 -0
  384. package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
  385. package/src/commerce/errors.ts +53 -0
  386. package/src/commerce/fulfillmentEligibility.ts +32 -0
  387. package/src/commerce/index.ts +82 -0
  388. package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
  389. package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
  390. package/src/commerce/model/omsAccountingVisibility.ts +135 -0
  391. package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
  392. package/src/commerce/model/omsCurrency.ts +8 -0
  393. package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
  394. package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
  395. package/src/commerce/model/omsListTotals.ts +38 -0
  396. package/src/commerce/model/omsOperationalLadder.ts +181 -0
  397. package/src/commerce/model/omsOrderLineMoney.ts +34 -0
  398. package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
  399. package/src/commerce/model/omsReadModel.ts +302 -0
  400. package/src/commerce/model/omsReadModelCommunication.ts +32 -0
  401. package/src/commerce/model/omsReadModelHelpers.ts +279 -0
  402. package/src/commerce/model/omsReadModelList.ts +90 -0
  403. package/src/commerce/model/omsReadModelListSummary.ts +19 -0
  404. package/src/commerce/model/omsReadModelPricing.ts +57 -0
  405. package/src/commerce/model/omsReadModelProjections.ts +1 -0
  406. package/src/commerce/model/omsReadModelRowCore.ts +193 -0
  407. package/src/commerce/model/omsReadModelRows.ts +7 -0
  408. package/src/commerce/offerAvailability.ts +75 -0
  409. package/src/commerce/offerAvailabilitySchemas.ts +56 -0
  410. package/src/commerce/offerEvidenceSchemas.ts +17 -0
  411. package/src/commerce/oms/omsContractBase.ts +92 -0
  412. package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
  413. package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
  414. package/src/commerce/oms/omsContractRequests.ts +143 -0
  415. package/src/commerce/oms/omsContracts.ts +6 -0
  416. package/src/commerce/oms/omsControlPlane.ts +85 -0
  417. package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
  418. package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
  419. package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
  420. package/src/commerce/oms/omsPorts.ts +165 -0
  421. package/src/commerce/oms/omsPrimitives.ts +3 -0
  422. package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
  423. package/src/commerce/orderDraftErrors.ts +28 -0
  424. package/src/commerce/orderEmailEligibility.ts +131 -0
  425. package/src/commerce/orderEmailLines.ts +22 -0
  426. package/src/commerce/orderFeedbackContracts.ts +47 -0
  427. package/src/commerce/orderMoney.ts +207 -0
  428. package/src/commerce/orderReviewContracts.ts +124 -0
  429. package/src/commerce/orderReviewPorts.ts +94 -0
  430. package/src/commerce/outboxDispatchContracts.ts +30 -0
  431. package/src/commerce/outboxEventSchemas.ts +230 -0
  432. package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
  433. package/src/commerce/paymentContinuation.ts +5 -0
  434. package/src/commerce/ports.ts +7 -0
  435. package/src/commerce/recoveryDestination.ts +23 -0
  436. package/src/commerce/runtimeErrors.ts +19 -0
  437. package/src/commerce/salesChannelEnvelope.ts +28 -0
  438. package/src/commerce/schemas.ts +104 -0
  439. package/src/commerce/server/checkoutCompensation.ts +49 -0
  440. package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
  441. package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
  442. package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
  443. package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
  444. package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
  445. package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
  446. package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
  447. package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
  448. package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
  449. package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
  450. package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
  451. package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
  452. package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
  453. package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
  454. package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
  455. package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
  456. package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
  457. package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
  458. package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
  459. package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
  460. package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
  461. package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
  462. package/src/commerce/server/commerceCheckoutResume.ts +132 -0
  463. package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
  464. package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
  465. package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
  466. package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
  467. package/src/commerce/server/commerceDiagnostics.ts +37 -0
  468. package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
  469. package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
  470. package/src/commerce/server/commerceOmsHandlers.ts +275 -0
  471. package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
  472. package/src/commerce/server/commerceOrderDraft.ts +131 -0
  473. package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
  474. package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
  475. package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
  476. package/src/commerce/server/commerceRuntimePort.ts +75 -0
  477. package/src/commerce/server/commerceRuntimeService.ts +229 -0
  478. package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
  479. package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
  480. package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
  481. package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
  482. package/src/commerce/server/emailRuntime.ts +30 -0
  483. package/src/commerce/server/handlerSupport.ts +22 -0
  484. package/src/commerce/server/index.ts +181 -0
  485. package/src/commerce/server/offerAvailability.ts +275 -0
  486. package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
  487. package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
  488. package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
  489. package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
  490. package/src/commerce/server/orderReviewHandlers.ts +57 -0
  491. package/src/commerce/server/orderReviewLifecycle.ts +129 -0
  492. package/src/commerce/server/orderReviewMedia.ts +170 -0
  493. package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
  494. package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
  495. package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
  496. package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
  497. package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
  498. package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
  499. package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
  500. package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
  501. package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
  502. package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
  503. package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
  504. package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
  505. package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
  506. package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
  507. package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
  508. package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
  509. package/src/commerce/server/reservationSweepPort.ts +67 -0
  510. package/src/commerce/server/starterTermsPort.ts +22 -0
  511. package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
  512. package/src/composition/commerceContribution.ts +35 -0
  513. package/src/composition/index.ts +1 -0
  514. package/src/fulfillment/index.ts +1 -1
  515. package/src/fulfillment/paidHandoff.ts +2 -2
  516. package/src/inventory/bindings.ts +12 -4
  517. package/src/inventory/index.ts +1 -0
  518. package/src/inventory/managedStockAvailability.ts +23 -0
  519. package/src/inventory/postgresStockAvailability.ts +2 -21
  520. package/src/inventory/stockReadResponse.ts +25 -0
  521. package/src/pricing/browser/index.ts +6 -0
  522. package/src/subscriptions/contracts/renewal.ts +2 -1
  523. package/src/subscriptions/index.ts +3 -2
  524. package/src/subscriptions/renewalCycleFailureMechanism.ts +3 -1
@@ -0,0 +1,122 @@
1
+ import { parseTimestampOrZero, } from "./omsFulfillmentSummary.js";
2
+ export function buildOmsFulfillmentDebug(input) {
3
+ const latestDispatch = newest(input.providerDispatchRefs, (row) => row.updated_at ?? row.created_at);
4
+ const latestAttempt = newest(input.providerAttempts, (row) => row.created_at);
5
+ const latestProvider = newest(input.providerStatusEvidence, (row) => row.occurred_at ?? row.created_at);
6
+ const latestInbound = newest(input.inboundProviderEvents, (row) => row.processed_at ?? row.created_at);
7
+ const dispatchedMail = latestMail(input.communicationDeliveries, "commerce-shipment-dispatched");
8
+ const providerProblem = latestInbound?.processing_status === "ignored" || latestInbound?.processing_status === "failed" ||
9
+ Boolean(latestDispatch?.error) || Boolean(latestAttempt?.error) || ["failed", "error"].includes(latestAttempt?.status ?? "");
10
+ const shippedWithoutTracking = Boolean(latestProvider && ["shipped", "delivered"].includes(latestProvider.provider_status ?? "")) &&
11
+ input.fulfillment.trackingReferences.length === 0;
12
+ const latestProviderStock = newest(input.providerStockCurrent ?? [], (row) => row.last_synced_at);
13
+ const providerStockStale = latestProviderStock ? Date.parse(latestProviderStock.stale_after) <= Date.now() : false;
14
+ const steps = [
15
+ step("payment", input.paymentStatus === "succeeded" ? "ok" : "blocked", "Payment", input.paymentStatus),
16
+ step("stock", ["reserved", "consumed"].includes(input.inventory.status) ? "ok" : "missing", "Stock", input.inventory.status, {
17
+ details: input.reservations.map((row) => `${row.status}:${row.quantity}`),
18
+ evidenceAt: input.inventory.expiresAt,
19
+ }),
20
+ step("provider_stock", providerStockStatus(Boolean(input.projections?.usesExternalStock?.(input.fulfillment.providerKind)), latestProviderStock, providerStockStale), "Provider stock", latestProviderStock ? `${latestProviderStock.provider_kind}:${latestProviderStock.sku}` : null, {
21
+ details: latestProviderStock
22
+ ? [
23
+ `forSale ${latestProviderStock.provider_for_sale_quantity}`,
24
+ `total ${latestProviderStock.provider_total_quantity}`,
25
+ `authority ${input.projections?.usesExternalStock?.(input.fulfillment.providerKind) ? "external_stock_master" : "local_atp"}`,
26
+ ]
27
+ : [],
28
+ evidenceAt: latestProviderStock?.last_synced_at ?? null,
29
+ }),
30
+ step("fulfillment", input.fulfillment.fulfillmentOrderId ? "ok" : "missing", "Fulfillment order", input.fulfillment.status),
31
+ step("dispatch", latestDispatch ? statusFromDispatch(latestDispatch) : "pending", input.projections?.dispatchStepLabel ?? "Provider dispatch", latestDispatch?.status ?? null, {
32
+ details: compact([latestDispatch?.provider_order_id ? `providerOrderId ${latestDispatch.provider_order_id}` : null, latestAttempt?.status ? `attempt ${latestAttempt.status}` : null]),
33
+ evidenceAt: latestDispatch?.updated_at ?? latestDispatch?.created_at ?? null,
34
+ }),
35
+ step("provider", providerProblem ? "warning" : latestProvider ? "ok" : "pending", "Provider evidence", latestProvider?.provider_status ?? latestInbound?.processing_status ?? null, {
36
+ details: compact([latestProvider?.provider_sub_status, latestInbound?.event_type, latestAttempt?.status ? `attempt ${latestAttempt.status}` : null, errorSummary(latestInbound?.error), errorSummary(latestAttempt?.error)]),
37
+ evidenceAt: latestProvider?.occurred_at ?? latestProvider?.created_at ?? latestInbound?.created_at ?? null,
38
+ }),
39
+ step("tracking", shippedWithoutTracking ? "missing" : input.fulfillment.trackingReferences.length > 0 ? "ok" : "pending", "Tracking refs", input.fulfillment.providerTrackingId, {
40
+ details: input.fulfillment.trackingReferences.map((ref) => compact([ref.trackingNumber, ref.carrierKind, ref.service]).join(" / ")),
41
+ evidenceAt: input.fulfillment.trackingReferences[0]?.updatedAt ?? null,
42
+ }),
43
+ step("communication", mailStatus(dispatchedMail), "Customer e-mail", dispatchedMail?.status ?? null, {
44
+ details: dispatchedMail ? compact([dispatchedMail.template_slug, dispatchedMail.last_error_code]) : [],
45
+ evidenceAt: dispatchedMail?.updated_at ?? dispatchedMail?.created_at ?? null,
46
+ }),
47
+ ];
48
+ const nextAction = chooseNextAction({ input, latestDispatch, providerProblem, shippedWithoutTracking });
49
+ const blockers = steps.filter((entry) => entry.status === "blocked" || entry.status === "missing" || entry.status === "warning").map((entry) => entry.label);
50
+ return {
51
+ summary: input.projections?.debugSummary?.(nextAction) ?? summaryFor(nextAction),
52
+ severity: blockers.length ? "action_required" : steps.some((entry) => entry.status === "pending") ? "watch" : "ok",
53
+ nextAction,
54
+ blockers,
55
+ steps,
56
+ };
57
+ }
58
+ function chooseNextAction(input) {
59
+ if (input.input.paymentStatus !== "succeeded")
60
+ return "review_payment";
61
+ if (!["reserved", "consumed"].includes(input.input.inventory.status))
62
+ return "review_stock";
63
+ const latestProviderStock = newest(input.input.providerStockCurrent ?? [], (row) => row.last_synced_at);
64
+ if (input.input.projections?.usesExternalStock?.(input.input.fulfillment.providerKind) && !latestProviderStock)
65
+ return "review_stock";
66
+ if (latestProviderStock && Date.parse(latestProviderStock.stale_after) <= Date.now())
67
+ return "review_stock";
68
+ if (!input.input.fulfillment.fulfillmentOrderId)
69
+ return "create_fulfillment";
70
+ if (input.providerProblem)
71
+ return "review_provider";
72
+ if (!input.latestDispatch && input.input.projections?.usesExternalStock?.(input.input.fulfillment.providerKind))
73
+ return "retry_dispatch";
74
+ if (input.shippedWithoutTracking)
75
+ return "reconcile";
76
+ return "wait";
77
+ }
78
+ function providerStockStatus(usesExternalStock, stock, stale) {
79
+ if (!usesExternalStock)
80
+ return "ok";
81
+ if (!stock)
82
+ return "missing";
83
+ return stale ? "warning" : "ok";
84
+ }
85
+ function step(key, status, label, value, extra = {}) {
86
+ return { key, status, label, value: value ?? null, evidenceAt: extra.evidenceAt ?? null, details: extra.details ?? [] };
87
+ }
88
+ function statusFromDispatch(row) {
89
+ if (row.error || row.status === "failed")
90
+ return "warning";
91
+ return row.status ? "ok" : "pending";
92
+ }
93
+ function mailStatus(row) {
94
+ if (!row)
95
+ return "pending";
96
+ if (["bounced", "complained", "missed", "blocked", "delivery_delayed"].includes(row.status))
97
+ return "warning";
98
+ if (["sent", "delivered"].includes(row.status))
99
+ return "ok";
100
+ return "pending";
101
+ }
102
+ function latestMail(rows, slug) {
103
+ return newest(rows.filter((row) => row.template_slug === slug || row.purpose === "shipment_dispatched"), (row) => row.updated_at ?? row.created_at);
104
+ }
105
+ function newest(rows, time) {
106
+ return [...rows].sort((a, b) => parseTimestampOrZero(time(b)) - parseTimestampOrZero(time(a)))[0] ?? null;
107
+ }
108
+ function summaryFor(action) {
109
+ return { wait: "Monitor the next event.", create_fulfillment: "Create a fulfillment order.", retry_dispatch: "Review or retry provider dispatch.", reconcile: "Reconcile tracking and status.", review_payment: "Review payment first.", review_stock: "Review stock reservations first.", review_provider: "Review provider evidence.", contact_support: "Contact technical support." }[action];
110
+ }
111
+ function errorSummary(value) {
112
+ if (!value)
113
+ return null;
114
+ if (typeof value === "string")
115
+ return value;
116
+ if (typeof value === "object" && "reason" in value && typeof value.reason === "string")
117
+ return value.reason;
118
+ return "error_present";
119
+ }
120
+ function compact(values) {
121
+ return values.filter((value) => Boolean(value && value.trim()));
122
+ }
@@ -0,0 +1,16 @@
1
+ import type { OmsFulfillmentOperationRow, OmsFulfillmentOrderRow, OmsProviderAttemptRow, OmsProviderDispatchRefRow, OmsProviderStatusEvidenceRow, OmsReleasedProviderExceptionHoldRow, OmsShipmentExternalRefRow } from "../contracts/omsTypes.js";
2
+ import type { OmsOrderDetail } from "../oms/omsContracts.js";
3
+ import { type CustomerFulfillmentStep } from "./customerFulfillmentRecovery.js";
4
+ import type { OmsReadModelProjections } from "./omsReadModelProjections.js";
5
+ export type { OmsFulfillmentOperationRow, OmsFulfillmentOrderRow, OmsProviderAttemptRow, OmsProviderDispatchRefRow, OmsProviderStatusEvidenceRow, OmsReleasedProviderExceptionHoldRow, OmsShipmentExternalRefRow } from "../contracts/omsTypes.js";
6
+ export declare function buildOmsFulfillmentSummary(input: {
7
+ projections?: OmsReadModelProjections;
8
+ fulfillmentOrders: OmsFulfillmentOrderRow[];
9
+ fulfillmentOperations: OmsFulfillmentOperationRow[];
10
+ shipmentExternalRefs: OmsShipmentExternalRefRow[];
11
+ providerAttempts?: OmsProviderAttemptRow[];
12
+ providerDispatchRefs?: OmsProviderDispatchRefRow[];
13
+ providerStatusEvidence?: OmsProviderStatusEvidenceRow[];
14
+ }): OmsOrderDetail["fulfillment"];
15
+ export declare function deriveOmsCustomerFulfillmentStep(orderStatus: string | null | undefined, fulfillment: OmsOrderDetail["fulfillment"], deliveredAt?: string | null, releasedProviderExceptionHolds?: OmsReleasedProviderExceptionHoldRow[], providerStatusEvidence?: OmsProviderStatusEvidenceRow[], activeHoldCount?: number, projections?: OmsReadModelProjections): CustomerFulfillmentStep;
16
+ export declare function parseTimestampOrZero(value: string | null | undefined): number;
@@ -0,0 +1,189 @@
1
+ import { rowsForParcel } from "@openlup/core/fulfillment";
2
+ import { customerSafeEvidenceToken, customerStepFromTimedSignals, resolveProviderExceptionRecovery, stepForToken } from "./customerFulfillmentRecovery.js";
3
+ export function buildOmsFulfillmentSummary(input) {
4
+ const fulfillmentOrder = input.fulfillmentOrders[0] ?? null;
5
+ if (!fulfillmentOrder) {
6
+ return {
7
+ fulfillmentOrderId: null,
8
+ status: null,
9
+ providerKind: null,
10
+ latestOperationType: null,
11
+ latestOperationAt: null,
12
+ providerTrackingId: null,
13
+ trackingUrl: null,
14
+ carrierKind: null,
15
+ service: null,
16
+ trackingReferences: [],
17
+ trackingTimeline: [],
18
+ providerEvidence: [],
19
+ };
20
+ }
21
+ // Every other companion below is already narrowed to this parcel by `fulfillment_order_id`;
22
+ // tracking references only joined them once the column existed. An unattributed row still
23
+ // answers for any parcel, so a one-parcel order reads exactly as it did before.
24
+ const parcelRefs = rowsForParcel(input.shipmentExternalRefs, fulfillmentOrder.id);
25
+ const trackingReferences = parcelRefs
26
+ .filter((row) => row.active !== false)
27
+ .filter((row) => Boolean(row.provider_tracking_id))
28
+ .map((row) => ({
29
+ providerKind: row.provider_kind ?? "unknown",
30
+ trackingNumber: row.provider_tracking_id,
31
+ trackingUrl: row.tracking_url ?? null,
32
+ carrierKind: row.carrier_kind ?? row.provider_kind ?? null,
33
+ service: row.service ?? null,
34
+ updatedAt: row.updated_at ?? row.created_at ?? null,
35
+ }))
36
+ .sort((a, b) => parseTimestampOrZero(b.updatedAt) - parseTimestampOrZero(a.updatedAt));
37
+ const fulfillmentTimeline = input.fulfillmentOperations
38
+ .filter((operation) => operation.fulfillment_order_id === fulfillmentOrder.id)
39
+ .map((operation) => ({
40
+ eventType: operation.operation_type,
41
+ label: labelForOperation(operation.operation_type, input.projections),
42
+ occurredAt: operation.occurred_at,
43
+ source: "fulfillment",
44
+ }));
45
+ const providerStatusTimeline = (input.providerStatusEvidence ?? [])
46
+ .filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
47
+ .map((row) => {
48
+ const eventType = row.customer_status ?? row.local_status ?? row.provider_status ?? "provider_status";
49
+ return {
50
+ eventType,
51
+ label: labelForOperation(eventType, input.projections),
52
+ occurredAt: row.occurred_at ?? null,
53
+ source: sourceForEvidenceKind(row.evidence_kind),
54
+ };
55
+ });
56
+ const dispatchTimeline = (input.providerDispatchRefs ?? [])
57
+ .filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
58
+ .map((row) => ({
59
+ eventType: `dispatch_${row.status ?? "recorded"}`,
60
+ label: input.projections?.dispatchLabel?.(row.status) ?? "Provider dispatch recorded",
61
+ occurredAt: row.updated_at ?? row.created_at ?? null,
62
+ source: "dispatch",
63
+ }));
64
+ const trackingTimeline = [...fulfillmentTimeline, ...providerStatusTimeline, ...dispatchTimeline]
65
+ .sort((a, b) => parseTimestampOrZero(b.occurredAt) - parseTimestampOrZero(a.occurredAt))
66
+ .slice(0, 12);
67
+ const providerEvidence = [
68
+ ...(input.providerDispatchRefs ?? [])
69
+ .filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
70
+ .map((row) => ({
71
+ evidenceType: "dispatch_ref",
72
+ status: row.status ?? null,
73
+ providerStatus: null,
74
+ providerOrderId: row.provider_order_id ?? null,
75
+ evidenceKind: row.dispatch_mode ?? null,
76
+ occurredAt: row.created_at ?? null,
77
+ updatedAt: row.updated_at ?? row.created_at ?? null,
78
+ summary: row.error ? "dispatch_error_present" : null,
79
+ })),
80
+ ...(input.providerAttempts ?? [])
81
+ .filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
82
+ .map((row) => ({
83
+ evidenceType: "provider_attempt",
84
+ status: row.status ?? null,
85
+ providerStatus: row.provider_kind ?? null,
86
+ providerOrderId: null,
87
+ evidenceKind: "provider_attempt",
88
+ occurredAt: row.created_at ?? null,
89
+ updatedAt: row.created_at ?? null,
90
+ summary: row.error ? "provider_attempt_error_present" : null,
91
+ })),
92
+ ...(input.providerStatusEvidence ?? [])
93
+ .filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
94
+ .map((row) => ({
95
+ evidenceType: "status_evidence",
96
+ status: row.local_status ?? null,
97
+ providerStatus: row.provider_status ?? null,
98
+ providerOrderId: null,
99
+ evidenceKind: row.evidence_kind ?? null,
100
+ occurredAt: row.occurred_at ?? null,
101
+ updatedAt: row.created_at ?? null,
102
+ summary: row.provider_sub_status ?? null,
103
+ })),
104
+ ].sort((a, b) => parseTimestampOrZero(b.updatedAt ?? b.occurredAt) - parseTimestampOrZero(a.updatedAt ?? a.occurredAt));
105
+ const latestOperation = input.fulfillmentOperations
106
+ .find((operation) => operation.fulfillment_order_id === fulfillmentOrder.id) ?? null;
107
+ const tracking = parcelRefs.find((ref) => ref.order_id === fulfillmentOrder.order_id && ref.active) ?? null;
108
+ return {
109
+ fulfillmentOrderId: fulfillmentOrder.id,
110
+ status: fulfillmentOrder.status,
111
+ providerKind: trackingReferences[0]?.providerKind ?? fulfillmentOrder.provider_kind ?? null,
112
+ latestOperationType: latestOperation?.operation_type ?? null,
113
+ latestOperationAt: latestOperation?.occurred_at ?? null,
114
+ providerTrackingId: trackingReferences[0]?.trackingNumber ?? tracking?.provider_tracking_id ?? null,
115
+ trackingUrl: trackingReferences[0]?.trackingUrl ?? null,
116
+ carrierKind: trackingReferences[0]?.carrierKind ?? null,
117
+ service: trackingReferences[0]?.service ?? null,
118
+ trackingReferences,
119
+ trackingTimeline,
120
+ providerEvidence,
121
+ };
122
+ }
123
+ export function deriveOmsCustomerFulfillmentStep(orderStatus, fulfillment, deliveredAt, releasedProviderExceptionHolds = [], providerStatusEvidence = [], activeHoldCount = 0, projections) {
124
+ if (activeHoldCount > 0)
125
+ return "exception";
126
+ const recovery = resolveProviderExceptionRecovery({
127
+ automaticHoldSource: projections?.automaticExceptionHoldSource,
128
+ automaticReleaseSource: projections?.automaticExceptionReleaseSource,
129
+ fulfillmentOrderId: fulfillment.fulfillmentOrderId,
130
+ releasedHolds: releasedProviderExceptionHolds.map(toReleasedProviderExceptionHold),
131
+ statusEvidence: providerStatusEvidence.map((row) => ({
132
+ id: row.id,
133
+ fulfillmentOrderId: row.fulfillment_order_id,
134
+ providerStatus: row.provider_status,
135
+ localStatus: row.local_status,
136
+ occurredAt: row.occurred_at,
137
+ token: customerSafeEvidenceToken(row.local_status, row.provider_status),
138
+ })),
139
+ });
140
+ return customerStepFromTimedSignals([orderStatus, fulfillment.status], [
141
+ ...(deliveredAt ? [{ token: "delivered", occurredAt: deliveredAt }] : []),
142
+ ...providerStatusEvidence
143
+ .filter((row) => row.fulfillment_order_id === fulfillment.fulfillmentOrderId)
144
+ .map((row) => ({
145
+ id: row.id,
146
+ token: customerSafeEvidenceToken(row.local_status, row.provider_status),
147
+ occurredAt: row.occurred_at,
148
+ })),
149
+ ...fulfillment.trackingTimeline
150
+ .filter((event) => event.source === "fulfillment")
151
+ .map((event) => ({
152
+ token: event.eventType,
153
+ occurredAt: event.occurredAt,
154
+ })),
155
+ ], recovery);
156
+ }
157
+ function toReleasedProviderExceptionHold(row) {
158
+ return {
159
+ orderId: row.order_id,
160
+ status: row.status ?? null,
161
+ reason: row.reason ?? null,
162
+ createdBy: row.created_by ?? null,
163
+ releasedBy: row.released_by ?? null,
164
+ metadata: row.metadata,
165
+ };
166
+ }
167
+ /** Resolve the same canonical step as the customer timeline, without choosing
168
+ * a locale. Hosts supply presentation through the existing projection; the
169
+ * neutral default is the step key, with the generic fallback for unknown tokens.
170
+ * This is not another status-to-label table. */
171
+ function labelForOperation(operationType, projections) {
172
+ const step = stepForToken(operationType);
173
+ return projections?.timelineLabel?.(step) ?? step ?? "Delivery status updated";
174
+ }
175
+ function sourceForEvidenceKind(kind) {
176
+ if (kind === "webhook")
177
+ return "webhook";
178
+ if (kind === "reconciliation")
179
+ return "reconciliation";
180
+ return "provider";
181
+ }
182
+ // Shared with the two sibling read-model modules that sorted the same evidence
183
+ // rows through a byte-identical private copy of this function. Not merged with
184
+ // omsAccountingVisibility's `timestampOrNull`: that one answers null for a
185
+ // missing instant so the outbox comparator can rank "unknown" apart from the
186
+ // epoch, which this zero-defaulting sort must not do.
187
+ export function parseTimestampOrZero(value) {
188
+ return value ? Date.parse(value) || 0 : 0;
189
+ }
@@ -0,0 +1,13 @@
1
+ import type { AdminCommerceOrdersListResponse } from "../oms/omsContracts.js";
2
+ import { type OmsCurrencyPolicy } from "./omsCurrency.js";
3
+ /**
4
+ * A paid set that spans more than one currency has no single GMV and no single
5
+ * average order value. Adding the minor units across currencies produces a
6
+ * figure that is money in none of them, and labelling it with one of the codes
7
+ * makes it look actionable. The operator gets a named refusal instead.
8
+ */
9
+ export declare class CommerceOmsMixedCurrencyTotalsError extends Error {
10
+ readonly currencies: readonly string[];
11
+ constructor(currencies: readonly string[]);
12
+ }
13
+ export declare function summarizeOmsListTotals(orders: AdminCommerceOrdersListResponse["orders"], policy?: OmsCurrencyPolicy): AdminCommerceOrdersListResponse["summaryTotals"];
@@ -0,0 +1,32 @@
1
+ import { neutralOmsCurrencyPolicy } from "./omsCurrency.js";
2
+ /**
3
+ * A paid set that spans more than one currency has no single GMV and no single
4
+ * average order value. Adding the minor units across currencies produces a
5
+ * figure that is money in none of them, and labelling it with one of the codes
6
+ * makes it look actionable. The operator gets a named refusal instead.
7
+ */
8
+ export class CommerceOmsMixedCurrencyTotalsError extends Error {
9
+ currencies;
10
+ constructor(currencies) {
11
+ super("commerce_oms_summary_mixed_currency");
12
+ this.name = "CommerceOmsMixedCurrencyTotalsError";
13
+ this.currencies = currencies;
14
+ }
15
+ }
16
+ export function summarizeOmsListTotals(orders, policy = neutralOmsCurrencyPolicy) {
17
+ const paidOrders = orders.filter((order) => order.paymentStatus === "succeeded");
18
+ const currencies = [...new Set(paidOrders.map((order) => order.total.currency))].sort();
19
+ if (currencies.length > 1)
20
+ throw new CommerceOmsMixedCurrencyTotalsError(currencies);
21
+ const amountMinor = paidOrders.reduce((sum, order) => sum + order.total.amountMinor, 0);
22
+ const orderCount = paidOrders.length;
23
+ // No paid order means no order named a currency, so the platform default is
24
+ // the only honest label for a zero total - and it is read from one module.
25
+ const currency = currencies[0] ?? policy.defaultCurrency;
26
+ return {
27
+ gmv: { amountMinor, currency },
28
+ aov: { amountMinor: orderCount > 0 ? Math.round(amountMinor / orderCount) : 0, currency },
29
+ orderCount,
30
+ paidSubscriptionCycleCount: paidOrders.filter((order) => order.mode === "subscription_cycle").length,
31
+ };
32
+ }
@@ -0,0 +1,51 @@
1
+ import type { OmsOperationalLadderInput, OmsOperationalRung } from "../contracts/omsTypes.js";
2
+ import type { AdminOmsAttentionReason, AdminOmsNextAction } from "../oms/omsContracts.js";
3
+ export type { OmsOperationalLadderInput, OmsOperationalRung } from "../contracts/omsTypes.js";
4
+ /**
5
+ * The operator attention/next-action ladder, declared once.
6
+ *
7
+ * The same ladder is implemented a second time in SQL, inside the live queue
8
+ * RPC `public.commerce_oms_admin_list_queue`
9
+ * (the live queue migration `20260903190000_oms_queue_hides_withdrawn_checkout_rows`,
10
+ * the `operational` CTE and the `attention_priority_desc` rank arm). Both run on
11
+ * the same admin request: SQL decides which orders are selected, what the
12
+ * summary counters say and in what order the rows arrive; this module labels the
13
+ * rows that come back. Nothing in the type system makes them agree.
14
+ *
15
+ * So the agreement is written down instead: every rung carries the live SQL
16
+ * CASE-arm condition it mirrors, verbatim modulo whitespace, and
17
+ * `omsOperationalLadder.test.ts` parses those arms out of the migration and
18
+ * compares them rung for rung, in order. Editing one side without the other
19
+ * turns that test red, which is the only thing standing between the two
20
+ * implementations and a silent divergence.
21
+ *
22
+ * ⛔ Changing a rung here is a behaviour change to the OMS queue. It must be
23
+ * made on both sides in the same change, or not at all.
24
+ */
25
+ /** The facts the ladder reads. Flat on purpose: it is the join between the row
26
+ * shapes this codebase carries and the columns the SQL `operational` CTE has. */
27
+ export declare const OMS_OPERATIONAL_LADDER: readonly OmsOperationalRung[];
28
+ /** The `ELSE` of both SQL CASE expressions, and the fall-through of the loop. */
29
+ export declare const OMS_OPERATIONAL_LADDER_FALLBACK: {
30
+ readonly attentionReason: AdminOmsAttentionReason;
31
+ readonly nextAction: AdminOmsNextAction;
32
+ };
33
+ /**
34
+ * The `attention_priority_desc` sort ranks, in SQL arm order. Lower sorts first.
35
+ *
36
+ * Nothing in TypeScript consumes this today - the queue arrives pre-sorted from
37
+ * SQL, and the fixture bundle does not offer that sort. It is declared here
38
+ * because the ranking is part of the same ladder: an attention reason added
39
+ * above without a rank silently sorts to the bottom of the operator's queue.
40
+ * The parity test binds it to the live migration arm for arm.
41
+ */
42
+ export declare const OMS_ATTENTION_PRIORITY_LADDER: readonly {
43
+ readonly attentionReason: AdminOmsAttentionReason;
44
+ readonly rank: number;
45
+ }[];
46
+ export declare const OMS_ATTENTION_PRIORITY_FALLBACK_RANK = 99;
47
+ /** Walks the ladder once and returns the first rung that matches. */
48
+ export declare function resolveOmsOperationalState(input: OmsOperationalLadderInput): {
49
+ attentionReason: AdminOmsAttentionReason;
50
+ nextAction: AdminOmsNextAction;
51
+ };
@@ -0,0 +1,158 @@
1
+ /**
2
+ * The operator attention/next-action ladder, declared once.
3
+ *
4
+ * The same ladder is implemented a second time in SQL, inside the live queue
5
+ * RPC `public.commerce_oms_admin_list_queue`
6
+ * (the live queue migration `20260903190000_oms_queue_hides_withdrawn_checkout_rows`,
7
+ * the `operational` CTE and the `attention_priority_desc` rank arm). Both run on
8
+ * the same admin request: SQL decides which orders are selected, what the
9
+ * summary counters say and in what order the rows arrive; this module labels the
10
+ * rows that come back. Nothing in the type system makes them agree.
11
+ *
12
+ * So the agreement is written down instead: every rung carries the live SQL
13
+ * CASE-arm condition it mirrors, verbatim modulo whitespace, and
14
+ * `omsOperationalLadder.test.ts` parses those arms out of the migration and
15
+ * compares them rung for rung, in order. Editing one side without the other
16
+ * turns that test red, which is the only thing standing between the two
17
+ * implementations and a silent divergence.
18
+ *
19
+ * ⛔ Changing a rung here is a behaviour change to the OMS queue. It must be
20
+ * made on both sides in the same change, or not at all.
21
+ */
22
+ /** The facts the ladder reads. Flat on purpose: it is the join between the row
23
+ * shapes this codebase carries and the columns the SQL `operational` CTE has. */
24
+ export const OMS_OPERATIONAL_LADDER = [
25
+ {
26
+ id: "terminal_order",
27
+ sqlPredicate: "order_status IN ('refunded', 'cancelled')",
28
+ attentionReason: "none",
29
+ nextAction: "none",
30
+ // A refunded/cancelled order is done, even though its payment_status is no
31
+ // longer 'succeeded'. Without this rung the payment rung below would flag
32
+ // every refunded order as needing payment review.
33
+ matches: (input) => input.orderStatus === "refunded" || input.orderStatus === "cancelled",
34
+ },
35
+ {
36
+ id: "active_hold",
37
+ sqlPredicate: "active_hold_count > 0",
38
+ attentionReason: "active_hold",
39
+ nextAction: "release_hold",
40
+ matches: (input) => input.activeHoldCount > 0,
41
+ },
42
+ {
43
+ id: "payment_not_succeeded",
44
+ sqlPredicate: "payment_status <> 'succeeded'",
45
+ attentionReason: "payment_required",
46
+ nextAction: "review_payment",
47
+ matches: (input) => input.paymentStatus !== "succeeded",
48
+ },
49
+ {
50
+ id: "missing_shipping_address",
51
+ sqlPredicate: "EXISTS ( SELECT 1 FROM base_orders orders WHERE orders.id = derived.id AND orders.shipping_address_id IS NULL )",
52
+ attentionReason: "missing_shipping_address",
53
+ nextAction: "review_address",
54
+ matches: (input) => !input.hasShippingAddress,
55
+ },
56
+ {
57
+ id: "inventory_not_held",
58
+ sqlPredicate: "inventory_status NOT IN ('reserved', 'consumed')",
59
+ attentionReason: "inventory_missing",
60
+ nextAction: "review_inventory",
61
+ matches: (input) => input.inventoryStatus !== "reserved" && input.inventoryStatus !== "consumed",
62
+ },
63
+ {
64
+ id: "fulfillment_absent_and_blocked",
65
+ sqlPredicate: "fulfillment_status IS NULL AND fulfillment_allowed = false",
66
+ attentionReason: "fulfillment_blocked",
67
+ nextAction: "review_fulfillment",
68
+ matches: (input) => !input.fulfillmentStatus && !input.fulfillmentAllowed,
69
+ },
70
+ {
71
+ id: "fulfillment_absent",
72
+ sqlPredicate: "fulfillment_status IS NULL",
73
+ attentionReason: "fulfillment_pending",
74
+ nextAction: "create_fulfillment",
75
+ matches: (input) => !input.fulfillmentStatus,
76
+ },
77
+ {
78
+ id: "fulfillment_before_label",
79
+ sqlPredicate: "fulfillment_status IN ('created', 'packed', 'label_pending')",
80
+ attentionReason: "fulfillment_pending",
81
+ nextAction: "record_label",
82
+ matches: (input) => input.fulfillmentStatus === "created" ||
83
+ input.fulfillmentStatus === "packed" ||
84
+ input.fulfillmentStatus === "label_pending",
85
+ },
86
+ {
87
+ id: "fulfillment_label_created",
88
+ sqlPredicate: "fulfillment_status = 'label_created'",
89
+ attentionReason: "fulfillment_pending",
90
+ nextAction: "hand_off",
91
+ matches: (input) => input.fulfillmentStatus === "label_created",
92
+ },
93
+ {
94
+ id: "fulfillment_exception",
95
+ sqlPredicate: "fulfillment_status = 'exception'",
96
+ attentionReason: "fulfillment_exception",
97
+ nextAction: "review_tracking",
98
+ matches: (input) => input.fulfillmentStatus === "exception",
99
+ },
100
+ // The three accounting rungs carry three distinct attention reasons but one
101
+ // shared next action. The SQL next-action ladder therefore collapses them into
102
+ // a single arm over the union of their literals; the parity test asserts that
103
+ // collapse explicitly rather than letting the arm counts differ unremarked.
104
+ {
105
+ id: "accounting_missing",
106
+ sqlPredicate: "accounting_status = 'missing'",
107
+ attentionReason: "invoice_missing",
108
+ nextAction: "review_invoice",
109
+ matches: (input) => input.accountingStatus === "missing",
110
+ },
111
+ {
112
+ id: "accounting_blocked",
113
+ sqlPredicate: "accounting_status = 'blocked'",
114
+ attentionReason: "invoice_buyer_data_invalid",
115
+ nextAction: "review_invoice",
116
+ matches: (input) => input.accountingStatus === "blocked",
117
+ },
118
+ {
119
+ id: "accounting_issue_failed",
120
+ sqlPredicate: "accounting_status IN ('rejected', 'outbox_failed')",
121
+ attentionReason: "invoice_issue_failed",
122
+ nextAction: "review_invoice",
123
+ matches: (input) => input.accountingStatus === "rejected" || input.accountingStatus === "outbox_failed",
124
+ },
125
+ ];
126
+ /** The `ELSE` of both SQL CASE expressions, and the fall-through of the loop. */
127
+ export const OMS_OPERATIONAL_LADDER_FALLBACK = { attentionReason: "none", nextAction: "none" };
128
+ /**
129
+ * The `attention_priority_desc` sort ranks, in SQL arm order. Lower sorts first.
130
+ *
131
+ * Nothing in TypeScript consumes this today - the queue arrives pre-sorted from
132
+ * SQL, and the fixture bundle does not offer that sort. It is declared here
133
+ * because the ranking is part of the same ladder: an attention reason added
134
+ * above without a rank silently sorts to the bottom of the operator's queue.
135
+ * The parity test binds it to the live migration arm for arm.
136
+ */
137
+ export const OMS_ATTENTION_PRIORITY_LADDER = [
138
+ { attentionReason: "active_hold", rank: 1 },
139
+ { attentionReason: "payment_required", rank: 2 },
140
+ { attentionReason: "missing_shipping_address", rank: 3 },
141
+ { attentionReason: "inventory_missing", rank: 4 },
142
+ { attentionReason: "fulfillment_blocked", rank: 5 },
143
+ { attentionReason: "fulfillment_exception", rank: 6 },
144
+ { attentionReason: "invoice_issue_failed", rank: 7 },
145
+ { attentionReason: "invoice_buyer_data_invalid", rank: 8 },
146
+ { attentionReason: "invoice_missing", rank: 9 },
147
+ // Deliberately the same rank as invoice_missing in the live body.
148
+ { attentionReason: "fulfillment_pending", rank: 9 },
149
+ ];
150
+ export const OMS_ATTENTION_PRIORITY_FALLBACK_RANK = 99;
151
+ /** Walks the ladder once and returns the first rung that matches. */
152
+ export function resolveOmsOperationalState(input) {
153
+ for (const rung of OMS_OPERATIONAL_LADDER) {
154
+ if (rung.matches(input))
155
+ return { attentionReason: rung.attentionReason, nextAction: rung.nextAction };
156
+ }
157
+ return { ...OMS_OPERATIONAL_LADDER_FALLBACK };
158
+ }
@@ -0,0 +1,4 @@
1
+ import type { OmsOrderDetail } from "../oms/omsContracts.js";
2
+ import type { OmsOrderItemRow } from "./omsReadModelRows.js";
3
+ import type { CanonicalOrderMoneyLine } from "../orderMoney.js";
4
+ export declare function mapOmsOrderLine(item: OmsOrderItemRow, currency: OmsOrderDetail["total"]["currency"], moneyLine: CanonicalOrderMoneyLine): OmsOrderDetail["lines"][number];
@@ -0,0 +1,25 @@
1
+ export function mapOmsOrderLine(item, currency, moneyLine) {
2
+ const productSnapshot = item.product_snapshot ?? {};
3
+ const variantSnapshot = item.variant_snapshot ?? null;
4
+ return {
5
+ id: item.id,
6
+ skuId: item.sku_id ?? null,
7
+ sku: item.sku ?? readSnapshotText(productSnapshot, "sku"),
8
+ title: item.title
9
+ ?? readSnapshotText(productSnapshot, "title")
10
+ ?? readSnapshotText(productSnapshot, "name"),
11
+ quantity: item.quantity,
12
+ unitPrice: { amountMinor: moneyLine.catalogUnit, currency },
13
+ total: { amountMinor: moneyLine.catalogTotal, currency },
14
+ discountAllocated: { amountMinor: moneyLine.discountAllocated, currency },
15
+ effectiveTotal: { amountMinor: moneyLine.effectiveGross, currency },
16
+ effectiveNet: { amountMinor: moneyLine.effectiveNet, currency },
17
+ vatRateBps: moneyLine.vatRateBps,
18
+ productSnapshot,
19
+ variantSnapshot,
20
+ };
21
+ }
22
+ function readSnapshotText(snapshot, key) {
23
+ const value = snapshot[key];
24
+ return typeof value === "string" && value.trim() ? value : null;
25
+ }
@@ -0,0 +1,5 @@
1
+ import type { OmsPaymentMethodSummary } from "../contracts/omsTypes.js";
2
+ import type { OmsReadModelProjections } from "./omsReadModelProjections.js";
3
+ import type { OmsPaymentAttemptRow, OmsPaymentIntentRow } from "./omsReadModelRows.js";
4
+ export type { OmsPaymentMethodSummary } from "../contracts/omsTypes.js";
5
+ export declare function paymentMethodForOrder(orderId: string, paymentIntents: OmsPaymentIntentRow[], paymentAttempts: OmsPaymentAttemptRow[], projections?: OmsReadModelProjections): OmsPaymentMethodSummary;
@@ -0,0 +1,11 @@
1
+ export function paymentMethodForOrder(orderId, paymentIntents, paymentAttempts, projections) {
2
+ const intent = paymentIntents.find((candidate) => candidate.id && candidate.order_id === orderId) ?? null;
3
+ if (!intent)
4
+ return { provider: null, label: null };
5
+ const attempt = paymentAttempts.find((candidate) => candidate.id === intent.active_attempt_id)
6
+ ?? paymentAttempts.find((candidate) => candidate.payment_intent_id === intent.id)
7
+ ?? null;
8
+ if (!attempt)
9
+ return { provider: null, label: null };
10
+ return { provider: attempt.provider, label: projections?.paymentMethodLabel?.(attempt) ?? attempt.provider };
11
+ }