@openlup/platform 0.20.0 → 0.22.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 (458) hide show
  1. package/CHANGELOG.md +272 -278
  2. package/README.md +195 -6
  3. package/dist/composition/composeBundle.d.ts +13 -0
  4. package/dist/composition/composeBundle.js +4 -0
  5. package/dist/composition/fulfillmentContribution.d.ts +21 -0
  6. package/dist/composition/fulfillmentContribution.js +19 -0
  7. package/dist/composition/index.d.ts +1 -0
  8. package/dist/composition/index.js +2 -0
  9. package/dist/fulfillment/adapterConformance.d.ts +3 -0
  10. package/dist/fulfillment/adapterConformance.js +223 -0
  11. package/dist/fulfillment/bindings.d.ts +3 -0
  12. package/dist/fulfillment/bindings.js +29 -0
  13. package/dist/fulfillment/commerceFulfillmentHandlers.d.ts +29 -0
  14. package/dist/fulfillment/commerceFulfillmentHandlers.js +184 -0
  15. package/dist/fulfillment/commerceFulfillmentReadModel.d.ts +86 -0
  16. package/dist/fulfillment/commerceFulfillmentReadModel.js +131 -0
  17. package/dist/fulfillment/contracts/alignment.d.ts +25 -0
  18. package/dist/fulfillment/contracts/alignment.js +1 -0
  19. package/dist/fulfillment/contracts/bindings.d.ts +51 -0
  20. package/dist/fulfillment/contracts/bindings.js +1 -0
  21. package/dist/fulfillment/contracts/capabilities.d.ts +29 -0
  22. package/dist/fulfillment/contracts/capabilities.js +1 -0
  23. package/dist/fulfillment/contracts/conformance.d.ts +93 -0
  24. package/dist/fulfillment/contracts/conformance.js +1 -0
  25. package/dist/fulfillment/contracts/customerAlignment.d.ts +6 -0
  26. package/dist/fulfillment/contracts/customerAlignment.js +1 -0
  27. package/dist/fulfillment/contracts/dispatch.d.ts +105 -0
  28. package/dist/fulfillment/contracts/dispatch.js +1 -0
  29. package/dist/fulfillment/contracts/index.d.ts +18 -0
  30. package/dist/fulfillment/contracts/index.js +1 -0
  31. package/dist/fulfillment/contracts/label.d.ts +35 -0
  32. package/dist/fulfillment/contracts/label.js +1 -0
  33. package/dist/fulfillment/contracts/nativeUnsupported.d.ts +6 -0
  34. package/dist/fulfillment/contracts/nativeUnsupported.js +1 -0
  35. package/dist/fulfillment/contracts/observation.d.ts +52 -0
  36. package/dist/fulfillment/contracts/observation.js +1 -0
  37. package/dist/fulfillment/contracts/operator.d.ts +64 -0
  38. package/dist/fulfillment/contracts/operator.js +1 -0
  39. package/dist/fulfillment/contracts/read.d.ts +110 -0
  40. package/dist/fulfillment/contracts/read.js +1 -0
  41. package/dist/fulfillment/contracts/readback.d.ts +38 -0
  42. package/dist/fulfillment/contracts/readback.js +1 -0
  43. package/dist/fulfillment/contracts/replacement.d.ts +34 -0
  44. package/dist/fulfillment/contracts/replacement.js +1 -0
  45. package/dist/fulfillment/contracts/store.d.ts +86 -0
  46. package/dist/fulfillment/contracts/store.js +1 -0
  47. package/dist/fulfillment/contracts/sync.d.ts +170 -0
  48. package/dist/fulfillment/contracts/sync.js +1 -0
  49. package/dist/fulfillment/currentFulfillmentParcel.d.ts +2 -0
  50. package/dist/fulfillment/currentFulfillmentParcel.js +1 -0
  51. package/dist/fulfillment/delayReadModel.d.ts +11 -0
  52. package/dist/fulfillment/delayReadModel.js +45 -0
  53. package/dist/fulfillment/deliveryAlignmentReadModel.d.ts +4 -0
  54. package/dist/fulfillment/deliveryAlignmentReadModel.js +12 -0
  55. package/dist/fulfillment/dispatchProjection.d.ts +7 -0
  56. package/dist/fulfillment/dispatchProjection.js +18 -0
  57. package/dist/fulfillment/fulfillmentObservationEffects.d.ts +66 -0
  58. package/dist/fulfillment/fulfillmentObservationEffects.js +36 -0
  59. package/dist/fulfillment/handlerSchemas.d.ts +647 -0
  60. package/dist/fulfillment/handlerSchemas.js +213 -0
  61. package/dist/fulfillment/handlerSupport.d.ts +33 -0
  62. package/dist/fulfillment/handlerSupport.js +25 -0
  63. package/dist/fulfillment/index.d.ts +37 -0
  64. package/dist/fulfillment/index.js +37 -0
  65. package/dist/fulfillment/labelLifecycle.d.ts +24 -0
  66. package/dist/fulfillment/labelLifecycle.js +9 -0
  67. package/dist/fulfillment/lowStockEvidenceHandler.d.ts +36 -0
  68. package/dist/fulfillment/lowStockEvidenceHandler.js +46 -0
  69. package/dist/fulfillment/migrations.d.ts +27 -0
  70. package/dist/fulfillment/migrations.js +8 -0
  71. package/dist/fulfillment/nativeUnsupported.d.ts +10 -0
  72. package/dist/fulfillment/nativeUnsupported.js +18 -0
  73. package/dist/fulfillment/normalizedFulfillmentFacts.d.ts +2 -0
  74. package/dist/fulfillment/normalizedFulfillmentFacts.js +1 -0
  75. package/dist/fulfillment/observationProjection.d.ts +11 -0
  76. package/dist/fulfillment/observationProjection.js +37 -0
  77. package/dist/fulfillment/omnipack/capabilities.d.ts +3 -0
  78. package/dist/fulfillment/omnipack/capabilities.js +16 -0
  79. package/dist/fulfillment/omnipack/client.d.ts +37 -0
  80. package/dist/fulfillment/omnipack/client.js +162 -0
  81. package/dist/fulfillment/omnipack/index.d.ts +52 -0
  82. package/dist/fulfillment/omnipack/index.js +349 -0
  83. package/dist/fulfillment/omnipack/mappers.d.ts +73 -0
  84. package/dist/fulfillment/omnipack/mappers.js +177 -0
  85. package/dist/fulfillment/omnipack/observation.d.ts +21 -0
  86. package/dist/fulfillment/omnipack/observation.js +57 -0
  87. package/dist/fulfillment/omnipack/omnipackDispatchPayload.d.ts +36 -0
  88. package/dist/fulfillment/omnipack/omnipackDispatchPayload.js +63 -0
  89. package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.d.ts +83 -0
  90. package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.js +113 -0
  91. package/dist/fulfillment/omnipack/omnipackProductPackPayload.d.ts +11 -0
  92. package/dist/fulfillment/omnipack/omnipackProductPackPayload.js +38 -0
  93. package/dist/fulfillment/omnipack/omnipackProductPayload.d.ts +18 -0
  94. package/dist/fulfillment/omnipack/omnipackProductPayload.js +51 -0
  95. package/dist/fulfillment/omnipack/omnipackReconciliationPayload.d.ts +1 -0
  96. package/dist/fulfillment/omnipack/omnipackReconciliationPayload.js +3 -0
  97. package/dist/fulfillment/omnipack/omnipackStatusVocabulary.d.ts +4 -0
  98. package/dist/fulfillment/omnipack/omnipackStatusVocabulary.js +87 -0
  99. package/dist/fulfillment/omnipack/omnipackWebhookPayload.d.ts +9 -0
  100. package/dist/fulfillment/omnipack/omnipackWebhookPayload.js +76 -0
  101. package/dist/fulfillment/omnipack/productSyncMappers.d.ts +18 -0
  102. package/dist/fulfillment/omnipack/productSyncMappers.js +43 -0
  103. package/dist/fulfillment/omnipack/providerError.d.ts +25 -0
  104. package/dist/fulfillment/omnipack/providerError.js +47 -0
  105. package/dist/fulfillment/omnipack/trackingReferences.d.ts +16 -0
  106. package/dist/fulfillment/omnipack/trackingReferences.js +52 -0
  107. package/dist/fulfillment/paidFulfillmentRecovery.d.ts +67 -0
  108. package/dist/fulfillment/paidFulfillmentRecovery.js +154 -0
  109. package/dist/fulfillment/paidHandoff.d.ts +27 -0
  110. package/dist/fulfillment/paidHandoff.js +86 -0
  111. package/dist/fulfillment/paidHandoffPorts.d.ts +24 -0
  112. package/dist/fulfillment/paidHandoffPorts.js +3 -0
  113. package/dist/fulfillment/postgresDeliveryAlignment.d.ts +4 -0
  114. package/dist/fulfillment/postgresDeliveryAlignment.js +12 -0
  115. package/dist/fulfillment/postgresDispatchStore.d.ts +16 -0
  116. package/dist/fulfillment/postgresDispatchStore.js +44 -0
  117. package/dist/fulfillment/postgresEvidenceReadPort.d.ts +25 -0
  118. package/dist/fulfillment/postgresEvidenceReadPort.js +45 -0
  119. package/dist/fulfillment/postgresPaidFulfillmentRecovery.d.ts +25 -0
  120. package/dist/fulfillment/postgresPaidFulfillmentRecovery.js +26 -0
  121. package/dist/fulfillment/postgresPaidHandoffStore.d.ts +4 -0
  122. package/dist/fulfillment/postgresPaidHandoffStore.js +10 -0
  123. package/dist/fulfillment/postgresShipmentSpine.d.ts +63 -0
  124. package/dist/fulfillment/postgresShipmentSpine.js +232 -0
  125. package/dist/fulfillment/postgresStockSyncPort.d.ts +8 -0
  126. package/dist/fulfillment/postgresStockSyncPort.js +63 -0
  127. package/dist/fulfillment/productReconciliationEvidenceHandler.d.ts +36 -0
  128. package/dist/fulfillment/productReconciliationEvidenceHandler.js +50 -0
  129. package/dist/fulfillment/providerCapabilities.d.ts +9 -0
  130. package/dist/fulfillment/providerCapabilities.js +17 -0
  131. package/dist/fulfillment/providerCommandLedger.d.ts +143 -0
  132. package/dist/fulfillment/providerCommandLedger.js +14 -0
  133. package/dist/fulfillment/providerDispatchAcceptance.d.ts +26 -0
  134. package/dist/fulfillment/providerDispatchAcceptance.js +23 -0
  135. package/dist/fulfillment/providerDispatchError.d.ts +6 -0
  136. package/dist/fulfillment/providerDispatchError.js +5 -0
  137. package/dist/fulfillment/providerDispatchWorker.d.ts +31 -0
  138. package/dist/fulfillment/providerDispatchWorker.js +172 -0
  139. package/dist/fulfillment/providerProductSyncWorker.d.ts +28 -0
  140. package/dist/fulfillment/providerProductSyncWorker.js +122 -0
  141. package/dist/fulfillment/providerReconciliationError.d.ts +9 -0
  142. package/dist/fulfillment/providerReconciliationError.js +17 -0
  143. package/dist/fulfillment/providerReconciliationTerminalSkip.d.ts +2 -0
  144. package/dist/fulfillment/providerReconciliationTerminalSkip.js +6 -0
  145. package/dist/fulfillment/providerReconciliationTimestamp.d.ts +1 -0
  146. package/dist/fulfillment/providerReconciliationTimestamp.js +27 -0
  147. package/dist/fulfillment/providerReconciliationWorker.d.ts +82 -0
  148. package/dist/fulfillment/providerReconciliationWorker.js +151 -0
  149. package/dist/fulfillment/providerStockAvailability.d.ts +13 -0
  150. package/dist/fulfillment/providerStockAvailability.js +51 -0
  151. package/dist/fulfillment/providerStockSyncWorker.d.ts +37 -0
  152. package/dist/fulfillment/providerStockSyncWorker.js +186 -0
  153. package/dist/fulfillment/providerTrackingReferences.d.ts +15 -0
  154. package/dist/fulfillment/providerTrackingReferences.js +23 -0
  155. package/dist/fulfillment/replacementRefusals.d.ts +5 -0
  156. package/dist/fulfillment/replacementRefusals.js +38 -0
  157. package/dist/fulfillment/replacementShipmentHandler.d.ts +5 -0
  158. package/dist/fulfillment/replacementShipmentHandler.js +46 -0
  159. package/dist/fulfillment/schemaCapabilities.d.ts +13 -0
  160. package/dist/fulfillment/schemaCapabilities.js +7 -0
  161. package/dist/fulfillment/shipmentsOverviewHandler.d.ts +16 -0
  162. package/dist/fulfillment/shipmentsOverviewHandler.js +54 -0
  163. package/dist/fulfillment/statusMap.d.ts +2 -0
  164. package/dist/fulfillment/statusMap.js +1 -0
  165. package/dist/fulfillment/trackingProgress.d.ts +1 -0
  166. package/dist/fulfillment/trackingProgress.js +1 -0
  167. package/dist/fulfillment/verifiedIngress.d.ts +52 -0
  168. package/dist/fulfillment/verifiedIngress.js +66 -0
  169. package/dist/payments/adapterConformance.d.ts +8 -0
  170. package/dist/payments/adapterConformance.js +109 -0
  171. package/dist/payments/bindings.d.ts +3 -0
  172. package/dist/payments/bindings.js +17 -0
  173. package/dist/payments/checkoutActivePaymentActionResolver.d.ts +7 -0
  174. package/dist/payments/checkoutActivePaymentActionResolver.js +77 -0
  175. package/dist/payments/checkoutRecoveryPaymentResolver.d.ts +8 -0
  176. package/dist/payments/checkoutRecoveryPaymentResolver.js +87 -0
  177. package/dist/payments/contracts/adapter.d.ts +113 -0
  178. package/dist/payments/contracts/adapter.js +1 -0
  179. package/dist/payments/contracts/conformance.d.ts +155 -0
  180. package/dist/payments/contracts/conformance.js +1 -0
  181. package/dist/payments/contracts/evidence.d.ts +157 -0
  182. package/dist/payments/contracts/evidence.js +1 -0
  183. package/dist/payments/contracts/index.d.ts +10 -0
  184. package/dist/payments/contracts/index.js +1 -0
  185. package/dist/payments/contracts/preparedAttempt.d.ts +69 -0
  186. package/dist/payments/contracts/preparedAttempt.js +1 -0
  187. package/dist/payments/contracts/reconciliation.d.ts +303 -0
  188. package/dist/payments/contracts/reconciliation.js +1 -0
  189. package/dist/payments/contracts/repair.d.ts +92 -0
  190. package/dist/payments/contracts/repair.js +1 -0
  191. package/dist/payments/contracts/truth.d.ts +92 -0
  192. package/dist/payments/contracts/truth.js +1 -0
  193. package/dist/payments/eventConformanceRunner.d.ts +12 -0
  194. package/dist/payments/eventConformanceRunner.js +125 -0
  195. package/dist/payments/index.d.ts +16 -0
  196. package/dist/payments/index.js +16 -0
  197. package/dist/payments/paymentAttemptSilenceWindow.d.ts +10 -0
  198. package/dist/payments/paymentAttemptSilenceWindow.js +19 -0
  199. package/dist/payments/paymentMethodLifecycle.d.ts +11 -0
  200. package/dist/payments/paymentMethodLifecycle.js +37 -0
  201. package/dist/payments/paymentProviderReconciliationAbsenceReopen.d.ts +7 -0
  202. package/dist/payments/paymentProviderReconciliationAbsenceReopen.js +100 -0
  203. package/dist/payments/paymentProviderReconciliationEvidence.d.ts +36 -0
  204. package/dist/payments/paymentProviderReconciliationEvidence.js +91 -0
  205. package/dist/payments/paymentProviderReconciliationWorker.d.ts +4 -0
  206. package/dist/payments/paymentProviderReconciliationWorker.js +245 -0
  207. package/dist/payments/paymentTruth.d.ts +8 -0
  208. package/dist/payments/paymentTruth.js +125 -0
  209. package/dist/payments/paymentVerifyNowHandler.d.ts +27 -0
  210. package/dist/payments/paymentVerifyNowHandler.js +70 -0
  211. package/dist/payments/paymentVerifyNowService.d.ts +23 -0
  212. package/dist/payments/paymentVerifyNowService.js +93 -0
  213. package/dist/payments/paymentWebhookPostProcessing.d.ts +22 -0
  214. package/dist/payments/paymentWebhookPostProcessing.js +15 -0
  215. package/dist/payments/postgresPaymentTruth.d.ts +10 -0
  216. package/dist/payments/postgresPaymentTruth.js +126 -0
  217. package/dist/payments/preparedAttempt.d.ts +6 -0
  218. package/dist/payments/preparedAttempt.js +70 -0
  219. package/dist/payments/preparedAttemptFinalization.d.ts +5 -0
  220. package/dist/payments/preparedAttemptFinalization.js +12 -0
  221. package/dist/payments/schemaCapabilities.d.ts +10 -0
  222. package/dist/payments/schemaCapabilities.js +10 -0
  223. package/dist/payments/sql.d.ts +20 -0
  224. package/dist/payments/sql.js +6 -0
  225. package/dist/payments/stripe/classifyDecline.d.ts +46 -0
  226. package/dist/payments/stripe/classifyDecline.js +58 -0
  227. package/dist/payments/stripe/declineFailureHints.d.ts +46 -0
  228. package/dist/payments/stripe/declineFailureHints.js +87 -0
  229. package/dist/payments/stripe/donorContracts.d.ts +120 -0
  230. package/dist/payments/stripe/donorContracts.js +1 -0
  231. package/dist/payments/stripe/executionDecline.d.ts +53 -0
  232. package/dist/payments/stripe/executionDecline.js +107 -0
  233. package/dist/payments/stripe/index.d.ts +41 -0
  234. package/dist/payments/stripe/index.js +264 -0
  235. package/dist/payments/stripe/intentMapper.d.ts +26 -0
  236. package/dist/payments/stripe/intentMapper.js +51 -0
  237. package/dist/payments/stripe/methodFacts.d.ts +10 -0
  238. package/dist/payments/stripe/methodFacts.js +12 -0
  239. package/dist/payments/stripe/paymentFailureEvidence.d.ts +26 -0
  240. package/dist/payments/stripe/paymentFailureEvidence.js +33 -0
  241. package/dist/payments/stripe/stripeFailureEvidence.d.ts +41 -0
  242. package/dist/payments/stripe/stripeFailureEvidence.js +82 -0
  243. package/dist/payments/stripe/stripeIntentConfirmationEvidence.d.ts +28 -0
  244. package/dist/payments/stripe/stripeIntentConfirmationEvidence.js +32 -0
  245. package/dist/payments/stripe/stripePaymentReconciliationProvider.d.ts +35 -0
  246. package/dist/payments/stripe/stripePaymentReconciliationProvider.js +222 -0
  247. package/dist/payments/stripe/stripeRefundEvidence.d.ts +8 -0
  248. package/dist/payments/stripe/stripeRefundEvidence.js +17 -0
  249. package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.d.ts +45 -0
  250. package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.js +220 -0
  251. package/dist/payments/stripe/stripeWebhookNormalizer.d.ts +14 -0
  252. package/dist/payments/stripe/stripeWebhookNormalizer.js +243 -0
  253. package/dist/payments/stripe/webhookSignature.d.ts +14 -0
  254. package/dist/payments/stripe/webhookSignature.js +43 -0
  255. package/dist/payments/tpay/blikRecurringMapper.d.ts +37 -0
  256. package/dist/payments/tpay/blikRecurringMapper.js +24 -0
  257. package/dist/payments/tpay/capabilities.d.ts +3 -0
  258. package/dist/payments/tpay/capabilities.js +18 -0
  259. package/dist/payments/tpay/classifyDecline.d.ts +46 -0
  260. package/dist/payments/tpay/classifyDecline.js +58 -0
  261. package/dist/payments/tpay/declineFailureHints.d.ts +72 -0
  262. package/dist/payments/tpay/declineFailureHints.js +37 -0
  263. package/dist/payments/tpay/donorContracts.d.ts +140 -0
  264. package/dist/payments/tpay/donorContracts.js +1 -0
  265. package/dist/payments/tpay/index.d.ts +73 -0
  266. package/dist/payments/tpay/index.js +294 -0
  267. package/dist/payments/tpay/paymentFailureEvidence.d.ts +26 -0
  268. package/dist/payments/tpay/paymentFailureEvidence.js +33 -0
  269. package/dist/payments/tpay/preparedProviderAttempt.d.ts +22 -0
  270. package/dist/payments/tpay/preparedProviderAttempt.js +24 -0
  271. package/dist/payments/tpay/providerAttemptFailureDiagnostic.d.ts +3 -0
  272. package/dist/payments/tpay/providerAttemptFailureDiagnostic.js +95 -0
  273. package/dist/payments/tpay/tpayCreateTransactionInput.d.ts +25 -0
  274. package/dist/payments/tpay/tpayCreateTransactionInput.js +128 -0
  275. package/dist/payments/tpay/tpayDeclineEvidence.d.ts +126 -0
  276. package/dist/payments/tpay/tpayDeclineEvidence.js +177 -0
  277. package/dist/payments/tpay/tpayDispatchFailure.d.ts +60 -0
  278. package/dist/payments/tpay/tpayDispatchFailure.js +121 -0
  279. package/dist/payments/tpay/tpayFailureEvidence.d.ts +20 -0
  280. package/dist/payments/tpay/tpayFailureEvidence.js +61 -0
  281. package/dist/payments/tpay/tpayHttpClient.d.ts +52 -0
  282. package/dist/payments/tpay/tpayHttpClient.js +185 -0
  283. package/dist/payments/tpay/tpayHttpFailure.d.ts +57 -0
  284. package/dist/payments/tpay/tpayHttpFailure.js +143 -0
  285. package/dist/payments/tpay/tpayPaymentExecutionAdapter.d.ts +20 -0
  286. package/dist/payments/tpay/tpayPaymentExecutionAdapter.js +249 -0
  287. package/dist/payments/tpay/tpayPaymentReconciliationProvider.d.ts +5 -0
  288. package/dist/payments/tpay/tpayPaymentReconciliationProvider.js +244 -0
  289. package/dist/payments/tpay/tpayTransactionPayload.d.ts +120 -0
  290. package/dist/payments/tpay/tpayTransactionPayload.js +96 -0
  291. package/dist/payments/tpay/wallClockTime.d.ts +31 -0
  292. package/dist/payments/tpay/wallClockTime.js +57 -0
  293. package/dist/payments/tpay/webhookJwsVerifier.d.ts +17 -0
  294. package/dist/payments/tpay/webhookJwsVerifier.js +51 -0
  295. package/dist/payments/tpay/webhookNormalizer.d.ts +54 -0
  296. package/dist/payments/tpay/webhookNormalizer.js +200 -0
  297. package/dist/payments/verifiedEvidenceProjection.d.ts +12 -0
  298. package/dist/payments/verifiedEvidenceProjection.js +166 -0
  299. package/dist/payments/verifiedIngress.d.ts +119 -0
  300. package/dist/payments/verifiedIngress.js +220 -0
  301. package/package.json +37 -2
  302. package/release-gates.json +105 -3
  303. package/sql/20260808210000_fulfillment_shipment_rail.sql +810 -0
  304. package/sql/20260810180000_payment_settlement_rail.sql +574 -0
  305. package/sql/20260815150000_payment_truth_reconciliation.sql +479 -0
  306. package/sql/20260819150000_fulfillment_shipment_sequence.sql +98 -0
  307. package/sql/20260826100000_late_payment_shifts_the_subscription_cycle.sql +215 -0
  308. package/sql/20261022080000_fulfillment_command_ledger.sql +786 -0
  309. package/sql/20261022090000_fulfillment_delivery_alignment.sql +1106 -0
  310. package/src/composition/composeBundle.ts +13 -0
  311. package/src/composition/fulfillmentContribution.ts +28 -0
  312. package/src/composition/index.ts +2 -0
  313. package/src/fulfillment/adapterConformance.ts +195 -0
  314. package/src/fulfillment/bindings.ts +26 -0
  315. package/src/fulfillment/commerceFulfillmentHandlers.ts +263 -0
  316. package/src/fulfillment/commerceFulfillmentReadModel.ts +257 -0
  317. package/src/fulfillment/contracts/alignment.ts +13 -0
  318. package/src/fulfillment/contracts/bindings.ts +30 -0
  319. package/src/fulfillment/contracts/capabilities.ts +15 -0
  320. package/src/fulfillment/contracts/conformance.ts +61 -0
  321. package/src/fulfillment/contracts/customerAlignment.ts +4 -0
  322. package/src/fulfillment/contracts/dispatch.ts +58 -0
  323. package/src/fulfillment/contracts/index.ts +18 -0
  324. package/src/fulfillment/contracts/label.ts +9 -0
  325. package/src/fulfillment/contracts/nativeUnsupported.ts +6 -0
  326. package/src/fulfillment/contracts/observation.ts +18 -0
  327. package/src/fulfillment/contracts/operator.ts +31 -0
  328. package/src/fulfillment/contracts/read.ts +42 -0
  329. package/src/fulfillment/contracts/readback.ts +11 -0
  330. package/src/fulfillment/contracts/replacement.ts +15 -0
  331. package/src/fulfillment/contracts/store.ts +26 -0
  332. package/src/fulfillment/contracts/sync.ts +61 -0
  333. package/src/fulfillment/currentFulfillmentParcel.ts +2 -0
  334. package/src/fulfillment/delayReadModel.ts +60 -0
  335. package/src/fulfillment/deliveryAlignmentReadModel.ts +15 -0
  336. package/src/fulfillment/dispatchProjection.ts +20 -0
  337. package/src/fulfillment/fulfillmentObservationEffects.ts +86 -0
  338. package/src/fulfillment/handlerSchemas.ts +255 -0
  339. package/src/fulfillment/handlerSupport.ts +25 -0
  340. package/src/fulfillment/index.ts +38 -0
  341. package/src/fulfillment/labelLifecycle.ts +11 -0
  342. package/src/fulfillment/lowStockEvidenceHandler.ts +60 -0
  343. package/src/fulfillment/migrations.ts +8 -0
  344. package/src/fulfillment/nativeUnsupported.ts +23 -0
  345. package/src/fulfillment/normalizedFulfillmentFacts.ts +2 -0
  346. package/src/fulfillment/observationProjection.ts +41 -0
  347. package/src/fulfillment/omnipack/capabilities.ts +18 -0
  348. package/src/fulfillment/omnipack/client.ts +258 -0
  349. package/src/fulfillment/omnipack/index.ts +312 -0
  350. package/src/fulfillment/omnipack/mappers.ts +261 -0
  351. package/src/fulfillment/omnipack/observation.ts +61 -0
  352. package/src/fulfillment/omnipack/omnipackDispatchPayload.ts +93 -0
  353. package/src/fulfillment/omnipack/omnipackOutboundOrderPayload.ts +194 -0
  354. package/src/fulfillment/omnipack/omnipackProductPackPayload.ts +47 -0
  355. package/src/fulfillment/omnipack/omnipackProductPayload.ts +67 -0
  356. package/src/fulfillment/omnipack/omnipackReconciliationPayload.ts +7 -0
  357. package/src/fulfillment/omnipack/omnipackStatusVocabulary.ts +103 -0
  358. package/src/fulfillment/omnipack/omnipackWebhookPayload.ts +73 -0
  359. package/src/fulfillment/omnipack/productSyncMappers.ts +74 -0
  360. package/src/fulfillment/omnipack/providerError.ts +64 -0
  361. package/src/fulfillment/omnipack/trackingReferences.ts +77 -0
  362. package/src/fulfillment/paidFulfillmentRecovery.ts +252 -0
  363. package/src/fulfillment/paidHandoff.ts +122 -0
  364. package/src/fulfillment/paidHandoffPorts.ts +21 -0
  365. package/src/fulfillment/postgresDeliveryAlignment.ts +14 -0
  366. package/src/fulfillment/postgresDispatchStore.ts +55 -0
  367. package/src/fulfillment/postgresEvidenceReadPort.ts +59 -0
  368. package/src/fulfillment/postgresPaidFulfillmentRecovery.ts +29 -0
  369. package/src/fulfillment/postgresPaidHandoffStore.ts +11 -0
  370. package/src/fulfillment/postgresShipmentSpine.ts +321 -0
  371. package/src/fulfillment/postgresStockSyncPort.ts +65 -0
  372. package/src/fulfillment/productReconciliationEvidenceHandler.ts +64 -0
  373. package/src/fulfillment/providerCapabilities.ts +18 -0
  374. package/src/fulfillment/providerCommandLedger.ts +53 -0
  375. package/src/fulfillment/providerDispatchAcceptance.ts +31 -0
  376. package/src/fulfillment/providerDispatchError.ts +7 -0
  377. package/src/fulfillment/providerDispatchWorker.ts +131 -0
  378. package/src/fulfillment/providerProductSyncWorker.ts +154 -0
  379. package/src/fulfillment/providerReconciliationError.ts +20 -0
  380. package/src/fulfillment/providerReconciliationTerminalSkip.ts +8 -0
  381. package/src/fulfillment/providerReconciliationTimestamp.ts +34 -0
  382. package/src/fulfillment/providerReconciliationWorker.ts +150 -0
  383. package/src/fulfillment/providerStockAvailability.ts +60 -0
  384. package/src/fulfillment/providerStockSyncWorker.ts +222 -0
  385. package/src/fulfillment/providerTrackingReferences.ts +31 -0
  386. package/src/fulfillment/replacementRefusals.ts +43 -0
  387. package/src/fulfillment/replacementShipmentHandler.ts +47 -0
  388. package/src/fulfillment/schemaCapabilities.ts +7 -0
  389. package/src/fulfillment/shipmentsOverviewHandler.ts +73 -0
  390. package/src/fulfillment/statusMap.ts +2 -0
  391. package/src/fulfillment/trackingProgress.ts +1 -0
  392. package/src/fulfillment/verifiedIngress.ts +80 -0
  393. package/src/payments/adapterConformance.ts +118 -0
  394. package/src/payments/bindings.ts +17 -0
  395. package/src/payments/checkoutActivePaymentActionResolver.ts +97 -0
  396. package/src/payments/checkoutRecoveryPaymentResolver.ts +108 -0
  397. package/src/payments/contracts/adapter.ts +96 -0
  398. package/src/payments/contracts/conformance.ts +171 -0
  399. package/src/payments/contracts/evidence.ts +142 -0
  400. package/src/payments/contracts/index.ts +54 -0
  401. package/src/payments/contracts/preparedAttempt.ts +86 -0
  402. package/src/payments/contracts/reconciliation.ts +296 -0
  403. package/src/payments/contracts/repair.ts +95 -0
  404. package/src/payments/contracts/truth.ts +108 -0
  405. package/src/payments/eventConformanceRunner.ts +149 -0
  406. package/src/payments/index.ts +21 -0
  407. package/src/payments/paymentAttemptSilenceWindow.ts +26 -0
  408. package/src/payments/paymentMethodLifecycle.ts +50 -0
  409. package/src/payments/paymentProviderReconciliationAbsenceReopen.ts +130 -0
  410. package/src/payments/paymentProviderReconciliationEvidence.ts +117 -0
  411. package/src/payments/paymentProviderReconciliationWorker.ts +291 -0
  412. package/src/payments/paymentTruth.ts +131 -0
  413. package/src/payments/paymentVerifyNowHandler.ts +94 -0
  414. package/src/payments/paymentVerifyNowService.ts +125 -0
  415. package/src/payments/paymentWebhookPostProcessing.ts +36 -0
  416. package/src/payments/postgresPaymentTruth.ts +149 -0
  417. package/src/payments/preparedAttempt.ts +90 -0
  418. package/src/payments/preparedAttemptFinalization.ts +13 -0
  419. package/src/payments/schemaCapabilities.ts +10 -0
  420. package/src/payments/sql.ts +6 -0
  421. package/src/payments/stripe/classifyDecline.ts +62 -0
  422. package/src/payments/stripe/declineFailureHints.ts +89 -0
  423. package/src/payments/stripe/donorContracts.ts +87 -0
  424. package/src/payments/stripe/executionDecline.ts +126 -0
  425. package/src/payments/stripe/index.ts +265 -0
  426. package/src/payments/stripe/intentMapper.ts +58 -0
  427. package/src/payments/stripe/methodFacts.ts +21 -0
  428. package/src/payments/stripe/paymentFailureEvidence.ts +58 -0
  429. package/src/payments/stripe/stripeFailureEvidence.ts +115 -0
  430. package/src/payments/stripe/stripeIntentConfirmationEvidence.ts +34 -0
  431. package/src/payments/stripe/stripePaymentReconciliationProvider.ts +263 -0
  432. package/src/payments/stripe/stripeRefundEvidence.ts +19 -0
  433. package/src/payments/stripe/stripeSandboxPaymentExecutionAdapter.ts +283 -0
  434. package/src/payments/stripe/stripeWebhookNormalizer.ts +277 -0
  435. package/src/payments/stripe/webhookSignature.ts +55 -0
  436. package/src/payments/tpay/blikRecurringMapper.ts +42 -0
  437. package/src/payments/tpay/capabilities.ts +21 -0
  438. package/src/payments/tpay/classifyDecline.ts +62 -0
  439. package/src/payments/tpay/declineFailureHints.ts +90 -0
  440. package/src/payments/tpay/donorContracts.ts +104 -0
  441. package/src/payments/tpay/index.ts +293 -0
  442. package/src/payments/tpay/paymentFailureEvidence.ts +58 -0
  443. package/src/payments/tpay/preparedProviderAttempt.ts +38 -0
  444. package/src/payments/tpay/providerAttemptFailureDiagnostic.ts +99 -0
  445. package/src/payments/tpay/tpayCreateTransactionInput.ts +158 -0
  446. package/src/payments/tpay/tpayDeclineEvidence.ts +233 -0
  447. package/src/payments/tpay/tpayDispatchFailure.ts +186 -0
  448. package/src/payments/tpay/tpayFailureEvidence.ts +75 -0
  449. package/src/payments/tpay/tpayHttpClient.ts +290 -0
  450. package/src/payments/tpay/tpayHttpFailure.ts +186 -0
  451. package/src/payments/tpay/tpayPaymentExecutionAdapter.ts +297 -0
  452. package/src/payments/tpay/tpayPaymentReconciliationProvider.ts +285 -0
  453. package/src/payments/tpay/tpayTransactionPayload.ts +207 -0
  454. package/src/payments/tpay/wallClockTime.ts +57 -0
  455. package/src/payments/tpay/webhookJwsVerifier.ts +82 -0
  456. package/src/payments/tpay/webhookNormalizer.ts +279 -0
  457. package/src/payments/verifiedEvidenceProjection.ts +179 -0
  458. package/src/payments/verifiedIngress.ts +317 -0
@@ -0,0 +1,29 @@
1
+ import type { FulfillmentOperatorMutationPort as CommerceFulfillmentMutationPort } from './contracts/operator.js';
2
+ import type { FulfillmentCommerceReadPort as CommerceFulfillmentReadPort } from './contracts/read.js';
3
+ import { type BaseDeps, type FulfillmentHandlerRequest } from './handlerSupport.js';
4
+ type PortRef<T> = T | (() => T);
5
+ export declare function createAdminCommerceFulfillmentOrdersListHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
6
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentReadPort, "listCommerceFulfillmentOrders">>;
7
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
8
+ export declare function createAdminCommerceFulfillmentOrderDetailHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
9
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentReadPort, "getCommerceFulfillmentOrderDetail">>;
10
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
11
+ export declare function createAdminCommerceFulfillmentCreateOrderHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
12
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentMutationPort, "createCommerceFulfillmentOrder">>;
13
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
14
+ export declare function createAdminCommerceFulfillmentRecordProviderAttemptHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
15
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentMutationPort, "recordCommerceFulfillmentProviderAttempt">>;
16
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
17
+ export declare function createAdminCommerceFulfillmentRecordLabelHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
18
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentMutationPort, "recordCommerceFulfillmentLabel">>;
19
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
20
+ export declare function createAdminCommerceFulfillmentHandOffHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
21
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentMutationPort, "handOffCommerceFulfillmentOrder">>;
22
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
23
+ export declare function createAdminCommerceFulfillmentTrackingEventHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
24
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentMutationPort, "recordCommerceFulfillmentTrackingEvent">>;
25
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
26
+ export declare function createAdminCommerceFulfillmentCancelOrderHandler<Response>({ authorizeAdmin, respond, fulfillmentPort, }: BaseDeps<Response> & {
27
+ fulfillmentPort: PortRef<Pick<CommerceFulfillmentMutationPort, "cancelCommerceFulfillmentOrder">>;
28
+ }): (req: FulfillmentHandlerRequest, res: Response) => Promise<void>;
29
+ export {};
@@ -0,0 +1,184 @@
1
+ import { adminCommerceFulfillmentCancelRequestSchema, adminCommerceFulfillmentCreateRequestSchema, adminCommerceFulfillmentHandOffRequestSchema, adminCommerceFulfillmentMutationResponseSchema, adminCommerceFulfillmentOrderDetailRequestSchema, adminCommerceFulfillmentOrderDetailResponseSchema, adminCommerceFulfillmentOrdersListRequestSchema, adminCommerceFulfillmentOrdersListResponseSchema, adminCommerceFulfillmentRecordLabelRequestSchema, adminCommerceFulfillmentRecordProviderAttemptRequestSchema, adminCommerceFulfillmentTrackingEventRequestSchema, } from "./handlerSchemas.js";
2
+ import { CommerceFulfillmentConflictError, authorize, isNativeUnsupported } from './handlerSupport.js';
3
+ export function createAdminCommerceFulfillmentOrdersListHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
4
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = respond;
5
+ return async function handler(req, res) {
6
+ if (req.method !== "GET")
7
+ return sendMethodNotAllowed(res, ["GET"]);
8
+ if (!(await authorize(req, res, authorizeAdmin, respond)))
9
+ return;
10
+ const request = adminCommerceFulfillmentOrdersListRequestSchema.safeParse(req.query);
11
+ if (!request.success) {
12
+ sendBffError(res, "BAD_REQUEST", "Invalid admin commerce fulfillment orders request", {
13
+ details: request.error.flatten(),
14
+ });
15
+ return;
16
+ }
17
+ try {
18
+ const port = resolvePort(fulfillmentPort);
19
+ const result = await port.listCommerceFulfillmentOrders(request.data);
20
+ if (isNativeUnsupported(result)) {
21
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Native fulfillment operation unsupported", { details: result });
22
+ return;
23
+ }
24
+ const response = adminCommerceFulfillmentOrdersListResponseSchema.safeParse(result);
25
+ if (!response.success) {
26
+ sendBffError(res, "INVALID_RESPONSE", "Admin commerce fulfillment orders response invalid");
27
+ return;
28
+ }
29
+ sendBffSuccess(res, response.data);
30
+ }
31
+ catch {
32
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce fulfillment orders read failed");
33
+ }
34
+ };
35
+ }
36
+ export function createAdminCommerceFulfillmentOrderDetailHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
37
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = respond;
38
+ return async function handler(req, res) {
39
+ if (req.method !== "GET")
40
+ return sendMethodNotAllowed(res, ["GET"]);
41
+ if (!(await authorize(req, res, authorizeAdmin, respond)))
42
+ return;
43
+ const request = adminCommerceFulfillmentOrderDetailRequestSchema.safeParse(req.query);
44
+ if (!request.success) {
45
+ sendBffError(res, "BAD_REQUEST", "Invalid admin commerce fulfillment detail request", {
46
+ details: request.error.flatten(),
47
+ });
48
+ return;
49
+ }
50
+ try {
51
+ const port = resolvePort(fulfillmentPort);
52
+ const result = await port.getCommerceFulfillmentOrderDetail(request.data);
53
+ if (isNativeUnsupported(result)) {
54
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Native fulfillment operation unsupported", { details: result });
55
+ return;
56
+ }
57
+ if (!result) {
58
+ sendBffError(res, "NOT_FOUND", "Commerce fulfillment order not found");
59
+ return;
60
+ }
61
+ const response = adminCommerceFulfillmentOrderDetailResponseSchema.safeParse(result);
62
+ if (!response.success) {
63
+ sendBffError(res, "INVALID_RESPONSE", "Admin commerce fulfillment detail response invalid");
64
+ return;
65
+ }
66
+ sendBffSuccess(res, response.data);
67
+ }
68
+ catch {
69
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce fulfillment detail read failed");
70
+ }
71
+ };
72
+ }
73
+ export function createAdminCommerceFulfillmentCreateOrderHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
74
+ return createMutationHandler({
75
+ authorizeAdmin,
76
+ respond,
77
+ requestSchema: adminCommerceFulfillmentCreateRequestSchema,
78
+ invalidMessage: "Invalid admin commerce fulfillment create request",
79
+ execute: (request, actorUserId) => {
80
+ const port = resolvePort(fulfillmentPort);
81
+ return port.createCommerceFulfillmentOrder({ ...request, actorUserId });
82
+ },
83
+ });
84
+ }
85
+ export function createAdminCommerceFulfillmentRecordProviderAttemptHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
86
+ return createMutationHandler({
87
+ authorizeAdmin,
88
+ respond,
89
+ requestSchema: adminCommerceFulfillmentRecordProviderAttemptRequestSchema,
90
+ invalidMessage: "Invalid admin commerce fulfillment provider attempt request",
91
+ execute: (request, actorUserId) => {
92
+ const port = resolvePort(fulfillmentPort);
93
+ return port.recordCommerceFulfillmentProviderAttempt({ ...request, actorUserId });
94
+ },
95
+ });
96
+ }
97
+ export function createAdminCommerceFulfillmentRecordLabelHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
98
+ return createMutationHandler({
99
+ authorizeAdmin,
100
+ respond,
101
+ requestSchema: adminCommerceFulfillmentRecordLabelRequestSchema,
102
+ invalidMessage: "Invalid admin commerce fulfillment label request",
103
+ execute: (request, actorUserId) => {
104
+ const port = resolvePort(fulfillmentPort);
105
+ return port.recordCommerceFulfillmentLabel({ ...request, actorUserId });
106
+ },
107
+ });
108
+ }
109
+ export function createAdminCommerceFulfillmentHandOffHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
110
+ return createMutationHandler({
111
+ authorizeAdmin,
112
+ respond,
113
+ requestSchema: adminCommerceFulfillmentHandOffRequestSchema,
114
+ invalidMessage: "Invalid admin commerce fulfillment handoff request",
115
+ execute: (request, actorUserId) => {
116
+ const port = resolvePort(fulfillmentPort);
117
+ return port.handOffCommerceFulfillmentOrder({ ...request, actorUserId });
118
+ },
119
+ });
120
+ }
121
+ export function createAdminCommerceFulfillmentTrackingEventHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
122
+ return createMutationHandler({
123
+ authorizeAdmin,
124
+ respond,
125
+ requestSchema: adminCommerceFulfillmentTrackingEventRequestSchema,
126
+ invalidMessage: "Invalid admin commerce fulfillment tracking event request",
127
+ execute: (request, actorUserId) => {
128
+ const port = resolvePort(fulfillmentPort);
129
+ return port.recordCommerceFulfillmentTrackingEvent({ ...request, actorUserId });
130
+ },
131
+ });
132
+ }
133
+ export function createAdminCommerceFulfillmentCancelOrderHandler({ authorizeAdmin, respond, fulfillmentPort, }) {
134
+ return createMutationHandler({
135
+ authorizeAdmin,
136
+ respond,
137
+ requestSchema: adminCommerceFulfillmentCancelRequestSchema,
138
+ invalidMessage: "Invalid admin commerce fulfillment cancel request",
139
+ execute: (request, actorUserId) => {
140
+ const port = resolvePort(fulfillmentPort);
141
+ return port.cancelCommerceFulfillmentOrder({ ...request, actorUserId });
142
+ },
143
+ });
144
+ }
145
+ function resolvePort(port) {
146
+ return typeof port === "function" ? port() : port;
147
+ }
148
+ function createMutationHandler({ authorizeAdmin, respond, requestSchema, invalidMessage, execute, }) {
149
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = respond;
150
+ return async function handler(req, res) {
151
+ if (req.method !== "POST")
152
+ return sendMethodNotAllowed(res, ["POST"]);
153
+ const auth = await authorize(req, res, authorizeAdmin, respond);
154
+ if (!auth)
155
+ return;
156
+ const request = requestSchema.safeParse(req.body ?? {});
157
+ if (request.success === false) {
158
+ sendBffError(res, "BAD_REQUEST", invalidMessage, { details: request.error.flatten() });
159
+ return;
160
+ }
161
+ try {
162
+ const result = await execute(request.data, auth.userId);
163
+ if (isNativeUnsupported(result)) {
164
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Native fulfillment operation unsupported", { details: result });
165
+ return;
166
+ }
167
+ const response = adminCommerceFulfillmentMutationResponseSchema.safeParse(result);
168
+ if (!response.success) {
169
+ sendBffError(res, "INVALID_RESPONSE", "Admin commerce fulfillment mutation response invalid");
170
+ return;
171
+ }
172
+ sendBffSuccess(res, response.data);
173
+ }
174
+ catch (error) {
175
+ if (error instanceof CommerceFulfillmentConflictError) {
176
+ sendBffError(res, "CONFLICT", error.message, { details: error.details });
177
+ return;
178
+ }
179
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce fulfillment mutation failed", {
180
+ details: { reason: "fulfillment_mutation_failed" },
181
+ });
182
+ }
183
+ };
184
+ }
@@ -0,0 +1,86 @@
1
+ import type { FulfillmentCommerceReadPolicy, FulfillmentPaymentStatus, FulfillmentOrderStatus as OrderStatus } from './contracts/read.js';
2
+ import type { SubscriptionCycleStatus } from '@openlup/core/subscription';
3
+ import { type AdminCommerceFulfillmentOrderDetailResponse, type AdminCommerceFulfillmentOrdersListResponse, type CommerceFulfillmentOrder, type CommerceFulfillmentOperationType, type CommerceFulfillmentStatus } from "./handlerSchemas.js";
4
+ export interface CommerceFulfillmentOrderRow {
5
+ id: string;
6
+ order_id: string;
7
+ client_id: string | null;
8
+ status: CommerceFulfillmentStatus;
9
+ provider_kind: string | null;
10
+ shipping_address_snapshot: CommerceFulfillmentOrder["shippingAddress"];
11
+ created_at: string;
12
+ updated_at: string;
13
+ }
14
+ export interface CommerceFulfillmentLineRow {
15
+ id: string;
16
+ fulfillment_order_id: string;
17
+ order_item_id: string;
18
+ sku_id: string;
19
+ sku: string;
20
+ title: string | null;
21
+ quantity: number;
22
+ inventory_reservation_ids: string[];
23
+ product_snapshot: Record<string, unknown>;
24
+ }
25
+ export interface CommerceFulfillmentOperationRow {
26
+ id: string;
27
+ fulfillment_order_id: string;
28
+ operation_type: CommerceFulfillmentOperationType;
29
+ actor_user_id: string | null;
30
+ occurred_at: string;
31
+ payload: Record<string, unknown>;
32
+ }
33
+ export interface CommerceFulfillmentOrderContextRow {
34
+ id: string;
35
+ status: OrderStatus;
36
+ mode: "one_time" | "subscription_cycle";
37
+ shipping_address_id: string | null;
38
+ subscription_cycle_id: string | null;
39
+ }
40
+ export interface CommerceFulfillmentPaymentIntentRow {
41
+ id: string;
42
+ order_id: string;
43
+ status: FulfillmentPaymentStatus;
44
+ provider_payment_id: string | null;
45
+ }
46
+ export interface CommerceFulfillmentInventoryReservationRow {
47
+ id: string;
48
+ order_id: string;
49
+ status: "reserved" | "released" | "consumed" | "expired";
50
+ expires_at: string | null;
51
+ location_id: string | null;
52
+ inventory_locations?: {
53
+ code?: string | null;
54
+ } | null;
55
+ }
56
+ export interface CommerceFulfillmentShipmentRefRow {
57
+ order_id: string;
58
+ provider_tracking_id: string;
59
+ active: boolean;
60
+ created_at?: string | null;
61
+ }
62
+ export declare function buildCommerceFulfillmentOrdersListResponse(input: {
63
+ fulfillmentOrders: CommerceFulfillmentOrderRow[];
64
+ lines: CommerceFulfillmentLineRow[];
65
+ latestOperations: CommerceFulfillmentOperationRow[];
66
+ orderContexts: CommerceFulfillmentOrderContextRow[];
67
+ paymentIntents: CommerceFulfillmentPaymentIntentRow[];
68
+ inventoryReservations: CommerceFulfillmentInventoryReservationRow[];
69
+ shipmentRefs: CommerceFulfillmentShipmentRefRow[];
70
+ activeHoldCounts: Record<string, number>;
71
+ subscriptionCycleStatuses: Record<string, SubscriptionCycleStatus | null>;
72
+ totalCount: number;
73
+ page: number;
74
+ pageSize: number;
75
+ }, policy: FulfillmentCommerceReadPolicy): AdminCommerceFulfillmentOrdersListResponse;
76
+ export declare function buildCommerceFulfillmentOrderDetailResponse(input: {
77
+ fulfillmentOrder: CommerceFulfillmentOrderRow;
78
+ lines: CommerceFulfillmentLineRow[];
79
+ latestOperation: CommerceFulfillmentOperationRow | null;
80
+ orderContext: CommerceFulfillmentOrderContextRow;
81
+ paymentIntent: CommerceFulfillmentPaymentIntentRow;
82
+ inventoryReservations: CommerceFulfillmentInventoryReservationRow[];
83
+ shipmentRef: CommerceFulfillmentShipmentRefRow | null;
84
+ activeHoldCount: number;
85
+ subscriptionCycleStatus: SubscriptionCycleStatus | null;
86
+ }, policy: FulfillmentCommerceReadPolicy): AdminCommerceFulfillmentOrderDetailResponse;
@@ -0,0 +1,131 @@
1
+ import { COMMERCE_FULFILLMENT_CONTRACT_VERSION, adminCommerceFulfillmentOrderDetailResponseSchema, adminCommerceFulfillmentOrdersListResponseSchema, } from "./handlerSchemas.js";
2
+ export function buildCommerceFulfillmentOrdersListResponse(input, policy) {
3
+ return adminCommerceFulfillmentOrdersListResponseSchema.parse({
4
+ contractVersion: COMMERCE_FULFILLMENT_CONTRACT_VERSION,
5
+ orders: input.fulfillmentOrders.map((fulfillmentOrder) => buildCommerceFulfillmentOrder({
6
+ fulfillmentOrder,
7
+ lines: input.lines.filter((line) => line.fulfillment_order_id === fulfillmentOrder.id),
8
+ latestOperation: input.latestOperations.find((operation) => operation.fulfillment_order_id === fulfillmentOrder.id) ??
9
+ null,
10
+ orderContext: findRequired(input.orderContexts, fulfillmentOrder.order_id, "order context"),
11
+ paymentIntent: findRequired(input.paymentIntents, fulfillmentOrder.order_id, "payment intent"),
12
+ inventoryReservations: input.inventoryReservations.filter((reservation) => reservation.order_id === fulfillmentOrder.order_id),
13
+ shipmentRef: input.shipmentRefs.find((ref) => ref.order_id === fulfillmentOrder.order_id && ref.active) ?? null,
14
+ activeHoldCount: input.activeHoldCounts[fulfillmentOrder.order_id] ?? 0,
15
+ subscriptionCycleStatuses: input.subscriptionCycleStatuses,
16
+ policy,
17
+ })),
18
+ totalCount: input.totalCount,
19
+ page: input.page,
20
+ pageSize: input.pageSize,
21
+ });
22
+ }
23
+ export function buildCommerceFulfillmentOrderDetailResponse(input, policy) {
24
+ return adminCommerceFulfillmentOrderDetailResponseSchema.parse({
25
+ contractVersion: COMMERCE_FULFILLMENT_CONTRACT_VERSION,
26
+ order: buildCommerceFulfillmentOrder({
27
+ fulfillmentOrder: input.fulfillmentOrder,
28
+ lines: input.lines,
29
+ latestOperation: input.latestOperation,
30
+ orderContext: input.orderContext,
31
+ paymentIntent: input.paymentIntent,
32
+ inventoryReservations: input.inventoryReservations,
33
+ shipmentRef: input.shipmentRef,
34
+ activeHoldCount: input.activeHoldCount,
35
+ policy,
36
+ subscriptionCycleStatuses: {
37
+ [input.orderContext.subscription_cycle_id ?? ""]: input.subscriptionCycleStatus,
38
+ },
39
+ }),
40
+ });
41
+ }
42
+ function buildCommerceFulfillmentOrder(input) {
43
+ const paymentStatus = input.paymentIntent.status;
44
+ const inventory = inventorySummary(input.inventoryReservations);
45
+ return {
46
+ id: input.fulfillmentOrder.id,
47
+ orderId: input.fulfillmentOrder.order_id,
48
+ clientId: input.fulfillmentOrder.client_id,
49
+ status: input.fulfillmentOrder.status,
50
+ providerKind: input.fulfillmentOrder.provider_kind,
51
+ providerTrackingId: input.shipmentRef?.provider_tracking_id ?? null,
52
+ shippingAddress: normalizeShippingAddressSnapshot(input.fulfillmentOrder.shipping_address_snapshot),
53
+ lines: input.lines.map((line) => ({
54
+ id: line.id,
55
+ orderItemId: line.order_item_id,
56
+ skuId: line.sku_id,
57
+ sku: line.sku,
58
+ title: line.title,
59
+ quantity: line.quantity,
60
+ inventoryReservationIds: line.inventory_reservation_ids,
61
+ productSnapshot: line.product_snapshot,
62
+ })),
63
+ payment: {
64
+ paymentIntentId: input.paymentIntent.id,
65
+ paymentStatus,
66
+ providerPaymentId: input.paymentIntent.provider_payment_id,
67
+ },
68
+ inventory,
69
+ omsEligibility: input.policy.evaluateCommerceFulfillmentEligibility({
70
+ orderMode: input.orderContext.mode,
71
+ orderStatus: input.orderContext.status,
72
+ paymentStatus,
73
+ subscriptionCycleStatus: input.orderContext.subscription_cycle_id
74
+ ? input.subscriptionCycleStatuses[input.orderContext.subscription_cycle_id] ?? null
75
+ : null,
76
+ activeHoldCount: input.activeHoldCount,
77
+ hasShippingAddress: Boolean(input.orderContext.shipping_address_id),
78
+ inventoryStatus: inventory.status,
79
+ }),
80
+ latestOperation: input.latestOperation
81
+ ? {
82
+ id: input.latestOperation.id,
83
+ type: input.latestOperation.operation_type,
84
+ occurredAt: input.latestOperation.occurred_at,
85
+ actorUserId: input.latestOperation.actor_user_id,
86
+ payload: input.latestOperation.payload,
87
+ }
88
+ : null,
89
+ createdAt: input.fulfillmentOrder.created_at,
90
+ updatedAt: input.fulfillmentOrder.updated_at,
91
+ };
92
+ }
93
+ function normalizeShippingAddressSnapshot(snapshot) {
94
+ return {
95
+ addressId: snapshot.addressId,
96
+ clientId: snapshot.clientId,
97
+ label: snapshot.label,
98
+ line1: snapshot.line1,
99
+ line2: snapshot.line2,
100
+ city: snapshot.city,
101
+ postalCode: snapshot.postalCode,
102
+ country: snapshot.country,
103
+ };
104
+ }
105
+ function inventorySummary(reservations) {
106
+ const reservation = reservations[0] ?? null;
107
+ if (!reservation) {
108
+ return {
109
+ status: "missing",
110
+ reservationId: null,
111
+ reservationStatus: null,
112
+ expiresAt: null,
113
+ locationId: null,
114
+ locationCode: null,
115
+ };
116
+ }
117
+ return {
118
+ status: reservation.status === "reserved" ? "reserved" : reservation.status,
119
+ reservationId: reservation.id,
120
+ reservationStatus: reservation.status,
121
+ expiresAt: reservation.expires_at,
122
+ locationId: reservation.location_id,
123
+ locationCode: reservation.inventory_locations?.code ?? null,
124
+ };
125
+ }
126
+ function findRequired(rows, orderId, label) {
127
+ const row = rows.find((candidate) => candidate.order_id === orderId || candidate.id === orderId);
128
+ if (!row)
129
+ throw new Error(`Missing commerce fulfillment ${label} for order ${orderId}`);
130
+ return row;
131
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Late delivery extends the next cycle, never stacks deliveries or moves it earlier.
3
+ * A replacement may settle alignment as aligned only after reaching the customer.
4
+ * Its superseded predecessor is no longer outstanding; an in-flight or undelivered
5
+ * replacement still is. Never call subscription_delivery_alignment_confirm_replacement
6
+ * for a replacement that did not arrive: it records "Parcel delivered" and shifts
7
+ * the cycle later. That note-only operator attestation remains outside this port;
8
+ * no automatic caller or new guard is introduced.
9
+ */
10
+ export interface DeliveryAlignmentPort {
11
+ recordArrival(input: {
12
+ requestKey: string;
13
+ parcelRef: string;
14
+ deliveredAt: string;
15
+ evidenceRef: `evidence:${string}`;
16
+ }): Promise<{
17
+ disposition: "aligned" | "outstanding" | "manual_review";
18
+ nextCycleAt: string | null;
19
+ replayed: boolean;
20
+ }>;
21
+ read(fulfillmentRef: string): Promise<{
22
+ disposition: "aligned" | "outstanding" | "manual_review";
23
+ nextCycleAt: string | null;
24
+ }>;
25
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ import type { FulfillmentCapabilityDescriptor } from './capabilities.js';
2
+ import type { FulfillmentDispatchPort, FulfillmentDispatchRequest, FulfillmentRefusal, FulfillmentSelection } from './dispatch.js';
3
+ import type { FulfillmentNativeUnsupported } from './nativeUnsupported.js';
4
+ import type { DispatchRecord, FulfillmentStorePort } from './store.js';
5
+ /** In-memory ports and host closures only; never serialize options or recipient inputs. */
6
+ export interface FulfillmentServicesOptions {
7
+ enabled?: boolean;
8
+ selection: FulfillmentSelection | null;
9
+ capability: FulfillmentCapabilityDescriptor | null;
10
+ store: FulfillmentStorePort | null;
11
+ provider: FulfillmentDispatchPort | null;
12
+ readiness(): Promise<{
13
+ ready: true;
14
+ } | {
15
+ ready: false;
16
+ refusal: FulfillmentRefusal | FulfillmentNativeUnsupported;
17
+ }>;
18
+ listCandidates(limit: number): Promise<readonly FulfillmentDispatchRequest[]>;
19
+ keys: {
20
+ request(candidate: FulfillmentDispatchRequest): string;
21
+ mappedAttempt(requestKey: string, mappedAttemptIndex: number): string;
22
+ acceptance(fulfillmentRef: string): {
23
+ providerAttemptKey: string;
24
+ labelKey: string;
25
+ };
26
+ };
27
+ config: {
28
+ mode: DispatchRecord['mode'];
29
+ batchLimit: number;
30
+ };
31
+ now?: () => Date;
32
+ }
33
+ /** Import and construction are inert. Every invocation checks activation before any worker. */
34
+ export interface FulfillmentServices {
35
+ readiness(): ReturnType<FulfillmentServicesOptions['readiness']>;
36
+ runDispatch(): Promise<FulfillmentNativeUnsupported | {
37
+ kind: 'refused';
38
+ refusal: FulfillmentRefusal;
39
+ } | {
40
+ ok: boolean;
41
+ skipped: boolean;
42
+ checked: number;
43
+ updated: number;
44
+ failures: number;
45
+ mode: DispatchRecord['mode'];
46
+ replayed: number;
47
+ providerCalls: number;
48
+ readBacks: number;
49
+ reason: string | undefined;
50
+ }>;
51
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { FulfillmentRefusal } from "./dispatch.js";
2
+ export interface FulfillmentCapabilityDescriptor {
3
+ providerRef: string;
4
+ role: "warehouse" | "direct_carrier" | "manual" | "simulator";
5
+ operations: Readonly<Record<"dispatch" | "readback" | "exactAbsence" | "verifyObservation" | "syncStock" | "syncProducts" | "labelCreate" | "labelRead" | "labelVoid" | "cancel" | "pickupPoint" | "courierPickup", {
6
+ supported: true;
7
+ } | {
8
+ supported: false;
9
+ reason: "not_exposed" | "host_only" | "not_implemented";
10
+ }>>;
11
+ authentication: "token" | "authenticated_timestamp" | "none";
12
+ freshness: "authenticated_timestamp" | "not_available";
13
+ defaultOff: true;
14
+ selected: boolean;
15
+ readiness: {
16
+ ready: true;
17
+ } | {
18
+ ready: false;
19
+ refusal: FulfillmentRefusal;
20
+ };
21
+ ownsDeliveredNotification: boolean;
22
+ stockAuthority: "local_atp" | "external_stock_master_with_local_reservations";
23
+ labelReadOwner: "host_storage" | "adapter" | "none";
24
+ actionPolicy: {
25
+ providerSpecificAdminActions: boolean;
26
+ genericAdminActions: boolean;
27
+ mutationSurface: "none" | "local_only" | "provider_adapter";
28
+ };
29
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,93 @@
1
+ import type { FulfillmentCapabilityDescriptor } from "./capabilities.js";
2
+ import type { FulfillmentDispatchPort, FulfillmentDispatchRequest } from "./dispatch.js";
3
+ import type { FulfillmentLabelPort } from "./label.js";
4
+ import type { FulfillmentObservationPort } from "./observation.js";
5
+ import type { FulfillmentReadbackPort } from "./readback.js";
6
+ import type { FulfillmentStockSyncProvider, FulfillmentProductSyncProvider } from "./sync.js";
7
+ import type { FulfillmentStorePort } from "./store.js";
8
+ type Fixture<Method extends (...args: never[]) => unknown> = {
9
+ input: Parameters<Method>;
10
+ expected: Awaited<ReturnType<Method>>;
11
+ };
12
+ type SyncFixture<Port> = {
13
+ [K in keyof Port]: Port[K] extends (...args: never[]) => unknown ? {
14
+ operation: K;
15
+ input: Parameters<Port[K]>;
16
+ expected: Awaited<ReturnType<Port[K]>> | {
17
+ kind: "refused";
18
+ refusal: {
19
+ reason: "unsupported";
20
+ phase: "sync";
21
+ retryable: false;
22
+ };
23
+ };
24
+ } : never;
25
+ }[keyof Port];
26
+ /** Offline adapter-owned inputs and exact expected outputs; never real customer data. */
27
+ export interface FulfillmentAdapterConformanceSubject {
28
+ subjectId: string;
29
+ adapter: {
30
+ capabilities: FulfillmentCapabilityDescriptor;
31
+ dispatch: FulfillmentDispatchPort;
32
+ label?: FulfillmentLabelPort;
33
+ observation?: FulfillmentObservationPort;
34
+ readback?: FulfillmentReadbackPort;
35
+ stockSync?: FulfillmentStockSyncProvider;
36
+ productSync?: FulfillmentProductSyncProvider;
37
+ };
38
+ /** Count external submission I/O, including attempted calls. Preparation/refusals must not increase it. */
39
+ readIoCount(): number;
40
+ sensitiveValues: readonly string[];
41
+ fixtures: {
42
+ dispatch: readonly {
43
+ input: FulfillmentDispatchRequest;
44
+ expectedPrepare: Awaited<ReturnType<FulfillmentDispatchPort["prepare"]>>;
45
+ expectedDispatch?: Awaited<ReturnType<FulfillmentDispatchPort["dispatch"]>>;
46
+ /** Repeating this operation must not increase external submission I/O. */
47
+ replay?: boolean;
48
+ }[];
49
+ label?: {
50
+ create?: readonly Fixture<FulfillmentLabelPort["create"]>[];
51
+ read?: readonly Fixture<FulfillmentLabelPort["read"]>[];
52
+ void?: readonly Fixture<FulfillmentLabelPort["void"]>[];
53
+ };
54
+ observation?: readonly Fixture<FulfillmentObservationPort["verifyAndNormalize"]>[];
55
+ readback?: readonly (Fixture<FulfillmentReadbackPort["read"]> & {
56
+ localMissing?: boolean;
57
+ })[];
58
+ stockSync?: readonly SyncFixture<FulfillmentStockSyncProvider>[];
59
+ productSync?: readonly SyncFixture<FulfillmentProductSyncProvider>[];
60
+ };
61
+ /** A fresh isolated host store per call; no database implementation is supplied by the runner. */
62
+ store?: {
63
+ create(): Promise<FulfillmentStorePort & {
64
+ /** Offline fixture inspection, not a new production store operation. */
65
+ readMappedAttempts(): Promise<readonly {
66
+ attemptKey: string;
67
+ fulfillmentRef: string;
68
+ preparedEvidence: Parameters<FulfillmentStorePort["recordProviderAttempt"]>[2];
69
+ mode: Parameters<FulfillmentStorePort["recordProviderAttempt"]>[3];
70
+ status: "recorded";
71
+ }[]>;
72
+ }>;
73
+ claim: Parameters<FulfillmentStorePort["claim"]>[0];
74
+ remappedClaim: Parameters<FulfillmentStorePort["claim"]>[0];
75
+ mappedAttemptKey: string;
76
+ remappedAttemptKey: string;
77
+ request: FulfillmentDispatchRequest;
78
+ remappedRequest: FulfillmentDispatchRequest;
79
+ };
80
+ }
81
+ /** Sanitized proof only: no fixture inputs, raw responses, transient URLs or credentials. */
82
+ export interface FulfillmentAdapterConformanceEvidence {
83
+ subjects: readonly {
84
+ subjectId: string;
85
+ providerRef: string;
86
+ }[];
87
+ cases: readonly {
88
+ subjectId: string;
89
+ operation: string;
90
+ passed: true;
91
+ }[];
92
+ }
93
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { FulfillmentNativeUnsupported } from './nativeUnsupported.js';
2
+ export interface CustomerDeliveryAlignment {
3
+ state: 'protected' | 'aligned';
4
+ }
5
+ /** Absence from the map means no current customer case, distinct from protected. */
6
+ export type FulfillmentCustomerAlignmentRowsReader = (subscriptionIds: string[]) => Promise<Record<string, unknown>[] | FulfillmentNativeUnsupported>;
@@ -0,0 +1 @@
1
+ export {};