@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.
- package/CHANGELOG.md +272 -278
- package/README.md +195 -6
- package/dist/composition/composeBundle.d.ts +13 -0
- package/dist/composition/composeBundle.js +4 -0
- package/dist/composition/fulfillmentContribution.d.ts +21 -0
- package/dist/composition/fulfillmentContribution.js +19 -0
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +2 -0
- package/dist/fulfillment/adapterConformance.d.ts +3 -0
- package/dist/fulfillment/adapterConformance.js +223 -0
- package/dist/fulfillment/bindings.d.ts +3 -0
- package/dist/fulfillment/bindings.js +29 -0
- package/dist/fulfillment/commerceFulfillmentHandlers.d.ts +29 -0
- package/dist/fulfillment/commerceFulfillmentHandlers.js +184 -0
- package/dist/fulfillment/commerceFulfillmentReadModel.d.ts +86 -0
- package/dist/fulfillment/commerceFulfillmentReadModel.js +131 -0
- package/dist/fulfillment/contracts/alignment.d.ts +25 -0
- package/dist/fulfillment/contracts/alignment.js +1 -0
- package/dist/fulfillment/contracts/bindings.d.ts +51 -0
- package/dist/fulfillment/contracts/bindings.js +1 -0
- package/dist/fulfillment/contracts/capabilities.d.ts +29 -0
- package/dist/fulfillment/contracts/capabilities.js +1 -0
- package/dist/fulfillment/contracts/conformance.d.ts +93 -0
- package/dist/fulfillment/contracts/conformance.js +1 -0
- package/dist/fulfillment/contracts/customerAlignment.d.ts +6 -0
- package/dist/fulfillment/contracts/customerAlignment.js +1 -0
- package/dist/fulfillment/contracts/dispatch.d.ts +105 -0
- package/dist/fulfillment/contracts/dispatch.js +1 -0
- package/dist/fulfillment/contracts/index.d.ts +18 -0
- package/dist/fulfillment/contracts/index.js +1 -0
- package/dist/fulfillment/contracts/label.d.ts +35 -0
- package/dist/fulfillment/contracts/label.js +1 -0
- package/dist/fulfillment/contracts/nativeUnsupported.d.ts +6 -0
- package/dist/fulfillment/contracts/nativeUnsupported.js +1 -0
- package/dist/fulfillment/contracts/observation.d.ts +52 -0
- package/dist/fulfillment/contracts/observation.js +1 -0
- package/dist/fulfillment/contracts/operator.d.ts +64 -0
- package/dist/fulfillment/contracts/operator.js +1 -0
- package/dist/fulfillment/contracts/read.d.ts +110 -0
- package/dist/fulfillment/contracts/read.js +1 -0
- package/dist/fulfillment/contracts/readback.d.ts +38 -0
- package/dist/fulfillment/contracts/readback.js +1 -0
- package/dist/fulfillment/contracts/replacement.d.ts +34 -0
- package/dist/fulfillment/contracts/replacement.js +1 -0
- package/dist/fulfillment/contracts/store.d.ts +86 -0
- package/dist/fulfillment/contracts/store.js +1 -0
- package/dist/fulfillment/contracts/sync.d.ts +170 -0
- package/dist/fulfillment/contracts/sync.js +1 -0
- package/dist/fulfillment/currentFulfillmentParcel.d.ts +2 -0
- package/dist/fulfillment/currentFulfillmentParcel.js +1 -0
- package/dist/fulfillment/delayReadModel.d.ts +11 -0
- package/dist/fulfillment/delayReadModel.js +45 -0
- package/dist/fulfillment/deliveryAlignmentReadModel.d.ts +4 -0
- package/dist/fulfillment/deliveryAlignmentReadModel.js +12 -0
- package/dist/fulfillment/dispatchProjection.d.ts +7 -0
- package/dist/fulfillment/dispatchProjection.js +18 -0
- package/dist/fulfillment/fulfillmentObservationEffects.d.ts +66 -0
- package/dist/fulfillment/fulfillmentObservationEffects.js +36 -0
- package/dist/fulfillment/handlerSchemas.d.ts +647 -0
- package/dist/fulfillment/handlerSchemas.js +213 -0
- package/dist/fulfillment/handlerSupport.d.ts +33 -0
- package/dist/fulfillment/handlerSupport.js +25 -0
- package/dist/fulfillment/index.d.ts +37 -0
- package/dist/fulfillment/index.js +37 -0
- package/dist/fulfillment/labelLifecycle.d.ts +24 -0
- package/dist/fulfillment/labelLifecycle.js +9 -0
- package/dist/fulfillment/lowStockEvidenceHandler.d.ts +36 -0
- package/dist/fulfillment/lowStockEvidenceHandler.js +46 -0
- package/dist/fulfillment/migrations.d.ts +27 -0
- package/dist/fulfillment/migrations.js +8 -0
- package/dist/fulfillment/nativeUnsupported.d.ts +10 -0
- package/dist/fulfillment/nativeUnsupported.js +18 -0
- package/dist/fulfillment/normalizedFulfillmentFacts.d.ts +2 -0
- package/dist/fulfillment/normalizedFulfillmentFacts.js +1 -0
- package/dist/fulfillment/observationProjection.d.ts +11 -0
- package/dist/fulfillment/observationProjection.js +37 -0
- package/dist/fulfillment/omnipack/capabilities.d.ts +3 -0
- package/dist/fulfillment/omnipack/capabilities.js +16 -0
- package/dist/fulfillment/omnipack/client.d.ts +37 -0
- package/dist/fulfillment/omnipack/client.js +162 -0
- package/dist/fulfillment/omnipack/index.d.ts +52 -0
- package/dist/fulfillment/omnipack/index.js +349 -0
- package/dist/fulfillment/omnipack/mappers.d.ts +73 -0
- package/dist/fulfillment/omnipack/mappers.js +177 -0
- package/dist/fulfillment/omnipack/observation.d.ts +21 -0
- package/dist/fulfillment/omnipack/observation.js +57 -0
- package/dist/fulfillment/omnipack/omnipackDispatchPayload.d.ts +36 -0
- package/dist/fulfillment/omnipack/omnipackDispatchPayload.js +63 -0
- package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.d.ts +83 -0
- package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.js +113 -0
- package/dist/fulfillment/omnipack/omnipackProductPackPayload.d.ts +11 -0
- package/dist/fulfillment/omnipack/omnipackProductPackPayload.js +38 -0
- package/dist/fulfillment/omnipack/omnipackProductPayload.d.ts +18 -0
- package/dist/fulfillment/omnipack/omnipackProductPayload.js +51 -0
- package/dist/fulfillment/omnipack/omnipackReconciliationPayload.d.ts +1 -0
- package/dist/fulfillment/omnipack/omnipackReconciliationPayload.js +3 -0
- package/dist/fulfillment/omnipack/omnipackStatusVocabulary.d.ts +4 -0
- package/dist/fulfillment/omnipack/omnipackStatusVocabulary.js +87 -0
- package/dist/fulfillment/omnipack/omnipackWebhookPayload.d.ts +9 -0
- package/dist/fulfillment/omnipack/omnipackWebhookPayload.js +76 -0
- package/dist/fulfillment/omnipack/productSyncMappers.d.ts +18 -0
- package/dist/fulfillment/omnipack/productSyncMappers.js +43 -0
- package/dist/fulfillment/omnipack/providerError.d.ts +25 -0
- package/dist/fulfillment/omnipack/providerError.js +47 -0
- package/dist/fulfillment/omnipack/trackingReferences.d.ts +16 -0
- package/dist/fulfillment/omnipack/trackingReferences.js +52 -0
- package/dist/fulfillment/paidFulfillmentRecovery.d.ts +67 -0
- package/dist/fulfillment/paidFulfillmentRecovery.js +154 -0
- package/dist/fulfillment/paidHandoff.d.ts +27 -0
- package/dist/fulfillment/paidHandoff.js +86 -0
- package/dist/fulfillment/paidHandoffPorts.d.ts +24 -0
- package/dist/fulfillment/paidHandoffPorts.js +3 -0
- package/dist/fulfillment/postgresDeliveryAlignment.d.ts +4 -0
- package/dist/fulfillment/postgresDeliveryAlignment.js +12 -0
- package/dist/fulfillment/postgresDispatchStore.d.ts +16 -0
- package/dist/fulfillment/postgresDispatchStore.js +44 -0
- package/dist/fulfillment/postgresEvidenceReadPort.d.ts +25 -0
- package/dist/fulfillment/postgresEvidenceReadPort.js +45 -0
- package/dist/fulfillment/postgresPaidFulfillmentRecovery.d.ts +25 -0
- package/dist/fulfillment/postgresPaidFulfillmentRecovery.js +26 -0
- package/dist/fulfillment/postgresPaidHandoffStore.d.ts +4 -0
- package/dist/fulfillment/postgresPaidHandoffStore.js +10 -0
- package/dist/fulfillment/postgresShipmentSpine.d.ts +63 -0
- package/dist/fulfillment/postgresShipmentSpine.js +232 -0
- package/dist/fulfillment/postgresStockSyncPort.d.ts +8 -0
- package/dist/fulfillment/postgresStockSyncPort.js +63 -0
- package/dist/fulfillment/productReconciliationEvidenceHandler.d.ts +36 -0
- package/dist/fulfillment/productReconciliationEvidenceHandler.js +50 -0
- package/dist/fulfillment/providerCapabilities.d.ts +9 -0
- package/dist/fulfillment/providerCapabilities.js +17 -0
- package/dist/fulfillment/providerCommandLedger.d.ts +143 -0
- package/dist/fulfillment/providerCommandLedger.js +14 -0
- package/dist/fulfillment/providerDispatchAcceptance.d.ts +26 -0
- package/dist/fulfillment/providerDispatchAcceptance.js +23 -0
- package/dist/fulfillment/providerDispatchError.d.ts +6 -0
- package/dist/fulfillment/providerDispatchError.js +5 -0
- package/dist/fulfillment/providerDispatchWorker.d.ts +31 -0
- package/dist/fulfillment/providerDispatchWorker.js +172 -0
- package/dist/fulfillment/providerProductSyncWorker.d.ts +28 -0
- package/dist/fulfillment/providerProductSyncWorker.js +122 -0
- package/dist/fulfillment/providerReconciliationError.d.ts +9 -0
- package/dist/fulfillment/providerReconciliationError.js +17 -0
- package/dist/fulfillment/providerReconciliationTerminalSkip.d.ts +2 -0
- package/dist/fulfillment/providerReconciliationTerminalSkip.js +6 -0
- package/dist/fulfillment/providerReconciliationTimestamp.d.ts +1 -0
- package/dist/fulfillment/providerReconciliationTimestamp.js +27 -0
- package/dist/fulfillment/providerReconciliationWorker.d.ts +82 -0
- package/dist/fulfillment/providerReconciliationWorker.js +151 -0
- package/dist/fulfillment/providerStockAvailability.d.ts +13 -0
- package/dist/fulfillment/providerStockAvailability.js +51 -0
- package/dist/fulfillment/providerStockSyncWorker.d.ts +37 -0
- package/dist/fulfillment/providerStockSyncWorker.js +186 -0
- package/dist/fulfillment/providerTrackingReferences.d.ts +15 -0
- package/dist/fulfillment/providerTrackingReferences.js +23 -0
- package/dist/fulfillment/replacementRefusals.d.ts +5 -0
- package/dist/fulfillment/replacementRefusals.js +38 -0
- package/dist/fulfillment/replacementShipmentHandler.d.ts +5 -0
- package/dist/fulfillment/replacementShipmentHandler.js +46 -0
- package/dist/fulfillment/schemaCapabilities.d.ts +13 -0
- package/dist/fulfillment/schemaCapabilities.js +7 -0
- package/dist/fulfillment/shipmentsOverviewHandler.d.ts +16 -0
- package/dist/fulfillment/shipmentsOverviewHandler.js +54 -0
- package/dist/fulfillment/statusMap.d.ts +2 -0
- package/dist/fulfillment/statusMap.js +1 -0
- package/dist/fulfillment/trackingProgress.d.ts +1 -0
- package/dist/fulfillment/trackingProgress.js +1 -0
- package/dist/fulfillment/verifiedIngress.d.ts +52 -0
- package/dist/fulfillment/verifiedIngress.js +66 -0
- package/dist/payments/adapterConformance.d.ts +8 -0
- package/dist/payments/adapterConformance.js +109 -0
- package/dist/payments/bindings.d.ts +3 -0
- package/dist/payments/bindings.js +17 -0
- package/dist/payments/checkoutActivePaymentActionResolver.d.ts +7 -0
- package/dist/payments/checkoutActivePaymentActionResolver.js +77 -0
- package/dist/payments/checkoutRecoveryPaymentResolver.d.ts +8 -0
- package/dist/payments/checkoutRecoveryPaymentResolver.js +87 -0
- package/dist/payments/contracts/adapter.d.ts +113 -0
- package/dist/payments/contracts/adapter.js +1 -0
- package/dist/payments/contracts/conformance.d.ts +155 -0
- package/dist/payments/contracts/conformance.js +1 -0
- package/dist/payments/contracts/evidence.d.ts +157 -0
- package/dist/payments/contracts/evidence.js +1 -0
- package/dist/payments/contracts/index.d.ts +10 -0
- package/dist/payments/contracts/index.js +1 -0
- package/dist/payments/contracts/preparedAttempt.d.ts +69 -0
- package/dist/payments/contracts/preparedAttempt.js +1 -0
- package/dist/payments/contracts/reconciliation.d.ts +303 -0
- package/dist/payments/contracts/reconciliation.js +1 -0
- package/dist/payments/contracts/repair.d.ts +92 -0
- package/dist/payments/contracts/repair.js +1 -0
- package/dist/payments/contracts/truth.d.ts +92 -0
- package/dist/payments/contracts/truth.js +1 -0
- package/dist/payments/eventConformanceRunner.d.ts +12 -0
- package/dist/payments/eventConformanceRunner.js +125 -0
- package/dist/payments/index.d.ts +16 -0
- package/dist/payments/index.js +16 -0
- package/dist/payments/paymentAttemptSilenceWindow.d.ts +10 -0
- package/dist/payments/paymentAttemptSilenceWindow.js +19 -0
- package/dist/payments/paymentMethodLifecycle.d.ts +11 -0
- package/dist/payments/paymentMethodLifecycle.js +37 -0
- package/dist/payments/paymentProviderReconciliationAbsenceReopen.d.ts +7 -0
- package/dist/payments/paymentProviderReconciliationAbsenceReopen.js +100 -0
- package/dist/payments/paymentProviderReconciliationEvidence.d.ts +36 -0
- package/dist/payments/paymentProviderReconciliationEvidence.js +91 -0
- package/dist/payments/paymentProviderReconciliationWorker.d.ts +4 -0
- package/dist/payments/paymentProviderReconciliationWorker.js +245 -0
- package/dist/payments/paymentTruth.d.ts +8 -0
- package/dist/payments/paymentTruth.js +125 -0
- package/dist/payments/paymentVerifyNowHandler.d.ts +27 -0
- package/dist/payments/paymentVerifyNowHandler.js +70 -0
- package/dist/payments/paymentVerifyNowService.d.ts +23 -0
- package/dist/payments/paymentVerifyNowService.js +93 -0
- package/dist/payments/paymentWebhookPostProcessing.d.ts +22 -0
- package/dist/payments/paymentWebhookPostProcessing.js +15 -0
- package/dist/payments/postgresPaymentTruth.d.ts +10 -0
- package/dist/payments/postgresPaymentTruth.js +126 -0
- package/dist/payments/preparedAttempt.d.ts +6 -0
- package/dist/payments/preparedAttempt.js +70 -0
- package/dist/payments/preparedAttemptFinalization.d.ts +5 -0
- package/dist/payments/preparedAttemptFinalization.js +12 -0
- package/dist/payments/schemaCapabilities.d.ts +10 -0
- package/dist/payments/schemaCapabilities.js +10 -0
- package/dist/payments/sql.d.ts +20 -0
- package/dist/payments/sql.js +6 -0
- package/dist/payments/stripe/classifyDecline.d.ts +46 -0
- package/dist/payments/stripe/classifyDecline.js +58 -0
- package/dist/payments/stripe/declineFailureHints.d.ts +46 -0
- package/dist/payments/stripe/declineFailureHints.js +87 -0
- package/dist/payments/stripe/donorContracts.d.ts +120 -0
- package/dist/payments/stripe/donorContracts.js +1 -0
- package/dist/payments/stripe/executionDecline.d.ts +53 -0
- package/dist/payments/stripe/executionDecline.js +107 -0
- package/dist/payments/stripe/index.d.ts +41 -0
- package/dist/payments/stripe/index.js +264 -0
- package/dist/payments/stripe/intentMapper.d.ts +26 -0
- package/dist/payments/stripe/intentMapper.js +51 -0
- package/dist/payments/stripe/methodFacts.d.ts +10 -0
- package/dist/payments/stripe/methodFacts.js +12 -0
- package/dist/payments/stripe/paymentFailureEvidence.d.ts +26 -0
- package/dist/payments/stripe/paymentFailureEvidence.js +33 -0
- package/dist/payments/stripe/stripeFailureEvidence.d.ts +41 -0
- package/dist/payments/stripe/stripeFailureEvidence.js +82 -0
- package/dist/payments/stripe/stripeIntentConfirmationEvidence.d.ts +28 -0
- package/dist/payments/stripe/stripeIntentConfirmationEvidence.js +32 -0
- package/dist/payments/stripe/stripePaymentReconciliationProvider.d.ts +35 -0
- package/dist/payments/stripe/stripePaymentReconciliationProvider.js +222 -0
- package/dist/payments/stripe/stripeRefundEvidence.d.ts +8 -0
- package/dist/payments/stripe/stripeRefundEvidence.js +17 -0
- package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.d.ts +45 -0
- package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.js +220 -0
- package/dist/payments/stripe/stripeWebhookNormalizer.d.ts +14 -0
- package/dist/payments/stripe/stripeWebhookNormalizer.js +243 -0
- package/dist/payments/stripe/webhookSignature.d.ts +14 -0
- package/dist/payments/stripe/webhookSignature.js +43 -0
- package/dist/payments/tpay/blikRecurringMapper.d.ts +37 -0
- package/dist/payments/tpay/blikRecurringMapper.js +24 -0
- package/dist/payments/tpay/capabilities.d.ts +3 -0
- package/dist/payments/tpay/capabilities.js +18 -0
- package/dist/payments/tpay/classifyDecline.d.ts +46 -0
- package/dist/payments/tpay/classifyDecline.js +58 -0
- package/dist/payments/tpay/declineFailureHints.d.ts +72 -0
- package/dist/payments/tpay/declineFailureHints.js +37 -0
- package/dist/payments/tpay/donorContracts.d.ts +140 -0
- package/dist/payments/tpay/donorContracts.js +1 -0
- package/dist/payments/tpay/index.d.ts +73 -0
- package/dist/payments/tpay/index.js +294 -0
- package/dist/payments/tpay/paymentFailureEvidence.d.ts +26 -0
- package/dist/payments/tpay/paymentFailureEvidence.js +33 -0
- package/dist/payments/tpay/preparedProviderAttempt.d.ts +22 -0
- package/dist/payments/tpay/preparedProviderAttempt.js +24 -0
- package/dist/payments/tpay/providerAttemptFailureDiagnostic.d.ts +3 -0
- package/dist/payments/tpay/providerAttemptFailureDiagnostic.js +95 -0
- package/dist/payments/tpay/tpayCreateTransactionInput.d.ts +25 -0
- package/dist/payments/tpay/tpayCreateTransactionInput.js +128 -0
- package/dist/payments/tpay/tpayDeclineEvidence.d.ts +126 -0
- package/dist/payments/tpay/tpayDeclineEvidence.js +177 -0
- package/dist/payments/tpay/tpayDispatchFailure.d.ts +60 -0
- package/dist/payments/tpay/tpayDispatchFailure.js +121 -0
- package/dist/payments/tpay/tpayFailureEvidence.d.ts +20 -0
- package/dist/payments/tpay/tpayFailureEvidence.js +61 -0
- package/dist/payments/tpay/tpayHttpClient.d.ts +52 -0
- package/dist/payments/tpay/tpayHttpClient.js +185 -0
- package/dist/payments/tpay/tpayHttpFailure.d.ts +57 -0
- package/dist/payments/tpay/tpayHttpFailure.js +143 -0
- package/dist/payments/tpay/tpayPaymentExecutionAdapter.d.ts +20 -0
- package/dist/payments/tpay/tpayPaymentExecutionAdapter.js +249 -0
- package/dist/payments/tpay/tpayPaymentReconciliationProvider.d.ts +5 -0
- package/dist/payments/tpay/tpayPaymentReconciliationProvider.js +244 -0
- package/dist/payments/tpay/tpayTransactionPayload.d.ts +120 -0
- package/dist/payments/tpay/tpayTransactionPayload.js +96 -0
- package/dist/payments/tpay/wallClockTime.d.ts +31 -0
- package/dist/payments/tpay/wallClockTime.js +57 -0
- package/dist/payments/tpay/webhookJwsVerifier.d.ts +17 -0
- package/dist/payments/tpay/webhookJwsVerifier.js +51 -0
- package/dist/payments/tpay/webhookNormalizer.d.ts +54 -0
- package/dist/payments/tpay/webhookNormalizer.js +200 -0
- package/dist/payments/verifiedEvidenceProjection.d.ts +12 -0
- package/dist/payments/verifiedEvidenceProjection.js +166 -0
- package/dist/payments/verifiedIngress.d.ts +119 -0
- package/dist/payments/verifiedIngress.js +220 -0
- package/package.json +37 -2
- package/release-gates.json +105 -3
- package/sql/20260808210000_fulfillment_shipment_rail.sql +810 -0
- package/sql/20260810180000_payment_settlement_rail.sql +574 -0
- package/sql/20260815150000_payment_truth_reconciliation.sql +479 -0
- package/sql/20260819150000_fulfillment_shipment_sequence.sql +98 -0
- package/sql/20260826100000_late_payment_shifts_the_subscription_cycle.sql +215 -0
- package/sql/20261022080000_fulfillment_command_ledger.sql +786 -0
- package/sql/20261022090000_fulfillment_delivery_alignment.sql +1106 -0
- package/src/composition/composeBundle.ts +13 -0
- package/src/composition/fulfillmentContribution.ts +28 -0
- package/src/composition/index.ts +2 -0
- package/src/fulfillment/adapterConformance.ts +195 -0
- package/src/fulfillment/bindings.ts +26 -0
- package/src/fulfillment/commerceFulfillmentHandlers.ts +263 -0
- package/src/fulfillment/commerceFulfillmentReadModel.ts +257 -0
- package/src/fulfillment/contracts/alignment.ts +13 -0
- package/src/fulfillment/contracts/bindings.ts +30 -0
- package/src/fulfillment/contracts/capabilities.ts +15 -0
- package/src/fulfillment/contracts/conformance.ts +61 -0
- package/src/fulfillment/contracts/customerAlignment.ts +4 -0
- package/src/fulfillment/contracts/dispatch.ts +58 -0
- package/src/fulfillment/contracts/index.ts +18 -0
- package/src/fulfillment/contracts/label.ts +9 -0
- package/src/fulfillment/contracts/nativeUnsupported.ts +6 -0
- package/src/fulfillment/contracts/observation.ts +18 -0
- package/src/fulfillment/contracts/operator.ts +31 -0
- package/src/fulfillment/contracts/read.ts +42 -0
- package/src/fulfillment/contracts/readback.ts +11 -0
- package/src/fulfillment/contracts/replacement.ts +15 -0
- package/src/fulfillment/contracts/store.ts +26 -0
- package/src/fulfillment/contracts/sync.ts +61 -0
- package/src/fulfillment/currentFulfillmentParcel.ts +2 -0
- package/src/fulfillment/delayReadModel.ts +60 -0
- package/src/fulfillment/deliveryAlignmentReadModel.ts +15 -0
- package/src/fulfillment/dispatchProjection.ts +20 -0
- package/src/fulfillment/fulfillmentObservationEffects.ts +86 -0
- package/src/fulfillment/handlerSchemas.ts +255 -0
- package/src/fulfillment/handlerSupport.ts +25 -0
- package/src/fulfillment/index.ts +38 -0
- package/src/fulfillment/labelLifecycle.ts +11 -0
- package/src/fulfillment/lowStockEvidenceHandler.ts +60 -0
- package/src/fulfillment/migrations.ts +8 -0
- package/src/fulfillment/nativeUnsupported.ts +23 -0
- package/src/fulfillment/normalizedFulfillmentFacts.ts +2 -0
- package/src/fulfillment/observationProjection.ts +41 -0
- package/src/fulfillment/omnipack/capabilities.ts +18 -0
- package/src/fulfillment/omnipack/client.ts +258 -0
- package/src/fulfillment/omnipack/index.ts +312 -0
- package/src/fulfillment/omnipack/mappers.ts +261 -0
- package/src/fulfillment/omnipack/observation.ts +61 -0
- package/src/fulfillment/omnipack/omnipackDispatchPayload.ts +93 -0
- package/src/fulfillment/omnipack/omnipackOutboundOrderPayload.ts +194 -0
- package/src/fulfillment/omnipack/omnipackProductPackPayload.ts +47 -0
- package/src/fulfillment/omnipack/omnipackProductPayload.ts +67 -0
- package/src/fulfillment/omnipack/omnipackReconciliationPayload.ts +7 -0
- package/src/fulfillment/omnipack/omnipackStatusVocabulary.ts +103 -0
- package/src/fulfillment/omnipack/omnipackWebhookPayload.ts +73 -0
- package/src/fulfillment/omnipack/productSyncMappers.ts +74 -0
- package/src/fulfillment/omnipack/providerError.ts +64 -0
- package/src/fulfillment/omnipack/trackingReferences.ts +77 -0
- package/src/fulfillment/paidFulfillmentRecovery.ts +252 -0
- package/src/fulfillment/paidHandoff.ts +122 -0
- package/src/fulfillment/paidHandoffPorts.ts +21 -0
- package/src/fulfillment/postgresDeliveryAlignment.ts +14 -0
- package/src/fulfillment/postgresDispatchStore.ts +55 -0
- package/src/fulfillment/postgresEvidenceReadPort.ts +59 -0
- package/src/fulfillment/postgresPaidFulfillmentRecovery.ts +29 -0
- package/src/fulfillment/postgresPaidHandoffStore.ts +11 -0
- package/src/fulfillment/postgresShipmentSpine.ts +321 -0
- package/src/fulfillment/postgresStockSyncPort.ts +65 -0
- package/src/fulfillment/productReconciliationEvidenceHandler.ts +64 -0
- package/src/fulfillment/providerCapabilities.ts +18 -0
- package/src/fulfillment/providerCommandLedger.ts +53 -0
- package/src/fulfillment/providerDispatchAcceptance.ts +31 -0
- package/src/fulfillment/providerDispatchError.ts +7 -0
- package/src/fulfillment/providerDispatchWorker.ts +131 -0
- package/src/fulfillment/providerProductSyncWorker.ts +154 -0
- package/src/fulfillment/providerReconciliationError.ts +20 -0
- package/src/fulfillment/providerReconciliationTerminalSkip.ts +8 -0
- package/src/fulfillment/providerReconciliationTimestamp.ts +34 -0
- package/src/fulfillment/providerReconciliationWorker.ts +150 -0
- package/src/fulfillment/providerStockAvailability.ts +60 -0
- package/src/fulfillment/providerStockSyncWorker.ts +222 -0
- package/src/fulfillment/providerTrackingReferences.ts +31 -0
- package/src/fulfillment/replacementRefusals.ts +43 -0
- package/src/fulfillment/replacementShipmentHandler.ts +47 -0
- package/src/fulfillment/schemaCapabilities.ts +7 -0
- package/src/fulfillment/shipmentsOverviewHandler.ts +73 -0
- package/src/fulfillment/statusMap.ts +2 -0
- package/src/fulfillment/trackingProgress.ts +1 -0
- package/src/fulfillment/verifiedIngress.ts +80 -0
- package/src/payments/adapterConformance.ts +118 -0
- package/src/payments/bindings.ts +17 -0
- package/src/payments/checkoutActivePaymentActionResolver.ts +97 -0
- package/src/payments/checkoutRecoveryPaymentResolver.ts +108 -0
- package/src/payments/contracts/adapter.ts +96 -0
- package/src/payments/contracts/conformance.ts +171 -0
- package/src/payments/contracts/evidence.ts +142 -0
- package/src/payments/contracts/index.ts +54 -0
- package/src/payments/contracts/preparedAttempt.ts +86 -0
- package/src/payments/contracts/reconciliation.ts +296 -0
- package/src/payments/contracts/repair.ts +95 -0
- package/src/payments/contracts/truth.ts +108 -0
- package/src/payments/eventConformanceRunner.ts +149 -0
- package/src/payments/index.ts +21 -0
- package/src/payments/paymentAttemptSilenceWindow.ts +26 -0
- package/src/payments/paymentMethodLifecycle.ts +50 -0
- package/src/payments/paymentProviderReconciliationAbsenceReopen.ts +130 -0
- package/src/payments/paymentProviderReconciliationEvidence.ts +117 -0
- package/src/payments/paymentProviderReconciliationWorker.ts +291 -0
- package/src/payments/paymentTruth.ts +131 -0
- package/src/payments/paymentVerifyNowHandler.ts +94 -0
- package/src/payments/paymentVerifyNowService.ts +125 -0
- package/src/payments/paymentWebhookPostProcessing.ts +36 -0
- package/src/payments/postgresPaymentTruth.ts +149 -0
- package/src/payments/preparedAttempt.ts +90 -0
- package/src/payments/preparedAttemptFinalization.ts +13 -0
- package/src/payments/schemaCapabilities.ts +10 -0
- package/src/payments/sql.ts +6 -0
- package/src/payments/stripe/classifyDecline.ts +62 -0
- package/src/payments/stripe/declineFailureHints.ts +89 -0
- package/src/payments/stripe/donorContracts.ts +87 -0
- package/src/payments/stripe/executionDecline.ts +126 -0
- package/src/payments/stripe/index.ts +265 -0
- package/src/payments/stripe/intentMapper.ts +58 -0
- package/src/payments/stripe/methodFacts.ts +21 -0
- package/src/payments/stripe/paymentFailureEvidence.ts +58 -0
- package/src/payments/stripe/stripeFailureEvidence.ts +115 -0
- package/src/payments/stripe/stripeIntentConfirmationEvidence.ts +34 -0
- package/src/payments/stripe/stripePaymentReconciliationProvider.ts +263 -0
- package/src/payments/stripe/stripeRefundEvidence.ts +19 -0
- package/src/payments/stripe/stripeSandboxPaymentExecutionAdapter.ts +283 -0
- package/src/payments/stripe/stripeWebhookNormalizer.ts +277 -0
- package/src/payments/stripe/webhookSignature.ts +55 -0
- package/src/payments/tpay/blikRecurringMapper.ts +42 -0
- package/src/payments/tpay/capabilities.ts +21 -0
- package/src/payments/tpay/classifyDecline.ts +62 -0
- package/src/payments/tpay/declineFailureHints.ts +90 -0
- package/src/payments/tpay/donorContracts.ts +104 -0
- package/src/payments/tpay/index.ts +293 -0
- package/src/payments/tpay/paymentFailureEvidence.ts +58 -0
- package/src/payments/tpay/preparedProviderAttempt.ts +38 -0
- package/src/payments/tpay/providerAttemptFailureDiagnostic.ts +99 -0
- package/src/payments/tpay/tpayCreateTransactionInput.ts +158 -0
- package/src/payments/tpay/tpayDeclineEvidence.ts +233 -0
- package/src/payments/tpay/tpayDispatchFailure.ts +186 -0
- package/src/payments/tpay/tpayFailureEvidence.ts +75 -0
- package/src/payments/tpay/tpayHttpClient.ts +290 -0
- package/src/payments/tpay/tpayHttpFailure.ts +186 -0
- package/src/payments/tpay/tpayPaymentExecutionAdapter.ts +297 -0
- package/src/payments/tpay/tpayPaymentReconciliationProvider.ts +285 -0
- package/src/payments/tpay/tpayTransactionPayload.ts +207 -0
- package/src/payments/tpay/wallClockTime.ts +57 -0
- package/src/payments/tpay/webhookJwsVerifier.ts +82 -0
- package/src/payments/tpay/webhookNormalizer.ts +279 -0
- package/src/payments/verifiedEvidenceProjection.ts +179 -0
- package/src/payments/verifiedIngress.ts +317 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
PaymentAttemptStatus,
|
|
3
|
+
PaymentExecutionBaseInput,
|
|
4
|
+
PaymentExecutionBaseResult,
|
|
5
|
+
} from "@openlup/core/payment";
|
|
6
|
+
|
|
7
|
+
/** Durable preparation facts; provider admission belongs to the caller. */
|
|
8
|
+
export interface PreparedAttemptPrepareInput<P extends string = string> {
|
|
9
|
+
idempotencyKey: string;
|
|
10
|
+
paymentIntentId: string;
|
|
11
|
+
provider: P;
|
|
12
|
+
providerIdempotencyKey: string;
|
|
13
|
+
providerRequestFingerprint: string;
|
|
14
|
+
providerFlow: string;
|
|
15
|
+
paymentMethodRef?: string | null;
|
|
16
|
+
requestPayload: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface PreparedAttemptPersistenceResult<N extends string = string> {
|
|
20
|
+
paymentAttemptId: string;
|
|
21
|
+
status: PaymentAttemptStatus;
|
|
22
|
+
replayed: boolean;
|
|
23
|
+
providerAttemptId: string | null;
|
|
24
|
+
providerSessionId: string | null;
|
|
25
|
+
nextActionKind: N | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface PreparedAttemptFinalizeInput<N extends string = string> extends Pick<
|
|
29
|
+
PaymentExecutionBaseResult,
|
|
30
|
+
"providerAttemptId" | "providerSessionId" | "attemptStatus" | "requestPayload" | "responsePayload"
|
|
31
|
+
> {
|
|
32
|
+
idempotencyKey: string;
|
|
33
|
+
paymentIntentId: string;
|
|
34
|
+
paymentAttemptId: string;
|
|
35
|
+
providerIdempotencyKey: string;
|
|
36
|
+
providerRequestFingerprint: string;
|
|
37
|
+
nextActionKind: N | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Only persistence capabilities needed by interactive attempt ordering. */
|
|
41
|
+
export interface PreparedAttemptPersistencePort<P extends string = string, N extends string = string> {
|
|
42
|
+
prepareProviderAttempt(input: PreparedAttemptPrepareInput<P>): Promise<PreparedAttemptPersistenceResult<N>>;
|
|
43
|
+
finalizeProviderAttempt(input: PreparedAttemptFinalizeInput<N>): Promise<PreparedAttemptPersistenceResult<N>>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface PreparedAttemptExecutionPort<I extends PaymentExecutionBaseInput, R extends PaymentExecutionBaseResult> {
|
|
47
|
+
validateInput?(input: I): void;
|
|
48
|
+
execute(input: I): Promise<R>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Exact execution extensions and original input/port references cross this seam. */
|
|
52
|
+
export interface PreparedAttemptExecutionInput<
|
|
53
|
+
I extends PaymentExecutionBaseInput,
|
|
54
|
+
R extends PaymentExecutionBaseResult,
|
|
55
|
+
P extends string,
|
|
56
|
+
N extends string,
|
|
57
|
+
> {
|
|
58
|
+
paymentPort: PreparedAttemptPersistencePort<P, N>;
|
|
59
|
+
executionPort: PreparedAttemptExecutionPort<I, R>;
|
|
60
|
+
provider: P;
|
|
61
|
+
paymentIntentId: string;
|
|
62
|
+
executionInput: I;
|
|
63
|
+
prepareIdempotencyKey: string;
|
|
64
|
+
finalizeIdempotencyKey: string;
|
|
65
|
+
providerIdempotencyKey: string;
|
|
66
|
+
providerRequestFingerprint: string;
|
|
67
|
+
providerFlow: string;
|
|
68
|
+
paymentMethodRef?: string | null;
|
|
69
|
+
prepareRequestPayload: Record<string, unknown>;
|
|
70
|
+
validateExecution?: (execution: R) => void;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Synchronous, call-scoped native trust, diagnostics and error construction. */
|
|
74
|
+
export interface PreparedAttemptFailurePolicy<E extends Error, N extends string> {
|
|
75
|
+
replayError(prepared: PreparedAttemptPersistenceResult<N>): Error;
|
|
76
|
+
isTrustedNoCharge(error: unknown): error is E;
|
|
77
|
+
logRetry(error: E, prepared: PreparedAttemptPersistenceResult<N>): void;
|
|
78
|
+
exhaustedError(error: E, first: E, prepared: PreparedAttemptPersistenceResult<N>): E;
|
|
79
|
+
executionError(error: unknown, prepared: PreparedAttemptPersistenceResult<N>): Error;
|
|
80
|
+
finalizationError(error: unknown, prepared: PreparedAttemptPersistenceResult<N>): Error;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface PreparedAttemptExecutionResult<R extends PaymentExecutionBaseResult> {
|
|
84
|
+
execution: R;
|
|
85
|
+
attempt: { paymentAttemptId: string; status: PaymentAttemptStatus };
|
|
86
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import type { ProviderReadPurpose } from "./evidence.js";
|
|
2
|
+
export type ReconciliationProviderKind = string;
|
|
3
|
+
export type ProviderReconciliationStatusKind = "succeeded" | "failed" | "pending" | "unknown";
|
|
4
|
+
|
|
5
|
+
export interface ProviderReconciliationStatus {
|
|
6
|
+
status: ProviderReconciliationStatusKind;
|
|
7
|
+
providerStatus: string;
|
|
8
|
+
occurredAt: string | null;
|
|
9
|
+
failureReason: string | null;
|
|
10
|
+
amountMinor: number | null;
|
|
11
|
+
currency: string | null;
|
|
12
|
+
rawPayload: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Who is asking, and therefore what an unresolved provider state MEANS.
|
|
17
|
+
*
|
|
18
|
+
* The same read answers two different questions. Reconciliation — the caller
|
|
19
|
+
* that names no purpose — asks "is this attempt over", long after the buyer
|
|
20
|
+
* left, and an intent still waiting for its first payment method is over. A
|
|
21
|
+
* buyer standing in a live checkout asks "is this attempt settled yet", and the
|
|
22
|
+
* same state means the opposite: nobody has been asked anything.
|
|
23
|
+
*
|
|
24
|
+
* ⛔ Omitting the purpose keeps the reconciliation reading. Terminalizing real
|
|
25
|
+
* abandonment is the more expensive of the two errors to lose, so it is the
|
|
26
|
+
* behaviour a caller gets by default rather than one it must opt into.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
export interface PaymentProviderReconciliationProvider {
|
|
31
|
+
readPayment(input: {
|
|
32
|
+
providerPaymentId: string;
|
|
33
|
+
attempt?: ClaimedPaymentAttempt;
|
|
34
|
+
purpose?: ProviderReadPurpose;
|
|
35
|
+
}): Promise<ProviderReconciliationStatus>;
|
|
36
|
+
/** Atomically close an incomplete provider object before minting a replacement. */
|
|
37
|
+
closePayment?(input: { providerPaymentId: string }): Promise<ProviderReconciliationStatus>;
|
|
38
|
+
|
|
39
|
+
/** Exact provider-side absence only; missing local acknowledgement is not
|
|
40
|
+
* absence proof and must never authorize another charge. */
|
|
41
|
+
findPaymentByLocalIntent?(input: {
|
|
42
|
+
attempt: ClaimedPaymentAttempt;
|
|
43
|
+
}): Promise<"found" | "absent">;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ClaimedPaymentAttempt {
|
|
47
|
+
paymentAttemptId: string;
|
|
48
|
+
paymentIntentId: string;
|
|
49
|
+
paymentId: string;
|
|
50
|
+
orderId: string;
|
|
51
|
+
subscriptionId: string | null;
|
|
52
|
+
subscriptionCycleId: string | null;
|
|
53
|
+
provider: ReconciliationProviderKind;
|
|
54
|
+
providerPaymentId: string | null;
|
|
55
|
+
providerAttemptId: string | null;
|
|
56
|
+
providerSessionId: string | null;
|
|
57
|
+
attemptStatus: string;
|
|
58
|
+
intentStatus: string;
|
|
59
|
+
amountMinor: number;
|
|
60
|
+
currency: string;
|
|
61
|
+
orderMode: "one_time" | "subscription_cycle";
|
|
62
|
+
cycleRetryAttempt: number;
|
|
63
|
+
cycleNextRetryAt: string | null;
|
|
64
|
+
localUpdatedAt: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
export type ManualInteractivePreparedAttemptAbsenceEvidence = {
|
|
69
|
+
providerAbsenceConfirmed: true;
|
|
70
|
+
watchdogEvidence: true;
|
|
71
|
+
evidenceCode: "operator_verified_absence" | "operator_documented_absence";
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export interface InteractivePreparedAttemptReopenResult {
|
|
75
|
+
paymentAttemptId: string;
|
|
76
|
+
paymentIntentId: string;
|
|
77
|
+
paymentAttemptStatus: "failed";
|
|
78
|
+
paymentIntentStatus: "failed";
|
|
79
|
+
replayed: boolean;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface PaymentProviderReconciliationPort {
|
|
83
|
+
claimPreparedAttempts(input: {
|
|
84
|
+
now: string;
|
|
85
|
+
staleAfterSeconds: number;
|
|
86
|
+
limit: number;
|
|
87
|
+
claimKey: string;
|
|
88
|
+
}): Promise<ClaimedPaymentAttempt[]>;
|
|
89
|
+
claimStaleAttempts(input: {
|
|
90
|
+
now: string;
|
|
91
|
+
staleAfterSeconds: number;
|
|
92
|
+
limit: number;
|
|
93
|
+
claimKey: string;
|
|
94
|
+
}): Promise<ClaimedPaymentAttempt[]>;
|
|
95
|
+
recordEvidence(input: {
|
|
96
|
+
idempotencyKey: string;
|
|
97
|
+
provider: ReconciliationProviderKind;
|
|
98
|
+
providerPaymentId: string | null;
|
|
99
|
+
paymentIntentId: string;
|
|
100
|
+
paymentAttemptId: string;
|
|
101
|
+
localStatus: string;
|
|
102
|
+
providerStatus: string;
|
|
103
|
+
correctionStatus: "observed" | "corrected" | "ignored" | "failed";
|
|
104
|
+
checkedAt: string;
|
|
105
|
+
payload: Record<string, unknown>;
|
|
106
|
+
}): Promise<{ replayed: boolean }>;
|
|
107
|
+
applyTerminalResult(input: {
|
|
108
|
+
idempotencyKey: string;
|
|
109
|
+
expectedOrderId: string;
|
|
110
|
+
expectedPaymentIntentId: string;
|
|
111
|
+
expectedPaymentAttemptId: string;
|
|
112
|
+
expectedPaymentId: string;
|
|
113
|
+
provider: ReconciliationProviderKind;
|
|
114
|
+
providerPaymentId: string;
|
|
115
|
+
localStatus: string;
|
|
116
|
+
providerStatus: string;
|
|
117
|
+
resultStatus: "succeeded" | "failed";
|
|
118
|
+
occurredAt: string;
|
|
119
|
+
failureReason: string | null;
|
|
120
|
+
/**
|
|
121
|
+
* The class the reading adapter already decided for this refusal, persisted
|
|
122
|
+
* beside the refusal itself on both the attempt and the dunning case the
|
|
123
|
+
* terminal write opens.
|
|
124
|
+
*
|
|
125
|
+
* OPTIONAL, and absence is a real state rather than a default: a caller that
|
|
126
|
+
* omits it writes exactly what it wrote before this field existed, because
|
|
127
|
+
* the RPC coalesces it to NULL and the SQL treats a NULL class as "stamp
|
|
128
|
+
* nothing" rather than "stamp NULL". Two of this port's three consumers
|
|
129
|
+
* (`paymentVerifyNowService`, `checkoutRecoveryPaymentResolver`) resolve a
|
|
130
|
+
* payment without classifying it and are pinned to stay classification-absent.
|
|
131
|
+
*
|
|
132
|
+
* Shape mirrors `applyPaymentResultRpc` deliberately, so the synchronous
|
|
133
|
+
* decline rail and this polling rail hand the control plane the same object.
|
|
134
|
+
*/
|
|
135
|
+
failureClassification?: { failureClass: string; decidedBy: string } | null;
|
|
136
|
+
checkedAt: string;
|
|
137
|
+
payload: Record<string, unknown>;
|
|
138
|
+
}): Promise<{
|
|
139
|
+
replayed: boolean;
|
|
140
|
+
paymentResult: {
|
|
141
|
+
paymentIntentId: string;
|
|
142
|
+
paymentAttemptId: string;
|
|
143
|
+
paymentId: string;
|
|
144
|
+
orderId: string;
|
|
145
|
+
status: string;
|
|
146
|
+
kind: string;
|
|
147
|
+
replayed: boolean;
|
|
148
|
+
};
|
|
149
|
+
correctionStatus: "corrected" | "ignored";
|
|
150
|
+
subscriptionWebhookDunning: {
|
|
151
|
+
opened: boolean;
|
|
152
|
+
replayed: boolean;
|
|
153
|
+
caseId: string | null;
|
|
154
|
+
} | null;
|
|
155
|
+
}>;
|
|
156
|
+
reopenPreparedAttemptAfterAbsence(input: {
|
|
157
|
+
idempotencyKey: string;
|
|
158
|
+
paymentAttemptId: string;
|
|
159
|
+
expectedPaymentIntentId: string;
|
|
160
|
+
expectedSubscriptionCycleId: string;
|
|
161
|
+
operatorRef: string;
|
|
162
|
+
absenceCheckedAt: string;
|
|
163
|
+
nextRetryAt: string;
|
|
164
|
+
absenceEvidence: Record<string, unknown>;
|
|
165
|
+
}): Promise<{ replayed: boolean }>;
|
|
166
|
+
/**
|
|
167
|
+
* Optional because the automatic reconciliation worker and its provider
|
|
168
|
+
* neutral fixtures must not acquire an operator-only interactive capability.
|
|
169
|
+
* A caller that selects this rail must require the narrow interface below.
|
|
170
|
+
*/
|
|
171
|
+
reopenInteractivePreparedAttemptAfterAbsence?(input: {
|
|
172
|
+
idempotencyKey: string;
|
|
173
|
+
paymentAttemptId: string;
|
|
174
|
+
expectedPaymentIntentId: string;
|
|
175
|
+
expectedOrderId: string;
|
|
176
|
+
expectedSubscriptionId: string | null;
|
|
177
|
+
expectedSubscriptionCycleId: string | null;
|
|
178
|
+
operatorRef: string;
|
|
179
|
+
absenceCheckedAt: string;
|
|
180
|
+
absenceEvidence: ManualInteractivePreparedAttemptAbsenceEvidence;
|
|
181
|
+
}): Promise<InteractivePreparedAttemptReopenResult>;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Service-role operator boundary for an interactive checkout, distinct from
|
|
186
|
+
* the renewal retry RPC. It terminalizes the local prepared attempt after a
|
|
187
|
+
* human/provider absence confirmation; it never schedules dunning or cron.
|
|
188
|
+
*/
|
|
189
|
+
export interface InteractivePreparedAttemptManualReconciliationPort extends PaymentProviderReconciliationPort {
|
|
190
|
+
reopenInteractivePreparedAttemptAfterAbsence(input: {
|
|
191
|
+
idempotencyKey: string;
|
|
192
|
+
paymentAttemptId: string;
|
|
193
|
+
expectedPaymentIntentId: string;
|
|
194
|
+
expectedOrderId: string;
|
|
195
|
+
expectedSubscriptionId: string | null;
|
|
196
|
+
expectedSubscriptionCycleId: string | null;
|
|
197
|
+
operatorRef: string;
|
|
198
|
+
absenceCheckedAt: string;
|
|
199
|
+
absenceEvidence: ManualInteractivePreparedAttemptAbsenceEvidence;
|
|
200
|
+
}): Promise<InteractivePreparedAttemptReopenResult>;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export interface PaymentProviderReconciliationWorkerResult {
|
|
204
|
+
ok: boolean;
|
|
205
|
+
checked: number;
|
|
206
|
+
corrected: number;
|
|
207
|
+
succeeded: number;
|
|
208
|
+
failed: number;
|
|
209
|
+
pending: number;
|
|
210
|
+
unknown: number;
|
|
211
|
+
ignored: number;
|
|
212
|
+
dunningOpened: number;
|
|
213
|
+
replayed: number;
|
|
214
|
+
providerCalls: number;
|
|
215
|
+
preparedWithoutProviderAck: number;
|
|
216
|
+
preparedAttemptsReopened: number;
|
|
217
|
+
manualReview: number;
|
|
218
|
+
/**
|
|
219
|
+
* Attempts whose rail has answered non-terminally for longer than that rail
|
|
220
|
+
* declares normal. Counted, never acted on: elapsed time is not evidence
|
|
221
|
+
* about money, so this surfaces a case for a human rather than resolving it.
|
|
222
|
+
*/
|
|
223
|
+
silenceOverdue: number;
|
|
224
|
+
amountCurrencyMismatches: number;
|
|
225
|
+
failures: number;
|
|
226
|
+
skipped: boolean;
|
|
227
|
+
reason?: string;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export interface PaymentProviderReconciliationWorkerInput {
|
|
231
|
+
port: PaymentProviderReconciliationPort;
|
|
232
|
+
providers: Partial<Record<ReconciliationProviderKind, PaymentProviderReconciliationProvider>>;
|
|
233
|
+
now?: string;
|
|
234
|
+
staleAfterSeconds?: number;
|
|
235
|
+
batchSize?: number;
|
|
236
|
+
claimKey?: string;
|
|
237
|
+
/**
|
|
238
|
+
* When true, prepared attempts whose provider proves absence (see
|
|
239
|
+
* PaymentProviderReconciliationProvider.findPaymentByLocalIntent) and that
|
|
240
|
+
* are at least MIN_PREPARED_ABSENCE_REOPEN_AGE_SECONDS old are automatically
|
|
241
|
+
* reopened for cron retry via the operator RPC. Default false — the
|
|
242
|
+
* stranded-attempt loop stays operator-manual unless the flag is on.
|
|
243
|
+
*/
|
|
244
|
+
autoReopenPreparedAbsence?: boolean;
|
|
245
|
+
/**
|
|
246
|
+
* Published rail capabilities, read to learn how long a non-terminal answer
|
|
247
|
+
* from each rail is still normal. Optional: without it no attempt is ever
|
|
248
|
+
* counted overdue, so omitting it preserves today's behaviour exactly.
|
|
249
|
+
*/
|
|
250
|
+
capabilities?: SilenceWindowLookup;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* The narrow slice of the capability registry this worker reads.
|
|
255
|
+
*
|
|
256
|
+
* Declared here rather than importing the whole registry type so the worker
|
|
257
|
+
* depends on the one question it asks - "when does this rail's silence stop
|
|
258
|
+
* being normal" - and not on the shape of every unattended-charge capability.
|
|
259
|
+
*/
|
|
260
|
+
export interface SilenceWindowLookup {
|
|
261
|
+
get(providerKind: string): { terminalOutcomeReporting?: { silenceBecomesSuspectAfterMinutes: number } } | null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
export interface VerifiableAttemptSnapshot {
|
|
267
|
+
orderId: string;
|
|
268
|
+
orderClientId: string;
|
|
269
|
+
orderMode: string;
|
|
270
|
+
paymentIntentId: string;
|
|
271
|
+
intentStatus: string;
|
|
272
|
+
intentProviderPaymentId: string | null;
|
|
273
|
+
paymentAttemptId: string;
|
|
274
|
+
paymentId: string;
|
|
275
|
+
attemptStatus: string;
|
|
276
|
+
provider: string;
|
|
277
|
+
providerAttemptId: string | null;
|
|
278
|
+
providerSessionId: string | null;
|
|
279
|
+
amountMinor: number;
|
|
280
|
+
currency: string;
|
|
281
|
+
localUpdatedAt: string;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
export interface PaymentVerifyReadPort {
|
|
286
|
+
readVerifiableAttempt(input: {
|
|
287
|
+
orderId: string;
|
|
288
|
+
paymentIntentId: string;
|
|
289
|
+
}): Promise<VerifiableAttemptSnapshot | null>;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
export type PaymentVerifyNowResult =
|
|
294
|
+
| { status: string; verified: false; applied: false; providerPaymentId: string | null; attempt: ClaimedPaymentAttempt | null }
|
|
295
|
+
| { status: "unavailable" | "pending" | "manual_review"; verified: boolean; applied: false; providerPaymentId: string | null; attempt: ClaimedPaymentAttempt | null }
|
|
296
|
+
| { status: "succeeded" | "failed"; verified: true; applied: boolean; providerPaymentId: string; attempt: ClaimedPaymentAttempt };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { PaymentMethodHandoff } from "./adapter.js";
|
|
2
|
+
import type { ClaimedPaymentAttempt, PaymentProviderReconciliationProvider, ProviderReconciliationStatus, PaymentVerifyReadPort } from "./reconciliation.js";
|
|
3
|
+
import type { ProviderReadPurpose } from "./evidence.js";
|
|
4
|
+
|
|
5
|
+
export type CheckoutRecoveryPaymentResolution =
|
|
6
|
+
| { kind: "paid" }
|
|
7
|
+
| { kind: "retry_new" }
|
|
8
|
+
| { kind: "resume_existing"; clientAction: PaymentRecoveryAction }
|
|
9
|
+
| { kind: "awaiting_provider" }
|
|
10
|
+
| { kind: "manual_review" };
|
|
11
|
+
|
|
12
|
+
export interface ProviderPaymentReferenceInput {
|
|
13
|
+
providerAttemptId: string | null;
|
|
14
|
+
providerSessionId: string | null;
|
|
15
|
+
intentProviderPaymentId: string | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type PaymentRecoveryAction = { provider: string } & PaymentMethodHandoff;
|
|
19
|
+
|
|
20
|
+
export interface ProviderRecoveryRead {
|
|
21
|
+
status: ProviderReconciliationStatus;
|
|
22
|
+
identityMatches: boolean;
|
|
23
|
+
configuredMoneyMatches: boolean;
|
|
24
|
+
manualReviewRequired: boolean;
|
|
25
|
+
clientAction: PaymentRecoveryAction | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Recovery is an explicit capability, not an optional method on generic
|
|
30
|
+
* reconciliation providers. One read returns both PSP truth and any transient
|
|
31
|
+
* buyer action, so a redeem never calls the provider twice.
|
|
32
|
+
*/
|
|
33
|
+
export interface PaymentProviderRecoveryProvider extends PaymentProviderReconciliationProvider {
|
|
34
|
+
resolvePaymentReference(input: ProviderPaymentReferenceInput): string | null;
|
|
35
|
+
readRecoveryPayment(input: {
|
|
36
|
+
providerPaymentId: string;
|
|
37
|
+
attempt: ClaimedPaymentAttempt;
|
|
38
|
+
purpose?: ProviderReadPurpose;
|
|
39
|
+
}): Promise<ProviderRecoveryRead>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface CheckoutRecoveryPaymentResolver {
|
|
43
|
+
resolve(input: {
|
|
44
|
+
orderId: string;
|
|
45
|
+
paymentIntentId: string | null;
|
|
46
|
+
intentStatus?: string | null;
|
|
47
|
+
}): Promise<CheckoutRecoveryPaymentResolution>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
export interface ActivePaymentActionAuthority {
|
|
52
|
+
orderId: string;
|
|
53
|
+
clientId: string;
|
|
54
|
+
paymentIntentId: string;
|
|
55
|
+
paymentAttemptId: string;
|
|
56
|
+
executionRail: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface CheckoutActivePaymentActionResolver {
|
|
60
|
+
readActiveAction(authority: ActivePaymentActionAuthority): Promise<PaymentRecoveryAction | null>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type CheckoutActionReadProvider = Pick<
|
|
64
|
+
PaymentProviderRecoveryProvider,
|
|
65
|
+
"resolvePaymentReference" | "readRecoveryPayment"
|
|
66
|
+
>;
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/** Method collection only. Hosts authorize ownership before calling this port.
|
|
70
|
+
* The result never confirms payment, redeems a token or writes a subscription.
|
|
71
|
+
* Handoffs remain transient; unsupported must be shown as an explicit refusal.
|
|
72
|
+
*/
|
|
73
|
+
export interface PaymentRepairMethodPort {
|
|
74
|
+
setupMethod(input: {
|
|
75
|
+
customer: string;
|
|
76
|
+
metadata: Record<string, string>;
|
|
77
|
+
idempotencyKey: string;
|
|
78
|
+
}): Promise<
|
|
79
|
+
| { kind: "ready"; setupRef: string; handoff: PaymentMethodHandoff; replayed: boolean }
|
|
80
|
+
| { kind: "unsupported" }
|
|
81
|
+
>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Host-selected durable truth scope. Unsupported schema never opens a store. */
|
|
85
|
+
export interface PaymentServicesOptions {
|
|
86
|
+
schema?: { truth: "supported" | "unsupported" };
|
|
87
|
+
openTruth?: () => Promise<{
|
|
88
|
+
port: import("./truth.js").PaymentTruthPort;
|
|
89
|
+
close(): Promise<void>;
|
|
90
|
+
}>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface PaymentServices {
|
|
94
|
+
run<T>(work: (port: import("./truth.js").PaymentTruthPort) => Promise<T>): Promise<T>;
|
|
95
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
export type PaymentTruthOutcome = "captured" | "refused" | "indeterminate";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* How a refusal looked to the settlement source that reported it.
|
|
8
|
+
*
|
|
9
|
+
* NOT the retry taxonomy. `PaymentFailureClass` in `@openlup/core/payment` is a
|
|
10
|
+
* different vocabulary with no value in common: that one answers "may this be
|
|
11
|
+
* retried, and how", and is what `commerce_payment_attempts.failure_class`
|
|
12
|
+
* persists. This one answers "what did the source say happened" and never leaves
|
|
13
|
+
* this module's reconciliation ledger. They shared a name until this wave, which
|
|
14
|
+
* meant an import could quietly resolve to the wrong five strings.
|
|
15
|
+
*/
|
|
16
|
+
export type PaymentTruthRefusalClass =
|
|
17
|
+
| "authorization_refused"
|
|
18
|
+
| "insufficient_funds"
|
|
19
|
+
| "method_unavailable"
|
|
20
|
+
| "risk_refused"
|
|
21
|
+
| "unknown_refusal";
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
export type PaymentSourceEvidence = {
|
|
25
|
+
sourceKind: "accepted_event" | "reconciliation_read";
|
|
26
|
+
sourceReference: string;
|
|
27
|
+
observedStatus: string;
|
|
28
|
+
observedAt: string;
|
|
29
|
+
payloadFingerprint: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
export type PaymentTruthEvent = {
|
|
34
|
+
sourceEventId: string;
|
|
35
|
+
idempotencyKey: string;
|
|
36
|
+
settlementIntentId: string;
|
|
37
|
+
outcome: PaymentTruthOutcome;
|
|
38
|
+
amountMinor: number;
|
|
39
|
+
currency: string;
|
|
40
|
+
occurredAt: string;
|
|
41
|
+
failure: { classification: PaymentTruthRefusalClass; reason: string | null } | null;
|
|
42
|
+
evidence: PaymentSourceEvidence;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
export type PaymentReconciliationResult = {
|
|
47
|
+
eventId: string;
|
|
48
|
+
idempotencyKey: string;
|
|
49
|
+
evidenceStatus: "observed" | "failed";
|
|
50
|
+
outcome: PaymentTruthOutcome;
|
|
51
|
+
occurredAt: string;
|
|
52
|
+
failure: PaymentTruthEvent["failure"];
|
|
53
|
+
evidence: PaymentSourceEvidence;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
export type PaymentTruthReadback = {
|
|
58
|
+
event: {
|
|
59
|
+
id: string;
|
|
60
|
+
sourceEventId: string;
|
|
61
|
+
fingerprint: string;
|
|
62
|
+
state: "open" | "settled";
|
|
63
|
+
outcome: PaymentTruthOutcome;
|
|
64
|
+
replayed: boolean;
|
|
65
|
+
};
|
|
66
|
+
effects: {
|
|
67
|
+
paymentResultRecorded: boolean;
|
|
68
|
+
dunningOpened: boolean;
|
|
69
|
+
accountingRequested: boolean;
|
|
70
|
+
};
|
|
71
|
+
financial: {
|
|
72
|
+
settlementStatus: string | null;
|
|
73
|
+
orderStatus: string | null;
|
|
74
|
+
subscriptionStatus: string | null;
|
|
75
|
+
accountingStatus: string | null;
|
|
76
|
+
amountMinor: number;
|
|
77
|
+
currency: string;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
export interface PaymentTruthPort {
|
|
83
|
+
ingestEvent(input: PaymentTruthEvent): Promise<PaymentTruthReadback>;
|
|
84
|
+
recordReconciliation(input: PaymentReconciliationResult): Promise<PaymentTruthReadback>;
|
|
85
|
+
sweepOpenEvents(input: { now: string; limit: number }): Promise<{
|
|
86
|
+
claimed: number;
|
|
87
|
+
settledIgnored: number;
|
|
88
|
+
eventIds: string[];
|
|
89
|
+
}>;
|
|
90
|
+
readEvent(eventId: string): Promise<PaymentTruthReadback | null>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
export type CanonicalPaymentSource = {
|
|
95
|
+
sourceEventId: string;
|
|
96
|
+
eventKind: string;
|
|
97
|
+
settlementIntentId: string | null;
|
|
98
|
+
amountMinor: number | null;
|
|
99
|
+
currency: string | null;
|
|
100
|
+
occurredAt: string | null;
|
|
101
|
+
payloadFingerprint: string;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export type PostgresPaymentTruthOptions = {
|
|
105
|
+
dunningTemplateSlug: string;
|
|
106
|
+
recoveryUrlPath: string;
|
|
107
|
+
recoveryTemplateSlug: string;
|
|
108
|
+
};
|