@aglyn/plugins-commerce 1.0.0-beta.229 → 1.0.0-beta.231
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/package.json +13 -13
- package/src/index.d.ts +0 -1
- package/src/index.js +0 -1
- package/src/index.js.map +1 -1
- package/src/lib/barcode/barcode-decode.d.ts +71 -0
- package/src/lib/barcode/barcode-decode.js +498 -0
- package/src/lib/barcode/barcode-decode.js.map +1 -0
- package/src/lib/barcode/barcode-encode.d.ts +44 -0
- package/src/lib/barcode/barcode-encode.js +138 -0
- package/src/lib/barcode/barcode-encode.js.map +1 -0
- package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
- package/src/lib/barcode/barcode-scanner.component.js +260 -0
- package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
- package/src/lib/barcode/scan-button.component.d.ts +10 -0
- package/src/lib/barcode/scan-button.component.js +62 -0
- package/src/lib/barcode/scan-button.component.js.map +1 -0
- package/src/lib/barcode/scanner-wedge.d.ts +35 -0
- package/src/lib/barcode/scanner-wedge.js +108 -0
- package/src/lib/barcode/scanner-wedge.js.map +1 -0
- package/src/lib/components/account.js +10 -1
- package/src/lib/components/account.js.map +1 -1
- package/src/lib/components/cart-extras.d.ts +45 -0
- package/src/lib/components/cart-extras.js +127 -0
- package/src/lib/components/cart-extras.js.map +1 -0
- package/src/lib/components/cart.js +82 -15
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/checkout-return-notice.d.ts +26 -0
- package/src/lib/components/checkout-return-notice.js +48 -0
- package/src/lib/components/checkout-return-notice.js.map +1 -0
- package/src/lib/components/commerce-console-page.js +124 -0
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/commerce-console-sections.d.ts +1 -1
- package/src/lib/components/commerce-console-sections.js +4 -0
- package/src/lib/components/commerce-console-sections.js.map +1 -1
- package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
- package/src/lib/components/console/bulk-fulfill.js +84 -0
- package/src/lib/components/console/bulk-fulfill.js.map +1 -0
- package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
- package/src/lib/components/console/customer-notifications-card.component.js +149 -0
- package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
- package/src/lib/components/console/host-orders-card.component.js +84 -5
- package/src/lib/components/console/host-orders-card.component.js.map +1 -1
- package/src/lib/components/console/locations-card.component.js +164 -57
- package/src/lib/components/console/locations-card.component.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +209 -61
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
- package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
- package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
- package/src/lib/components/console/order-invoice.component.d.ts +33 -0
- package/src/lib/components/console/order-invoice.component.js +81 -0
- package/src/lib/components/console/order-invoice.component.js.map +1 -0
- package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
- package/src/lib/components/console/order-receipt-resend.component.js +203 -0
- package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
- package/src/lib/components/console/order-returns.component.d.ts +36 -0
- package/src/lib/components/console/order-returns.component.js +142 -0
- package/src/lib/components/console/order-returns.component.js.map +1 -0
- package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
- package/src/lib/components/console/order-shipping-actions.component.js +149 -0
- package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
- package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
- package/src/lib/components/console/order-webhooks-card.component.js +623 -0
- package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
- package/src/lib/components/console/order-zones.d.ts +155 -0
- package/src/lib/components/console/order-zones.js +40 -0
- package/src/lib/components/console/order-zones.js.map +1 -0
- package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
- package/src/lib/components/console/payment-methods-card.component.js +395 -0
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-api.d.ts +124 -0
- package/src/lib/components/console/pos/pos-api.js +101 -0
- package/src/lib/components/console/pos/pos-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
- package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
- package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
- package/src/lib/components/console/pos/use-pos-display.js +161 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
- package/src/lib/components/console/pos-devices-card.component.js +546 -0
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
- package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
- package/src/lib/components/console/pos-display/brand-screen.js +85 -0
- package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
- package/src/lib/components/console/pos-display/cart-screen.js +166 -0
- package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
- package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
- package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
- package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
- package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
- package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
- package/src/lib/components/console/pos-display/tip-screen.js +211 -0
- package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
- package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
- package/src/lib/components/console/pos-display-page.component.js +407 -0
- package/src/lib/components/console/pos-display-page.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
- package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
- package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
- package/src/lib/components/console/pos-ops/register-ops.js +28 -0
- package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
- package/src/lib/components/console/pos-page.component.d.ts +13 -5
- package/src/lib/components/console/pos-page.component.js +729 -657
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/product-editor-dialog.component.js +51 -7
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
- package/src/lib/components/console/product-labels-dialog.component.js +197 -0
- package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
- package/src/lib/components/console/product-register-fields.component.js +241 -0
- package/src/lib/components/console/product-register-fields.component.js.map +1 -0
- package/src/lib/components/console/product-zones.d.ts +58 -2
- package/src/lib/components/console/product-zones.js +10 -2
- package/src/lib/components/console/product-zones.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +51 -11
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
- package/src/lib/components/console/register-hardware-card.component.js +826 -0
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
- package/src/lib/components/console/registers-card.component.js +24 -5
- package/src/lib/components/console/registers-card.component.js.map +1 -1
- package/src/lib/components/console/return-actions.d.ts +38 -0
- package/src/lib/components/console/return-actions.js +76 -0
- package/src/lib/components/console/return-actions.js.map +1 -0
- package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
- package/src/lib/components/console/return-detail-dialog.component.js +718 -0
- package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
- package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
- package/src/lib/components/console/return-settings-card.component.js +195 -0
- package/src/lib/components/console/return-settings-card.component.js.map +1 -0
- package/src/lib/components/console/return-zones.d.ts +87 -0
- package/src/lib/components/console/return-zones.js +31 -0
- package/src/lib/components/console/return-zones.js.map +1 -0
- package/src/lib/components/console/returns-card.component.d.ts +45 -0
- package/src/lib/components/console/returns-card.component.js +159 -0
- package/src/lib/components/console/returns-card.component.js.map +1 -0
- package/src/lib/components/console/shipping-settings-card.component.js +161 -5
- package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
- package/src/lib/components/console/shippingeasy-card.component.js +378 -0
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
- package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
- package/src/lib/components/console/shipstation-card.component.js +345 -0
- package/src/lib/components/console/shipstation-card.component.js.map +1 -0
- package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
- package/src/lib/components/console/start-return-dialog.component.js +243 -0
- package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
- package/src/lib/components/console/stock-movements-card.component.js +2 -1
- package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
- package/src/lib/components/console/store-settings-card.component.js +2 -66
- package/src/lib/components/console/store-settings-card.component.js.map +1 -1
- package/src/lib/components/console/store-zones.d.ts +42 -0
- package/src/lib/components/console/store-zones.js +39 -0
- package/src/lib/components/console/store-zones.js.map +1 -0
- package/src/lib/components/order-status.d.ts +36 -0
- package/src/lib/components/order-status.js +502 -0
- package/src/lib/components/order-status.js.map +1 -0
- package/src/lib/components/product-detail.js +44 -2
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/return-request.d.ts +32 -0
- package/src/lib/components/return-request.js +576 -0
- package/src/lib/components/return-request.js.map +1 -0
- package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
- package/src/lib/components/storefront-payment-appearance.js +114 -0
- package/src/lib/components/storefront-payment-appearance.js.map +1 -0
- package/src/lib/components/storefront-payment-element.d.ts +57 -1
- package/src/lib/components/storefront-payment-element.js +332 -33
- package/src/lib/components/storefront-payment-element.js.map +1 -1
- package/src/lib/constants/order-status.d.ts +22 -0
- package/src/lib/constants/order-status.js +22 -0
- package/src/lib/constants/order-status.js.map +1 -0
- package/src/lib/constants/return-request.d.ts +27 -0
- package/src/lib/constants/return-request.js +32 -0
- package/src/lib/constants/return-request.js.map +1 -0
- package/src/lib/constants/stock-movement-query.js +2 -1
- package/src/lib/constants/stock-movement-query.js.map +1 -1
- package/src/lib/declarations.console-server.js +9 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.server.d.ts +2 -1
- package/src/lib/declarations.server.js +47 -1
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/buyer-notifications.d.ts +59 -0
- package/src/lib/model/buyer-notifications.js +97 -0
- package/src/lib/model/buyer-notifications.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +127 -1
- package/src/lib/model/commerce-orders.js +24 -15
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-payment-methods.d.ts +146 -0
- package/src/lib/model/commerce-payment-methods.js +247 -0
- package/src/lib/model/commerce-payment-methods.js.map +1 -0
- package/src/lib/model/commerce-pos-ops.d.ts +437 -0
- package/src/lib/model/commerce-pos-ops.js +721 -0
- package/src/lib/model/commerce-pos-ops.js.map +1 -0
- package/src/lib/model/commerce-pos.d.ts +263 -0
- package/src/lib/model/commerce-pos.js +375 -0
- package/src/lib/model/commerce-pos.js.map +1 -0
- package/src/lib/model/commerce-printers.d.ts +211 -0
- package/src/lib/model/commerce-printers.js +181 -0
- package/src/lib/model/commerce-printers.js.map +1 -0
- package/src/lib/model/commerce-receipt.d.ts +97 -0
- package/src/lib/model/commerce-receipt.js +180 -0
- package/src/lib/model/commerce-receipt.js.map +1 -0
- package/src/lib/model/commerce-returns.d.ts +207 -0
- package/src/lib/model/commerce-returns.js +300 -0
- package/src/lib/model/commerce-returns.js.map +1 -0
- package/src/lib/model/commerce-shipping.d.ts +44 -1
- package/src/lib/model/commerce-shipping.js +53 -9
- package/src/lib/model/commerce-shipping.js.map +1 -1
- package/src/lib/model/commerce-tax-engine.d.ts +90 -0
- package/src/lib/model/commerce-tax-engine.js +129 -0
- package/src/lib/model/commerce-tax-engine.js.map +1 -0
- package/src/lib/model/commerce.d.ts +88 -2
- package/src/lib/model/commerce.js +89 -1
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/index.d.ts +15 -0
- package/src/lib/model/index.js +15 -0
- package/src/lib/model/index.js.map +1 -1
- package/src/lib/model/order-events.d.ts +154 -0
- package/src/lib/model/order-events.js +153 -0
- package/src/lib/model/order-events.js.map +1 -0
- package/src/lib/model/order-fulfillment.d.ts +117 -0
- package/src/lib/model/order-fulfillment.js +217 -0
- package/src/lib/model/order-fulfillment.js.map +1 -0
- package/src/lib/model/order-history.d.ts +58 -0
- package/src/lib/model/order-history.js +22 -0
- package/src/lib/model/order-history.js.map +1 -0
- package/src/lib/model/order-list-fields.d.ts +9 -1
- package/src/lib/model/order-list-fields.js +7 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/order-shipping-export.d.ts +91 -0
- package/src/lib/model/order-shipping-export.js +192 -0
- package/src/lib/model/order-shipping-export.js.map +1 -0
- package/src/lib/model/order-status-view.d.ts +103 -0
- package/src/lib/model/order-status-view.js +156 -0
- package/src/lib/model/order-status-view.js.map +1 -0
- package/src/lib/model/order-webhooks.d.ts +142 -0
- package/src/lib/model/order-webhooks.js +91 -0
- package/src/lib/model/order-webhooks.js.map +1 -0
- package/src/lib/model/product-channel.d.ts +56 -0
- package/src/lib/model/product-channel.js +86 -0
- package/src/lib/model/product-channel.js.map +1 -0
- package/src/lib/model/product-modifiers.d.ts +80 -0
- package/src/lib/model/product-modifiers.js +140 -0
- package/src/lib/model/product-modifiers.js.map +1 -0
- package/src/lib/model/shippingeasy.d.ts +94 -0
- package/src/lib/model/shippingeasy.js +267 -0
- package/src/lib/model/shippingeasy.js.map +1 -0
- package/src/lib/model/shipstation.d.ts +125 -0
- package/src/lib/model/shipstation.js +399 -0
- package/src/lib/model/shipstation.js.map +1 -0
- package/src/lib/model/smart-collection-reads.d.ts +32 -0
- package/src/lib/model/smart-collection-reads.js +63 -0
- package/src/lib/model/smart-collection-reads.js.map +1 -0
- package/src/lib/model/tracking-url.d.ts +74 -0
- package/src/lib/model/tracking-url.js +159 -0
- package/src/lib/model/tracking-url.js.map +1 -0
- package/src/lib/plugin-config.d.ts +13 -0
- package/src/lib/plugin-config.js +77 -5
- package/src/lib/plugin-config.js.map +1 -1
- package/src/lib/plugin.js +23 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/pos-ops-config.d.ts +39 -0
- package/src/lib/pos-ops-config.js +88 -0
- package/src/lib/pos-ops-config.js.map +1 -0
- package/src/lib/printing/print-document.d.ts +106 -0
- package/src/lib/printing/print-document.js +464 -0
- package/src/lib/printing/print-document.js.map +1 -0
- package/src/lib/printing/product-labels.d.ts +58 -0
- package/src/lib/printing/product-labels.js +116 -0
- package/src/lib/printing/product-labels.js.map +1 -0
- package/src/lib/printing/render-epson.d.ts +57 -0
- package/src/lib/printing/render-epson.js +135 -0
- package/src/lib/printing/render-epson.js.map +1 -0
- package/src/lib/printing/render-star.d.ts +45 -0
- package/src/lib/printing/render-star.js +100 -0
- package/src/lib/printing/render-star.js.map +1 -0
- package/src/lib/printing/render-text.d.ts +25 -0
- package/src/lib/printing/render-text.js +53 -0
- package/src/lib/printing/render-text.js.map +1 -0
- package/src/lib/server/api-v1/openapi.js +27 -4
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/api-v1/order-view.d.ts +67 -0
- package/src/lib/server/api-v1/order-view.js +120 -0
- package/src/lib/server/api-v1/order-view.js.map +1 -0
- package/src/lib/server/api-v1/orders-and-products.js +58 -65
- package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
- package/src/lib/server/billing-webhook.js +135 -28
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +29 -0
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/carrier-rates-availability.d.ts +26 -0
- package/src/lib/server/carrier-rates-availability.js +76 -0
- package/src/lib/server/carrier-rates-availability.js.map +1 -0
- package/src/lib/server/carrier-shipping.d.ts +84 -0
- package/src/lib/server/carrier-shipping.js +135 -0
- package/src/lib/server/carrier-shipping.js.map +1 -0
- package/src/lib/server/cart-checkout.d.ts +2 -0
- package/src/lib/server/cart-checkout.js +226 -22
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/checkout-extras.d.ts +64 -0
- package/src/lib/server/checkout-extras.js +157 -0
- package/src/lib/server/checkout-extras.js.map +1 -0
- package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
- package/src/lib/server/checkout-status.js +111 -0
- package/src/lib/server/checkout-status.js.map +1 -0
- package/src/lib/server/checkout.js +86 -9
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/draft-order.js +34 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.d.ts +127 -10
- package/src/lib/server/fulfill-order.js +451 -49
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/legacy-feed.d.ts +28 -0
- package/src/lib/server/legacy-feed.js +52 -0
- package/src/lib/server/legacy-feed.js.map +1 -0
- package/src/lib/server/native-checkout.d.ts +34 -15
- package/src/lib/server/native-checkout.js +32 -17
- package/src/lib/server/native-checkout.js.map +1 -1
- package/src/lib/server/order-event-host-emit.d.ts +23 -0
- package/src/lib/server/order-event-host-emit.js +30 -0
- package/src/lib/server/order-event-host-emit.js.map +1 -0
- package/src/lib/server/order-event-triggers.d.ts +37 -0
- package/src/lib/server/order-event-triggers.js +119 -0
- package/src/lib/server/order-event-triggers.js.map +1 -0
- package/src/lib/server/order-events.d.ts +62 -0
- package/src/lib/server/order-events.js +109 -0
- package/src/lib/server/order-events.js.map +1 -0
- package/src/lib/server/order-history.d.ts +23 -0
- package/src/lib/server/order-history.js +65 -0
- package/src/lib/server/order-history.js.map +1 -0
- package/src/lib/server/order-notifications.d.ts +185 -0
- package/src/lib/server/order-notifications.js +567 -0
- package/src/lib/server/order-notifications.js.map +1 -0
- package/src/lib/server/order-receipt-send.d.ts +39 -0
- package/src/lib/server/order-receipt-send.js +151 -0
- package/src/lib/server/order-receipt-send.js.map +1 -0
- package/src/lib/server/order-status-token.d.ts +31 -0
- package/src/lib/server/order-status-token.js +75 -0
- package/src/lib/server/order-status-token.js.map +1 -0
- package/src/lib/server/order-status.d.ts +58 -0
- package/src/lib/server/order-status.js +141 -0
- package/src/lib/server/order-status.js.map +1 -0
- package/src/lib/server/order-webhooks.d.ts +108 -0
- package/src/lib/server/order-webhooks.js +622 -0
- package/src/lib/server/order-webhooks.js.map +1 -0
- package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
- package/src/lib/server/orders-shipping-prepare.js +121 -0
- package/src/lib/server/orders-shipping-prepare.js.map +1 -0
- package/src/lib/server/payment-method-domains.d.ts +209 -0
- package/src/lib/server/payment-method-domains.js +444 -0
- package/src/lib/server/payment-method-domains.js.map +1 -0
- package/src/lib/server/payment-methods.d.ts +77 -0
- package/src/lib/server/payment-methods.js +284 -0
- package/src/lib/server/payment-methods.js.map +1 -0
- package/src/lib/server/pos-auth.d.ts +50 -0
- package/src/lib/server/pos-auth.js +121 -0
- package/src/lib/server/pos-auth.js.map +1 -0
- package/src/lib/server/pos-customer.d.ts +49 -0
- package/src/lib/server/pos-customer.js +257 -0
- package/src/lib/server/pos-customer.js.map +1 -0
- package/src/lib/server/pos-display.d.ts +57 -0
- package/src/lib/server/pos-display.js +419 -0
- package/src/lib/server/pos-display.js.map +1 -0
- package/src/lib/server/pos-fee-month.d.ts +34 -0
- package/src/lib/server/pos-fee-month.js +36 -0
- package/src/lib/server/pos-fee-month.js.map +1 -0
- package/src/lib/server/pos-ops-gate.d.ts +161 -0
- package/src/lib/server/pos-ops-gate.js +295 -0
- package/src/lib/server/pos-ops-gate.js.map +1 -0
- package/src/lib/server/pos-ops-routes.d.ts +22 -0
- package/src/lib/server/pos-ops-routes.js +36 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -0
- package/src/lib/server/pos-order.d.ts +1 -18
- package/src/lib/server/pos-order.js +222 -42
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.d.ts +39 -0
- package/src/lib/server/pos-payment.js +922 -0
- package/src/lib/server/pos-payment.js.map +1 -0
- package/src/lib/server/pos-print.d.ts +82 -0
- package/src/lib/server/pos-print.js +193 -0
- package/src/lib/server/pos-print.js.map +1 -0
- package/src/lib/server/pos-readers.d.ts +27 -0
- package/src/lib/server/pos-readers.js +276 -0
- package/src/lib/server/pos-readers.js.map +1 -0
- package/src/lib/server/pos-refund-authority.d.ts +60 -0
- package/src/lib/server/pos-refund-authority.js +72 -0
- package/src/lib/server/pos-refund-authority.js.map +1 -0
- package/src/lib/server/pos-return.d.ts +58 -0
- package/src/lib/server/pos-return.js +891 -0
- package/src/lib/server/pos-return.js.map +1 -0
- package/src/lib/server/pos-sale-stamp.d.ts +66 -0
- package/src/lib/server/pos-sale-stamp.js +84 -0
- package/src/lib/server/pos-sale-stamp.js.map +1 -0
- package/src/lib/server/pos-sale.d.ts +170 -0
- package/src/lib/server/pos-sale.js +461 -0
- package/src/lib/server/pos-sale.js.map +1 -0
- package/src/lib/server/pos-shift.d.ts +45 -0
- package/src/lib/server/pos-shift.js +484 -0
- package/src/lib/server/pos-shift.js.map +1 -0
- package/src/lib/server/pos-staff-pin.d.ts +26 -0
- package/src/lib/server/pos-staff-pin.js +339 -0
- package/src/lib/server/pos-staff-pin.js.map +1 -0
- package/src/lib/server/pos-stripe.d.ts +91 -0
- package/src/lib/server/pos-stripe.js +129 -0
- package/src/lib/server/pos-stripe.js.map +1 -0
- package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
- package/src/lib/server/pos-terminal-connection-token.js +166 -0
- package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
- package/src/lib/server/pos-terminal.d.ts +218 -0
- package/src/lib/server/pos-terminal.js +1014 -0
- package/src/lib/server/pos-terminal.js.map +1 -0
- package/src/lib/server/print-queue.d.ts +124 -0
- package/src/lib/server/print-queue.js +301 -0
- package/src/lib/server/print-queue.js.map +1 -0
- package/src/lib/server/printer-poll.d.ts +75 -0
- package/src/lib/server/printer-poll.js +325 -0
- package/src/lib/server/printer-poll.js.map +1 -0
- package/src/lib/server/printer-secret.d.ts +39 -0
- package/src/lib/server/printer-secret.js +56 -0
- package/src/lib/server/printer-secret.js.map +1 -0
- package/src/lib/server/printers.d.ts +114 -0
- package/src/lib/server/printers.js +546 -0
- package/src/lib/server/printers.js.map +1 -0
- package/src/lib/server/product-ai-capability.d.ts +42 -0
- package/src/lib/server/product-ai-capability.js +159 -0
- package/src/lib/server/product-ai-capability.js.map +1 -0
- package/src/lib/server/product-catalog.d.ts +42 -0
- package/src/lib/server/product-catalog.js +305 -0
- package/src/lib/server/product-catalog.js.map +1 -0
- package/src/lib/server/product-drafts.d.ts +119 -0
- package/src/lib/server/product-drafts.js +384 -0
- package/src/lib/server/product-drafts.js.map +1 -0
- package/src/lib/server/refund.js +110 -45
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reserve.js +2 -0
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/return-status-action.d.ts +37 -0
- package/src/lib/server/return-status-action.js +57 -0
- package/src/lib/server/return-status-action.js.map +1 -0
- package/src/lib/server/returns.d.ts +119 -0
- package/src/lib/server/returns.js +938 -0
- package/src/lib/server/returns.js.map +1 -0
- package/src/lib/server/shipment-records.d.ts +36 -0
- package/src/lib/server/shipment-records.js +289 -0
- package/src/lib/server/shipment-records.js.map +1 -0
- package/src/lib/server/shipping-connector-gates.d.ts +40 -0
- package/src/lib/server/shipping-connector-gates.js +97 -0
- package/src/lib/server/shipping-connector-gates.js.map +1 -0
- package/src/lib/server/shipping-connectors.d.ts +29 -0
- package/src/lib/server/shipping-connectors.js +236 -0
- package/src/lib/server/shipping-connectors.js.map +1 -0
- package/src/lib/server/shippingeasy.d.ts +238 -0
- package/src/lib/server/shippingeasy.js +787 -0
- package/src/lib/server/shippingeasy.js.map +1 -0
- package/src/lib/server/shipstation.d.ts +129 -0
- package/src/lib/server/shipstation.js +483 -0
- package/src/lib/server/shipstation.js.map +1 -0
- package/src/lib/server/site-page-resolver.d.ts +5 -0
- package/src/lib/server/site-page-resolver.js +156 -1
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/stock-levels.d.ts +21 -0
- package/src/lib/server/stock-levels.js +263 -0
- package/src/lib/server/stock-levels.js.map +1 -0
- package/src/lib/server/stripe-refund.d.ts +47 -0
- package/src/lib/server/stripe-refund.js +87 -0
- package/src/lib/server/stripe-refund.js.map +1 -0
- package/src/lib/server/supplier-update.js +46 -5
- package/src/lib/server/supplier-update.js.map +1 -1
- package/src/lib/server/tax-engine-quote.d.ts +47 -0
- package/src/lib/server/tax-engine-quote.js +105 -0
- package/src/lib/server/tax-engine-quote.js.map +1 -0
- package/src/lib/server.js +146 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/site.js +12 -0
- package/src/lib/site.js.map +1 -1
- package/src/lib/subprocessors.d.ts +26 -0
- package/src/lib/subprocessors.js +50 -0
- package/src/lib/subprocessors.js.map +1 -0
- package/src/lib/tenant-emails.js +461 -3
- package/src/lib/tenant-emails.js.map +1 -1
- package/src/lib/testing/fake-firestore.d.ts +45 -0
- package/src/lib/testing/fake-firestore.js +189 -0
- package/src/lib/testing/fake-firestore.js.map +1 -0
- package/src/lib/testing/memory-firestore.d.ts +123 -0
- package/src/lib/testing/memory-firestore.js +274 -0
- package/src/lib/testing/memory-firestore.js.map +1 -0
- package/src/lib/testing/pos-ops-harness.d.ts +50 -0
- package/src/lib/testing/pos-ops-harness.js +184 -0
- package/src/lib/testing/pos-ops-harness.js.map +1 -0
- package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
- package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
- package/src/lib/transfer/records-transfer.d.ts +11 -1
- package/src/lib/transfer/records-transfer.js +127 -5
- package/src/lib/transfer/records-transfer.js.map +1 -1
- package/src/lib/transfer/records.server.d.ts +9 -2
- package/src/lib/transfer/records.server.js +58 -7
- package/src/lib/transfer/records.server.js.map +1 -1
- package/src/lib/transfer/register-transfer-resources.js +40 -1
- package/src/lib/transfer/register-transfer-resources.js.map +1 -1
- package/src/lib/transfer/register-transfer-ui.js +4 -1
- package/src/lib/transfer/register-transfer-ui.js.map +1 -1
- package/src/lib/transfer/shipping-presets.d.ts +23 -0
- package/src/lib/transfer/shipping-presets.js +156 -0
- package/src/lib/transfer/shipping-presets.js.map +1 -0
- package/src/lib/transfer/tracking-transfer.d.ts +101 -0
- package/src/lib/transfer/tracking-transfer.js +546 -0
- package/src/lib/transfer/tracking-transfer.js.map +1 -0
- package/src/lib/transfer/tracking.server.d.ts +37 -0
- package/src/lib/transfer/tracking.server.js +393 -0
- package/src/lib/transfer/tracking.server.js.map +1 -0
- package/src/lib/transfer/transfer-keys.d.ts +2 -1
- package/src/lib/transfer/transfer-keys.js +6 -2
- package/src/lib/transfer/transfer-keys.js.map +1 -1
- package/src/lib/utils/code128.d.ts +37 -0
- package/src/lib/utils/code128.js +199 -0
- package/src/lib/utils/code128.js.map +1 -0
- package/src/lib/utils/order-invoice.d.ts +55 -0
- package/src/lib/utils/order-invoice.js +127 -0
- package/src/lib/utils/order-invoice.js.map +1 -0
- package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
- package/src/lib/utils/use-checkout-return-notice.js +78 -0
- package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
- package/src/lib/utils/use-storefront-purchase-event.js +4 -0
- package/src/lib/utils/use-storefront-purchase-event.js.map +1 -1
- package/src/lib/server/feed.js +0 -69
- package/src/lib/server/feed.js.map +0 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
17
|
+
import { formatOrderNumber, orderLineRefundCents, orderLineRefunded } from "./commerce-orders.js";
|
|
18
|
+
import { fulfilledQuantities, lineRequiresShipping } from "./order-fulfillment.js";
|
|
19
|
+
export const RETURN_STATUSES = [
|
|
20
|
+
'requested',
|
|
21
|
+
'approved',
|
|
22
|
+
'declined',
|
|
23
|
+
'received',
|
|
24
|
+
'refunded',
|
|
25
|
+
'closed'
|
|
26
|
+
];
|
|
27
|
+
export const RETURN_STATUS_LABELS = {
|
|
28
|
+
requested: 'Requested',
|
|
29
|
+
approved: 'Approved',
|
|
30
|
+
declined: 'Declined',
|
|
31
|
+
received: 'Received',
|
|
32
|
+
refunded: 'Refunded',
|
|
33
|
+
closed: 'Closed'
|
|
34
|
+
};
|
|
35
|
+
export const RETURN_STATUS_COLOR = {
|
|
36
|
+
requested: 'warning',
|
|
37
|
+
approved: 'info',
|
|
38
|
+
declined: 'default',
|
|
39
|
+
received: 'info',
|
|
40
|
+
refunded: 'success',
|
|
41
|
+
closed: 'default'
|
|
42
|
+
};
|
|
43
|
+
export const RETURN_REASON_LABELS = {
|
|
44
|
+
damaged: 'Arrived damaged',
|
|
45
|
+
wrong_item: 'Wrong item',
|
|
46
|
+
not_as_described: 'Not as described',
|
|
47
|
+
size_or_fit: 'Size or fit',
|
|
48
|
+
no_longer_needed: 'No longer needed',
|
|
49
|
+
other: 'Other'
|
|
50
|
+
};
|
|
51
|
+
export const RETURN_REASONS = Object.keys(RETURN_REASON_LABELS);
|
|
52
|
+
export const DEFAULT_RETURN_SETTINGS = {
|
|
53
|
+
enabled: true,
|
|
54
|
+
windowDays: 30,
|
|
55
|
+
eligibleTypes: [
|
|
56
|
+
'physical'
|
|
57
|
+
]
|
|
58
|
+
};
|
|
59
|
+
/** The most days a window may be set to, and the most a note may hold. */ export const RETURN_WINDOW_MAX_DAYS = 365;
|
|
60
|
+
export const RETURN_NOTE_MAX = 1000;
|
|
61
|
+
/** The stored settings, read defensively: the document is admin-writable. */ export function readReturnSettings(raw) {
|
|
62
|
+
const value = raw != null ? raw : {};
|
|
63
|
+
const days = Math.round(Number(value.windowDays));
|
|
64
|
+
const types = Array.isArray(value.eligibleTypes) ? value.eligibleTypes.filter((type)=>type === 'physical' || type === 'digital' || type === 'service') : DEFAULT_RETURN_SETTINGS.eligibleTypes;
|
|
65
|
+
return {
|
|
66
|
+
enabled: value.enabled !== false,
|
|
67
|
+
windowDays: Number.isFinite(days) && days >= 0 ? Math.min(days, RETURN_WINDOW_MAX_DAYS) : DEFAULT_RETURN_SETTINGS.windowDays,
|
|
68
|
+
eligibleTypes: types
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const TRANSITIONS = {
|
|
72
|
+
requested: [
|
|
73
|
+
'approved',
|
|
74
|
+
'declined',
|
|
75
|
+
'closed'
|
|
76
|
+
],
|
|
77
|
+
approved: [
|
|
78
|
+
'received',
|
|
79
|
+
'refunded',
|
|
80
|
+
'closed'
|
|
81
|
+
],
|
|
82
|
+
declined: [
|
|
83
|
+
'closed'
|
|
84
|
+
],
|
|
85
|
+
received: [
|
|
86
|
+
'refunded',
|
|
87
|
+
'closed'
|
|
88
|
+
],
|
|
89
|
+
refunded: [
|
|
90
|
+
'closed'
|
|
91
|
+
],
|
|
92
|
+
closed: []
|
|
93
|
+
};
|
|
94
|
+
/** The return state machine. */ export function canTransitionReturn(from, to) {
|
|
95
|
+
var _TRANSITIONS_from;
|
|
96
|
+
return ((_TRANSITIONS_from = TRANSITIONS[from]) != null ? _TRANSITIONS_from : []).includes(to);
|
|
97
|
+
}
|
|
98
|
+
/** Whether a return still holds units against the order. */ export function returnIsOpen(entry) {
|
|
99
|
+
return entry.status !== 'declined' && entry.status !== 'closed';
|
|
100
|
+
}
|
|
101
|
+
/** Whether a return is still holding units, or took them: anything not declined. */ export function returnHoldsUnits(entry) {
|
|
102
|
+
if (entry.status === 'declined') return false;
|
|
103
|
+
// A return closed without a refund gave its units back to the order.
|
|
104
|
+
if (entry.status === 'closed') return Boolean(entry.refundedAtMs);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* What can come back on an order: each line's shipped units (every unit, for
|
|
109
|
+
* a line with nothing to ship), less units already in a return that has not
|
|
110
|
+
* been declined, less everything on a line already refunded by name.
|
|
111
|
+
*/ export function returnableLines(order, existing, settings) {
|
|
112
|
+
var _order_lineItems;
|
|
113
|
+
const shipped = fulfilledQuantities(order);
|
|
114
|
+
const held = new Map();
|
|
115
|
+
for (const entry of existing){
|
|
116
|
+
var _entry_lines;
|
|
117
|
+
if (!returnHoldsUnits(entry)) continue;
|
|
118
|
+
for (const line of (_entry_lines = entry.lines) != null ? _entry_lines : []){
|
|
119
|
+
var _held_get;
|
|
120
|
+
held.set(line.lineItemId, ((_held_get = held.get(line.lineItemId)) != null ? _held_get : 0) + Math.max(0, Math.floor(Number(line.quantity) || 0)));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return ((_order_lineItems = order.lineItems) != null ? _order_lineItems : []).map((line, index)=>{
|
|
124
|
+
var _shipped_get, _line_productType, _held_get, _line_variantLabel;
|
|
125
|
+
const quantity = Math.max(0, Math.floor(Number(line.quantity) || 0));
|
|
126
|
+
const delivered = lineRequiresShipping(line) ? Math.min(quantity, (_shipped_get = shipped.get(index)) != null ? _shipped_get : 0) : quantity;
|
|
127
|
+
const type = (_line_productType = line.productType) != null ? _line_productType : null;
|
|
128
|
+
let blocked = null;
|
|
129
|
+
if (orderLineRefunded(order, index)) blocked = 'Already refunded';
|
|
130
|
+
else if (settings && !settings.eligibleTypes.includes(type != null ? type : 'physical')) blocked = 'Not returnable';
|
|
131
|
+
else if (delivered === 0) blocked = 'Not shipped yet';
|
|
132
|
+
const returnable = blocked ? 0 : Math.max(0, delivered - ((_held_get = held.get(index)) != null ? _held_get : 0));
|
|
133
|
+
return {
|
|
134
|
+
lineItemId: index,
|
|
135
|
+
name: line.name,
|
|
136
|
+
variantLabel: (_line_variantLabel = line.variantLabel) != null ? _line_variantLabel : null,
|
|
137
|
+
productType: type,
|
|
138
|
+
returnable,
|
|
139
|
+
blocked: blocked != null ? blocked : returnable === 0 ? 'Already being returned' : null
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* When the return window closes: `windowDays` after the latest shipment, or
|
|
145
|
+
* after the order was placed when nothing shipped (a digital order). `null`
|
|
146
|
+
* when the order carries no date at all, which reads as open.
|
|
147
|
+
*/ export function returnWindowEndsAtMs(order, settings) {
|
|
148
|
+
var _order_fulfillments;
|
|
149
|
+
const shippedAt = Math.max(0, ...((_order_fulfillments = order.fulfillments) != null ? _order_fulfillments : []).filter((entry)=>entry.status !== 'cancelled').map((entry)=>Number(entry.atMs) || 0));
|
|
150
|
+
const from = shippedAt || Number(order.createdAtMs) || 0;
|
|
151
|
+
if (!from) return null;
|
|
152
|
+
return from + settings.windowDays * 86400000;
|
|
153
|
+
}
|
|
154
|
+
/** Order statuses a return may be opened against. */ export const RETURNABLE_ORDER_STATUSES = [
|
|
155
|
+
'paid',
|
|
156
|
+
'partially_fulfilled',
|
|
157
|
+
'fulfilled',
|
|
158
|
+
'delivered'
|
|
159
|
+
];
|
|
160
|
+
/**
|
|
161
|
+
* Checks a return request against the order and the returns already open on
|
|
162
|
+
* it, merging duplicate lines first. `merchant` skips the buyer-only rules —
|
|
163
|
+
* the switch and the window — since a merchant may take anything back.
|
|
164
|
+
*/ export function validateReturnRequest(input) {
|
|
165
|
+
const { order, existing, settings, by, now } = input;
|
|
166
|
+
if (by === 'buyer' && !settings.enabled) return {
|
|
167
|
+
problem: 'disabled'
|
|
168
|
+
};
|
|
169
|
+
if (!RETURNABLE_ORDER_STATUSES.includes(order.status)) return {
|
|
170
|
+
problem: 'order_status',
|
|
171
|
+
status: order.status
|
|
172
|
+
};
|
|
173
|
+
if (by === 'buyer') {
|
|
174
|
+
const endsAt = returnWindowEndsAtMs(order, settings);
|
|
175
|
+
if (endsAt !== null && now > endsAt) return {
|
|
176
|
+
problem: 'window_closed',
|
|
177
|
+
endedAtMs: endsAt
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const returnable = returnableLines(order, existing, by === 'buyer' ? settings : null);
|
|
181
|
+
const merged = new Map();
|
|
182
|
+
for (const entry of input.lines){
|
|
183
|
+
var _ref, _ref1, _ref2;
|
|
184
|
+
const lineItemId = Number(entry == null ? void 0 : entry.lineItemId);
|
|
185
|
+
const quantity = Number(entry == null ? void 0 : entry.quantity);
|
|
186
|
+
if (!Number.isInteger(lineItemId) || lineItemId < 0 || lineItemId >= returnable.length) {
|
|
187
|
+
return {
|
|
188
|
+
problem: 'bad_line',
|
|
189
|
+
lineItemId: Number.isFinite(lineItemId) ? lineItemId : -1
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (!Number.isInteger(quantity) || quantity <= 0) return {
|
|
193
|
+
problem: 'bad_line',
|
|
194
|
+
lineItemId
|
|
195
|
+
};
|
|
196
|
+
const reason = String((_ref = entry == null ? void 0 : entry.reason) != null ? _ref : '');
|
|
197
|
+
if (!RETURN_REASONS.includes(reason)) return {
|
|
198
|
+
problem: 'bad_reason',
|
|
199
|
+
lineItemId
|
|
200
|
+
};
|
|
201
|
+
const prior = merged.get(lineItemId);
|
|
202
|
+
merged.set(lineItemId, {
|
|
203
|
+
lineItemId,
|
|
204
|
+
quantity: ((_ref1 = prior == null ? void 0 : prior.quantity) != null ? _ref1 : 0) + quantity,
|
|
205
|
+
reason: (_ref2 = prior == null ? void 0 : prior.reason) != null ? _ref2 : reason
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
if (merged.size === 0) return {
|
|
209
|
+
problem: 'empty'
|
|
210
|
+
};
|
|
211
|
+
for (const line of merged.values()){
|
|
212
|
+
const allowed = returnable[line.lineItemId].returnable;
|
|
213
|
+
if (line.quantity > allowed) return {
|
|
214
|
+
problem: 'too_many',
|
|
215
|
+
lineItemId: line.lineItemId,
|
|
216
|
+
returnable: allowed
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
lines: [
|
|
221
|
+
...merged.values()
|
|
222
|
+
].sort((a, b)=>a.lineItemId - b.lineItemId)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** Words for a refused request, for the buyer and the merchant alike. */ export function describeReturnRequestProblem(problem) {
|
|
226
|
+
switch(problem.problem){
|
|
227
|
+
case 'disabled':
|
|
228
|
+
return 'This store does not take return requests online. Contact the store instead.';
|
|
229
|
+
case 'window_closed':
|
|
230
|
+
return `The return window for this order closed on ${new Date(problem.endedAtMs).toLocaleDateString('en-US')}.`;
|
|
231
|
+
case 'order_status':
|
|
232
|
+
return `An order that is ${problem.status.replace('_', ' ')} cannot be returned.`;
|
|
233
|
+
case 'empty':
|
|
234
|
+
return 'Choose at least one item to return.';
|
|
235
|
+
case 'bad_line':
|
|
236
|
+
return 'One of the items is not on this order.';
|
|
237
|
+
case 'bad_reason':
|
|
238
|
+
return 'Choose a reason for each item.';
|
|
239
|
+
case 'too_many':
|
|
240
|
+
return problem.returnable === 0 ? 'One of the items cannot be returned.' : `Only ${problem.returnable} of one item can be returned.`;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* What refunding a return's units is worth: each line's paid share
|
|
245
|
+
* (`orderLineRefundCents`, discount apportioned) in proportion to the units
|
|
246
|
+
* coming back, never more than is left to refund on the order. Shipping and
|
|
247
|
+
* tax stay out, as they do for a line refund; the merchant may add them by
|
|
248
|
+
* amount.
|
|
249
|
+
*/ export function returnRefundCents(order, lines) {
|
|
250
|
+
var _ref, _ref1, _order_refundedCents;
|
|
251
|
+
var _order_totals;
|
|
252
|
+
let cents = 0;
|
|
253
|
+
for (const line of lines){
|
|
254
|
+
var _order_lineItems;
|
|
255
|
+
const orderLine = (_order_lineItems = order.lineItems) == null ? void 0 : _order_lineItems[line.lineItemId];
|
|
256
|
+
if (!orderLine) continue;
|
|
257
|
+
const lineQuantity = Math.max(1, Math.floor(Number(orderLine.quantity) || 1));
|
|
258
|
+
const paid = orderLineRefundCents(order, [
|
|
259
|
+
line.lineItemId
|
|
260
|
+
]);
|
|
261
|
+
cents += Math.round(paid * Math.min(lineQuantity, line.quantity) / lineQuantity);
|
|
262
|
+
}
|
|
263
|
+
const total = Number((_ref = (_ref1 = (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref1 : order.amountCents) != null ? _ref : 0);
|
|
264
|
+
const left = Math.max(0, total - Math.max(0, Number((_order_refundedCents = order.refundedCents) != null ? _order_refundedCents : 0)));
|
|
265
|
+
return Math.max(0, Math.min(cents, left));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The lines a return can refund BY NAME: those it takes back in full, which
|
|
269
|
+
* the refund route then withdraws entitlements for. A partial-quantity line is
|
|
270
|
+
* refunded by amount alone.
|
|
271
|
+
*/ export function returnWholeLineIds(order, lines) {
|
|
272
|
+
return lines.filter((line)=>{
|
|
273
|
+
var _order_lineItems_line_lineItemId, _order_lineItems;
|
|
274
|
+
return line.quantity >= Math.floor(Number((_order_lineItems = order.lineItems) == null ? void 0 : (_order_lineItems_line_lineItemId = _order_lineItems[line.lineItemId]) == null ? void 0 : _order_lineItems_line_lineItemId.quantity) || 0);
|
|
275
|
+
}).map((line)=>line.lineItemId);
|
|
276
|
+
}
|
|
277
|
+
/** A short "2× Mug, 1× Shirt" for a return's lines. */ export function describeReturnLines(order, lines) {
|
|
278
|
+
return lines.map((line)=>{
|
|
279
|
+
var _ref;
|
|
280
|
+
var _order_lineItems_line_lineItemId, _order_lineItems;
|
|
281
|
+
return `${line.quantity}× ${(_ref = (_order_lineItems = order.lineItems) == null ? void 0 : (_order_lineItems_line_lineItemId = _order_lineItems[line.lineItemId]) == null ? void 0 : _order_lineItems_line_lineItemId.name) != null ? _ref : `line ${line.lineItemId}`}`;
|
|
282
|
+
}).join(', ');
|
|
283
|
+
}
|
|
284
|
+
/** The order number a return lists by. */ export function returnOrderNumber(order, orderId) {
|
|
285
|
+
return formatOrderNumber(order, orderId);
|
|
286
|
+
}
|
|
287
|
+
/** Appends a return timeline event immutably. */ export function appendReturnEvent(entry, event, detail, atMs = Date.now()) {
|
|
288
|
+
var _entry_timeline;
|
|
289
|
+
return [
|
|
290
|
+
...(_entry_timeline = entry.timeline) != null ? _entry_timeline : [],
|
|
291
|
+
_extends({
|
|
292
|
+
atMs,
|
|
293
|
+
event
|
|
294
|
+
}, detail ? {
|
|
295
|
+
detail
|
|
296
|
+
} : {})
|
|
297
|
+
];
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
//# sourceMappingURL=commerce-returns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/model/commerce-returns.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ProductType } from './commerce'\nimport {\n formatOrderNumber,\n orderLineRefundCents,\n orderLineRefunded,\n type HostOrder,\n} from './commerce-orders'\nimport { fulfilledQuantities, lineRequiresShipping } from './order-fulfillment'\n\n/**\n * Returns (RMA, AGL-3611): `hosts/{hostId}/returns/{id}`.\n *\n * A buyer asks to send items back, from their account or the order-status\n * page; the merchant approves or declines, receives the parcel and decides\n * per line whether it goes back on the shelf, then refunds through the\n * order's own refund route. The return is the record of all of that, so the\n * order keeps meaning what it always meant and the money still moves through\n * the one door that guards it.\n *\n * Every rule here is pure and shared by the buyer's route, the merchant's\n * route and the console, so the three cannot disagree about what is\n * returnable.\n */\n\nexport type ReturnStatus = 'requested' | 'approved' | 'declined' | 'received' | 'refunded' | 'closed'\n\nexport const RETURN_STATUSES: readonly ReturnStatus[] = [\n 'requested',\n 'approved',\n 'declined',\n 'received',\n 'refunded',\n 'closed',\n]\n\nexport const RETURN_STATUS_LABELS: Record<ReturnStatus, string> = {\n requested: 'Requested',\n approved: 'Approved',\n declined: 'Declined',\n received: 'Received',\n refunded: 'Refunded',\n closed: 'Closed',\n}\n\nexport const RETURN_STATUS_COLOR: Record<ReturnStatus, 'default' | 'info' | 'warning' | 'success' | 'error'> = {\n requested: 'warning',\n approved: 'info',\n declined: 'default',\n received: 'info',\n refunded: 'success',\n closed: 'default',\n}\n\nexport type ReturnReason =\n | 'damaged'\n | 'wrong_item'\n | 'not_as_described'\n | 'size_or_fit'\n | 'no_longer_needed'\n | 'other'\n\nexport const RETURN_REASON_LABELS: Record<ReturnReason, string> = {\n damaged: 'Arrived damaged',\n wrong_item: 'Wrong item',\n not_as_described: 'Not as described',\n size_or_fit: 'Size or fit',\n no_longer_needed: 'No longer needed',\n other: 'Other',\n}\n\nexport const RETURN_REASONS = Object.keys(RETURN_REASON_LABELS) as ReturnReason[]\n\nexport interface ReturnLine {\n lineItemId: number\n quantity: number\n reason: ReturnReason\n /** The line's name when the return was opened, for lists that read no order. */\n name?: string\n}\n\n/** A return label a shipping plugin bought for the buyer to send the parcel with. */\nexport interface ReturnLabel {\n carrier: string\n trackingNumber: string\n labelUrl: string\n trackingUrl?: string\n attachedAtMs: number\n}\n\n/** What went back on the shelf when the parcel arrived. */\nexport interface ReturnRestock {\n lines: Array<{ lineItemId: number; quantity: number }>\n /** The stock location the units went to, for a multi-location store. */\n locationId?: string\n atMs: number\n}\n\nexport interface ReturnTimelineEvent {\n atMs: number\n event: string\n detail?: string\n}\n\n/** `hosts/{hostId}/returns/{id}`, written only by the server. */\nexport interface HostReturn {\n orderId: string\n /** The order's number, for the list, e.g. `#1042`. */\n orderNumber: string\n customerEmail: string | null\n customerName: string | null\n lines: ReturnLine[]\n status: ReturnStatus\n /** Who opened it: the buyer, or the merchant on their behalf. */\n requestedBy: 'buyer' | 'merchant'\n /**\n * `register` for a return taken and refunded at a POS register (AGL-3609):\n * it is created already `refunded`, and the register's own record under\n * `registers/{registerId}/returns` holds the tenders it went back to.\n */\n source?: 'register'\n registerId?: string\n customerNote?: string\n merchantNote?: string\n returnLabel?: ReturnLabel\n restock?: ReturnRestock\n /** When the refund went through the order's refund route, and for how much. */\n refundedAtMs?: number\n refundCents?: number\n timeline: ReturnTimelineEvent[]\n createdAtMs: number\n updatedAtMs: number\n}\n\n/** The store's return policy, at `hosts/{hostId}/settings/store` `returns`. */\nexport interface StoreReturnSettings {\n /** Whether buyers may ask for a return themselves. */\n enabled: boolean\n /** Days after the order shipped (or was placed, if it never shipped). */\n windowDays: number\n /** The product types a buyer may return. */\n eligibleTypes: ProductType[]\n}\n\nexport const DEFAULT_RETURN_SETTINGS: StoreReturnSettings = {\n enabled: true,\n windowDays: 30,\n eligibleTypes: ['physical'],\n}\n\n/** The most days a window may be set to, and the most a note may hold. */\nexport const RETURN_WINDOW_MAX_DAYS = 365\nexport const RETURN_NOTE_MAX = 1000\n\n/** The stored settings, read defensively: the document is admin-writable. */\nexport function readReturnSettings(raw: unknown): StoreReturnSettings {\n const value = (raw ?? {}) as Partial<Record<keyof StoreReturnSettings, unknown>>\n const days = Math.round(Number(value.windowDays))\n const types = Array.isArray(value.eligibleTypes)\n ? (value.eligibleTypes as unknown[]).filter(\n (type): type is ProductType => type === 'physical' || type === 'digital' || type === 'service',\n )\n : DEFAULT_RETURN_SETTINGS.eligibleTypes\n return {\n enabled: value.enabled !== false,\n windowDays:\n Number.isFinite(days) && days >= 0 ? Math.min(days, RETURN_WINDOW_MAX_DAYS) : DEFAULT_RETURN_SETTINGS.windowDays,\n eligibleTypes: types,\n }\n}\n\nconst TRANSITIONS: Record<ReturnStatus, ReturnStatus[]> = {\n requested: ['approved', 'declined', 'closed'],\n approved: ['received', 'refunded', 'closed'],\n declined: ['closed'],\n received: ['refunded', 'closed'],\n refunded: ['closed'],\n closed: [],\n}\n\n/** The return state machine. */\nexport function canTransitionReturn(from: ReturnStatus, to: ReturnStatus): boolean {\n return (TRANSITIONS[from] ?? []).includes(to)\n}\n\n/** Whether a return still holds units against the order. */\nexport function returnIsOpen(entry: Pick<HostReturn, 'status'>): boolean {\n return entry.status !== 'declined' && entry.status !== 'closed'\n}\n\n/** Whether a return is still holding units, or took them: anything not declined. */\nexport function returnHoldsUnits(entry: Pick<HostReturn, 'status' | 'refundedAtMs'>): boolean {\n if (entry.status === 'declined') return false\n // A return closed without a refund gave its units back to the order.\n if (entry.status === 'closed') return Boolean(entry.refundedAtMs)\n return true\n}\n\n/** Units each line could be sent back, and why not where none can. */\nexport interface ReturnableLine {\n lineItemId: number\n name: string\n variantLabel: string | null\n productType: ProductType | null\n /** Units the buyer has and may send back. */\n returnable: number\n /** Why `returnable` is 0, in the buyer's words; `null` when it is not. */\n blocked: string | null\n}\n\n/**\n * What can come back on an order: each line's shipped units (every unit, for\n * a line with nothing to ship), less units already in a return that has not\n * been declined, less everything on a line already refunded by name.\n */\nexport function returnableLines(\n order: Pick<HostOrder, 'lineItems' | 'fulfillments' | 'refundedLineItemIds'>,\n existing: ReadonlyArray<Pick<HostReturn, 'status' | 'lines' | 'refundedAtMs'>>,\n settings: Pick<StoreReturnSettings, 'eligibleTypes'> | null,\n): ReturnableLine[] {\n const shipped = fulfilledQuantities(order)\n const held = new Map<number, number>()\n for (const entry of existing) {\n if (!returnHoldsUnits(entry)) continue\n for (const line of entry.lines ?? []) {\n held.set(line.lineItemId, (held.get(line.lineItemId) ?? 0) + Math.max(0, Math.floor(Number(line.quantity) || 0)))\n }\n }\n return (order.lineItems ?? []).map((line, index) => {\n const quantity = Math.max(0, Math.floor(Number(line.quantity) || 0))\n const delivered = lineRequiresShipping(line) ? Math.min(quantity, shipped.get(index) ?? 0) : quantity\n const type = (line.productType ?? null) as ProductType | null\n let blocked: string | null = null\n if (orderLineRefunded(order, index)) blocked = 'Already refunded'\n else if (settings && !settings.eligibleTypes.includes(type ?? 'physical')) blocked = 'Not returnable'\n else if (delivered === 0) blocked = 'Not shipped yet'\n const returnable = blocked ? 0 : Math.max(0, delivered - (held.get(index) ?? 0))\n return {\n lineItemId: index,\n name: line.name,\n variantLabel: line.variantLabel ?? null,\n productType: type,\n returnable,\n blocked: blocked ?? (returnable === 0 ? 'Already being returned' : null),\n }\n })\n}\n\n/**\n * When the return window closes: `windowDays` after the latest shipment, or\n * after the order was placed when nothing shipped (a digital order). `null`\n * when the order carries no date at all, which reads as open.\n */\nexport function returnWindowEndsAtMs(\n order: Pick<HostOrder, 'fulfillments' | 'createdAtMs'>,\n settings: Pick<StoreReturnSettings, 'windowDays'>,\n): number | null {\n const shippedAt = Math.max(0, ...(order.fulfillments ?? []).filter((entry) => entry.status !== 'cancelled').map((entry) => Number(entry.atMs) || 0))\n const from = shippedAt || Number(order.createdAtMs) || 0\n if (!from) return null\n return from + settings.windowDays * 86_400_000\n}\n\n/** Why a requested return was refused. */\nexport type ReturnRequestProblem =\n | { problem: 'disabled' }\n | { problem: 'window_closed'; endedAtMs: number }\n | { problem: 'order_status'; status: string }\n | { problem: 'empty' }\n | { problem: 'bad_line'; lineItemId: number }\n | { problem: 'bad_reason'; lineItemId: number }\n | { problem: 'too_many'; lineItemId: number; returnable: number }\n\n/** Order statuses a return may be opened against. */\nexport const RETURNABLE_ORDER_STATUSES: readonly string[] = ['paid', 'partially_fulfilled', 'fulfilled', 'delivered']\n\n/**\n * Checks a return request against the order and the returns already open on\n * it, merging duplicate lines first. `merchant` skips the buyer-only rules —\n * the switch and the window — since a merchant may take anything back.\n */\nexport function validateReturnRequest(input: {\n order: Pick<HostOrder, 'status' | 'lineItems' | 'fulfillments' | 'refundedLineItemIds' | 'createdAtMs'>\n existing: ReadonlyArray<Pick<HostReturn, 'status' | 'lines' | 'refundedAtMs'>>\n settings: StoreReturnSettings\n lines: ReadonlyArray<{ lineItemId: unknown; quantity: unknown; reason: unknown }>\n by: 'buyer' | 'merchant'\n now: number\n}): { lines: ReturnLine[] } | ReturnRequestProblem {\n const { order, existing, settings, by, now } = input\n if (by === 'buyer' && !settings.enabled) return { problem: 'disabled' }\n if (!RETURNABLE_ORDER_STATUSES.includes(order.status)) return { problem: 'order_status', status: order.status }\n if (by === 'buyer') {\n const endsAt = returnWindowEndsAtMs(order, settings)\n if (endsAt !== null && now > endsAt) return { problem: 'window_closed', endedAtMs: endsAt }\n }\n const returnable = returnableLines(order, existing, by === 'buyer' ? settings : null)\n const merged = new Map<number, ReturnLine>()\n for (const entry of input.lines) {\n const lineItemId = Number(entry?.lineItemId)\n const quantity = Number(entry?.quantity)\n if (!Number.isInteger(lineItemId) || lineItemId < 0 || lineItemId >= returnable.length) {\n return { problem: 'bad_line', lineItemId: Number.isFinite(lineItemId) ? lineItemId : -1 }\n }\n if (!Number.isInteger(quantity) || quantity <= 0) return { problem: 'bad_line', lineItemId }\n const reason = String(entry?.reason ?? '') as ReturnReason\n if (!RETURN_REASONS.includes(reason)) return { problem: 'bad_reason', lineItemId }\n const prior = merged.get(lineItemId)\n merged.set(lineItemId, { lineItemId, quantity: (prior?.quantity ?? 0) + quantity, reason: prior?.reason ?? reason })\n }\n if (merged.size === 0) return { problem: 'empty' }\n for (const line of merged.values()) {\n const allowed = returnable[line.lineItemId].returnable\n if (line.quantity > allowed) return { problem: 'too_many', lineItemId: line.lineItemId, returnable: allowed }\n }\n return { lines: [...merged.values()].sort((a, b) => a.lineItemId - b.lineItemId) }\n}\n\n/** Words for a refused request, for the buyer and the merchant alike. */\nexport function describeReturnRequestProblem(problem: ReturnRequestProblem): string {\n switch (problem.problem) {\n case 'disabled':\n return 'This store does not take return requests online. Contact the store instead.'\n case 'window_closed':\n return `The return window for this order closed on ${new Date(problem.endedAtMs).toLocaleDateString('en-US')}.`\n case 'order_status':\n return `An order that is ${problem.status.replace('_', ' ')} cannot be returned.`\n case 'empty':\n return 'Choose at least one item to return.'\n case 'bad_line':\n return 'One of the items is not on this order.'\n case 'bad_reason':\n return 'Choose a reason for each item.'\n case 'too_many':\n return problem.returnable === 0\n ? 'One of the items cannot be returned.'\n : `Only ${problem.returnable} of one item can be returned.`\n }\n}\n\n/**\n * What refunding a return's units is worth: each line's paid share\n * (`orderLineRefundCents`, discount apportioned) in proportion to the units\n * coming back, never more than is left to refund on the order. Shipping and\n * tax stay out, as they do for a line refund; the merchant may add them by\n * amount.\n */\nexport function returnRefundCents(\n order: Pick<HostOrder, 'lineItems' | 'totals' | 'refundedCents' | 'amountCents'>,\n lines: ReadonlyArray<Pick<ReturnLine, 'lineItemId' | 'quantity'>>,\n): number {\n let cents = 0\n for (const line of lines) {\n const orderLine = order.lineItems?.[line.lineItemId]\n if (!orderLine) continue\n const lineQuantity = Math.max(1, Math.floor(Number(orderLine.quantity) || 1))\n const paid = orderLineRefundCents(order, [line.lineItemId])\n cents += Math.round((paid * Math.min(lineQuantity, line.quantity)) / lineQuantity)\n }\n const total = Number(order.totals?.totalCents ?? order.amountCents ?? 0)\n const left = Math.max(0, total - Math.max(0, Number(order.refundedCents ?? 0)))\n return Math.max(0, Math.min(cents, left))\n}\n\n/**\n * The lines a return can refund BY NAME: those it takes back in full, which\n * the refund route then withdraws entitlements for. A partial-quantity line is\n * refunded by amount alone.\n */\nexport function returnWholeLineIds(\n order: Pick<HostOrder, 'lineItems'>,\n lines: ReadonlyArray<Pick<ReturnLine, 'lineItemId' | 'quantity'>>,\n): number[] {\n return lines\n .filter((line) => line.quantity >= Math.floor(Number(order.lineItems?.[line.lineItemId]?.quantity) || 0))\n .map((line) => line.lineItemId)\n}\n\n/** A short \"2× Mug, 1× Shirt\" for a return's lines. */\nexport function describeReturnLines(\n order: Pick<HostOrder, 'lineItems'>,\n lines: ReadonlyArray<Pick<ReturnLine, 'lineItemId' | 'quantity'>>,\n): string {\n return lines.map((line) => `${line.quantity}× ${order.lineItems?.[line.lineItemId]?.name ?? `line ${line.lineItemId}`}`).join(', ')\n}\n\n/** The order number a return lists by. */\nexport function returnOrderNumber(order: Pick<HostOrder, 'number'>, orderId: string): string {\n return formatOrderNumber(order, orderId)\n}\n\n/** Appends a return timeline event immutably. */\nexport function appendReturnEvent(\n entry: Pick<HostReturn, 'timeline'>,\n event: string,\n detail?: string,\n atMs = Date.now(),\n): ReturnTimelineEvent[] {\n return [...(entry.timeline ?? []), { atMs, event, ...(detail ? { detail } : {}) }]\n}\n"],"names":["formatOrderNumber","orderLineRefundCents","orderLineRefunded","fulfilledQuantities","lineRequiresShipping","RETURN_STATUSES","RETURN_STATUS_LABELS","requested","approved","declined","received","refunded","closed","RETURN_STATUS_COLOR","RETURN_REASON_LABELS","damaged","wrong_item","not_as_described","size_or_fit","no_longer_needed","other","RETURN_REASONS","Object","keys","DEFAULT_RETURN_SETTINGS","enabled","windowDays","eligibleTypes","RETURN_WINDOW_MAX_DAYS","RETURN_NOTE_MAX","readReturnSettings","raw","value","days","Math","round","Number","types","Array","isArray","filter","type","isFinite","min","TRANSITIONS","canTransitionReturn","from","to","includes","returnIsOpen","entry","status","returnHoldsUnits","Boolean","refundedAtMs","returnableLines","order","existing","settings","shipped","held","Map","line","lines","set","lineItemId","get","max","floor","quantity","lineItems","map","index","delivered","productType","blocked","returnable","name","variantLabel","returnWindowEndsAtMs","shippedAt","fulfillments","atMs","createdAtMs","RETURNABLE_ORDER_STATUSES","validateReturnRequest","input","by","now","problem","endsAt","endedAtMs","merged","isInteger","length","reason","String","prior","size","values","allowed","sort","a","b","describeReturnRequestProblem","Date","toLocaleDateString","replace","returnRefundCents","cents","orderLine","lineQuantity","paid","total","totals","totalCents","amountCents","left","refundedCents","returnWholeLineIds","describeReturnLines","join","returnOrderNumber","orderId","appendReturnEvent","event","detail","timeline"],"mappings":"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"}
|
|
@@ -52,17 +52,43 @@ export interface ShippingTier {
|
|
|
52
52
|
upTo: number;
|
|
53
53
|
amountCents: number;
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* A live carrier rate (AGL-3612): the zone's price is what a carrier quotes
|
|
57
|
+
* for the parcel to the shopper's address, asked through core's
|
|
58
|
+
* `core.shipping-rate-quoter` seam of whichever plugin quotes carriers. With
|
|
59
|
+
* no quoter, a quoter that is not available for the site, no postal code to
|
|
60
|
+
* quote against, or a quote slower than {@link CARRIER_QUOTE_TIMEOUT_MS}, it
|
|
61
|
+
* offers nothing and its fallback rate is offered instead.
|
|
62
|
+
*/
|
|
63
|
+
export interface CarrierRateSettings {
|
|
64
|
+
/** Service keys (`carrier:service`) to offer; empty offers every quoted service. */
|
|
65
|
+
services?: string[];
|
|
66
|
+
/** Added to each quote, in percent. */
|
|
67
|
+
markupPct?: number;
|
|
68
|
+
/** Added to each quote after the markup, in cents. */
|
|
69
|
+
handlingCents?: number;
|
|
70
|
+
/**
|
|
71
|
+
* A rate of this zone offered when no live quote is: it is HIDDEN while
|
|
72
|
+
* quotes are offered, so the shopper picks between carriers, not between a
|
|
73
|
+
* carrier and the merchant's guess.
|
|
74
|
+
*/
|
|
75
|
+
fallbackRateId?: string;
|
|
76
|
+
}
|
|
77
|
+
/** How long checkout waits for live carrier quotes before it falls back. */
|
|
78
|
+
export declare const CARRIER_QUOTE_TIMEOUT_MS = 3000;
|
|
55
79
|
export interface ShippingRate {
|
|
56
80
|
id: string;
|
|
57
81
|
zoneId: string;
|
|
58
82
|
name: string;
|
|
59
|
-
kind: 'flat' | 'free_over' | 'price_tiers' | 'weight_tiers';
|
|
83
|
+
kind: 'flat' | 'free_over' | 'price_tiers' | 'weight_tiers' | 'carrier';
|
|
60
84
|
/** flat + free_over base amount. */
|
|
61
85
|
amountCents?: number;
|
|
62
86
|
/** free_over: order subtotal (cents) at/above which shipping is free. */
|
|
63
87
|
freeOverCents?: number;
|
|
64
88
|
/** price_tiers (upTo = subtotal cents) / weight_tiers (upTo = grams). */
|
|
65
89
|
tiers?: ShippingTier[];
|
|
90
|
+
/** carrier: the live rate's options (AGL-3612). */
|
|
91
|
+
carrier?: CarrierRateSettings;
|
|
66
92
|
}
|
|
67
93
|
export interface ShippingSettings {
|
|
68
94
|
zones?: ShippingZone[];
|
|
@@ -89,6 +115,23 @@ export interface ResolvedShippingRate {
|
|
|
89
115
|
* collection as a merchant who delivers worldwide.
|
|
90
116
|
*/
|
|
91
117
|
export declare const LOCAL_PICKUP_RATE_ID = "pickup";
|
|
118
|
+
/**
|
|
119
|
+
* The zones a destination falls in (AGL-1707, factored out for AGL-3612).
|
|
120
|
+
* Specific country zones beat '*' zones: when any zone names the country
|
|
121
|
+
* outright, rest-of-world zones are ignored.
|
|
122
|
+
*/
|
|
123
|
+
export declare function matchedZoneIds(settings: ShippingSettings | undefined, destinationCountry: string): Set<string>;
|
|
124
|
+
/** The live carrier rates a destination's zones carry (AGL-3612). */
|
|
125
|
+
export declare function carrierRatesFor(settings: ShippingSettings | undefined, destinationCountry: string): ShippingRate[];
|
|
126
|
+
/** Whether any zone carries a live carrier rate (AGL-3612). */
|
|
127
|
+
export declare function hasCarrierRates(settings: ShippingSettings | undefined): boolean;
|
|
128
|
+
/** The rate id a quoted service is offered under: stable per rate and service. */
|
|
129
|
+
export declare function carrierOptionRateId(rateId: string, serviceKey: string): string;
|
|
130
|
+
/**
|
|
131
|
+
* What a shopper pays for a carrier's quote under one carrier rate: the
|
|
132
|
+
* quote, plus the markup, plus the handling fee, in whole cents.
|
|
133
|
+
*/
|
|
134
|
+
export declare function carrierOptionAmountCents(quotedCents: number, settings: CarrierRateSettings | undefined): number;
|
|
92
135
|
/**
|
|
93
136
|
* Rates available for a destination + cart, cheapest first. Specific
|
|
94
137
|
* country zones beat '*' zones: when any specific zone matches, '*'
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
* a register flow in exchange for nothing. A POS sale that must be shipped is
|
|
41
41
|
* a draft order.
|
|
42
42
|
*/ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
43
|
+
/** How long checkout waits for live carrier quotes before it falls back. */ export const CARRIER_QUOTE_TIMEOUT_MS = 3000;
|
|
43
44
|
/**
|
|
44
45
|
* The rate id appended for local pickup (AGL-2325).
|
|
45
46
|
*
|
|
@@ -76,6 +77,50 @@ function tierAmount(tiers, value) {
|
|
|
76
77
|
// catch-all tier with a large upTo).
|
|
77
78
|
return null;
|
|
78
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* The zones a destination falls in (AGL-1707, factored out for AGL-3612).
|
|
82
|
+
* Specific country zones beat '*' zones: when any zone names the country
|
|
83
|
+
* outright, rest-of-world zones are ignored.
|
|
84
|
+
*/ export function matchedZoneIds(settings, destinationCountry) {
|
|
85
|
+
var _ref;
|
|
86
|
+
const country = destinationCountry.toUpperCase();
|
|
87
|
+
const zones = (_ref = settings == null ? void 0 : settings.zones) != null ? _ref : [];
|
|
88
|
+
// A zone is SPECIFIC when it names this country outright — not merely when
|
|
89
|
+
// it is "not wildcard-only" (AGL-2298). The old test was `!every(code ===
|
|
90
|
+
// '*')`, so a zone spelled `['*','US']` counted as specific for all six
|
|
91
|
+
// destinations (it matches every country through the `*`) and suppressed
|
|
92
|
+
// every genuine rest-of-world zone globally. Asking the narrower question
|
|
93
|
+
// makes such a zone specific for `US` and wildcard for the rest, which is
|
|
94
|
+
// what its two entries actually say.
|
|
95
|
+
const specific = zones.filter((zone)=>{
|
|
96
|
+
var _zone_countries;
|
|
97
|
+
return ((_zone_countries = zone.countries) != null ? _zone_countries : []).some((code)=>zoneCode(code) === country);
|
|
98
|
+
});
|
|
99
|
+
const matched = specific.length ? specific : zones.filter((zone)=>zoneMatches(zone, country));
|
|
100
|
+
return new Set(matched.map((zone)=>zone.id));
|
|
101
|
+
}
|
|
102
|
+
/** The live carrier rates a destination's zones carry (AGL-3612). */ export function carrierRatesFor(settings, destinationCountry) {
|
|
103
|
+
var _settings_rates;
|
|
104
|
+
if (!settings) return [];
|
|
105
|
+
const zoneIds = matchedZoneIds(settings, destinationCountry);
|
|
106
|
+
return ((_settings_rates = settings.rates) != null ? _settings_rates : []).filter((rate)=>rate.kind === 'carrier' && zoneIds.has(rate.zoneId));
|
|
107
|
+
}
|
|
108
|
+
/** Whether any zone carries a live carrier rate (AGL-3612). */ export function hasCarrierRates(settings) {
|
|
109
|
+
var _ref;
|
|
110
|
+
return ((_ref = settings == null ? void 0 : settings.rates) != null ? _ref : []).some((rate)=>rate.kind === 'carrier');
|
|
111
|
+
}
|
|
112
|
+
/** The rate id a quoted service is offered under: stable per rate and service. */ export function carrierOptionRateId(rateId, serviceKey) {
|
|
113
|
+
return `carrier:${rateId}:${serviceKey}`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* What a shopper pays for a carrier's quote under one carrier rate: the
|
|
117
|
+
* quote, plus the markup, plus the handling fee, in whole cents.
|
|
118
|
+
*/ export function carrierOptionAmountCents(quotedCents, settings) {
|
|
119
|
+
const quote = Math.max(0, Math.round(Number(quotedCents) || 0));
|
|
120
|
+
const pct = Number(settings == null ? void 0 : settings.markupPct);
|
|
121
|
+
const handling = Number(settings == null ? void 0 : settings.handlingCents);
|
|
122
|
+
return quote + (Number.isFinite(pct) && pct > 0 ? Math.round(quote * Math.min(pct, 500) / 100) : 0) + (Number.isFinite(handling) && handling > 0 ? Math.round(handling) : 0);
|
|
123
|
+
}
|
|
79
124
|
/**
|
|
80
125
|
* Rates available for a destination + cart, cheapest first. Specific
|
|
81
126
|
* country zones beat '*' zones: when any specific zone matches, '*'
|
|
@@ -88,10 +133,9 @@ function tierAmount(tiers, value) {
|
|
|
88
133
|
* Callers deciding whether a destination is served must filter pickup out
|
|
89
134
|
* first; `planCheckoutShipping` and `summarizeShippingCoverage` do (AGL-2325).
|
|
90
135
|
*/ export function resolveShippingRates(settings, destinationCountry, cart) {
|
|
91
|
-
var
|
|
136
|
+
var _settings_rates;
|
|
92
137
|
if (!settings || !destinationCountry) return [];
|
|
93
|
-
const
|
|
94
|
-
const zones = (_settings_zones = settings.zones) != null ? _settings_zones : [];
|
|
138
|
+
const zoneIds = matchedZoneIds(settings, destinationCountry);
|
|
95
139
|
// A zone is SPECIFIC when it names this country outright — not merely when
|
|
96
140
|
// it is "not wildcard-only" (AGL-2298). The old test was `!every(code ===
|
|
97
141
|
// '*')`, so a zone spelled `['*','US']` counted as specific for all six
|
|
@@ -99,12 +143,6 @@ function tierAmount(tiers, value) {
|
|
|
99
143
|
// every genuine rest-of-world zone globally. Asking the narrower question
|
|
100
144
|
// makes such a zone specific for `US` and wildcard for the rest, which is
|
|
101
145
|
// what its two entries actually say.
|
|
102
|
-
const specific = zones.filter((zone)=>{
|
|
103
|
-
var _zone_countries;
|
|
104
|
-
return ((_zone_countries = zone.countries) != null ? _zone_countries : []).some((code)=>zoneCode(code) === country);
|
|
105
|
-
});
|
|
106
|
-
const matched = specific.length ? specific : zones.filter((zone)=>zoneMatches(zone, country));
|
|
107
|
-
const zoneIds = new Set(matched.map((zone)=>zone.id));
|
|
108
146
|
const resolved = [];
|
|
109
147
|
for (const rate of (_settings_rates = settings.rates) != null ? _settings_rates : []){
|
|
110
148
|
if (!zoneIds.has(rate.zoneId)) continue;
|
|
@@ -125,6 +163,12 @@ function tierAmount(tiers, value) {
|
|
|
125
163
|
var _cart_totalGrams;
|
|
126
164
|
amountCents = tierAmount(rate.tiers, (_cart_totalGrams = cart.totalGrams) != null ? _cart_totalGrams : 0);
|
|
127
165
|
break;
|
|
166
|
+
// A carrier's price exists only once a carrier quoted it for an
|
|
167
|
+
// address (AGL-3612), so a table read offers nothing for it and its
|
|
168
|
+
// fallback rate is what resolves here. `carrier-shipping.ts` adds the
|
|
169
|
+
// quotes where one can be had.
|
|
170
|
+
case 'carrier':
|
|
171
|
+
break;
|
|
128
172
|
}
|
|
129
173
|
if (amountCents == null) continue;
|
|
130
174
|
resolved.push({
|