@openlup/platform 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +138 -218
- package/README.md +229 -16
- package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
- package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
- package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
- package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
- package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
- package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
- package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
- package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
- package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
- package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
- package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
- package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
- package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
- package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
- package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
- package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
- package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
- package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
- package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
- package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
- package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
- package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
- package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
- package/dist/commerce/adapters/managed/oms/types.js +7 -0
- package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
- package/dist/commerce/checkoutCommandSchemas.js +70 -0
- package/dist/commerce/checkoutHelpers.d.ts +21 -0
- package/dist/commerce/checkoutHelpers.js +29 -0
- package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
- package/dist/commerce/checkoutResumeSchemas.js +145 -0
- package/dist/commerce/checkoutSchemas.d.ts +158 -0
- package/dist/commerce/checkoutSchemas.js +161 -0
- package/dist/commerce/commerceReturnsPort.d.ts +97 -0
- package/dist/commerce/commerceReturnsPort.js +39 -0
- package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
- package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
- package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
- package/dist/commerce/configuratorIntentSchemas.js +43 -0
- package/dist/commerce/contractPrimitives.d.ts +50 -0
- package/dist/commerce/contractPrimitives.js +25 -0
- package/dist/commerce/contracts/availability.d.ts +23 -0
- package/dist/commerce/contracts/availability.js +1 -0
- package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
- package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
- package/dist/commerce/contracts/index.d.ts +13 -0
- package/dist/commerce/contracts/index.js +1 -0
- package/dist/commerce/contracts/intent.d.ts +86 -0
- package/dist/commerce/contracts/intent.js +1 -0
- package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
- package/dist/commerce/contracts/omsTypes.js +1 -0
- package/dist/commerce/contracts/order.d.ts +39 -0
- package/dist/commerce/contracts/order.js +1 -0
- package/dist/commerce/contracts/orderMoney.d.ts +52 -0
- package/dist/commerce/contracts/orderMoney.js +1 -0
- package/dist/commerce/contracts/ports.d.ts +113 -0
- package/dist/commerce/contracts/ports.js +1 -0
- package/dist/commerce/contracts/recovery.d.ts +11 -0
- package/dist/commerce/contracts/recovery.js +1 -0
- package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
- package/dist/commerce/contracts/runtimePorts.js +1 -0
- package/dist/commerce/contracts/state.d.ts +26 -0
- package/dist/commerce/contracts/state.js +43 -0
- package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
- package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
- package/dist/commerce/errors.d.ts +18 -0
- package/dist/commerce/errors.js +36 -0
- package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
- package/dist/commerce/fulfillmentEligibility.js +31 -0
- package/dist/commerce/index.d.ts +72 -0
- package/dist/commerce/index.js +67 -0
- package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
- package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
- package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
- package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
- package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
- package/dist/commerce/model/omsAccountingVisibility.js +118 -0
- package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
- package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
- package/dist/commerce/model/omsCurrency.d.ts +4 -0
- package/dist/commerce/model/omsCurrency.js +5 -0
- package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
- package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
- package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
- package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
- package/dist/commerce/model/omsListTotals.d.ts +13 -0
- package/dist/commerce/model/omsListTotals.js +32 -0
- package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
- package/dist/commerce/model/omsOperationalLadder.js +158 -0
- package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
- package/dist/commerce/model/omsOrderLineMoney.js +25 -0
- package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
- package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
- package/dist/commerce/model/omsReadModel.d.ts +43 -0
- package/dist/commerce/model/omsReadModel.js +211 -0
- package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
- package/dist/commerce/model/omsReadModelCommunication.js +29 -0
- package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
- package/dist/commerce/model/omsReadModelHelpers.js +212 -0
- package/dist/commerce/model/omsReadModelList.d.ts +33 -0
- package/dist/commerce/model/omsReadModelList.js +50 -0
- package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
- package/dist/commerce/model/omsReadModelListSummary.js +13 -0
- package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
- package/dist/commerce/model/omsReadModelPricing.js +36 -0
- package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
- package/dist/commerce/model/omsReadModelProjections.js +1 -0
- package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
- package/dist/commerce/model/omsReadModelRowCore.js +149 -0
- package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
- package/dist/commerce/model/omsReadModelRows.js +6 -0
- package/dist/commerce/offerAvailability.d.ts +18 -0
- package/dist/commerce/offerAvailability.js +53 -0
- package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
- package/dist/commerce/offerAvailabilitySchemas.js +42 -0
- package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
- package/dist/commerce/offerEvidenceSchemas.js +13 -0
- package/dist/commerce/oms/omsContractBase.d.ts +130 -0
- package/dist/commerce/oms/omsContractBase.js +86 -0
- package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
- package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
- package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
- package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
- package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
- package/dist/commerce/oms/omsContractRequests.js +118 -0
- package/dist/commerce/oms/omsContracts.d.ts +5 -0
- package/dist/commerce/oms/omsContracts.js +4 -0
- package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
- package/dist/commerce/oms/omsControlPlane.js +72 -0
- package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
- package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
- package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
- package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
- package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
- package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
- package/dist/commerce/oms/omsPorts.d.ts +84 -0
- package/dist/commerce/oms/omsPorts.js +148 -0
- package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
- package/dist/commerce/oms/omsPrimitives.js +3 -0
- package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
- package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
- package/dist/commerce/orderDraftErrors.d.ts +13 -0
- package/dist/commerce/orderDraftErrors.js +20 -0
- package/dist/commerce/orderEmailEligibility.d.ts +54 -0
- package/dist/commerce/orderEmailEligibility.js +123 -0
- package/dist/commerce/orderEmailLines.d.ts +12 -0
- package/dist/commerce/orderEmailLines.js +8 -0
- package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
- package/dist/commerce/orderFeedbackContracts.js +33 -0
- package/dist/commerce/orderMoney.d.ts +6 -0
- package/dist/commerce/orderMoney.js +168 -0
- package/dist/commerce/orderReviewContracts.d.ts +475 -0
- package/dist/commerce/orderReviewContracts.js +94 -0
- package/dist/commerce/orderReviewPorts.d.ts +140 -0
- package/dist/commerce/orderReviewPorts.js +1 -0
- package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
- package/dist/commerce/outboxDispatchContracts.js +1 -0
- package/dist/commerce/outboxEventSchemas.d.ts +162 -0
- package/dist/commerce/outboxEventSchemas.js +164 -0
- package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
- package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
- package/dist/commerce/paymentContinuation.d.ts +4 -0
- package/dist/commerce/paymentContinuation.js +4 -0
- package/dist/commerce/ports.d.ts +8 -0
- package/dist/commerce/ports.js +1 -0
- package/dist/commerce/recoveryDestination.d.ts +3 -0
- package/dist/commerce/recoveryDestination.js +17 -0
- package/dist/commerce/runtimeErrors.d.ts +8 -0
- package/dist/commerce/runtimeErrors.js +16 -0
- package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
- package/dist/commerce/salesChannelEnvelope.js +7 -0
- package/dist/commerce/schemas.d.ts +174 -0
- package/dist/commerce/schemas.js +84 -0
- package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
- package/dist/commerce/server/checkoutCompensation.js +32 -0
- package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
- package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
- package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
- package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
- package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
- package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
- package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
- package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
- package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
- package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
- package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
- package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
- package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
- package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
- package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
- package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
- package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
- package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
- package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
- package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
- package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
- package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
- package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
- package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
- package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
- package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
- package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
- package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
- package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
- package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
- package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
- package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
- package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
- package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
- package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
- package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
- package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
- package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
- package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
- package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
- package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
- package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
- package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
- package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
- package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
- package/dist/commerce/server/commerceCheckoutResume.js +81 -0
- package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
- package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
- package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
- package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
- package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
- package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
- package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
- package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
- package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
- package/dist/commerce/server/commerceDiagnostics.js +31 -0
- package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
- package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
- package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
- package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
- package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
- package/dist/commerce/server/commerceOmsHandlers.js +176 -0
- package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
- package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
- package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
- package/dist/commerce/server/commerceOrderDraft.js +92 -0
- package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
- package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
- package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
- package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
- package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
- package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
- package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
- package/dist/commerce/server/commerceRuntimePort.js +57 -0
- package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
- package/dist/commerce/server/commerceRuntimeService.js +186 -0
- package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
- package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
- package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
- package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
- package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
- package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
- package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
- package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
- package/dist/commerce/server/emailRuntime.d.ts +47 -0
- package/dist/commerce/server/emailRuntime.js +1 -0
- package/dist/commerce/server/handlerSupport.d.ts +68 -0
- package/dist/commerce/server/handlerSupport.js +1 -0
- package/dist/commerce/server/index.d.ts +178 -0
- package/dist/commerce/server/index.js +127 -0
- package/dist/commerce/server/offerAvailability.d.ts +21 -0
- package/dist/commerce/server/offerAvailability.js +163 -0
- package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
- package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
- package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
- package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
- package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
- package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
- package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
- package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
- package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
- package/dist/commerce/server/orderReviewHandlers.js +42 -0
- package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
- package/dist/commerce/server/orderReviewLifecycle.js +121 -0
- package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
- package/dist/commerce/server/orderReviewMedia.js +172 -0
- package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
- package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
- package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
- package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
- package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
- package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
- package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
- package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
- package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
- package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
- package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
- package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
- package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
- package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
- package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
- package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
- package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
- package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
- package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
- package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
- package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
- package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
- package/dist/commerce/server/reservationSweepPort.js +45 -0
- package/dist/commerce/server/starterTermsPort.d.ts +22 -0
- package/dist/commerce/server/starterTermsPort.js +1 -0
- package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
- package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
- package/dist/communications/consentPurposeRegistry.d.ts +1 -1
- package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
- package/dist/composition/commerceContribution.d.ts +21 -0
- package/dist/composition/commerceContribution.js +27 -0
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +1 -0
- package/dist/fulfillment/handlerSchemas.d.ts +41 -41
- package/dist/fulfillment/index.d.ts +1 -1
- package/dist/fulfillment/index.js +1 -1
- package/dist/fulfillment/paidHandoff.d.ts +12 -1
- package/dist/fulfillment/paidHandoff.js +2 -2
- package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
- package/dist/identity/customerContracts.d.ts +2 -2
- package/dist/inventory/bindings.d.ts +3 -0
- package/dist/inventory/bindings.js +10 -4
- package/dist/inventory/index.d.ts +1 -0
- package/dist/inventory/index.js +1 -0
- package/dist/inventory/managedStockAvailability.d.ts +15 -0
- package/dist/inventory/managedStockAvailability.js +16 -0
- package/dist/inventory/postgresStockAvailability.js +2 -25
- package/dist/inventory/schemas.d.ts +1 -1
- package/dist/inventory/stockReadResponse.d.ts +4 -0
- package/dist/inventory/stockReadResponse.js +27 -0
- package/dist/pricing/browser/index.d.ts +6 -0
- package/dist/pricing/browser/index.js +6 -0
- package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
- package/dist/subscriptions/index.d.ts +3 -2
- package/dist/subscriptions/index.js +3 -2
- package/package.json +22 -2
- package/release-gates.json +63 -8
- package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
- package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
- package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
- package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
- package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
- package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
- package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
- package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
- package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
- package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
- package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
- package/src/commerce/adapters/managed/oms/types.ts +9 -0
- package/src/commerce/checkoutCommandSchemas.ts +93 -0
- package/src/commerce/checkoutHelpers.ts +47 -0
- package/src/commerce/checkoutResumeSchemas.ts +164 -0
- package/src/commerce/checkoutSchemas.ts +182 -0
- package/src/commerce/commerceReturnsPort.ts +67 -0
- package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
- package/src/commerce/configuratorIntentSchemas.ts +47 -0
- package/src/commerce/contractPrimitives.ts +30 -0
- package/src/commerce/contracts/availability.ts +21 -0
- package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
- package/src/commerce/contracts/index.ts +17 -0
- package/src/commerce/contracts/intent.ts +58 -0
- package/src/commerce/contracts/omsTypes.ts +1217 -0
- package/src/commerce/contracts/order.ts +44 -0
- package/src/commerce/contracts/orderMoney.ts +75 -0
- package/src/commerce/contracts/ports.ts +124 -0
- package/src/commerce/contracts/recovery.ts +24 -0
- package/src/commerce/contracts/runtimePorts.ts +201 -0
- package/src/commerce/contracts/state.ts +64 -0
- package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
- package/src/commerce/errors.ts +53 -0
- package/src/commerce/fulfillmentEligibility.ts +32 -0
- package/src/commerce/index.ts +82 -0
- package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
- package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
- package/src/commerce/model/omsAccountingVisibility.ts +135 -0
- package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
- package/src/commerce/model/omsCurrency.ts +8 -0
- package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
- package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
- package/src/commerce/model/omsListTotals.ts +38 -0
- package/src/commerce/model/omsOperationalLadder.ts +181 -0
- package/src/commerce/model/omsOrderLineMoney.ts +34 -0
- package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
- package/src/commerce/model/omsReadModel.ts +302 -0
- package/src/commerce/model/omsReadModelCommunication.ts +32 -0
- package/src/commerce/model/omsReadModelHelpers.ts +279 -0
- package/src/commerce/model/omsReadModelList.ts +90 -0
- package/src/commerce/model/omsReadModelListSummary.ts +19 -0
- package/src/commerce/model/omsReadModelPricing.ts +57 -0
- package/src/commerce/model/omsReadModelProjections.ts +1 -0
- package/src/commerce/model/omsReadModelRowCore.ts +193 -0
- package/src/commerce/model/omsReadModelRows.ts +7 -0
- package/src/commerce/offerAvailability.ts +75 -0
- package/src/commerce/offerAvailabilitySchemas.ts +56 -0
- package/src/commerce/offerEvidenceSchemas.ts +17 -0
- package/src/commerce/oms/omsContractBase.ts +92 -0
- package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
- package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
- package/src/commerce/oms/omsContractRequests.ts +143 -0
- package/src/commerce/oms/omsContracts.ts +6 -0
- package/src/commerce/oms/omsControlPlane.ts +85 -0
- package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
- package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
- package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
- package/src/commerce/oms/omsPorts.ts +165 -0
- package/src/commerce/oms/omsPrimitives.ts +3 -0
- package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
- package/src/commerce/orderDraftErrors.ts +28 -0
- package/src/commerce/orderEmailEligibility.ts +131 -0
- package/src/commerce/orderEmailLines.ts +22 -0
- package/src/commerce/orderFeedbackContracts.ts +47 -0
- package/src/commerce/orderMoney.ts +207 -0
- package/src/commerce/orderReviewContracts.ts +124 -0
- package/src/commerce/orderReviewPorts.ts +94 -0
- package/src/commerce/outboxDispatchContracts.ts +30 -0
- package/src/commerce/outboxEventSchemas.ts +230 -0
- package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
- package/src/commerce/paymentContinuation.ts +5 -0
- package/src/commerce/ports.ts +7 -0
- package/src/commerce/recoveryDestination.ts +23 -0
- package/src/commerce/runtimeErrors.ts +19 -0
- package/src/commerce/salesChannelEnvelope.ts +28 -0
- package/src/commerce/schemas.ts +104 -0
- package/src/commerce/server/checkoutCompensation.ts +49 -0
- package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
- package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
- package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
- package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
- package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
- package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
- package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
- package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
- package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
- package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
- package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
- package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
- package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
- package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
- package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
- package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
- package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
- package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
- package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
- package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
- package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
- package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
- package/src/commerce/server/commerceCheckoutResume.ts +132 -0
- package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
- package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
- package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
- package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
- package/src/commerce/server/commerceDiagnostics.ts +37 -0
- package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
- package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
- package/src/commerce/server/commerceOmsHandlers.ts +275 -0
- package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
- package/src/commerce/server/commerceOrderDraft.ts +131 -0
- package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
- package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
- package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
- package/src/commerce/server/commerceRuntimePort.ts +75 -0
- package/src/commerce/server/commerceRuntimeService.ts +229 -0
- package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
- package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
- package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
- package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
- package/src/commerce/server/emailRuntime.ts +30 -0
- package/src/commerce/server/handlerSupport.ts +22 -0
- package/src/commerce/server/index.ts +181 -0
- package/src/commerce/server/offerAvailability.ts +275 -0
- package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
- package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
- package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
- package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
- package/src/commerce/server/orderReviewHandlers.ts +57 -0
- package/src/commerce/server/orderReviewLifecycle.ts +129 -0
- package/src/commerce/server/orderReviewMedia.ts +170 -0
- package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
- package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
- package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
- package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
- package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
- package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
- package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
- package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
- package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
- package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
- package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
- package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
- package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
- package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
- package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
- package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
- package/src/commerce/server/reservationSweepPort.ts +67 -0
- package/src/commerce/server/starterTermsPort.ts +22 -0
- package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
- package/src/composition/commerceContribution.ts +35 -0
- package/src/composition/index.ts +1 -0
- package/src/fulfillment/index.ts +1 -1
- package/src/fulfillment/paidHandoff.ts +2 -2
- package/src/inventory/bindings.ts +12 -4
- package/src/inventory/index.ts +1 -0
- package/src/inventory/managedStockAvailability.ts +23 -0
- package/src/inventory/postgresStockAvailability.ts +2 -21
- package/src/inventory/stockReadResponse.ts +25 -0
- package/src/pricing/browser/index.ts +6 -0
- package/src/subscriptions/index.ts +3 -2
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { parseTimestampOrZero, } from "./omsFulfillmentSummary.js";
|
|
2
|
+
export function buildOmsFulfillmentDebug(input) {
|
|
3
|
+
const latestDispatch = newest(input.providerDispatchRefs, (row) => row.updated_at ?? row.created_at);
|
|
4
|
+
const latestAttempt = newest(input.providerAttempts, (row) => row.created_at);
|
|
5
|
+
const latestProvider = newest(input.providerStatusEvidence, (row) => row.occurred_at ?? row.created_at);
|
|
6
|
+
const latestInbound = newest(input.inboundProviderEvents, (row) => row.processed_at ?? row.created_at);
|
|
7
|
+
const dispatchedMail = latestMail(input.communicationDeliveries, "commerce-shipment-dispatched");
|
|
8
|
+
const providerProblem = latestInbound?.processing_status === "ignored" || latestInbound?.processing_status === "failed" ||
|
|
9
|
+
Boolean(latestDispatch?.error) || Boolean(latestAttempt?.error) || ["failed", "error"].includes(latestAttempt?.status ?? "");
|
|
10
|
+
const shippedWithoutTracking = Boolean(latestProvider && ["shipped", "delivered"].includes(latestProvider.provider_status ?? "")) &&
|
|
11
|
+
input.fulfillment.trackingReferences.length === 0;
|
|
12
|
+
const latestProviderStock = newest(input.providerStockCurrent ?? [], (row) => row.last_synced_at);
|
|
13
|
+
const providerStockStale = latestProviderStock ? Date.parse(latestProviderStock.stale_after) <= Date.now() : false;
|
|
14
|
+
const steps = [
|
|
15
|
+
step("payment", input.paymentStatus === "succeeded" ? "ok" : "blocked", "Payment", input.paymentStatus),
|
|
16
|
+
step("stock", ["reserved", "consumed"].includes(input.inventory.status) ? "ok" : "missing", "Stock", input.inventory.status, {
|
|
17
|
+
details: input.reservations.map((row) => `${row.status}:${row.quantity}`),
|
|
18
|
+
evidenceAt: input.inventory.expiresAt,
|
|
19
|
+
}),
|
|
20
|
+
step("provider_stock", providerStockStatus(Boolean(input.projections?.usesExternalStock?.(input.fulfillment.providerKind)), latestProviderStock, providerStockStale), "Provider stock", latestProviderStock ? `${latestProviderStock.provider_kind}:${latestProviderStock.sku}` : null, {
|
|
21
|
+
details: latestProviderStock
|
|
22
|
+
? [
|
|
23
|
+
`forSale ${latestProviderStock.provider_for_sale_quantity}`,
|
|
24
|
+
`total ${latestProviderStock.provider_total_quantity}`,
|
|
25
|
+
`authority ${input.projections?.usesExternalStock?.(input.fulfillment.providerKind) ? "external_stock_master" : "local_atp"}`,
|
|
26
|
+
]
|
|
27
|
+
: [],
|
|
28
|
+
evidenceAt: latestProviderStock?.last_synced_at ?? null,
|
|
29
|
+
}),
|
|
30
|
+
step("fulfillment", input.fulfillment.fulfillmentOrderId ? "ok" : "missing", "Fulfillment order", input.fulfillment.status),
|
|
31
|
+
step("dispatch", latestDispatch ? statusFromDispatch(latestDispatch) : "pending", input.projections?.dispatchStepLabel ?? "Provider dispatch", latestDispatch?.status ?? null, {
|
|
32
|
+
details: compact([latestDispatch?.provider_order_id ? `providerOrderId ${latestDispatch.provider_order_id}` : null, latestAttempt?.status ? `attempt ${latestAttempt.status}` : null]),
|
|
33
|
+
evidenceAt: latestDispatch?.updated_at ?? latestDispatch?.created_at ?? null,
|
|
34
|
+
}),
|
|
35
|
+
step("provider", providerProblem ? "warning" : latestProvider ? "ok" : "pending", "Provider evidence", latestProvider?.provider_status ?? latestInbound?.processing_status ?? null, {
|
|
36
|
+
details: compact([latestProvider?.provider_sub_status, latestInbound?.event_type, latestAttempt?.status ? `attempt ${latestAttempt.status}` : null, errorSummary(latestInbound?.error), errorSummary(latestAttempt?.error)]),
|
|
37
|
+
evidenceAt: latestProvider?.occurred_at ?? latestProvider?.created_at ?? latestInbound?.created_at ?? null,
|
|
38
|
+
}),
|
|
39
|
+
step("tracking", shippedWithoutTracking ? "missing" : input.fulfillment.trackingReferences.length > 0 ? "ok" : "pending", "Tracking refs", input.fulfillment.providerTrackingId, {
|
|
40
|
+
details: input.fulfillment.trackingReferences.map((ref) => compact([ref.trackingNumber, ref.carrierKind, ref.service]).join(" / ")),
|
|
41
|
+
evidenceAt: input.fulfillment.trackingReferences[0]?.updatedAt ?? null,
|
|
42
|
+
}),
|
|
43
|
+
step("communication", mailStatus(dispatchedMail), "Customer e-mail", dispatchedMail?.status ?? null, {
|
|
44
|
+
details: dispatchedMail ? compact([dispatchedMail.template_slug, dispatchedMail.last_error_code]) : [],
|
|
45
|
+
evidenceAt: dispatchedMail?.updated_at ?? dispatchedMail?.created_at ?? null,
|
|
46
|
+
}),
|
|
47
|
+
];
|
|
48
|
+
const nextAction = chooseNextAction({ input, latestDispatch, providerProblem, shippedWithoutTracking });
|
|
49
|
+
const blockers = steps.filter((entry) => entry.status === "blocked" || entry.status === "missing" || entry.status === "warning").map((entry) => entry.label);
|
|
50
|
+
return {
|
|
51
|
+
summary: input.projections?.debugSummary?.(nextAction) ?? summaryFor(nextAction),
|
|
52
|
+
severity: blockers.length ? "action_required" : steps.some((entry) => entry.status === "pending") ? "watch" : "ok",
|
|
53
|
+
nextAction,
|
|
54
|
+
blockers,
|
|
55
|
+
steps,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function chooseNextAction(input) {
|
|
59
|
+
if (input.input.paymentStatus !== "succeeded")
|
|
60
|
+
return "review_payment";
|
|
61
|
+
if (!["reserved", "consumed"].includes(input.input.inventory.status))
|
|
62
|
+
return "review_stock";
|
|
63
|
+
const latestProviderStock = newest(input.input.providerStockCurrent ?? [], (row) => row.last_synced_at);
|
|
64
|
+
if (input.input.projections?.usesExternalStock?.(input.input.fulfillment.providerKind) && !latestProviderStock)
|
|
65
|
+
return "review_stock";
|
|
66
|
+
if (latestProviderStock && Date.parse(latestProviderStock.stale_after) <= Date.now())
|
|
67
|
+
return "review_stock";
|
|
68
|
+
if (!input.input.fulfillment.fulfillmentOrderId)
|
|
69
|
+
return "create_fulfillment";
|
|
70
|
+
if (input.providerProblem)
|
|
71
|
+
return "review_provider";
|
|
72
|
+
if (!input.latestDispatch && input.input.projections?.usesExternalStock?.(input.input.fulfillment.providerKind))
|
|
73
|
+
return "retry_dispatch";
|
|
74
|
+
if (input.shippedWithoutTracking)
|
|
75
|
+
return "reconcile";
|
|
76
|
+
return "wait";
|
|
77
|
+
}
|
|
78
|
+
function providerStockStatus(usesExternalStock, stock, stale) {
|
|
79
|
+
if (!usesExternalStock)
|
|
80
|
+
return "ok";
|
|
81
|
+
if (!stock)
|
|
82
|
+
return "missing";
|
|
83
|
+
return stale ? "warning" : "ok";
|
|
84
|
+
}
|
|
85
|
+
function step(key, status, label, value, extra = {}) {
|
|
86
|
+
return { key, status, label, value: value ?? null, evidenceAt: extra.evidenceAt ?? null, details: extra.details ?? [] };
|
|
87
|
+
}
|
|
88
|
+
function statusFromDispatch(row) {
|
|
89
|
+
if (row.error || row.status === "failed")
|
|
90
|
+
return "warning";
|
|
91
|
+
return row.status ? "ok" : "pending";
|
|
92
|
+
}
|
|
93
|
+
function mailStatus(row) {
|
|
94
|
+
if (!row)
|
|
95
|
+
return "pending";
|
|
96
|
+
if (["bounced", "complained", "missed", "blocked", "delivery_delayed"].includes(row.status))
|
|
97
|
+
return "warning";
|
|
98
|
+
if (["sent", "delivered"].includes(row.status))
|
|
99
|
+
return "ok";
|
|
100
|
+
return "pending";
|
|
101
|
+
}
|
|
102
|
+
function latestMail(rows, slug) {
|
|
103
|
+
return newest(rows.filter((row) => row.template_slug === slug || row.purpose === "shipment_dispatched"), (row) => row.updated_at ?? row.created_at);
|
|
104
|
+
}
|
|
105
|
+
function newest(rows, time) {
|
|
106
|
+
return [...rows].sort((a, b) => parseTimestampOrZero(time(b)) - parseTimestampOrZero(time(a)))[0] ?? null;
|
|
107
|
+
}
|
|
108
|
+
function summaryFor(action) {
|
|
109
|
+
return { wait: "Monitor the next event.", create_fulfillment: "Create a fulfillment order.", retry_dispatch: "Review or retry provider dispatch.", reconcile: "Reconcile tracking and status.", review_payment: "Review payment first.", review_stock: "Review stock reservations first.", review_provider: "Review provider evidence.", contact_support: "Contact technical support." }[action];
|
|
110
|
+
}
|
|
111
|
+
function errorSummary(value) {
|
|
112
|
+
if (!value)
|
|
113
|
+
return null;
|
|
114
|
+
if (typeof value === "string")
|
|
115
|
+
return value;
|
|
116
|
+
if (typeof value === "object" && "reason" in value && typeof value.reason === "string")
|
|
117
|
+
return value.reason;
|
|
118
|
+
return "error_present";
|
|
119
|
+
}
|
|
120
|
+
function compact(values) {
|
|
121
|
+
return values.filter((value) => Boolean(value && value.trim()));
|
|
122
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { OmsFulfillmentOperationRow, OmsFulfillmentOrderRow, OmsProviderAttemptRow, OmsProviderDispatchRefRow, OmsProviderStatusEvidenceRow, OmsReleasedProviderExceptionHoldRow, OmsShipmentExternalRefRow } from "../contracts/omsTypes.js";
|
|
2
|
+
import type { OmsOrderDetail } from "../oms/omsContracts.js";
|
|
3
|
+
import { type CustomerFulfillmentStep } from "./customerFulfillmentRecovery.js";
|
|
4
|
+
import type { OmsReadModelProjections } from "./omsReadModelProjections.js";
|
|
5
|
+
export type { OmsFulfillmentOperationRow, OmsFulfillmentOrderRow, OmsProviderAttemptRow, OmsProviderDispatchRefRow, OmsProviderStatusEvidenceRow, OmsReleasedProviderExceptionHoldRow, OmsShipmentExternalRefRow } from "../contracts/omsTypes.js";
|
|
6
|
+
export declare function buildOmsFulfillmentSummary(input: {
|
|
7
|
+
projections?: OmsReadModelProjections;
|
|
8
|
+
fulfillmentOrders: OmsFulfillmentOrderRow[];
|
|
9
|
+
fulfillmentOperations: OmsFulfillmentOperationRow[];
|
|
10
|
+
shipmentExternalRefs: OmsShipmentExternalRefRow[];
|
|
11
|
+
providerAttempts?: OmsProviderAttemptRow[];
|
|
12
|
+
providerDispatchRefs?: OmsProviderDispatchRefRow[];
|
|
13
|
+
providerStatusEvidence?: OmsProviderStatusEvidenceRow[];
|
|
14
|
+
}): OmsOrderDetail["fulfillment"];
|
|
15
|
+
export declare function deriveOmsCustomerFulfillmentStep(orderStatus: string | null | undefined, fulfillment: OmsOrderDetail["fulfillment"], deliveredAt?: string | null, releasedProviderExceptionHolds?: OmsReleasedProviderExceptionHoldRow[], providerStatusEvidence?: OmsProviderStatusEvidenceRow[], activeHoldCount?: number, projections?: OmsReadModelProjections): CustomerFulfillmentStep;
|
|
16
|
+
export declare function parseTimestampOrZero(value: string | null | undefined): number;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { rowsForParcel } from "@openlup/core/fulfillment";
|
|
2
|
+
import { customerSafeEvidenceToken, customerStepFromTimedSignals, resolveProviderExceptionRecovery, stepForToken } from "./customerFulfillmentRecovery.js";
|
|
3
|
+
export function buildOmsFulfillmentSummary(input) {
|
|
4
|
+
const fulfillmentOrder = input.fulfillmentOrders[0] ?? null;
|
|
5
|
+
if (!fulfillmentOrder) {
|
|
6
|
+
return {
|
|
7
|
+
fulfillmentOrderId: null,
|
|
8
|
+
status: null,
|
|
9
|
+
providerKind: null,
|
|
10
|
+
latestOperationType: null,
|
|
11
|
+
latestOperationAt: null,
|
|
12
|
+
providerTrackingId: null,
|
|
13
|
+
trackingUrl: null,
|
|
14
|
+
carrierKind: null,
|
|
15
|
+
service: null,
|
|
16
|
+
trackingReferences: [],
|
|
17
|
+
trackingTimeline: [],
|
|
18
|
+
providerEvidence: [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Every other companion below is already narrowed to this parcel by `fulfillment_order_id`;
|
|
22
|
+
// tracking references only joined them once the column existed. An unattributed row still
|
|
23
|
+
// answers for any parcel, so a one-parcel order reads exactly as it did before.
|
|
24
|
+
const parcelRefs = rowsForParcel(input.shipmentExternalRefs, fulfillmentOrder.id);
|
|
25
|
+
const trackingReferences = parcelRefs
|
|
26
|
+
.filter((row) => row.active !== false)
|
|
27
|
+
.filter((row) => Boolean(row.provider_tracking_id))
|
|
28
|
+
.map((row) => ({
|
|
29
|
+
providerKind: row.provider_kind ?? "unknown",
|
|
30
|
+
trackingNumber: row.provider_tracking_id,
|
|
31
|
+
trackingUrl: row.tracking_url ?? null,
|
|
32
|
+
carrierKind: row.carrier_kind ?? row.provider_kind ?? null,
|
|
33
|
+
service: row.service ?? null,
|
|
34
|
+
updatedAt: row.updated_at ?? row.created_at ?? null,
|
|
35
|
+
}))
|
|
36
|
+
.sort((a, b) => parseTimestampOrZero(b.updatedAt) - parseTimestampOrZero(a.updatedAt));
|
|
37
|
+
const fulfillmentTimeline = input.fulfillmentOperations
|
|
38
|
+
.filter((operation) => operation.fulfillment_order_id === fulfillmentOrder.id)
|
|
39
|
+
.map((operation) => ({
|
|
40
|
+
eventType: operation.operation_type,
|
|
41
|
+
label: labelForOperation(operation.operation_type, input.projections),
|
|
42
|
+
occurredAt: operation.occurred_at,
|
|
43
|
+
source: "fulfillment",
|
|
44
|
+
}));
|
|
45
|
+
const providerStatusTimeline = (input.providerStatusEvidence ?? [])
|
|
46
|
+
.filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
|
|
47
|
+
.map((row) => {
|
|
48
|
+
const eventType = row.customer_status ?? row.local_status ?? row.provider_status ?? "provider_status";
|
|
49
|
+
return {
|
|
50
|
+
eventType,
|
|
51
|
+
label: labelForOperation(eventType, input.projections),
|
|
52
|
+
occurredAt: row.occurred_at ?? null,
|
|
53
|
+
source: sourceForEvidenceKind(row.evidence_kind),
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
const dispatchTimeline = (input.providerDispatchRefs ?? [])
|
|
57
|
+
.filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
|
|
58
|
+
.map((row) => ({
|
|
59
|
+
eventType: `dispatch_${row.status ?? "recorded"}`,
|
|
60
|
+
label: input.projections?.dispatchLabel?.(row.status) ?? "Provider dispatch recorded",
|
|
61
|
+
occurredAt: row.updated_at ?? row.created_at ?? null,
|
|
62
|
+
source: "dispatch",
|
|
63
|
+
}));
|
|
64
|
+
const trackingTimeline = [...fulfillmentTimeline, ...providerStatusTimeline, ...dispatchTimeline]
|
|
65
|
+
.sort((a, b) => parseTimestampOrZero(b.occurredAt) - parseTimestampOrZero(a.occurredAt))
|
|
66
|
+
.slice(0, 12);
|
|
67
|
+
const providerEvidence = [
|
|
68
|
+
...(input.providerDispatchRefs ?? [])
|
|
69
|
+
.filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
|
|
70
|
+
.map((row) => ({
|
|
71
|
+
evidenceType: "dispatch_ref",
|
|
72
|
+
status: row.status ?? null,
|
|
73
|
+
providerStatus: null,
|
|
74
|
+
providerOrderId: row.provider_order_id ?? null,
|
|
75
|
+
evidenceKind: row.dispatch_mode ?? null,
|
|
76
|
+
occurredAt: row.created_at ?? null,
|
|
77
|
+
updatedAt: row.updated_at ?? row.created_at ?? null,
|
|
78
|
+
summary: row.error ? "dispatch_error_present" : null,
|
|
79
|
+
})),
|
|
80
|
+
...(input.providerAttempts ?? [])
|
|
81
|
+
.filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
|
|
82
|
+
.map((row) => ({
|
|
83
|
+
evidenceType: "provider_attempt",
|
|
84
|
+
status: row.status ?? null,
|
|
85
|
+
providerStatus: row.provider_kind ?? null,
|
|
86
|
+
providerOrderId: null,
|
|
87
|
+
evidenceKind: "provider_attempt",
|
|
88
|
+
occurredAt: row.created_at ?? null,
|
|
89
|
+
updatedAt: row.created_at ?? null,
|
|
90
|
+
summary: row.error ? "provider_attempt_error_present" : null,
|
|
91
|
+
})),
|
|
92
|
+
...(input.providerStatusEvidence ?? [])
|
|
93
|
+
.filter((row) => row.fulfillment_order_id === fulfillmentOrder.id)
|
|
94
|
+
.map((row) => ({
|
|
95
|
+
evidenceType: "status_evidence",
|
|
96
|
+
status: row.local_status ?? null,
|
|
97
|
+
providerStatus: row.provider_status ?? null,
|
|
98
|
+
providerOrderId: null,
|
|
99
|
+
evidenceKind: row.evidence_kind ?? null,
|
|
100
|
+
occurredAt: row.occurred_at ?? null,
|
|
101
|
+
updatedAt: row.created_at ?? null,
|
|
102
|
+
summary: row.provider_sub_status ?? null,
|
|
103
|
+
})),
|
|
104
|
+
].sort((a, b) => parseTimestampOrZero(b.updatedAt ?? b.occurredAt) - parseTimestampOrZero(a.updatedAt ?? a.occurredAt));
|
|
105
|
+
const latestOperation = input.fulfillmentOperations
|
|
106
|
+
.find((operation) => operation.fulfillment_order_id === fulfillmentOrder.id) ?? null;
|
|
107
|
+
const tracking = parcelRefs.find((ref) => ref.order_id === fulfillmentOrder.order_id && ref.active) ?? null;
|
|
108
|
+
return {
|
|
109
|
+
fulfillmentOrderId: fulfillmentOrder.id,
|
|
110
|
+
status: fulfillmentOrder.status,
|
|
111
|
+
providerKind: trackingReferences[0]?.providerKind ?? fulfillmentOrder.provider_kind ?? null,
|
|
112
|
+
latestOperationType: latestOperation?.operation_type ?? null,
|
|
113
|
+
latestOperationAt: latestOperation?.occurred_at ?? null,
|
|
114
|
+
providerTrackingId: trackingReferences[0]?.trackingNumber ?? tracking?.provider_tracking_id ?? null,
|
|
115
|
+
trackingUrl: trackingReferences[0]?.trackingUrl ?? null,
|
|
116
|
+
carrierKind: trackingReferences[0]?.carrierKind ?? null,
|
|
117
|
+
service: trackingReferences[0]?.service ?? null,
|
|
118
|
+
trackingReferences,
|
|
119
|
+
trackingTimeline,
|
|
120
|
+
providerEvidence,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function deriveOmsCustomerFulfillmentStep(orderStatus, fulfillment, deliveredAt, releasedProviderExceptionHolds = [], providerStatusEvidence = [], activeHoldCount = 0, projections) {
|
|
124
|
+
if (activeHoldCount > 0)
|
|
125
|
+
return "exception";
|
|
126
|
+
const recovery = resolveProviderExceptionRecovery({
|
|
127
|
+
automaticHoldSource: projections?.automaticExceptionHoldSource,
|
|
128
|
+
automaticReleaseSource: projections?.automaticExceptionReleaseSource,
|
|
129
|
+
fulfillmentOrderId: fulfillment.fulfillmentOrderId,
|
|
130
|
+
releasedHolds: releasedProviderExceptionHolds.map(toReleasedProviderExceptionHold),
|
|
131
|
+
statusEvidence: providerStatusEvidence.map((row) => ({
|
|
132
|
+
id: row.id,
|
|
133
|
+
fulfillmentOrderId: row.fulfillment_order_id,
|
|
134
|
+
providerStatus: row.provider_status,
|
|
135
|
+
localStatus: row.local_status,
|
|
136
|
+
occurredAt: row.occurred_at,
|
|
137
|
+
token: customerSafeEvidenceToken(row.local_status, row.provider_status),
|
|
138
|
+
})),
|
|
139
|
+
});
|
|
140
|
+
return customerStepFromTimedSignals([orderStatus, fulfillment.status], [
|
|
141
|
+
...(deliveredAt ? [{ token: "delivered", occurredAt: deliveredAt }] : []),
|
|
142
|
+
...providerStatusEvidence
|
|
143
|
+
.filter((row) => row.fulfillment_order_id === fulfillment.fulfillmentOrderId)
|
|
144
|
+
.map((row) => ({
|
|
145
|
+
id: row.id,
|
|
146
|
+
token: customerSafeEvidenceToken(row.local_status, row.provider_status),
|
|
147
|
+
occurredAt: row.occurred_at,
|
|
148
|
+
})),
|
|
149
|
+
...fulfillment.trackingTimeline
|
|
150
|
+
.filter((event) => event.source === "fulfillment")
|
|
151
|
+
.map((event) => ({
|
|
152
|
+
token: event.eventType,
|
|
153
|
+
occurredAt: event.occurredAt,
|
|
154
|
+
})),
|
|
155
|
+
], recovery);
|
|
156
|
+
}
|
|
157
|
+
function toReleasedProviderExceptionHold(row) {
|
|
158
|
+
return {
|
|
159
|
+
orderId: row.order_id,
|
|
160
|
+
status: row.status ?? null,
|
|
161
|
+
reason: row.reason ?? null,
|
|
162
|
+
createdBy: row.created_by ?? null,
|
|
163
|
+
releasedBy: row.released_by ?? null,
|
|
164
|
+
metadata: row.metadata,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** Resolve the same canonical step as the customer timeline, without choosing
|
|
168
|
+
* a locale. Hosts supply presentation through the existing projection; the
|
|
169
|
+
* neutral default is the step key, with the generic fallback for unknown tokens.
|
|
170
|
+
* This is not another status-to-label table. */
|
|
171
|
+
function labelForOperation(operationType, projections) {
|
|
172
|
+
const step = stepForToken(operationType);
|
|
173
|
+
return projections?.timelineLabel?.(step) ?? step ?? "Delivery status updated";
|
|
174
|
+
}
|
|
175
|
+
function sourceForEvidenceKind(kind) {
|
|
176
|
+
if (kind === "webhook")
|
|
177
|
+
return "webhook";
|
|
178
|
+
if (kind === "reconciliation")
|
|
179
|
+
return "reconciliation";
|
|
180
|
+
return "provider";
|
|
181
|
+
}
|
|
182
|
+
// Shared with the two sibling read-model modules that sorted the same evidence
|
|
183
|
+
// rows through a byte-identical private copy of this function. Not merged with
|
|
184
|
+
// omsAccountingVisibility's `timestampOrNull`: that one answers null for a
|
|
185
|
+
// missing instant so the outbox comparator can rank "unknown" apart from the
|
|
186
|
+
// epoch, which this zero-defaulting sort must not do.
|
|
187
|
+
export function parseTimestampOrZero(value) {
|
|
188
|
+
return value ? Date.parse(value) || 0 : 0;
|
|
189
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AdminCommerceOrdersListResponse } from "../oms/omsContracts.js";
|
|
2
|
+
import { type OmsCurrencyPolicy } from "./omsCurrency.js";
|
|
3
|
+
/**
|
|
4
|
+
* A paid set that spans more than one currency has no single GMV and no single
|
|
5
|
+
* average order value. Adding the minor units across currencies produces a
|
|
6
|
+
* figure that is money in none of them, and labelling it with one of the codes
|
|
7
|
+
* makes it look actionable. The operator gets a named refusal instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare class CommerceOmsMixedCurrencyTotalsError extends Error {
|
|
10
|
+
readonly currencies: readonly string[];
|
|
11
|
+
constructor(currencies: readonly string[]);
|
|
12
|
+
}
|
|
13
|
+
export declare function summarizeOmsListTotals(orders: AdminCommerceOrdersListResponse["orders"], policy?: OmsCurrencyPolicy): AdminCommerceOrdersListResponse["summaryTotals"];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { neutralOmsCurrencyPolicy } from "./omsCurrency.js";
|
|
2
|
+
/**
|
|
3
|
+
* A paid set that spans more than one currency has no single GMV and no single
|
|
4
|
+
* average order value. Adding the minor units across currencies produces a
|
|
5
|
+
* figure that is money in none of them, and labelling it with one of the codes
|
|
6
|
+
* makes it look actionable. The operator gets a named refusal instead.
|
|
7
|
+
*/
|
|
8
|
+
export class CommerceOmsMixedCurrencyTotalsError extends Error {
|
|
9
|
+
currencies;
|
|
10
|
+
constructor(currencies) {
|
|
11
|
+
super("commerce_oms_summary_mixed_currency");
|
|
12
|
+
this.name = "CommerceOmsMixedCurrencyTotalsError";
|
|
13
|
+
this.currencies = currencies;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function summarizeOmsListTotals(orders, policy = neutralOmsCurrencyPolicy) {
|
|
17
|
+
const paidOrders = orders.filter((order) => order.paymentStatus === "succeeded");
|
|
18
|
+
const currencies = [...new Set(paidOrders.map((order) => order.total.currency))].sort();
|
|
19
|
+
if (currencies.length > 1)
|
|
20
|
+
throw new CommerceOmsMixedCurrencyTotalsError(currencies);
|
|
21
|
+
const amountMinor = paidOrders.reduce((sum, order) => sum + order.total.amountMinor, 0);
|
|
22
|
+
const orderCount = paidOrders.length;
|
|
23
|
+
// No paid order means no order named a currency, so the platform default is
|
|
24
|
+
// the only honest label for a zero total - and it is read from one module.
|
|
25
|
+
const currency = currencies[0] ?? policy.defaultCurrency;
|
|
26
|
+
return {
|
|
27
|
+
gmv: { amountMinor, currency },
|
|
28
|
+
aov: { amountMinor: orderCount > 0 ? Math.round(amountMinor / orderCount) : 0, currency },
|
|
29
|
+
orderCount,
|
|
30
|
+
paidSubscriptionCycleCount: paidOrders.filter((order) => order.mode === "subscription_cycle").length,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { OmsOperationalLadderInput, OmsOperationalRung } from "../contracts/omsTypes.js";
|
|
2
|
+
import type { AdminOmsAttentionReason, AdminOmsNextAction } from "../oms/omsContracts.js";
|
|
3
|
+
export type { OmsOperationalLadderInput, OmsOperationalRung } from "../contracts/omsTypes.js";
|
|
4
|
+
/**
|
|
5
|
+
* The operator attention/next-action ladder, declared once.
|
|
6
|
+
*
|
|
7
|
+
* The same ladder is implemented a second time in SQL, inside the live queue
|
|
8
|
+
* RPC `public.commerce_oms_admin_list_queue`
|
|
9
|
+
* (the live queue migration `20260903190000_oms_queue_hides_withdrawn_checkout_rows`,
|
|
10
|
+
* the `operational` CTE and the `attention_priority_desc` rank arm). Both run on
|
|
11
|
+
* the same admin request: SQL decides which orders are selected, what the
|
|
12
|
+
* summary counters say and in what order the rows arrive; this module labels the
|
|
13
|
+
* rows that come back. Nothing in the type system makes them agree.
|
|
14
|
+
*
|
|
15
|
+
* So the agreement is written down instead: every rung carries the live SQL
|
|
16
|
+
* CASE-arm condition it mirrors, verbatim modulo whitespace, and
|
|
17
|
+
* `omsOperationalLadder.test.ts` parses those arms out of the migration and
|
|
18
|
+
* compares them rung for rung, in order. Editing one side without the other
|
|
19
|
+
* turns that test red, which is the only thing standing between the two
|
|
20
|
+
* implementations and a silent divergence.
|
|
21
|
+
*
|
|
22
|
+
* ⛔ Changing a rung here is a behaviour change to the OMS queue. It must be
|
|
23
|
+
* made on both sides in the same change, or not at all.
|
|
24
|
+
*/
|
|
25
|
+
/** The facts the ladder reads. Flat on purpose: it is the join between the row
|
|
26
|
+
* shapes this codebase carries and the columns the SQL `operational` CTE has. */
|
|
27
|
+
export declare const OMS_OPERATIONAL_LADDER: readonly OmsOperationalRung[];
|
|
28
|
+
/** The `ELSE` of both SQL CASE expressions, and the fall-through of the loop. */
|
|
29
|
+
export declare const OMS_OPERATIONAL_LADDER_FALLBACK: {
|
|
30
|
+
readonly attentionReason: AdminOmsAttentionReason;
|
|
31
|
+
readonly nextAction: AdminOmsNextAction;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The `attention_priority_desc` sort ranks, in SQL arm order. Lower sorts first.
|
|
35
|
+
*
|
|
36
|
+
* Nothing in TypeScript consumes this today - the queue arrives pre-sorted from
|
|
37
|
+
* SQL, and the fixture bundle does not offer that sort. It is declared here
|
|
38
|
+
* because the ranking is part of the same ladder: an attention reason added
|
|
39
|
+
* above without a rank silently sorts to the bottom of the operator's queue.
|
|
40
|
+
* The parity test binds it to the live migration arm for arm.
|
|
41
|
+
*/
|
|
42
|
+
export declare const OMS_ATTENTION_PRIORITY_LADDER: readonly {
|
|
43
|
+
readonly attentionReason: AdminOmsAttentionReason;
|
|
44
|
+
readonly rank: number;
|
|
45
|
+
}[];
|
|
46
|
+
export declare const OMS_ATTENTION_PRIORITY_FALLBACK_RANK = 99;
|
|
47
|
+
/** Walks the ladder once and returns the first rung that matches. */
|
|
48
|
+
export declare function resolveOmsOperationalState(input: OmsOperationalLadderInput): {
|
|
49
|
+
attentionReason: AdminOmsAttentionReason;
|
|
50
|
+
nextAction: AdminOmsNextAction;
|
|
51
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The operator attention/next-action ladder, declared once.
|
|
3
|
+
*
|
|
4
|
+
* The same ladder is implemented a second time in SQL, inside the live queue
|
|
5
|
+
* RPC `public.commerce_oms_admin_list_queue`
|
|
6
|
+
* (the live queue migration `20260903190000_oms_queue_hides_withdrawn_checkout_rows`,
|
|
7
|
+
* the `operational` CTE and the `attention_priority_desc` rank arm). Both run on
|
|
8
|
+
* the same admin request: SQL decides which orders are selected, what the
|
|
9
|
+
* summary counters say and in what order the rows arrive; this module labels the
|
|
10
|
+
* rows that come back. Nothing in the type system makes them agree.
|
|
11
|
+
*
|
|
12
|
+
* So the agreement is written down instead: every rung carries the live SQL
|
|
13
|
+
* CASE-arm condition it mirrors, verbatim modulo whitespace, and
|
|
14
|
+
* `omsOperationalLadder.test.ts` parses those arms out of the migration and
|
|
15
|
+
* compares them rung for rung, in order. Editing one side without the other
|
|
16
|
+
* turns that test red, which is the only thing standing between the two
|
|
17
|
+
* implementations and a silent divergence.
|
|
18
|
+
*
|
|
19
|
+
* ⛔ Changing a rung here is a behaviour change to the OMS queue. It must be
|
|
20
|
+
* made on both sides in the same change, or not at all.
|
|
21
|
+
*/
|
|
22
|
+
/** The facts the ladder reads. Flat on purpose: it is the join between the row
|
|
23
|
+
* shapes this codebase carries and the columns the SQL `operational` CTE has. */
|
|
24
|
+
export const OMS_OPERATIONAL_LADDER = [
|
|
25
|
+
{
|
|
26
|
+
id: "terminal_order",
|
|
27
|
+
sqlPredicate: "order_status IN ('refunded', 'cancelled')",
|
|
28
|
+
attentionReason: "none",
|
|
29
|
+
nextAction: "none",
|
|
30
|
+
// A refunded/cancelled order is done, even though its payment_status is no
|
|
31
|
+
// longer 'succeeded'. Without this rung the payment rung below would flag
|
|
32
|
+
// every refunded order as needing payment review.
|
|
33
|
+
matches: (input) => input.orderStatus === "refunded" || input.orderStatus === "cancelled",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "active_hold",
|
|
37
|
+
sqlPredicate: "active_hold_count > 0",
|
|
38
|
+
attentionReason: "active_hold",
|
|
39
|
+
nextAction: "release_hold",
|
|
40
|
+
matches: (input) => input.activeHoldCount > 0,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "payment_not_succeeded",
|
|
44
|
+
sqlPredicate: "payment_status <> 'succeeded'",
|
|
45
|
+
attentionReason: "payment_required",
|
|
46
|
+
nextAction: "review_payment",
|
|
47
|
+
matches: (input) => input.paymentStatus !== "succeeded",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "missing_shipping_address",
|
|
51
|
+
sqlPredicate: "EXISTS ( SELECT 1 FROM base_orders orders WHERE orders.id = derived.id AND orders.shipping_address_id IS NULL )",
|
|
52
|
+
attentionReason: "missing_shipping_address",
|
|
53
|
+
nextAction: "review_address",
|
|
54
|
+
matches: (input) => !input.hasShippingAddress,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "inventory_not_held",
|
|
58
|
+
sqlPredicate: "inventory_status NOT IN ('reserved', 'consumed')",
|
|
59
|
+
attentionReason: "inventory_missing",
|
|
60
|
+
nextAction: "review_inventory",
|
|
61
|
+
matches: (input) => input.inventoryStatus !== "reserved" && input.inventoryStatus !== "consumed",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "fulfillment_absent_and_blocked",
|
|
65
|
+
sqlPredicate: "fulfillment_status IS NULL AND fulfillment_allowed = false",
|
|
66
|
+
attentionReason: "fulfillment_blocked",
|
|
67
|
+
nextAction: "review_fulfillment",
|
|
68
|
+
matches: (input) => !input.fulfillmentStatus && !input.fulfillmentAllowed,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "fulfillment_absent",
|
|
72
|
+
sqlPredicate: "fulfillment_status IS NULL",
|
|
73
|
+
attentionReason: "fulfillment_pending",
|
|
74
|
+
nextAction: "create_fulfillment",
|
|
75
|
+
matches: (input) => !input.fulfillmentStatus,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "fulfillment_before_label",
|
|
79
|
+
sqlPredicate: "fulfillment_status IN ('created', 'packed', 'label_pending')",
|
|
80
|
+
attentionReason: "fulfillment_pending",
|
|
81
|
+
nextAction: "record_label",
|
|
82
|
+
matches: (input) => input.fulfillmentStatus === "created" ||
|
|
83
|
+
input.fulfillmentStatus === "packed" ||
|
|
84
|
+
input.fulfillmentStatus === "label_pending",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "fulfillment_label_created",
|
|
88
|
+
sqlPredicate: "fulfillment_status = 'label_created'",
|
|
89
|
+
attentionReason: "fulfillment_pending",
|
|
90
|
+
nextAction: "hand_off",
|
|
91
|
+
matches: (input) => input.fulfillmentStatus === "label_created",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "fulfillment_exception",
|
|
95
|
+
sqlPredicate: "fulfillment_status = 'exception'",
|
|
96
|
+
attentionReason: "fulfillment_exception",
|
|
97
|
+
nextAction: "review_tracking",
|
|
98
|
+
matches: (input) => input.fulfillmentStatus === "exception",
|
|
99
|
+
},
|
|
100
|
+
// The three accounting rungs carry three distinct attention reasons but one
|
|
101
|
+
// shared next action. The SQL next-action ladder therefore collapses them into
|
|
102
|
+
// a single arm over the union of their literals; the parity test asserts that
|
|
103
|
+
// collapse explicitly rather than letting the arm counts differ unremarked.
|
|
104
|
+
{
|
|
105
|
+
id: "accounting_missing",
|
|
106
|
+
sqlPredicate: "accounting_status = 'missing'",
|
|
107
|
+
attentionReason: "invoice_missing",
|
|
108
|
+
nextAction: "review_invoice",
|
|
109
|
+
matches: (input) => input.accountingStatus === "missing",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "accounting_blocked",
|
|
113
|
+
sqlPredicate: "accounting_status = 'blocked'",
|
|
114
|
+
attentionReason: "invoice_buyer_data_invalid",
|
|
115
|
+
nextAction: "review_invoice",
|
|
116
|
+
matches: (input) => input.accountingStatus === "blocked",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "accounting_issue_failed",
|
|
120
|
+
sqlPredicate: "accounting_status IN ('rejected', 'outbox_failed')",
|
|
121
|
+
attentionReason: "invoice_issue_failed",
|
|
122
|
+
nextAction: "review_invoice",
|
|
123
|
+
matches: (input) => input.accountingStatus === "rejected" || input.accountingStatus === "outbox_failed",
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
/** The `ELSE` of both SQL CASE expressions, and the fall-through of the loop. */
|
|
127
|
+
export const OMS_OPERATIONAL_LADDER_FALLBACK = { attentionReason: "none", nextAction: "none" };
|
|
128
|
+
/**
|
|
129
|
+
* The `attention_priority_desc` sort ranks, in SQL arm order. Lower sorts first.
|
|
130
|
+
*
|
|
131
|
+
* Nothing in TypeScript consumes this today - the queue arrives pre-sorted from
|
|
132
|
+
* SQL, and the fixture bundle does not offer that sort. It is declared here
|
|
133
|
+
* because the ranking is part of the same ladder: an attention reason added
|
|
134
|
+
* above without a rank silently sorts to the bottom of the operator's queue.
|
|
135
|
+
* The parity test binds it to the live migration arm for arm.
|
|
136
|
+
*/
|
|
137
|
+
export const OMS_ATTENTION_PRIORITY_LADDER = [
|
|
138
|
+
{ attentionReason: "active_hold", rank: 1 },
|
|
139
|
+
{ attentionReason: "payment_required", rank: 2 },
|
|
140
|
+
{ attentionReason: "missing_shipping_address", rank: 3 },
|
|
141
|
+
{ attentionReason: "inventory_missing", rank: 4 },
|
|
142
|
+
{ attentionReason: "fulfillment_blocked", rank: 5 },
|
|
143
|
+
{ attentionReason: "fulfillment_exception", rank: 6 },
|
|
144
|
+
{ attentionReason: "invoice_issue_failed", rank: 7 },
|
|
145
|
+
{ attentionReason: "invoice_buyer_data_invalid", rank: 8 },
|
|
146
|
+
{ attentionReason: "invoice_missing", rank: 9 },
|
|
147
|
+
// Deliberately the same rank as invoice_missing in the live body.
|
|
148
|
+
{ attentionReason: "fulfillment_pending", rank: 9 },
|
|
149
|
+
];
|
|
150
|
+
export const OMS_ATTENTION_PRIORITY_FALLBACK_RANK = 99;
|
|
151
|
+
/** Walks the ladder once and returns the first rung that matches. */
|
|
152
|
+
export function resolveOmsOperationalState(input) {
|
|
153
|
+
for (const rung of OMS_OPERATIONAL_LADDER) {
|
|
154
|
+
if (rung.matches(input))
|
|
155
|
+
return { attentionReason: rung.attentionReason, nextAction: rung.nextAction };
|
|
156
|
+
}
|
|
157
|
+
return { ...OMS_OPERATIONAL_LADDER_FALLBACK };
|
|
158
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OmsOrderDetail } from "../oms/omsContracts.js";
|
|
2
|
+
import type { OmsOrderItemRow } from "./omsReadModelRows.js";
|
|
3
|
+
import type { CanonicalOrderMoneyLine } from "../orderMoney.js";
|
|
4
|
+
export declare function mapOmsOrderLine(item: OmsOrderItemRow, currency: OmsOrderDetail["total"]["currency"], moneyLine: CanonicalOrderMoneyLine): OmsOrderDetail["lines"][number];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function mapOmsOrderLine(item, currency, moneyLine) {
|
|
2
|
+
const productSnapshot = item.product_snapshot ?? {};
|
|
3
|
+
const variantSnapshot = item.variant_snapshot ?? null;
|
|
4
|
+
return {
|
|
5
|
+
id: item.id,
|
|
6
|
+
skuId: item.sku_id ?? null,
|
|
7
|
+
sku: item.sku ?? readSnapshotText(productSnapshot, "sku"),
|
|
8
|
+
title: item.title
|
|
9
|
+
?? readSnapshotText(productSnapshot, "title")
|
|
10
|
+
?? readSnapshotText(productSnapshot, "name"),
|
|
11
|
+
quantity: item.quantity,
|
|
12
|
+
unitPrice: { amountMinor: moneyLine.catalogUnit, currency },
|
|
13
|
+
total: { amountMinor: moneyLine.catalogTotal, currency },
|
|
14
|
+
discountAllocated: { amountMinor: moneyLine.discountAllocated, currency },
|
|
15
|
+
effectiveTotal: { amountMinor: moneyLine.effectiveGross, currency },
|
|
16
|
+
effectiveNet: { amountMinor: moneyLine.effectiveNet, currency },
|
|
17
|
+
vatRateBps: moneyLine.vatRateBps,
|
|
18
|
+
productSnapshot,
|
|
19
|
+
variantSnapshot,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function readSnapshotText(snapshot, key) {
|
|
23
|
+
const value = snapshot[key];
|
|
24
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
25
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { OmsPaymentMethodSummary } from "../contracts/omsTypes.js";
|
|
2
|
+
import type { OmsReadModelProjections } from "./omsReadModelProjections.js";
|
|
3
|
+
import type { OmsPaymentAttemptRow, OmsPaymentIntentRow } from "./omsReadModelRows.js";
|
|
4
|
+
export type { OmsPaymentMethodSummary } from "../contracts/omsTypes.js";
|
|
5
|
+
export declare function paymentMethodForOrder(orderId: string, paymentIntents: OmsPaymentIntentRow[], paymentAttempts: OmsPaymentAttemptRow[], projections?: OmsReadModelProjections): OmsPaymentMethodSummary;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function paymentMethodForOrder(orderId, paymentIntents, paymentAttempts, projections) {
|
|
2
|
+
const intent = paymentIntents.find((candidate) => candidate.id && candidate.order_id === orderId) ?? null;
|
|
3
|
+
if (!intent)
|
|
4
|
+
return { provider: null, label: null };
|
|
5
|
+
const attempt = paymentAttempts.find((candidate) => candidate.id === intent.active_attempt_id)
|
|
6
|
+
?? paymentAttempts.find((candidate) => candidate.payment_intent_id === intent.id)
|
|
7
|
+
?? null;
|
|
8
|
+
if (!attempt)
|
|
9
|
+
return { provider: null, label: null };
|
|
10
|
+
return { provider: attempt.provider, label: projections?.paymentMethodLabel?.(attempt) ?? attempt.provider };
|
|
11
|
+
}
|