@openlup/platform 0.17.0 → 0.19.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 +143 -0
- package/README.md +299 -6
- package/dist/catalog/activeSkuSelection.d.ts +2 -0
- package/dist/catalog/activeSkuSelection.js +20 -0
- package/dist/catalog/adminBindings.d.ts +72 -0
- package/dist/catalog/adminBindings.js +1 -0
- package/dist/catalog/adminBundleHandler.d.ts +26 -0
- package/dist/catalog/adminBundleHandler.js +111 -0
- package/dist/catalog/adminBundleReadHandler.d.ts +21 -0
- package/dist/catalog/adminBundleReadHandler.js +185 -0
- package/dist/catalog/adminBundleWritePort.d.ts +85 -0
- package/dist/catalog/adminBundleWritePort.js +1 -0
- package/dist/catalog/bundleAvailability.d.ts +63 -0
- package/dist/catalog/bundleAvailability.js +78 -0
- package/dist/catalog/bundleAvailabilityService.d.ts +65 -0
- package/dist/catalog/bundleAvailabilityService.js +89 -0
- package/dist/catalog/bundleBindings.d.ts +33 -0
- package/dist/catalog/bundleBindings.js +1 -0
- package/dist/catalog/bundleCatalogQueries.d.ts +28 -0
- package/dist/catalog/bundleCatalogQueries.js +84 -0
- package/dist/catalog/bundleCatalogReadPort.d.ts +173 -0
- package/dist/catalog/bundleCatalogReadPort.js +36 -0
- package/dist/catalog/bundleCatalogStore.d.ts +5 -0
- package/dist/catalog/bundleCatalogStore.js +156 -0
- package/dist/catalog/bundlePriceSelection.d.ts +13 -0
- package/dist/catalog/bundlePriceSelection.js +26 -0
- package/dist/catalog/bundleRuleCodes.d.ts +41 -0
- package/dist/catalog/bundleRuleCodes.js +110 -0
- package/dist/catalog/bundleRules.d.ts +69 -0
- package/dist/catalog/bundleRules.js +102 -0
- package/dist/catalog/catalogDraftStore.d.ts +4 -0
- package/dist/catalog/catalogDraftStore.js +63 -0
- package/dist/catalog/catalogSkuEnvelope.d.ts +7 -0
- package/dist/catalog/catalogSkuEnvelope.js +142 -0
- package/dist/catalog/catalogSkuEnvelopeMapper.d.ts +38 -0
- package/dist/catalog/catalogSkuEnvelopeMapper.js +88 -0
- package/dist/catalog/contracts/bundleAdmin.d.ts +143 -0
- package/dist/catalog/contracts/bundleAdmin.js +1 -0
- package/dist/catalog/contracts/bundleAvailability.d.ts +61 -0
- package/dist/catalog/contracts/bundleAvailability.js +1 -0
- package/dist/catalog/contracts/bundleRead.d.ts +241 -0
- package/dist/catalog/contracts/bundleRead.js +1 -0
- package/dist/catalog/contracts/draft.d.ts +79 -0
- package/dist/catalog/contracts/draft.js +47 -0
- package/dist/catalog/contracts/foundation.d.ts +78 -0
- package/dist/catalog/contracts/foundation.js +53 -0
- package/dist/catalog/contracts/index.d.ts +14 -0
- package/dist/catalog/contracts/index.js +6 -0
- package/dist/catalog/contracts/lifecycle.d.ts +77 -0
- package/dist/catalog/contracts/lifecycle.js +1 -0
- package/dist/catalog/contracts/productMediaContracts.d.ts +77 -0
- package/dist/catalog/contracts/productMediaContracts.js +149 -0
- package/dist/catalog/contracts/productTypes.d.ts +54 -0
- package/dist/catalog/contracts/productTypes.js +16 -0
- package/dist/catalog/contracts/resolveProductMedia.d.ts +3 -0
- package/dist/catalog/contracts/resolveProductMedia.js +78 -0
- package/dist/catalog/contracts/sellable.d.ts +23 -0
- package/dist/catalog/contracts/sellable.js +1 -0
- package/dist/catalog/draftHandler.d.ts +25 -0
- package/dist/catalog/draftHandler.js +118 -0
- package/dist/catalog/draftPorts.d.ts +18 -0
- package/dist/catalog/draftPorts.js +8 -0
- package/dist/catalog/draftSchemas.d.ts +423 -0
- package/dist/catalog/draftSchemas.js +89 -0
- package/dist/catalog/draftValidation.d.ts +21 -0
- package/dist/catalog/draftValidation.js +125 -0
- package/dist/catalog/effectiveBundleCatalogQueries.d.ts +8 -0
- package/dist/catalog/effectiveBundleCatalogQueries.js +79 -0
- package/dist/catalog/effectiveBundleCatalogStore.d.ts +4 -0
- package/dist/catalog/effectiveBundleCatalogStore.js +156 -0
- package/dist/catalog/foundationSchemas.d.ts +98 -0
- package/dist/catalog/foundationSchemas.js +110 -0
- package/dist/catalog/index.d.ts +44 -0
- package/dist/catalog/index.js +26 -0
- package/dist/catalog/mediaSourcePack.d.ts +51 -0
- package/dist/catalog/mediaSourcePack.js +247 -0
- package/dist/catalog/productTypeSchemas.d.ts +46 -0
- package/dist/catalog/productTypeSchemas.js +72 -0
- package/dist/catalog/publicationPorts.d.ts +42 -0
- package/dist/catalog/publicationPorts.js +1 -0
- package/dist/catalog/readPorts.d.ts +51 -0
- package/dist/catalog/readPorts.js +1 -0
- package/dist/catalog/referenceCatalogHandler.d.ts +7 -0
- package/dist/catalog/referenceCatalogHandler.js +27 -0
- package/dist/catalog/resolvedSkuProjection.d.ts +88 -0
- package/dist/catalog/resolvedSkuProjection.js +60 -0
- package/dist/catalog/sellableBundleHandler.d.ts +46 -0
- package/dist/catalog/sellableBundleHandler.js +84 -0
- package/dist/catalog/sellableSchemas.d.ts +46 -0
- package/dist/catalog/sellableSchemas.js +27 -0
- package/dist/catalog/sql.d.ts +46 -0
- package/dist/catalog/sql.js +13 -0
- package/dist/catalog/validation.d.ts +2 -0
- package/dist/catalog/validation.js +3 -0
- package/dist/communications/contracts/index.d.ts +1 -0
- package/dist/communications/contracts/marketingSync.d.ts +194 -0
- package/dist/communications/contracts/marketingSync.js +1 -0
- package/dist/communications/index.d.ts +1 -0
- package/dist/communications/klaviyo/consentPush.d.ts +51 -0
- package/dist/communications/klaviyo/consentPush.js +19 -0
- package/dist/communications/klaviyo/index.d.ts +110 -0
- package/dist/communications/klaviyo/index.js +860 -0
- package/dist/communications/newsletterIntegrationContracts.d.ts +3 -3
- package/dist/communications/resend/index.d.ts +40 -0
- package/dist/communications/resend/index.js +310 -0
- package/dist/composition/catalogContribution.d.ts +18 -0
- package/dist/composition/catalogContribution.js +21 -0
- package/dist/composition/index.d.ts +3 -0
- package/dist/composition/index.js +3 -0
- package/dist/composition/inventoryContribution.d.ts +16 -0
- package/dist/composition/inventoryContribution.js +17 -0
- package/dist/composition/shippingContribution.d.ts +16 -0
- package/dist/composition/shippingContribution.js +17 -0
- package/dist/identity/customerContracts.d.ts +2 -2
- package/dist/inventory/adminInventory.d.ts +13 -0
- package/dist/inventory/adminInventory.js +214 -0
- package/dist/inventory/bindings.d.ts +35 -0
- package/dist/inventory/bindings.js +45 -0
- package/dist/inventory/contracts/forecast.d.ts +86 -0
- package/dist/inventory/contracts/forecast.js +1 -0
- package/dist/inventory/contracts/index.d.ts +4 -0
- package/dist/inventory/contracts/index.js +1 -0
- package/dist/inventory/contracts/inventory.d.ts +157 -0
- package/dist/inventory/contracts/inventory.js +1 -0
- package/dist/inventory/contracts/newPurchaseStock.d.ts +20 -0
- package/dist/inventory/contracts/newPurchaseStock.js +1 -0
- package/dist/inventory/contracts/reservation.d.ts +18 -0
- package/dist/inventory/contracts/reservation.js +1 -0
- package/dist/inventory/forecast.d.ts +24 -0
- package/dist/inventory/forecast.js +200 -0
- package/dist/inventory/index.d.ts +14 -0
- package/dist/inventory/index.js +11 -0
- package/dist/inventory/inventoryHandlers.d.ts +53 -0
- package/dist/inventory/inventoryHandlers.js +151 -0
- package/dist/inventory/newPurchaseStockAvailability.d.ts +47 -0
- package/dist/inventory/newPurchaseStockAvailability.js +75 -0
- package/dist/inventory/ports.d.ts +21 -0
- package/dist/inventory/ports.js +16 -0
- package/dist/inventory/renewalReservation.d.ts +27 -0
- package/dist/inventory/renewalReservation.js +61 -0
- package/dist/inventory/reservationPolicy.d.ts +6 -0
- package/dist/inventory/reservationPolicy.js +19 -0
- package/dist/inventory/schemas.d.ts +137 -0
- package/dist/inventory/schemas.js +112 -0
- package/dist/inventory/sql.d.ts +14 -0
- package/dist/inventory/sql.js +5 -0
- package/dist/inventory/subscriptionForecastCalculation.d.ts +4 -0
- package/dist/inventory/subscriptionForecastCalculation.js +133 -0
- package/dist/pricing/acquisitionFinancialPolicy.d.ts +26 -0
- package/dist/pricing/acquisitionFinancialPolicy.js +1 -0
- package/dist/pricing/acquisitionOfferPricing.d.ts +27 -0
- package/dist/pricing/acquisitionOfferPricing.js +25 -0
- package/dist/pricing/acquisitionOfferPricingHandler.d.ts +20 -0
- package/dist/pricing/acquisitionOfferPricingHandler.js +105 -0
- package/dist/pricing/acquisitionOfferPricingSchemas.d.ts +31 -0
- package/dist/pricing/acquisitionOfferPricingSchemas.js +33 -0
- package/dist/pricing/acquisitionQuoteBinding.d.ts +12 -0
- package/dist/pricing/acquisitionQuoteBinding.js +12 -0
- package/dist/pricing/acquisitionReadiness.d.ts +31 -0
- package/dist/pricing/acquisitionReadiness.js +117 -0
- package/dist/pricing/acquisitionTerms.d.ts +19 -0
- package/dist/pricing/acquisitionTerms.js +126 -0
- package/dist/pricing/acquisitionTermsSchemas.d.ts +59 -0
- package/dist/pricing/acquisitionTermsSchemas.js +42 -0
- package/dist/pricing/catalogFactsProvenance.d.ts +33 -0
- package/dist/pricing/catalogFactsProvenance.js +64 -0
- package/dist/pricing/catalogFactsSchemas.d.ts +45 -0
- package/dist/pricing/catalogFactsSchemas.js +58 -0
- package/dist/pricing/commerceOfferPricing.d.ts +25 -0
- package/dist/pricing/commerceOfferPricing.js +139 -0
- package/dist/pricing/commerceOfferPricingCache.d.ts +10 -0
- package/dist/pricing/commerceOfferPricingCache.js +44 -0
- package/dist/pricing/commerceOfferPricingHandler.d.ts +21 -0
- package/dist/pricing/commerceOfferPricingHandler.js +78 -0
- package/dist/pricing/commercePriceAuthority.d.ts +28 -0
- package/dist/pricing/commercePriceAuthority.js +140 -0
- package/dist/pricing/commercePricingPolicyErrors.d.ts +40 -0
- package/dist/pricing/commercePricingPolicyErrors.js +67 -0
- package/dist/pricing/commerceQuoteBatchHandler.d.ts +37 -0
- package/dist/pricing/commerceQuoteBatchHandler.js +83 -0
- package/dist/pricing/commerceQuoteCatalogReadPort.d.ts +27 -0
- package/dist/pricing/commerceQuoteCatalogReadPort.js +8 -0
- package/dist/pricing/commerceQuoteHandler.d.ts +35 -0
- package/dist/pricing/commerceQuoteHandler.js +122 -0
- package/dist/pricing/commerceQuoteSnapshotExpect.d.ts +9 -0
- package/dist/pricing/commerceQuoteSnapshotExpect.js +22 -0
- package/dist/pricing/contracts/acquisitionTerms.d.ts +32 -0
- package/dist/pricing/contracts/acquisitionTerms.js +2 -0
- package/dist/pricing/contracts/authority.d.ts +27 -0
- package/dist/pricing/contracts/authority.js +1 -0
- package/dist/pricing/contracts/evidence.d.ts +33 -0
- package/dist/pricing/contracts/evidence.js +1 -0
- package/dist/pricing/contracts/index.d.ts +17 -0
- package/dist/pricing/contracts/index.js +7 -0
- package/dist/pricing/contracts/money.d.ts +27 -0
- package/dist/pricing/contracts/money.js +1 -0
- package/dist/pricing/contracts/offer.d.ts +52 -0
- package/dist/pricing/contracts/offer.js +4 -0
- package/dist/pricing/contracts/offerPolicy.d.ts +16 -0
- package/dist/pricing/contracts/offerPolicy.js +5 -0
- package/dist/pricing/contracts/policy.d.ts +22 -0
- package/dist/pricing/contracts/policy.js +3 -0
- package/dist/pricing/contracts/provenance.d.ts +24 -0
- package/dist/pricing/contracts/provenance.js +2 -0
- package/dist/pricing/contracts/quote.d.ts +94 -0
- package/dist/pricing/contracts/quote.js +1 -0
- package/dist/pricing/dbBackedCommerceQuoteHelpers.d.ts +78 -0
- package/dist/pricing/dbBackedCommerceQuoteHelpers.js +146 -0
- package/dist/pricing/dbBackedCommerceQuotePort.d.ts +74 -0
- package/dist/pricing/dbBackedCommerceQuotePort.js +223 -0
- package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.d.ts +4 -0
- package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.js +25 -0
- package/dist/pricing/index.d.ts +52 -0
- package/dist/pricing/index.js +36 -0
- package/dist/pricing/offerPolicyReadiness.d.ts +21 -0
- package/dist/pricing/offerPolicyReadiness.js +79 -0
- package/dist/pricing/offerPolicySchemas.d.ts +25 -0
- package/dist/pricing/offerPolicySchemas.js +15 -0
- package/dist/pricing/offerPricingSchemas.d.ts +315 -0
- package/dist/pricing/offerPricingSchemas.js +65 -0
- package/dist/pricing/ports.d.ts +13 -0
- package/dist/pricing/ports.js +9 -0
- package/dist/pricing/pricingPolicyToken.d.ts +39 -0
- package/dist/pricing/pricingPolicyToken.js +84 -0
- package/dist/pricing/quoteAcquisitionTerms.d.ts +2 -0
- package/dist/pricing/quoteAcquisitionTerms.js +4 -0
- package/dist/pricing/quoteCodeRejectionDetails.d.ts +20 -0
- package/dist/pricing/quoteCodeRejectionDetails.js +22 -0
- package/dist/pricing/quotePorts.d.ts +30 -0
- package/dist/pricing/quotePorts.js +20 -0
- package/dist/pricing/quotePrimitives.d.ts +13 -0
- package/dist/pricing/quotePrimitives.js +18 -0
- package/dist/pricing/quotePromotionEvidence.d.ts +39 -0
- package/dist/pricing/quotePromotionEvidence.js +73 -0
- package/dist/pricing/quoteSchemas.d.ts +1176 -0
- package/dist/pricing/quoteSchemas.js +196 -0
- package/dist/pricing/quoteShippingPromotions.d.ts +20 -0
- package/dist/pricing/quoteShippingPromotions.js +1 -0
- package/dist/pricing/subscriptionPricePolicy.d.ts +52 -0
- package/dist/pricing/subscriptionPricePolicy.js +96 -0
- package/dist/pricing/taxProfileGuard.d.ts +2 -0
- package/dist/pricing/taxProfileGuard.js +24 -0
- package/dist/pricing/validation.d.ts +2 -0
- package/dist/pricing/validation.js +3 -0
- package/dist/promotions/adminBindings.d.ts +72 -0
- package/dist/promotions/adminBindings.js +1 -0
- package/dist/promotions/adminPromotionCodesContracts.d.ts +498 -0
- package/dist/promotions/adminPromotionCodesContracts.js +211 -0
- package/dist/promotions/adminPromotionCodesDataPort.d.ts +47 -0
- package/dist/promotions/adminPromotionCodesDataPort.js +1 -0
- package/dist/promotions/adminPromotionCodesHandler.d.ts +14 -0
- package/dist/promotions/adminPromotionCodesHandler.js +194 -0
- package/dist/promotions/adminPromotionsContracts.d.ts +235 -0
- package/dist/promotions/adminPromotionsContracts.js +99 -0
- package/dist/promotions/adminPromotionsDataPort.d.ts +42 -0
- package/dist/promotions/adminPromotionsDataPort.js +1 -0
- package/dist/promotions/adminPromotionsHandler.d.ts +16 -0
- package/dist/promotions/adminPromotionsHandler.js +47 -0
- package/dist/promotions/commerceQuoteReadPreparation.d.ts +3 -0
- package/dist/promotions/commerceQuoteReadPreparation.js +27 -0
- package/dist/promotions/contracts/index.d.ts +387 -0
- package/dist/promotions/contracts/index.js +1 -0
- package/dist/promotions/index.d.ts +25 -0
- package/dist/promotions/index.js +22 -0
- package/dist/promotions/promoDataPort.d.ts +47 -0
- package/dist/promotions/promoDataPort.js +14 -0
- package/dist/promotions/promotionAcceptanceTelemetry.d.ts +29 -0
- package/dist/promotions/promotionAcceptanceTelemetry.js +45 -0
- package/dist/promotions/promotionBenefitDefinition.d.ts +37 -0
- package/dist/promotions/promotionBenefitDefinition.js +33 -0
- package/dist/promotions/promotionClaimSweepPort.d.ts +14 -0
- package/dist/promotions/promotionClaimSweepPort.js +8 -0
- package/dist/promotions/promotionClaims.d.ts +5 -0
- package/dist/promotions/promotionClaims.js +57 -0
- package/dist/promotions/promotionCodePreview.d.ts +11 -0
- package/dist/promotions/promotionCodePreview.js +154 -0
- package/dist/promotions/promotionCodeQuotePort.d.ts +25 -0
- package/dist/promotions/promotionCodeQuotePort.js +1 -0
- package/dist/promotions/promotionQuoteAcceptance.d.ts +70 -0
- package/dist/promotions/promotionQuoteAcceptance.js +202 -0
- package/dist/promotions/promotionQuoteBinding.d.ts +73 -0
- package/dist/promotions/promotionQuoteBinding.js +87 -0
- package/dist/promotions/quoteAcquisitionBinding.d.ts +6 -0
- package/dist/promotions/quoteAcquisitionBinding.js +1 -0
- package/dist/promotions/quoteAutomaticPromotions.d.ts +26 -0
- package/dist/promotions/quoteAutomaticPromotions.js +60 -0
- package/dist/promotions/quotePromoDiscounts.d.ts +36 -0
- package/dist/promotions/quotePromoDiscounts.js +146 -0
- package/dist/promotions/quotePromotionCodeAdjustments.d.ts +27 -0
- package/dist/promotions/quotePromotionCodeAdjustments.js +223 -0
- package/dist/promotions/quotePromotionV2.d.ts +30 -0
- package/dist/promotions/quotePromotionV2.js +186 -0
- package/dist/promotions/quoteShippingPolicy.d.ts +23 -0
- package/dist/promotions/quoteShippingPolicy.js +47 -0
- package/dist/promotions/sql.d.ts +14 -0
- package/dist/promotions/sql.js +5 -0
- package/dist/promotions/validation.d.ts +2 -0
- package/dist/promotions/validation.js +3 -0
- package/dist/shipping/addressCanonLookupHandler.d.ts +7 -0
- package/dist/shipping/addressCanonLookupHandler.js +105 -0
- package/dist/shipping/addressCanonical.d.ts +2 -0
- package/dist/shipping/addressCanonical.js +26 -0
- package/dist/shipping/addressPorts.d.ts +39 -0
- package/dist/shipping/addressPorts.js +1 -0
- package/dist/shipping/addressSchemas.d.ts +30 -0
- package/dist/shipping/addressSchemas.js +1 -0
- package/dist/shipping/adminShippingRateHandler.d.ts +4 -0
- package/dist/shipping/adminShippingRateHandler.js +64 -0
- package/dist/shipping/bindings.d.ts +57 -0
- package/dist/shipping/bindings.js +46 -0
- package/dist/shipping/contracts/address.d.ts +144 -0
- package/dist/shipping/contracts/address.js +1 -0
- package/dist/shipping/contracts/delivery.d.ts +110 -0
- package/dist/shipping/contracts/delivery.js +1 -0
- package/dist/shipping/contracts/index.d.ts +4 -0
- package/dist/shipping/contracts/index.js +1 -0
- package/dist/shipping/contracts/shippingRate.d.ts +11 -0
- package/dist/shipping/contracts/shippingRate.js +1 -0
- package/dist/shipping/contracts/threshold.d.ts +22 -0
- package/dist/shipping/contracts/threshold.js +1 -0
- package/dist/shipping/customerAddressesHandler.d.ts +5 -0
- package/dist/shipping/customerAddressesHandler.js +80 -0
- package/dist/shipping/customerSelfServiceAddressModels.d.ts +27 -0
- package/dist/shipping/customerSelfServiceAddressModels.js +101 -0
- package/dist/shipping/deliverySelectionHandler.d.ts +10 -0
- package/dist/shipping/deliverySelectionHandler.js +77 -0
- package/dist/shipping/deliverySelectionPort.d.ts +8 -0
- package/dist/shipping/deliverySelectionPort.js +1 -0
- package/dist/shipping/deliverySelectionSummary.d.ts +2 -0
- package/dist/shipping/deliverySelectionSummary.js +53 -0
- package/dist/shipping/handlerSchemas.d.ts +21 -0
- package/dist/shipping/handlerSchemas.js +1 -0
- package/dist/shipping/index.d.ts +20 -0
- package/dist/shipping/index.js +10 -0
- package/dist/shipping/pickupPointSearchPort.d.ts +4 -0
- package/dist/shipping/pickupPointSearchPort.js +1 -0
- package/dist/shipping/readDeliverySelectionEvidence.d.ts +2 -0
- package/dist/shipping/readDeliverySelectionEvidence.js +44 -0
- package/dist/shipping/shippingRatePorts.d.ts +52 -0
- package/dist/shipping/shippingRatePorts.js +1 -0
- package/dist/shipping/thresholdPolicy.d.ts +42 -0
- package/dist/shipping/thresholdPolicy.js +60 -0
- package/package.json +62 -2
- package/release-gates.json +263 -53
- package/sql/20260807140000_read_parity_catalog.sql +94 -0
- package/sql/20260810120000_storefront_catalog_attributes.sql +51 -0
- package/sql/20260812140000_sellable_bundle_catalog.sql +124 -0
- package/sql/20260812210000_bundle_operator_write_boundary.sql +567 -0
- package/sql/20260814000000_fulfillment_stock_evidence.sql +239 -0
- package/sql/20260815120000_automatic_subscription_renewal.sql +1083 -0
- package/sql/20260817180000_promotion_claim_lifecycle.sql +591 -0
- package/sql/20260817180100_promotion_claim_lifecycle_validation.sql +23 -0
- package/sql/20260827220000_catalog_document_revision_foundation.sql +226 -0
- package/sql/20260827220001_catalog_document_revision_foundation_validate.sql +10 -0
- package/sql/20260908100000_catalog_draft_foundation.sql +217 -0
- package/src/catalog/activeSkuSelection.ts +20 -0
- package/src/catalog/adminBindings.ts +59 -0
- package/src/catalog/adminBundleHandler.ts +165 -0
- package/src/catalog/adminBundleReadHandler.ts +263 -0
- package/src/catalog/adminBundleWritePort.ts +102 -0
- package/src/catalog/bundleAvailability.ts +129 -0
- package/src/catalog/bundleAvailabilityService.ts +171 -0
- package/src/catalog/bundleBindings.ts +29 -0
- package/src/catalog/bundleCatalogQueries.ts +98 -0
- package/src/catalog/bundleCatalogReadPort.ts +181 -0
- package/src/catalog/bundleCatalogStore.ts +274 -0
- package/src/catalog/bundlePriceSelection.ts +25 -0
- package/src/catalog/bundleRuleCodes.ts +134 -0
- package/src/catalog/bundleRules.ts +153 -0
- package/src/catalog/catalogDraftStore.ts +71 -0
- package/src/catalog/catalogSkuEnvelope.ts +214 -0
- package/src/catalog/catalogSkuEnvelopeMapper.ts +160 -0
- package/src/catalog/contracts/bundleAdmin.ts +20 -0
- package/src/catalog/contracts/bundleAvailability.ts +5 -0
- package/src/catalog/contracts/bundleRead.ts +13 -0
- package/src/catalog/contracts/draft.ts +69 -0
- package/src/catalog/contracts/foundation.ts +104 -0
- package/src/catalog/contracts/index.ts +14 -0
- package/src/catalog/contracts/lifecycle.ts +74 -0
- package/src/catalog/contracts/productMediaContracts.ts +170 -0
- package/src/catalog/contracts/productTypes.ts +35 -0
- package/src/catalog/contracts/resolveProductMedia.ts +85 -0
- package/src/catalog/contracts/sellable.ts +12 -0
- package/src/catalog/draftHandler.ts +105 -0
- package/src/catalog/draftPorts.ts +18 -0
- package/src/catalog/draftSchemas.ts +88 -0
- package/src/catalog/draftValidation.ts +100 -0
- package/src/catalog/effectiveBundleCatalogQueries.ts +80 -0
- package/src/catalog/effectiveBundleCatalogStore.ts +208 -0
- package/src/catalog/foundationSchemas.ts +123 -0
- package/src/catalog/index.ts +44 -0
- package/src/catalog/mediaSourcePack.ts +219 -0
- package/src/catalog/productTypeSchemas.ts +70 -0
- package/src/catalog/publicationPorts.ts +44 -0
- package/src/catalog/readPorts.ts +61 -0
- package/src/catalog/referenceCatalogHandler.ts +39 -0
- package/src/catalog/resolvedSkuProjection.ts +76 -0
- package/src/catalog/sellableBundleHandler.ts +133 -0
- package/src/catalog/sellableSchemas.ts +33 -0
- package/src/catalog/sql.ts +14 -0
- package/src/catalog/validation.ts +3 -0
- package/src/communications/contracts/index.ts +1 -0
- package/src/communications/contracts/marketingSync.ts +109 -0
- package/src/communications/index.ts +1 -0
- package/src/communications/klaviyo/consentPush.ts +19 -0
- package/src/communications/klaviyo/index.ts +649 -0
- package/src/communications/resend/index.ts +350 -0
- package/src/composition/catalogContribution.ts +32 -0
- package/src/composition/index.ts +3 -0
- package/src/composition/inventoryContribution.ts +24 -0
- package/src/composition/shippingContribution.ts +24 -0
- package/src/inventory/adminInventory.ts +251 -0
- package/src/inventory/bindings.ts +61 -0
- package/src/inventory/contracts/forecast.ts +96 -0
- package/src/inventory/contracts/index.ts +18 -0
- package/src/inventory/contracts/inventory.ts +14 -0
- package/src/inventory/contracts/newPurchaseStock.ts +23 -0
- package/src/inventory/contracts/reservation.ts +20 -0
- package/src/inventory/forecast.ts +239 -0
- package/src/inventory/index.ts +22 -0
- package/src/inventory/inventoryHandlers.ts +215 -0
- package/src/inventory/newPurchaseStockAvailability.ts +120 -0
- package/src/inventory/ports.ts +46 -0
- package/src/inventory/renewalReservation.ts +88 -0
- package/src/inventory/reservationPolicy.ts +27 -0
- package/src/inventory/schemas.ts +128 -0
- package/src/inventory/sql.ts +5 -0
- package/src/inventory/subscriptionForecastCalculation.ts +157 -0
- package/src/pricing/acquisitionFinancialPolicy.ts +26 -0
- package/src/pricing/acquisitionOfferPricing.ts +38 -0
- package/src/pricing/acquisitionOfferPricingHandler.ts +157 -0
- package/src/pricing/acquisitionOfferPricingSchemas.ts +35 -0
- package/src/pricing/acquisitionQuoteBinding.ts +12 -0
- package/src/pricing/acquisitionReadiness.ts +148 -0
- package/src/pricing/acquisitionTerms.ts +125 -0
- package/src/pricing/acquisitionTermsSchemas.ts +52 -0
- package/src/pricing/catalogFactsProvenance.ts +102 -0
- package/src/pricing/catalogFactsSchemas.ts +69 -0
- package/src/pricing/commerceOfferPricing.ts +224 -0
- package/src/pricing/commerceOfferPricingCache.ts +53 -0
- package/src/pricing/commerceOfferPricingHandler.ts +137 -0
- package/src/pricing/commercePriceAuthority.ts +169 -0
- package/src/pricing/commercePricingPolicyErrors.ts +88 -0
- package/src/pricing/commerceQuoteBatchHandler.ts +129 -0
- package/src/pricing/commerceQuoteCatalogReadPort.ts +42 -0
- package/src/pricing/commerceQuoteHandler.ts +199 -0
- package/src/pricing/commerceQuoteSnapshotExpect.ts +48 -0
- package/src/pricing/contracts/acquisitionTerms.ts +26 -0
- package/src/pricing/contracts/authority.ts +44 -0
- package/src/pricing/contracts/evidence.ts +25 -0
- package/src/pricing/contracts/index.ts +17 -0
- package/src/pricing/contracts/money.ts +32 -0
- package/src/pricing/contracts/offer.ts +42 -0
- package/src/pricing/contracts/offerPolicy.ts +17 -0
- package/src/pricing/contracts/policy.ts +26 -0
- package/src/pricing/contracts/provenance.ts +19 -0
- package/src/pricing/contracts/quote.ts +106 -0
- package/src/pricing/dbBackedCommerceQuoteHelpers.ts +256 -0
- package/src/pricing/dbBackedCommerceQuotePort.ts +280 -0
- package/src/pricing/dbBackedCommerceQuoteSnapshotVerifier.ts +49 -0
- package/src/pricing/index.ts +53 -0
- package/src/pricing/offerPolicyReadiness.ts +110 -0
- package/src/pricing/offerPolicySchemas.ts +23 -0
- package/src/pricing/offerPricingSchemas.ts +92 -0
- package/src/pricing/ports.ts +17 -0
- package/src/pricing/pricingPolicyToken.ts +119 -0
- package/src/pricing/quoteAcquisitionTerms.ts +10 -0
- package/src/pricing/quoteCodeRejectionDetails.ts +23 -0
- package/src/pricing/quotePorts.ts +58 -0
- package/src/pricing/quotePrimitives.ts +21 -0
- package/src/pricing/quotePromotionEvidence.ts +82 -0
- package/src/pricing/quoteSchemas.ts +230 -0
- package/src/pricing/quoteShippingPromotions.ts +21 -0
- package/src/pricing/subscriptionPricePolicy.ts +113 -0
- package/src/pricing/taxProfileGuard.ts +33 -0
- package/src/pricing/validation.ts +3 -0
- package/src/promotions/adminBindings.ts +53 -0
- package/src/promotions/adminPromotionCodesContracts.ts +244 -0
- package/src/promotions/adminPromotionCodesDataPort.ts +56 -0
- package/src/promotions/adminPromotionCodesHandler.ts +254 -0
- package/src/promotions/adminPromotionsContracts.ts +121 -0
- package/src/promotions/adminPromotionsDataPort.ts +48 -0
- package/src/promotions/adminPromotionsHandler.ts +72 -0
- package/src/promotions/commerceQuoteReadPreparation.ts +29 -0
- package/src/promotions/contracts/index.ts +387 -0
- package/src/promotions/index.ts +25 -0
- package/src/promotions/promoDataPort.ts +65 -0
- package/src/promotions/promotionAcceptanceTelemetry.ts +73 -0
- package/src/promotions/promotionBenefitDefinition.ts +48 -0
- package/src/promotions/promotionClaimSweepPort.ts +23 -0
- package/src/promotions/promotionClaims.ts +70 -0
- package/src/promotions/promotionCodePreview.ts +183 -0
- package/src/promotions/promotionCodeQuotePort.ts +35 -0
- package/src/promotions/promotionQuoteAcceptance.ts +291 -0
- package/src/promotions/promotionQuoteBinding.ts +163 -0
- package/src/promotions/quoteAcquisitionBinding.ts +7 -0
- package/src/promotions/quoteAutomaticPromotions.ts +84 -0
- package/src/promotions/quotePromoDiscounts.ts +194 -0
- package/src/promotions/quotePromotionCodeAdjustments.ts +277 -0
- package/src/promotions/quotePromotionV2.ts +239 -0
- package/src/promotions/quoteShippingPolicy.ts +61 -0
- package/src/promotions/sql.ts +5 -0
- package/src/promotions/validation.ts +3 -0
- package/src/shipping/addressCanonLookupHandler.ts +114 -0
- package/src/shipping/addressCanonical.ts +31 -0
- package/src/shipping/addressPorts.ts +48 -0
- package/src/shipping/addressSchemas.ts +28 -0
- package/src/shipping/adminShippingRateHandler.ts +72 -0
- package/src/shipping/bindings.ts +74 -0
- package/src/shipping/contracts/address.ts +71 -0
- package/src/shipping/contracts/delivery.ts +114 -0
- package/src/shipping/contracts/index.ts +19 -0
- package/src/shipping/contracts/shippingRate.ts +7 -0
- package/src/shipping/contracts/threshold.ts +22 -0
- package/src/shipping/customerAddressesHandler.ts +100 -0
- package/src/shipping/customerSelfServiceAddressModels.ts +124 -0
- package/src/shipping/deliverySelectionHandler.ts +94 -0
- package/src/shipping/deliverySelectionPort.ts +10 -0
- package/src/shipping/deliverySelectionSummary.ts +56 -0
- package/src/shipping/handlerSchemas.ts +19 -0
- package/src/shipping/index.ts +26 -0
- package/src/shipping/pickupPointSearchPort.ts +8 -0
- package/src/shipping/readDeliverySelectionEvidence.ts +51 -0
- package/src/shipping/shippingRatePorts.ts +36 -0
- package/src/shipping/thresholdPolicy.ts +65 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { CommerceMoney } from "./money.js";
|
|
2
|
+
import type { PricingPolicySnapshot } from "./offerPolicy.js";
|
|
3
|
+
export declare const COMMERCE_OFFER_PRICING_CONTRACT_VERSION: "commerce.offer-pricing.v1";
|
|
4
|
+
export declare const COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION: "commerce.offer-pricing.v2";
|
|
5
|
+
export interface CommerceOfferPrice {
|
|
6
|
+
packageGross: CommerceMoney;
|
|
7
|
+
unitGross: CommerceMoney;
|
|
8
|
+
}
|
|
9
|
+
export interface CommerceProductOfferPricing {
|
|
10
|
+
productSlug: string;
|
|
11
|
+
unitCount: number;
|
|
12
|
+
oneTime: CommerceOfferPrice;
|
|
13
|
+
subscriptionInitial: CommerceOfferPrice;
|
|
14
|
+
subscriptionRecurring: CommerceOfferPrice;
|
|
15
|
+
catalogAnchorUnitGross: CommerceMoney;
|
|
16
|
+
initialDiscountPercent: number;
|
|
17
|
+
recurringDiscountPercent: number;
|
|
18
|
+
}
|
|
19
|
+
export type CommerceOfferPricingResponse<ScopeV1 extends string = string, ScopeV2 extends string = string> = {
|
|
20
|
+
contractVersion: typeof COMMERCE_OFFER_PRICING_CONTRACT_VERSION;
|
|
21
|
+
scope: ScopeV1;
|
|
22
|
+
products: CommerceProductOfferPricing[];
|
|
23
|
+
minimum: {
|
|
24
|
+
oneTime: CommerceProductOfferPricing;
|
|
25
|
+
subscription: CommerceProductOfferPricing;
|
|
26
|
+
};
|
|
27
|
+
} | {
|
|
28
|
+
contractVersion: typeof COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION;
|
|
29
|
+
scope: ScopeV2;
|
|
30
|
+
products: CommerceProductOfferPricing[];
|
|
31
|
+
minimum: {
|
|
32
|
+
oneTime: CommerceProductOfferPricing;
|
|
33
|
+
subscription: CommerceProductOfferPricing;
|
|
34
|
+
};
|
|
35
|
+
pricingPolicy: PricingPolicySnapshot;
|
|
36
|
+
shipping: {
|
|
37
|
+
gross: CommerceMoney;
|
|
38
|
+
discountGross: CommerceMoney;
|
|
39
|
+
payable: CommerceMoney;
|
|
40
|
+
};
|
|
41
|
+
minimumProductPayable: CommerceMoney;
|
|
42
|
+
};
|
|
43
|
+
/** Complete opt-in v3 response; the incumbent v1/v2 union stays unchanged. */
|
|
44
|
+
export declare const COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION: "commerce.offer-pricing.v3";
|
|
45
|
+
export type AcquisitionOfferPricingResponse<ScopeV2 extends string = string> = Omit<Extract<CommerceOfferPricingResponse<string, ScopeV2>, {
|
|
46
|
+
contractVersion: typeof COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION;
|
|
47
|
+
}>, "contractVersion"> & {
|
|
48
|
+
contractVersion: typeof COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION;
|
|
49
|
+
acquisitionTerms: import("./acquisitionTerms.js").AcquisitionTerms;
|
|
50
|
+
observedAt: string;
|
|
51
|
+
validUntil: string;
|
|
52
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export const COMMERCE_OFFER_PRICING_CONTRACT_VERSION = "commerce.offer-pricing.v1";
|
|
2
|
+
export const COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION = "commerce.offer-pricing.v2";
|
|
3
|
+
/** Complete opt-in v3 response; the incumbent v1/v2 union stays unchanged. */
|
|
4
|
+
export const COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION = "commerce.offer-pricing.v3";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const OFFER_POLICY_V1: "commerce.offer-policy.v1";
|
|
2
|
+
export declare const OFFER_POLICY_V2: "commerce.offer-policy.v2";
|
|
3
|
+
export declare const PROMOTION_ENGINE_V1: "promotion-engine.v1";
|
|
4
|
+
export declare const PROMOTION_ENGINE_V2: "promotion-engine.v2";
|
|
5
|
+
export declare const OFFER_POLICY_V2_CAPABILITY: "commerce.offer-policy.v2";
|
|
6
|
+
export type OfferPolicyVersion = typeof OFFER_POLICY_V1 | typeof OFFER_POLICY_V2;
|
|
7
|
+
export type PromotionEngineVersion = typeof PROMOTION_ENGINE_V1 | typeof PROMOTION_ENGINE_V2;
|
|
8
|
+
export interface PricingPolicyRequest {
|
|
9
|
+
capability?: typeof OFFER_POLICY_V2_CAPABILITY;
|
|
10
|
+
token?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface PricingPolicySnapshot {
|
|
13
|
+
offerPolicyVersion: OfferPolicyVersion;
|
|
14
|
+
promotionEngineVersion: PromotionEngineVersion;
|
|
15
|
+
pricingPolicyToken?: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const OFFER_POLICY_V1 = "commerce.offer-policy.v1";
|
|
2
|
+
export const OFFER_POLICY_V2 = "commerce.offer-policy.v2";
|
|
3
|
+
export const PROMOTION_ENGINE_V1 = "promotion-engine.v1";
|
|
4
|
+
export const PROMOTION_ENGINE_V2 = "promotion-engine.v2";
|
|
5
|
+
export const OFFER_POLICY_V2_CAPABILITY = OFFER_POLICY_V2;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const SUBSCRIPTION_PRICE_POLICY_SCHEMA_VERSION = "subscription-price-policy.v1";
|
|
2
|
+
export declare const SUBSCRIPTION_PRICE_POLICY_DEFAULT_DISCOUNT_BPS = 1000;
|
|
3
|
+
export declare const SUBSCRIPTION_PRICE_POLICY_DEFAULT_QUANTUM_MINOR = 10;
|
|
4
|
+
export interface SubscriptionPricePolicySemantics {
|
|
5
|
+
discountBps: number;
|
|
6
|
+
roundingQuantumMinor: number;
|
|
7
|
+
roundingRule: "FLOOR_TO_QUANTUM";
|
|
8
|
+
}
|
|
9
|
+
export interface SubscriptionPricePolicyCanonicalInput extends SubscriptionPricePolicySemantics {
|
|
10
|
+
id: string;
|
|
11
|
+
revisionNo: number;
|
|
12
|
+
priceListId: string;
|
|
13
|
+
regionCode: string;
|
|
14
|
+
currency: string;
|
|
15
|
+
channel: string;
|
|
16
|
+
effectiveFrom: string;
|
|
17
|
+
effectiveTo: string | null;
|
|
18
|
+
}
|
|
19
|
+
export interface SubscriptionPricePolicyRevision extends SubscriptionPricePolicyCanonicalInput {
|
|
20
|
+
digest: string;
|
|
21
|
+
}
|
|
22
|
+
export type SubscriptionPricePolicyDigestRefusal = "subscription_price_policy_digest_mismatch";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const CATALOG_FACTS_PROVENANCE_VERSION: "catalog_facts_v1";
|
|
2
|
+
export declare const CATALOG_FACTS_POLICY_PROVENANCE_VERSION: "catalog_facts_v2";
|
|
3
|
+
interface CatalogFactsFields {
|
|
4
|
+
skuId: string;
|
|
5
|
+
documentRevisionId: string;
|
|
6
|
+
documentDigest: string;
|
|
7
|
+
basePriceEntryId: string;
|
|
8
|
+
atTime: string;
|
|
9
|
+
currency: string;
|
|
10
|
+
resolvedUnitAmountMinor: number;
|
|
11
|
+
resolvedLineAmountMinor: number;
|
|
12
|
+
baseUnitAmountMinor: number;
|
|
13
|
+
}
|
|
14
|
+
export type CatalogFactsProvenance = CatalogFactsFields & ({
|
|
15
|
+
version: typeof CATALOG_FACTS_PROVENANCE_VERSION;
|
|
16
|
+
resolvedPriceEntryId: string;
|
|
17
|
+
mode: "one_time" | "subscription";
|
|
18
|
+
} | {
|
|
19
|
+
version: typeof CATALOG_FACTS_POLICY_PROVENANCE_VERSION;
|
|
20
|
+
policyRevisionId: string;
|
|
21
|
+
policyDigest: string;
|
|
22
|
+
mode: "subscription";
|
|
23
|
+
});
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { CommerceCurrency, CommerceMoney, CommerceTaxBreakdown } from "./money.js";
|
|
2
|
+
import type { CommerceCodeRejectionDetail } from "./evidence.js";
|
|
3
|
+
export declare const COMMERCE_CONTRACT_VERSION = "commerce.v0";
|
|
4
|
+
export interface CommerceQuotePricingComponent {
|
|
5
|
+
scope: "line" | "order";
|
|
6
|
+
componentType: "base_unit" | "mode_discount" | "qty_tier" | "promo" | "loyalty" | "shipping" | "bundle";
|
|
7
|
+
amountMinor: number;
|
|
8
|
+
reasonCode: string;
|
|
9
|
+
reasonPayload: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
/** Hosts may extend this context with their own validated policy. */
|
|
12
|
+
export interface CommerceQuoteContext {
|
|
13
|
+
mode: "one_time" | "subscription";
|
|
14
|
+
cadenceDays?: number | null;
|
|
15
|
+
promoCodes: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface CommerceQuoteLine {
|
|
18
|
+
sku: string;
|
|
19
|
+
productSlug: string;
|
|
20
|
+
quantity: number;
|
|
21
|
+
unitPriceGross: CommerceMoney;
|
|
22
|
+
lineSubtotalGross: CommerceMoney;
|
|
23
|
+
tax: CommerceTaxBreakdown;
|
|
24
|
+
pricingComponents?: CommerceQuotePricingComponent[];
|
|
25
|
+
}
|
|
26
|
+
export type CommercePromotionCustomerSemantic = "first_purchase_10" | "first_subscription_50" | "bundle_5";
|
|
27
|
+
export interface CommerceQuoteDiscount {
|
|
28
|
+
promotionId: string;
|
|
29
|
+
code?: string | null;
|
|
30
|
+
label?: string;
|
|
31
|
+
appliesTo: "order_total" | "line" | "shipping";
|
|
32
|
+
amountOffMinor: number;
|
|
33
|
+
reasonCode: string;
|
|
34
|
+
/** Stable presentation identity for canonical offers; never inferred from an editable name. */
|
|
35
|
+
customerSemantic?: CommercePromotionCustomerSemantic;
|
|
36
|
+
promotionEngineVersion?: "promotion-engine.v2";
|
|
37
|
+
promotionCodeId?: string;
|
|
38
|
+
promotionCodeRevision?: number;
|
|
39
|
+
promotionDefinitionFingerprint?: string;
|
|
40
|
+
promotionCodeScopes?: Array<"one_time" | "subscription_initial">;
|
|
41
|
+
promotionMinimumReferenceMinor?: number;
|
|
42
|
+
promotionCodeValidTo?: string | null;
|
|
43
|
+
promotionBenefitKind?: "target_percentage" | "percentage" | "fixed_amount" | "free_shipping";
|
|
44
|
+
promotionBenefitValueBps?: number;
|
|
45
|
+
promotionBenefitValueMinor?: number;
|
|
46
|
+
floorApplied?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Why a customer-submitted promo code did not produce a discount, surfaced so the FE
|
|
50
|
+
* can show a specific message instead of a generic "invalid". `better_price_exists` is
|
|
51
|
+
* the one non-error reason (eligible but unused because an automatic offer is equally
|
|
52
|
+
* good or better; the FE renders it neutrally); `scope_not_applicable` means the code
|
|
53
|
+
* is real but does not apply to this order type. The last two are v2-engine-only reasons.
|
|
54
|
+
*/
|
|
55
|
+
export type CommerceCodeRejectionReason = "not_recognized" | "already_used" | "not_eligible" | "expired" | "better_price_exists" | "scope_not_applicable";
|
|
56
|
+
export interface CommerceCodeRejection {
|
|
57
|
+
code: string;
|
|
58
|
+
reason: CommerceCodeRejectionReason;
|
|
59
|
+
}
|
|
60
|
+
export interface CommerceQuote {
|
|
61
|
+
currency: CommerceCurrency;
|
|
62
|
+
taxIncluded: true;
|
|
63
|
+
lines: CommerceQuoteLine[];
|
|
64
|
+
discounts: CommerceQuoteDiscount[];
|
|
65
|
+
pricingComponents?: CommerceQuotePricingComponent[];
|
|
66
|
+
context?: CommerceQuoteContext;
|
|
67
|
+
/** Submitted coupon codes that produced no discount, with the reason. Omitted when empty. */
|
|
68
|
+
codeRejections?: CommerceCodeRejection[];
|
|
69
|
+
/** UI-safe specifics for selected rejected codes. Omitted when no detail is available. */
|
|
70
|
+
codeRejectionDetails?: CommerceCodeRejectionDetail[];
|
|
71
|
+
subtotalGross: CommerceMoney;
|
|
72
|
+
discountTotalGross: CommerceMoney;
|
|
73
|
+
/** Gross shipping before any free-shipping promo. Optional; absent ⇒ shipping not priced (legacy/0). */
|
|
74
|
+
shippingGross?: CommerceMoney;
|
|
75
|
+
/** Gross shipping discount from a free-shipping promo (≤ shippingGross). Optional; absent ⇒ 0. */
|
|
76
|
+
shippingDiscountGross?: CommerceMoney;
|
|
77
|
+
totalGross: CommerceMoney;
|
|
78
|
+
netTotal: CommerceMoney;
|
|
79
|
+
taxTotal: CommerceMoney;
|
|
80
|
+
}
|
|
81
|
+
export interface CreateQuoteRequest {
|
|
82
|
+
mode: "one_time" | "subscription";
|
|
83
|
+
lines: import("./money.js").CartLineInput[];
|
|
84
|
+
cadenceDays?: number | null;
|
|
85
|
+
promoCodes: string[];
|
|
86
|
+
}
|
|
87
|
+
export interface CreateQuoteResponse {
|
|
88
|
+
contractVersion: typeof COMMERCE_CONTRACT_VERSION;
|
|
89
|
+
quote: Omit<CommerceQuote, "lines"> & {
|
|
90
|
+
lines: Array<CommerceQuoteLine & {
|
|
91
|
+
catalogFacts?: import("./provenance.js").CatalogFactsProvenance;
|
|
92
|
+
}>;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const COMMERCE_CONTRACT_VERSION = "commerce.v0";
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { CreateQuoteRequest } from "./contracts/quote.js";
|
|
2
|
+
import type { CommerceMoney, CommerceQuotePricingComponent } from "./contracts/index.js";
|
|
3
|
+
import type { PricingComponent } from "@openlup/core/pricing";
|
|
4
|
+
import { type CommercePriceAuthorityPort } from "./ports.js";
|
|
5
|
+
import type { PricingResolverPort, PricingMode, ResolvedPrice } from "@openlup/core/pricing";
|
|
6
|
+
import type { CommerceQuoteCatalogItem } from "./commerceQuoteCatalogReadPort.js";
|
|
7
|
+
/** Pure helpers for the DB-backed commerce quote port (extracted to keep the port under the LOC cap). */
|
|
8
|
+
export interface SkuIndexEntry<Item = CommerceQuoteCatalogItem> {
|
|
9
|
+
item: Item;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildSkuIndex<Item extends CommerceQuoteCatalogItem>(quoteCatalogReadPort: {
|
|
12
|
+
listQuoteCatalogItems(): Promise<Item[]>;
|
|
13
|
+
}): Promise<Map<string, SkuIndexEntry<Item>>>;
|
|
14
|
+
export declare function eligibleQtyForMode(request: CreateQuoteRequest, mode: Exclude<PricingMode, "any">): number;
|
|
15
|
+
export declare function resolveOneTimeComparison(input: {
|
|
16
|
+
pricingResolverPort: PricingResolverPort;
|
|
17
|
+
variantId: string;
|
|
18
|
+
lineQty: number;
|
|
19
|
+
eligibleCartQty: number;
|
|
20
|
+
regionCode: string;
|
|
21
|
+
currency: string;
|
|
22
|
+
atTime: string;
|
|
23
|
+
}): Promise<ResolvedPrice | null>;
|
|
24
|
+
export interface StrictQuotePriceResolution {
|
|
25
|
+
base: ResolvedPrice;
|
|
26
|
+
resolved: ResolvedPrice;
|
|
27
|
+
policy?: {
|
|
28
|
+
policyRevisionId: string;
|
|
29
|
+
policyDigest: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Strict authority quotes require one exact one-time base anchor. Subscription money is either
|
|
34
|
+
* derived by a validated policy or taken from the authority's explicit legacy
|
|
35
|
+
* subscription observation; this layer never calls the generic resolver.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveStrictQuotePrice(input: {
|
|
38
|
+
commercePriceAuthorityPort: CommercePriceAuthorityPort;
|
|
39
|
+
variantId: string;
|
|
40
|
+
mode: Exclude<PricingMode, "any">;
|
|
41
|
+
regionCode: string;
|
|
42
|
+
currency: string;
|
|
43
|
+
channel: string;
|
|
44
|
+
atTime: string;
|
|
45
|
+
}): Promise<StrictQuotePriceResolution>;
|
|
46
|
+
export declare function assertSubscriptionCheapest(input: {
|
|
47
|
+
requestSku: string;
|
|
48
|
+
modeAtLine: Exclude<PricingMode, "any">;
|
|
49
|
+
resolved: ResolvedPrice;
|
|
50
|
+
oneTime: ResolvedPrice | null;
|
|
51
|
+
vatRateBps: number;
|
|
52
|
+
}): void;
|
|
53
|
+
export declare function toGrossMinor(price: ResolvedPrice, vatRateBps: number): number;
|
|
54
|
+
export declare function calculateIncludedVat(grossMinor: number, vatRateBps: number): {
|
|
55
|
+
netMinor: number;
|
|
56
|
+
vatMinor: number;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Map one kernel pricing component onto the quote transport shape.
|
|
60
|
+
*
|
|
61
|
+
* A component type outside the transport union stops the quote loudly. It is never
|
|
62
|
+
* cast through and never silently dropped: a dropped component breaks the breakdown
|
|
63
|
+
* invariant (components must sum to the line total), so a quote would go out priced
|
|
64
|
+
* from an incomplete explanation of its own total.
|
|
65
|
+
*/
|
|
66
|
+
export declare function mapPricingComponent(component: PricingComponent, scope: "line" | "order"): CommerceQuotePricingComponent;
|
|
67
|
+
/**
|
|
68
|
+
* A money builder bound to one currency.
|
|
69
|
+
*
|
|
70
|
+
* This used to be a plain `money(amountMinor)` that stamped the settlement
|
|
71
|
+
* currency as a literal, which meant the quote's declared `currency` and the
|
|
72
|
+
* currency on every amount inside it came from two different places. They
|
|
73
|
+
* agreed only because the port's `currency` option was typed as that same
|
|
74
|
+
* literal. Binding the builder once per port makes the agreement structural:
|
|
75
|
+
* there is no second place left for the two to disagree.
|
|
76
|
+
*/
|
|
77
|
+
export declare function moneyIn(currency: string): (amountMinor: number) => CommerceMoney;
|
|
78
|
+
export declare function sum(values: number[]): number;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { CommerceQuoteError } from "./quotePorts.js";
|
|
2
|
+
import { splitIncludedVat } from "./quoteSchemas.js";
|
|
3
|
+
import { CommercePriceAuthorityError, } from "./ports.js";
|
|
4
|
+
export async function buildSkuIndex(quoteCatalogReadPort) {
|
|
5
|
+
const items = await quoteCatalogReadPort.listQuoteCatalogItems();
|
|
6
|
+
return new Map(items.map((item) => [item.skuCode, { item }]));
|
|
7
|
+
}
|
|
8
|
+
export function eligibleQtyForMode(request, mode) {
|
|
9
|
+
return request.lines
|
|
10
|
+
.filter((line) => !line.isAddon)
|
|
11
|
+
.filter((line) => (line.modeAtLine ?? request.mode) === mode)
|
|
12
|
+
.reduce((sum, line) => sum + line.quantity, 0);
|
|
13
|
+
}
|
|
14
|
+
export async function resolveOneTimeComparison(input) {
|
|
15
|
+
return input.pricingResolverPort.resolvePrice({
|
|
16
|
+
variantId: input.variantId,
|
|
17
|
+
mode: "one_time",
|
|
18
|
+
lineQty: input.lineQty,
|
|
19
|
+
eligibleCartQty: input.eligibleCartQty,
|
|
20
|
+
regionCode: input.regionCode,
|
|
21
|
+
currency: input.currency,
|
|
22
|
+
atTime: input.atTime,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Strict authority quotes require one exact one-time base anchor. Subscription money is either
|
|
27
|
+
* derived by a validated policy or taken from the authority's explicit legacy
|
|
28
|
+
* subscription observation; this layer never calls the generic resolver.
|
|
29
|
+
*/
|
|
30
|
+
export async function resolveStrictQuotePrice(input) {
|
|
31
|
+
try {
|
|
32
|
+
const authority = await input.commercePriceAuthorityPort.resolvePrice({
|
|
33
|
+
variantId: input.variantId,
|
|
34
|
+
mode: input.mode,
|
|
35
|
+
regionCode: input.regionCode,
|
|
36
|
+
currency: input.currency,
|
|
37
|
+
channel: input.channel,
|
|
38
|
+
atTime: input.atTime,
|
|
39
|
+
});
|
|
40
|
+
return strictQuotePriceResolution(authority, input.mode);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof CommercePriceAuthorityError) {
|
|
44
|
+
throw new CommerceQuoteError("PRICE_NOT_CONFIGURED", "Commerce price is not configured", { reason: error.code });
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function strictQuotePriceResolution(authority, requestedMode) {
|
|
50
|
+
const base = authority.base;
|
|
51
|
+
if (base.mode !== "one_time" || base.matchedMinQty !== 1) {
|
|
52
|
+
throw new CommerceQuoteError("PRICING_INVARIANT_VIOLATION", "Strict money authority did not return an exact one-time base anchor", { basePriceEntryId: base.priceEntryId, mode: base.mode, matchedMinQty: base.matchedMinQty });
|
|
53
|
+
}
|
|
54
|
+
if (requestedMode === "one_time") {
|
|
55
|
+
if (authority.kind !== "one_time" || authority.unitPriceMinor !== base.unitPriceMinor) {
|
|
56
|
+
throw new CommerceQuoteError("PRICING_INVARIANT_VIOLATION", "Strict money authority returned an invalid one-time result", { authorityKind: authority.kind, basePriceEntryId: base.priceEntryId });
|
|
57
|
+
}
|
|
58
|
+
return { base, resolved: base };
|
|
59
|
+
}
|
|
60
|
+
if (authority.kind === "subscription_policy") {
|
|
61
|
+
return {
|
|
62
|
+
base,
|
|
63
|
+
resolved: { ...base, mode: "subscription", unitPriceMinor: authority.unitPriceMinor },
|
|
64
|
+
policy: {
|
|
65
|
+
policyRevisionId: authority.policy.id,
|
|
66
|
+
policyDigest: authority.policy.digest,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (authority.kind === "subscription_legacy") {
|
|
71
|
+
if (authority.legacyResolved.mode !== "subscription" || authority.legacyResolved.unitPriceMinor !== authority.unitPriceMinor) {
|
|
72
|
+
throw new CommerceQuoteError("PRICING_INVARIANT_VIOLATION", "Strict money authority returned an invalid legacy subscription result", { legacyPriceEntryId: authority.legacyResolved.priceEntryId, mode: authority.legacyResolved.mode });
|
|
73
|
+
}
|
|
74
|
+
return { base, resolved: authority.legacyResolved };
|
|
75
|
+
}
|
|
76
|
+
throw new CommerceQuoteError("PRICING_INVARIANT_VIOLATION", "Strict money authority returned a one-time result for a subscription quote", { authorityKind: authority.kind, basePriceEntryId: base.priceEntryId });
|
|
77
|
+
}
|
|
78
|
+
export function assertSubscriptionCheapest(input) {
|
|
79
|
+
if (input.modeAtLine === "subscription" &&
|
|
80
|
+
input.oneTime &&
|
|
81
|
+
toGrossMinor(input.resolved, input.vatRateBps) > toGrossMinor(input.oneTime, input.vatRateBps)) {
|
|
82
|
+
throw new CommerceQuoteError("PRICING_INVARIANT_VIOLATION", "Subscription price must not exceed active one-time price", {
|
|
83
|
+
sku: input.requestSku,
|
|
84
|
+
subscriptionPriceEntryId: input.resolved.priceEntryId,
|
|
85
|
+
oneTimePriceEntryId: input.oneTime.priceEntryId,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function toGrossMinor(price, vatRateBps) {
|
|
90
|
+
if (price.amountKind === "gross")
|
|
91
|
+
return price.unitPriceMinor;
|
|
92
|
+
return Math.round((price.unitPriceMinor * (10_000 + vatRateBps)) / 10_000);
|
|
93
|
+
}
|
|
94
|
+
export function calculateIncludedVat(grossMinor, vatRateBps) {
|
|
95
|
+
return splitIncludedVat(grossMinor, vatRateBps);
|
|
96
|
+
}
|
|
97
|
+
/** Exhaustive transport vocabulary; widening requires the matching durable contract. */
|
|
98
|
+
const TRANSPORT_COMPONENT_TYPES = {
|
|
99
|
+
base_unit: true,
|
|
100
|
+
mode_discount: true,
|
|
101
|
+
qty_tier: true,
|
|
102
|
+
promo: true,
|
|
103
|
+
loyalty: true,
|
|
104
|
+
shipping: true,
|
|
105
|
+
bundle: true,
|
|
106
|
+
};
|
|
107
|
+
function isTransportComponentType(componentType) {
|
|
108
|
+
return Object.prototype.hasOwnProperty.call(TRANSPORT_COMPONENT_TYPES, componentType);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Map one kernel pricing component onto the quote transport shape.
|
|
112
|
+
*
|
|
113
|
+
* A component type outside the transport union stops the quote loudly. It is never
|
|
114
|
+
* cast through and never silently dropped: a dropped component breaks the breakdown
|
|
115
|
+
* invariant (components must sum to the line total), so a quote would go out priced
|
|
116
|
+
* from an incomplete explanation of its own total.
|
|
117
|
+
*/
|
|
118
|
+
export function mapPricingComponent(component, scope) {
|
|
119
|
+
const componentType = component.component_type;
|
|
120
|
+
if (!isTransportComponentType(componentType)) {
|
|
121
|
+
throw new CommerceQuoteError("PRICING_INVARIANT_VIOLATION", "Pricing component type is not carried by the quote transport", { componentType, carriedTypes: Object.keys(TRANSPORT_COMPONENT_TYPES) });
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
scope,
|
|
125
|
+
componentType,
|
|
126
|
+
amountMinor: component.amount_minor,
|
|
127
|
+
reasonCode: component.reason_code,
|
|
128
|
+
reasonPayload: component.reason_payload,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A money builder bound to one currency.
|
|
133
|
+
*
|
|
134
|
+
* This used to be a plain `money(amountMinor)` that stamped the settlement
|
|
135
|
+
* currency as a literal, which meant the quote's declared `currency` and the
|
|
136
|
+
* currency on every amount inside it came from two different places. They
|
|
137
|
+
* agreed only because the port's `currency` option was typed as that same
|
|
138
|
+
* literal. Binding the builder once per port makes the agreement structural:
|
|
139
|
+
* there is no second place left for the two to disagree.
|
|
140
|
+
*/
|
|
141
|
+
export function moneyIn(currency) {
|
|
142
|
+
return (amountMinor) => ({ amountMinor, currency });
|
|
143
|
+
}
|
|
144
|
+
export function sum(values) {
|
|
145
|
+
return values.reduce((total, value) => total + value, 0);
|
|
146
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ShippingTerms } from "../shipping/index.js";
|
|
2
|
+
import type { ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
|
|
3
|
+
import type { QuoteShippingPromotionInput, QuoteShippingPromotionResult } from "./quoteShippingPromotions.js";
|
|
4
|
+
import type { PricingResolverPort } from "@openlup/core/pricing";
|
|
5
|
+
import type { CreateQuoteResponse, PricingPolicySnapshot, CreateQuoteRequest, CommerceQuoteContext, CommerceQuoteLine, CommerceTaxProfile, CommerceQuoteDiscount, CommerceCodeRejection, CommerceCodeRejectionDetail, CartLineInput } from "./contracts/index.js";
|
|
6
|
+
import { type CreateQuoteOptions } from "./quotePorts.js";
|
|
7
|
+
import type { CommercePriceAuthorityPort } from "./ports.js";
|
|
8
|
+
import type { CommerceQuoteCatalogItem } from "./commerceQuoteCatalogReadPort.js";
|
|
9
|
+
export interface QuotePromotionResult {
|
|
10
|
+
discounts: CommerceQuoteDiscount[];
|
|
11
|
+
codeRejections: CommerceCodeRejection[];
|
|
12
|
+
codeRejectionDetails: CommerceCodeRejectionDetail[];
|
|
13
|
+
}
|
|
14
|
+
export interface DbBackedCommerceQuotePortDeps<Request extends CreateQuoteRequest, Item extends CommerceQuoteCatalogItem, LineContext extends object, Context extends CommerceQuoteContext> {
|
|
15
|
+
quoteCatalogReadPort: {
|
|
16
|
+
listQuoteCatalogItems(): Promise<Item[]>;
|
|
17
|
+
};
|
|
18
|
+
isStrictD1Quote: boolean;
|
|
19
|
+
commercePriceAuthorityPort?: CommercePriceAuthorityPort;
|
|
20
|
+
pricingResolverPort?: PricingResolverPort;
|
|
21
|
+
taxProfile: CommerceTaxProfile;
|
|
22
|
+
supportedTaxProfiles: readonly CommerceTaxProfile[];
|
|
23
|
+
regionCode: string;
|
|
24
|
+
currency: string;
|
|
25
|
+
now?: () => string;
|
|
26
|
+
shippingFlatMinor?: () => Promise<number>;
|
|
27
|
+
resolveQuoteShippingPromotions?: (input: QuoteShippingPromotionInput<Request>) => Promise<QuoteShippingPromotionResult>;
|
|
28
|
+
hasPromotionCodePort: boolean;
|
|
29
|
+
lineContext(line: CartLineInput, item: Item): LineContext;
|
|
30
|
+
quoteContext(request: Request, lines: Array<LineContext & {
|
|
31
|
+
line: CommerceQuoteLine;
|
|
32
|
+
}>): () => Context;
|
|
33
|
+
resolveAutomaticQuotePromotions(input: {
|
|
34
|
+
request: Request;
|
|
35
|
+
options?: CreateQuoteOptions;
|
|
36
|
+
regionCode: string;
|
|
37
|
+
referenceProductMinor: number;
|
|
38
|
+
subtotalGrossMinor: number;
|
|
39
|
+
shippingGrossMinor: number;
|
|
40
|
+
atTime: string;
|
|
41
|
+
}): Promise<Pick<QuotePromotionResult, "discounts" | "codeRejections">>;
|
|
42
|
+
applyPromotionCodesV2(input: {
|
|
43
|
+
preserveLegacyDiscountsWhenNoCandidates: boolean;
|
|
44
|
+
clientId: string | null;
|
|
45
|
+
mode: Request["mode"];
|
|
46
|
+
promoCodes: string[];
|
|
47
|
+
referenceProductMinor: number;
|
|
48
|
+
subtotalGrossMinor: number;
|
|
49
|
+
shippingGrossMinor: number;
|
|
50
|
+
discounts: CommerceQuoteDiscount[];
|
|
51
|
+
codeRejections: CommerceCodeRejection[];
|
|
52
|
+
atTime: string;
|
|
53
|
+
}): Promise<QuotePromotionResult>;
|
|
54
|
+
}
|
|
55
|
+
export declare function createDbBackedCommerceQuotePort<Request extends CreateQuoteRequest, Item extends CommerceQuoteCatalogItem, LineContext extends object, Context extends CommerceQuoteContext>(deps: DbBackedCommerceQuotePortDeps<Request, Item, LineContext, Context>): {
|
|
56
|
+
createQuote: (request: Request, options?: CreateQuoteOptions) => Promise<Omit<CreateQuoteResponse, "quote"> & {
|
|
57
|
+
quote: Omit<CreateQuoteResponse["quote"], "context"> & {
|
|
58
|
+
context: Context & {
|
|
59
|
+
pricingPolicy?: PricingPolicySnapshot;
|
|
60
|
+
shippingTerms?: ShippingTerms;
|
|
61
|
+
acquisitionTerms?: ResolvedAcquisitionTerms;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
}>;
|
|
65
|
+
createServerAuthoritativeQuote: (request: Request, options?: CreateQuoteOptions) => Promise<Omit<CreateQuoteResponse, "quote"> & {
|
|
66
|
+
quote: Omit<CreateQuoteResponse["quote"], "context"> & {
|
|
67
|
+
context: Context & {
|
|
68
|
+
pricingPolicy?: PricingPolicySnapshot;
|
|
69
|
+
shippingTerms?: ShippingTerms;
|
|
70
|
+
acquisitionTerms?: ResolvedAcquisitionTerms;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
}>;
|
|
74
|
+
};
|