@aglyn/plugins-commerce 1.0.0-beta.230 → 1.0.0-beta.232
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/catalog-organization-card.component.js +1 -0
- package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
- 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 +88 -6
- 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 +756 -654
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-zones.d.ts +23 -0
- package/src/lib/components/console/pos-zones.js +31 -0
- package/src/lib/components/console/pos-zones.js.map +1 -0
- package/src/lib/components/console/product-editor-dialog.component.js +61 -71
- 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 +44 -0
- package/src/lib/components/console/product-zones.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +23 -20
- 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/console/storefront-tax-summary-card.component.js +1 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
- 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 +41 -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 +68 -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 +171 -2
- package/src/lib/model/commerce-orders.js +26 -16
- 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 +91 -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 +16 -0
- package/src/lib/model/index.js +16 -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/product-write.d.ts +186 -0
- package/src/lib/model/product-write.js +116 -0
- package/src/lib/model/product-write.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 +26 -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/channel-order-updates.d.ts +50 -0
- package/src/lib/server/channel-order-updates.js +290 -0
- package/src/lib/server/channel-order-updates.js.map +1 -0
- package/src/lib/server/channel-orders.d.ts +85 -0
- package/src/lib/server/channel-orders.js +543 -0
- package/src/lib/server/channel-orders.js.map +1 -0
- 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-catalog.d.ts +42 -0
- package/src/lib/server/product-catalog.js +309 -0
- package/src/lib/server/product-catalog.js.map +1 -0
- package/src/lib/server/product-drafts.d.ts +5 -1
- package/src/lib/server/product-drafts.js +3 -3
- package/src/lib/server/product-drafts.js.map +1 -1
- package/src/lib/server/product-writer.d.ts +19 -0
- package/src/lib/server/product-writer.js +261 -0
- package/src/lib/server/product-writer.js.map +1 -0
- package/src/lib/server/products-write.d.ts +61 -0
- package/src/lib/server/products-write.js +375 -0
- package/src/lib/server/products-write.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 +143 -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 +136 -0
- package/src/lib/testing/memory-firestore.js +282 -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/products.server.d.ts +5 -0
- package/src/lib/transfer/products.server.js +2 -2
- package/src/lib/transfer/products.server.js.map +1 -1
- 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/server/feed.js +0 -69
- package/src/lib/server/feed.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/tracking-transfer.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 {\n buildTransferPlan,\n matchLookupKey,\n normalizeMatchValue,\n resolveFieldPolicy,\n resolveRecordPolicy,\n withTransferResourceFindings,\n type BuildTransferPlanInput,\n type MatchKeySpec,\n type MatchLookup,\n type PlannedTransferRow,\n type RowMatchOutcome,\n type TransferField,\n type TransferFieldChange,\n type TransferPlan,\n type TransferPlanSummary,\n type TransferPolicyDefaults,\n type TransferResourceFinding,\n} from '@aglyn/aglyn/data-transfer'\nimport {\n ORDER_STATUS_LABELS,\n formatOrderNumber,\n liftLegacyOrder,\n type HostOrder,\n type OrderFulfillment,\n} from '../model/commerce-orders'\nimport { fulfillmentIsActive, orderLineFulfillmentStates } from '../model/order-fulfillment'\nimport {\n fulfillmentWithTracking,\n normalizeTrackingNumber,\n shippingOrderNumber,\n shippingOrderRefs,\n} from '../model/order-shipping-export'\n\n/*\n * TRACKING NUMBERS AS A FILE (AGL-3613): what Pirate Ship's shipment export,\n * Shippo's and EasyPost's reports, or any spreadsheet of parcels brings back\n * — an order and the tracking number of the parcel that left for it — made\n * into the order's shipments. Pure; the server half is `tracking.server.ts`.\n *\n * ## A row is a parcel, and a parcel is recorded once\n *\n * Rows are matched to orders by the order number the export wrote (`1042`,\n * `#1042`, or the order's ID). Several rows may name one order — one per\n * parcel — so a row is a duplicate only when it repeats an order AND a\n * tracking number together. A tracking number the order already carries is\n * `unchanged`, so the same file imported twice records nothing twice.\n *\n * ## What a row does to its order\n *\n * - The order still has units to ship: the row SHIPS them, recorded through\n * the console's own shipment (`recordOrderShipment`) and emailed to the\n * buyer. A row with a SKU (and a quantity) ships that line; one without\n * ships everything left.\n * - The order has nothing left to ship: this is the CONFLICT, and the\n * person decides it on the Conflicts step through the Tracking number\n * field's choice. Keep existing (the start) leaves the shipment as it is;\n * Overwrite replaces its tracking; Fill blanks adds tracking only to a\n * shipment recorded without any.\n * - A pending, canceled or refunded order is refused, by name.\n *\n * Nothing here creates an order: a row naming no order fails with the\n * number it named.\n */\n\nexport const TRACKING_FIELD = {\n orderRef: 'orderRef',\n trackingNumber: 'trackingNumber',\n carrier: 'carrier',\n service: 'service',\n trackingUrl: 'trackingUrl',\n sku: 'sku',\n quantity: 'quantity',\n status: 'status',\n shippedAt: 'shippedAt',\n} as const\n\nexport const TRACKING_TRANSFER_FIELDS: readonly TransferField[] = [\n {\n id: TRACKING_FIELD.orderRef,\n label: 'Order',\n group: 'parcel',\n type: 'text',\n required: true,\n matchKey: true,\n description: 'The order number the shipping export wrote (1042 or #1042), or the order’s ID.',\n aliases: [\n 'order',\n 'order id',\n 'order number',\n 'order #',\n 'order no',\n 'order_number',\n 'order_id',\n 'orderid',\n 'reference',\n 'reference 1',\n 'reference1',\n 'ref',\n 'external order id',\n 'invoice number',\n ],\n },\n {\n id: TRACKING_FIELD.trackingNumber,\n label: 'Tracking number',\n group: 'parcel',\n type: 'text',\n required: true,\n maxLength: 60,\n aliases: ['tracking', 'tracking #', 'tracking no', 'tracking code', 'tracking_code', 'tracking_number', 'tracking id'],\n },\n {\n id: TRACKING_FIELD.carrier,\n label: 'Carrier',\n group: 'parcel',\n type: 'text',\n maxLength: 40,\n aliases: ['provider', 'shipping carrier', 'carrier name'],\n },\n {\n id: TRACKING_FIELD.service,\n label: 'Service',\n group: 'parcel',\n type: 'text',\n description: 'Read for the timeline; the carrier and the number are what the buyer is sent.',\n aliases: ['shipping service', 'service level', 'servicelevel', 'mail class'],\n },\n {\n id: TRACKING_FIELD.trackingUrl,\n label: 'Tracking link',\n group: 'parcel',\n type: 'url',\n description: 'Used instead of the carrier’s own tracking page when given. https only.',\n aliases: ['tracking url', 'tracking_url', 'tracking_url_provider', 'public_url', 'tracking page'],\n },\n {\n id: TRACKING_FIELD.sku,\n label: 'SKU',\n group: 'items',\n type: 'text',\n description: 'Ships only this item of the order. Blank ships everything still to ship.',\n aliases: ['item sku', 'product sku'],\n },\n {\n id: TRACKING_FIELD.quantity,\n label: 'Quantity',\n group: 'items',\n type: 'integer',\n description: 'How many of the SKU’s units this parcel holds. Blank ships every unit left.',\n aliases: ['qty', 'item quantity', 'units'],\n },\n { id: TRACKING_FIELD.status, label: 'Order status', group: 'order', type: 'text', readOnly: true },\n { id: TRACKING_FIELD.shippedAt, label: 'Shipped', group: 'order', type: 'datetime', readOnly: true },\n]\n\nexport const TRACKING_TRANSFER_GROUPS = [\n { id: 'parcel', label: 'Parcel' },\n { id: 'items', label: 'Items' },\n { id: 'order', label: 'Order' },\n]\n\nexport const TRACKING_MATCH_KEYS: readonly MatchKeySpec[] = [{ fieldId: TRACKING_FIELD.orderRef, normalizer: 'trim' }]\n\n/**\n * Where the Conflicts step starts: a matched order is updated (shipped), a\n * row naming no order is never made into one, and a tracking number an\n * already-shipped order holds is KEPT until the person chooses otherwise.\n */\nexport const TRACKING_DEFAULT_POLICY: TransferPolicyDefaults = {\n record: { onMatch: 'update', onNew: 'skip', onAmbiguous: 'ask' },\n fields: { [TRACKING_FIELD.trackingNumber]: { mode: 'keepExisting', blank: 'leave' } },\n note:\n 'A row ships what its order still has to ship. For an order that has already shipped, choose ' +\n 'Overwrite for Tracking number to replace its tracking, or keep what it has.',\n}\n\n/** What `apply` does for one planned row. */\nexport type TrackingDecision =\n | {\n action: 'ship'\n orderId: string\n carrier: string\n trackingNumber: string\n trackingUrl?: string\n /** Absent ships everything still to ship. */\n lineItems?: Array<{ lineItemId: number; quantity: number }>\n }\n | {\n action: 'replace'\n orderId: string\n fulfillmentId: string\n carrier: string\n trackingNumber: string\n trackingUrl?: string\n previous: { carrier: string | null; trackingNumber: string | null; trackingUrl: string | null }\n }\n\n/** A planned row with what it will do to its order. */\nexport type TrackingPlannedRow = PlannedTransferRow & { tracking?: TrackingDecision }\n\n/** An order as the plan and the records read it. */\nexport type StoredTrackingOrder = Partial<HostOrder> & { createdAtMs?: number }\n\nconst iso = (ms: unknown): string | null => {\n const value = Number(ms)\n return Number.isFinite(value) && value > 0 ? new Date(value).toISOString() : null\n}\n\nconst cell = (value: unknown): string => (value === null || value === undefined ? '' : String(value).trim())\n\n/** The order's latest active shipment, the one a replacement tracking number lands on. */\nexport function latestShipment(order: Pick<HostOrder, 'fulfillments'>): OrderFulfillment | undefined {\n return (order.fulfillments ?? [])\n .filter((entry) => fulfillmentIsActive(entry))\n .reduce<OrderFulfillment | undefined>((latest, entry) => (!latest || entry.atMs >= latest.atMs ? entry : latest), undefined)\n}\n\nconst unitsLeft = (order: Pick<HostOrder, 'lineItems' | 'fulfillments'>): number =>\n orderLineFulfillmentStates(order)\n .filter((state) => state.requiresShipping)\n .reduce((sum, state) => sum + state.remainingQuantity, 0)\n\n/**\n * An order as the import's records name it: its numbers, and the tracking a\n * row would conflict with — the latest shipment's, but only once nothing is\n * left to ship. An order still owed parcels has no \"current\" tracking: the\n * next row is a new parcel, not a change to an old one.\n */\nexport function trackingRecord(id: string, stored: StoredTrackingOrder): Record<string, unknown> {\n const order = liftLegacyOrder(stored)\n const open = unitsLeft(order) > 0\n const latest = open ? undefined : latestShipment(order)\n return {\n id,\n orderRef: shippingOrderNumber(order, id),\n trackingNumber: latest?.trackingNumber ?? null,\n carrier: latest?.carrier ?? null,\n trackingUrl: latest?.trackingUrl ?? null,\n service: null,\n sku: null,\n quantity: null,\n status: ORDER_STATUS_LABELS[order.status] ?? order.status,\n shippedAt: iso(latest?.atMs),\n }\n}\n\n/** The values an order is found by: `1042`, `#1042` and its ID. */\nexport function trackingMatchValues(id: string, stored: StoredTrackingOrder): Record<string, unknown> {\n return { id, orderRef: shippingOrderRefs(stored, id) }\n}\n\n/** One export row per shipment an order carries, newest last. */\nexport function trackingExportRows(id: string, stored: StoredTrackingOrder): Array<Record<string, unknown>> {\n const order = liftLegacyOrder(stored)\n return (order.fulfillments ?? [])\n .filter((entry) => fulfillmentIsActive(entry) && entry.trackingNumber)\n .map((entry) => ({\n id,\n orderRef: shippingOrderNumber(order, id),\n trackingNumber: entry.trackingNumber ?? null,\n carrier: entry.carrier ?? null,\n trackingUrl: entry.trackingUrl ?? null,\n service: null,\n sku: null,\n quantity: (entry.lines ?? []).reduce((sum, line) => sum + (Number(line.quantity) || 0), 0) || null,\n status: ORDER_STATUS_LABELS[order.status] ?? order.status,\n shippedAt: iso(entry.atMs),\n }))\n}\n\n/**\n * Which order each row names, the import's own way: by order number through\n * the lookup, with a duplicate only when a row repeats an EARLIER row's\n * order and tracking number together. The core's rule — any repeated key is\n * a duplicate — would refuse the second parcel of every two-parcel order.\n */\nexport function matchTrackingRows(\n rows: ReadonlyArray<Readonly<Record<string, unknown>>>,\n lookup: MatchLookup,\n): RowMatchOutcome[] {\n const seen = new Map<string, number>()\n return rows.map((values, index): RowMatchOutcome => {\n const ref = normalizeMatchValue('trim', values[TRACKING_FIELD.orderRef])\n if (!ref) return { kind: 'new' }\n const via = { fieldId: TRACKING_FIELD.orderRef, value: ref }\n const ids = lookup.get(matchLookupKey(TRACKING_FIELD.orderRef, ref)) ?? []\n if (ids.length > 1) return { kind: 'ambiguous', recordIds: [...ids], via }\n if (!ids.length) return { kind: 'new' }\n const parcel = `${ids[0]}\\u0000${normalizeTrackingNumber(values[TRACKING_FIELD.trackingNumber])}`\n const first = seen.get(parcel)\n if (first !== undefined && normalizeTrackingNumber(values[TRACKING_FIELD.trackingNumber])) {\n return { kind: 'duplicateInFile', firstRow: first, via }\n }\n seen.set(parcel, index)\n return { kind: 'matched', recordId: ids[0], via }\n })\n}\n\nconst SHIPPABLE_STATUSES = new Set(['paid', 'partially_fulfilled', 'fulfilled', 'delivered'])\n\nfunction summaryOf(rows: readonly PlannedTransferRow[]): TransferPlanSummary {\n const summary: TransferPlanSummary = { create: 0, update: 0, unchanged: 0, skip: 0, fail: 0, total: rows.length }\n for (const row of rows) summary[row.verdict] += 1\n return summary\n}\n\nfunction change(fieldId: string, before: unknown, after: unknown): TransferFieldChange {\n return { fieldId, before: before ?? null, after, mode: 'overwrite', source: 'default', rule: 'written' }\n}\n\n/**\n * The dry run: the core's plan for the policy, warnings and acknowledgements,\n * then each matched row decided against its order as the file leaves it —\n * units shipped by an earlier row of the same file are not shipped twice.\n * `orders` holds every matched order, read once.\n */\nexport function planTrackingRows(\n input: BuildTransferPlanInput,\n orders: ReadonlyMap<string, StoredTrackingOrder>,\n): TransferPlan {\n const core = buildTransferPlan(input)\n const field = input.fields.find((entry) => entry.id === TRACKING_FIELD.trackingNumber)\n const valuesByIndex = new Map(input.rows.map((row) => [row.index, row.values]))\n const findings: TransferResourceFinding[] = []\n /** Units left per order and line, as the rows above have left them. */\n const left = new Map<string, Map<number, number>>()\n /** Orders whose last units a row above shipped, by that row. */\n const closedBy = new Map<string, number>()\n /** Shipments a row above already re-tracked. */\n const replaced = new Set<string>()\n\n const refuse = (row: TrackingPlannedRow, detail: string, fieldId?: string): TrackingPlannedRow => {\n findings.push({ row: row.index, detail, ...(fieldId ? { fieldId } : {}) })\n return { ...row, verdict: 'fail', reason: 'resourceRule', diff: [] }\n }\n\n const rows = core.rows.map((planned): TrackingPlannedRow => {\n const row: TrackingPlannedRow = { ...planned }\n const values = valuesByIndex.get(row.index) ?? {}\n const ref = cell(values[TRACKING_FIELD.orderRef])\n if (row.match.kind === 'new') {\n return ref\n ? refuse(row, `No order ${ref} on this site. A tracking file records parcels for orders; it never creates one.`, TRACKING_FIELD.orderRef)\n : refuse(row, 'The row names no order.', TRACKING_FIELD.orderRef)\n }\n if (row.match.kind !== 'matched') return row\n if (row.verdict === 'skip' || resolveRecordPolicy(input.policy, row.index).action === 'skip') {\n return { ...row, verdict: 'skip', reason: row.reason ?? 'skippedByChoice', diff: [] }\n }\n const orderId = row.match.recordId\n const stored = orders.get(orderId)\n if (!stored) return { ...row, verdict: 'fail', reason: 'matchedRecordMissing', diff: [] }\n const order = liftLegacyOrder(stored)\n const label = formatOrderNumber(order, orderId)\n const trackingNumber = cell(values[TRACKING_FIELD.trackingNumber]).slice(0, 60)\n if (!trackingNumber) return refuse(row, `No tracking number for order ${label}.`, TRACKING_FIELD.trackingNumber)\n if (!SHIPPABLE_STATUSES.has(order.status)) {\n return refuse(row, `Order ${label} is ${ORDER_STATUS_LABELS[order.status]?.toLowerCase() ?? order.status}; nothing on it ships.`)\n }\n if (fulfillmentWithTracking(order, trackingNumber)) {\n return { ...row, verdict: 'unchanged', diff: [], reason: undefined }\n }\n const carrier = cell(values[TRACKING_FIELD.carrier]).slice(0, 40)\n const trackingUrl = cell(values[TRACKING_FIELD.trackingUrl]) || undefined\n const states = orderLineFulfillmentStates(order)\n const remaining =\n left.get(orderId) ??\n new Map(states.filter((state) => state.requiresShipping).map((state) => [state.lineItemId, state.remainingQuantity]))\n left.set(orderId, remaining)\n const unitsOpen = [...remaining.values()].reduce((sum, units) => sum + units, 0)\n\n if (unitsOpen > 0) {\n const sku = cell(values[TRACKING_FIELD.sku]).toLowerCase()\n let lineItems: Array<{ lineItemId: number; quantity: number }> | undefined\n if (sku) {\n const lineItemId = (order.lineItems ?? []).findIndex(\n (line, index) => (line.sku ?? '').trim().toLowerCase() === sku && (remaining.get(index) ?? 0) > 0,\n )\n if (lineItemId < 0) return refuse(row, `Order ${label} has no item with SKU ${cell(values[TRACKING_FIELD.sku])} left to ship.`, TRACKING_FIELD.sku)\n const open = remaining.get(lineItemId) ?? 0\n const asked = values[TRACKING_FIELD.quantity]\n const quantity = asked === null || asked === undefined || cell(asked) === '' ? open : Math.floor(Number(asked))\n if (!Number.isInteger(quantity) || quantity <= 0) {\n return refuse(row, `The quantity for order ${label} must be a whole number above zero.`, TRACKING_FIELD.quantity)\n }\n if (quantity > open) {\n return refuse(row, `Order ${label} has only ${open} of SKU ${cell(values[TRACKING_FIELD.sku])} left to ship, not ${quantity}.`, TRACKING_FIELD.quantity)\n }\n lineItems = [{ lineItemId, quantity }]\n remaining.set(lineItemId, open - quantity)\n } else {\n for (const key of remaining.keys()) remaining.set(key, 0)\n }\n if ([...remaining.values()].every((units) => units === 0)) closedBy.set(orderId, row.index)\n return {\n ...row,\n verdict: 'update',\n reason: undefined,\n diff: [change(TRACKING_FIELD.trackingNumber, null, trackingNumber), ...(carrier ? [change(TRACKING_FIELD.carrier, null, carrier)] : [])],\n tracking: {\n action: 'ship',\n orderId,\n carrier,\n trackingNumber,\n ...(trackingUrl ? { trackingUrl } : {}),\n ...(lineItems ? { lineItems } : {}),\n },\n }\n }\n\n // Nothing left to ship. Shipped by a row ABOVE in this file: that row's\n // parcel took everything, so this one has nothing to hold.\n const closer = closedBy.get(orderId)\n if (closer !== undefined) {\n return refuse(\n row,\n `Row ${closer + 1} already ships everything left on order ${label}. To split an order across parcels, give each parcel’s SKU and Quantity.`,\n )\n }\n const latest = latestShipment(order)\n if (!latest) return refuse(row, `Order ${label} has nothing to ship.`)\n if (replaced.has(latest.id)) {\n return refuse(row, `An earlier row already replaces the tracking on order ${label}.`)\n }\n const mode = field ? resolveFieldPolicy(input.policy, row.index, field).mode : 'keepExisting'\n const hasTracking = Boolean(cell(latest.trackingNumber))\n const writes = mode === 'overwrite' || (mode === 'fillBlanks' && !hasTracking)\n if (!writes) {\n findings.push({\n row: row.index,\n fieldId: TRACKING_FIELD.trackingNumber,\n value: trackingNumber,\n detail: hasTracking\n ? `Order ${label} already shipped with tracking ${latest.trackingNumber}; it is kept. Choose Overwrite for Tracking number to replace it.`\n : `Order ${label} already shipped without tracking; choose Fill blanks or Overwrite for Tracking number to add it.`,\n })\n return { ...row, verdict: 'unchanged', diff: [], reason: undefined }\n }\n replaced.add(latest.id)\n return {\n ...row,\n verdict: 'update',\n reason: undefined,\n diff: [\n { ...change(TRACKING_FIELD.trackingNumber, latest.trackingNumber ?? null, trackingNumber), mode },\n ...(carrier ? [change(TRACKING_FIELD.carrier, latest.carrier ?? null, carrier)] : []),\n ],\n tracking: {\n action: 'replace',\n orderId,\n fulfillmentId: latest.id,\n carrier: carrier || latest.carrier || '',\n trackingNumber,\n ...(trackingUrl ? { trackingUrl } : {}),\n previous: {\n carrier: latest.carrier ?? null,\n trackingNumber: latest.trackingNumber ?? null,\n trackingUrl: latest.trackingUrl ?? null,\n },\n },\n }\n })\n\n const decided: TransferPlan = { ...core, rows, summary: summaryOf(rows) }\n return withTransferResourceFindings(decided, findings)\n}\n"],"names":["buildTransferPlan","matchLookupKey","normalizeMatchValue","resolveFieldPolicy","resolveRecordPolicy","withTransferResourceFindings","ORDER_STATUS_LABELS","formatOrderNumber","liftLegacyOrder","fulfillmentIsActive","orderLineFulfillmentStates","fulfillmentWithTracking","normalizeTrackingNumber","shippingOrderNumber","shippingOrderRefs","TRACKING_FIELD","orderRef","trackingNumber","carrier","service","trackingUrl","sku","quantity","status","shippedAt","TRACKING_TRANSFER_FIELDS","id","label","group","type","required","matchKey","description","aliases","maxLength","readOnly","TRACKING_TRANSFER_GROUPS","TRACKING_MATCH_KEYS","fieldId","normalizer","TRACKING_DEFAULT_POLICY","record","onMatch","onNew","onAmbiguous","fields","mode","blank","note","iso","ms","value","Number","isFinite","Date","toISOString","cell","undefined","String","trim","latestShipment","order","fulfillments","filter","entry","reduce","latest","atMs","unitsLeft","state","requiresShipping","sum","remainingQuantity","trackingRecord","stored","open","trackingMatchValues","trackingExportRows","map","lines","line","matchTrackingRows","rows","lookup","seen","Map","values","index","ref","kind","via","ids","get","length","recordIds","parcel","first","firstRow","set","recordId","SHIPPABLE_STATUSES","Set","summaryOf","summary","create","update","unchanged","skip","fail","total","row","verdict","change","before","after","source","rule","planTrackingRows","input","orders","core","field","find","valuesByIndex","findings","left","closedBy","replaced","refuse","detail","push","reason","diff","planned","match","policy","action","orderId","slice","has","toLowerCase","states","remaining","lineItemId","unitsOpen","units","lineItems","findIndex","asked","Math","floor","isInteger","key","keys","every","tracking","closer","hasTracking","Boolean","writes","add","fulfillmentId","previous","decided"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
*/
|
|
17
|
+
import { type BuildTransferPlanInput, type MatchLookupRequest, type PlannedTransferRow, type TransferChunk, type TransferPlan, type TransferUndoSnapshot } from '@aglyn/aglyn/data-transfer';
|
|
18
|
+
import type { PluginTransferResource, TransferApplyResult, TransferApplyWriter, TransferLookupResult, TransferReadOptions, TransferReadPage, TransferResourceContext, TransferRevertDecisions, TransferRevertResult } from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources';
|
|
19
|
+
export declare function lookupTrackingOrders(ctx: TransferResourceContext, requests: readonly MatchLookupRequest[]): Promise<TransferLookupResult>;
|
|
20
|
+
/**
|
|
21
|
+
* The shipments export: every order that has shipped something, newest
|
|
22
|
+
* first, one row per shipment with a tracking number. The cursor is the last
|
|
23
|
+
* order's `createdAtMs` and id, as the orders export pages.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readTrackingPage(ctx: TransferResourceContext, cursor: string | null, fieldIds: readonly string[], options?: TransferReadOptions): Promise<TransferReadPage>;
|
|
26
|
+
/** The dry run, against every matched order read once. */
|
|
27
|
+
export declare function planTracking(ctx: TransferResourceContext, input: BuildTransferPlanInput): Promise<TransferPlan>;
|
|
28
|
+
/** Records one chunk's parcels, each through the order's own shipment paths. */
|
|
29
|
+
export declare function applyTracking(ctx: TransferResourceContext, chunk: TransferChunk<PlannedTransferRow>, writer: TransferApplyWriter): Promise<TransferApplyResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Undoes one chunk, newest first: a parcel the import recorded is cancelled
|
|
32
|
+
* and a tracking number it replaced is put back — while the shipment still
|
|
33
|
+
* holds what the import wrote. A shipment edited since is a conflict, done
|
|
34
|
+
* only when the person's decision says `revert`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function revertTracking(ctx: TransferResourceContext, snapshot: TransferUndoSnapshot, decisions?: TransferRevertDecisions): Promise<TransferRevertResult>;
|
|
37
|
+
export declare const trackingTransfer: PluginTransferResource;
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ import { buildMatchLookup } from "@aglyn/aglyn/data-transfer";
|
|
18
|
+
import { hostRoleFor } from "@aglyn/aglyn/app-utils/organizations";
|
|
19
|
+
import * as Aglyn from "@aglyn/aglyn/server";
|
|
20
|
+
import { firebaseAdmin, getOrgForHost, resolveOrgMembership } from "@aglyn/tenant-data-admin";
|
|
21
|
+
import { TransferEngineError } from "@aglyn/tenant-data-admin/server/transfer-jobs";
|
|
22
|
+
import { normalizeTrackingNumber, parseShippingOrderRef } from "../model/order-shipping-export.js";
|
|
23
|
+
import { cancelOrderFulfillment, recordOrderShipment, updateFulfillmentTracking } from "../server/fulfill-order.js";
|
|
24
|
+
import { NOTHING, ROW_BUDGET_MS, firestoreOf, hostRefOf, readerSeesHost } from "./server-common.js";
|
|
25
|
+
import { TRACKING_DEFAULT_POLICY, TRACKING_MATCH_KEYS, matchTrackingRows, planTrackingRows, trackingExportRows, trackingMatchValues, trackingRecord } from "./tracking-transfer.js";
|
|
26
|
+
/*
|
|
27
|
+
* THE TRACKING IMPORT'S SERVER HALF (AGL-3613). The plan is
|
|
28
|
+
* `planTrackingRows`; this module reads the orders it plans against, writes
|
|
29
|
+
* each parcel through the order's own shipment paths and undoes them.
|
|
30
|
+
*
|
|
31
|
+
* - WHO: the site's admins and editors — the roles the console's Fulfill
|
|
32
|
+
* button has — on a plan that sells. Asked by the plan, the apply and the
|
|
33
|
+
* undo, each server-side.
|
|
34
|
+
* - HOW: a new parcel through `recordOrderShipment`, keyed by its tracking
|
|
35
|
+
* number, so a retried chunk or a second import of the same file is one
|
|
36
|
+
* parcel; the buyer is emailed as for any shipment. A replaced tracking
|
|
37
|
+
* number through `updateFulfillmentTracking`.
|
|
38
|
+
* - UNDO: a parcel this import recorded is cancelled (its units go back to
|
|
39
|
+
* unfulfilled), and a replaced tracking number is put back — each only
|
|
40
|
+
* while the shipment still holds what the import wrote; otherwise it is a
|
|
41
|
+
* conflict the person decides.
|
|
42
|
+
*/ const IN_MAX = 30;
|
|
43
|
+
/** Orders a page of the shipments export reads: those that have shipped something. */ const SHIPPED_STATUSES = [
|
|
44
|
+
'partially_fulfilled',
|
|
45
|
+
'fulfilled',
|
|
46
|
+
'delivered'
|
|
47
|
+
];
|
|
48
|
+
/** The member importing, checked for the role and the plan, or the refusal. */ async function shipperOf(ctx) {
|
|
49
|
+
const hostId = ctx.hostId;
|
|
50
|
+
if (!hostId) throw new TransferEngineError('invalid', 400, 'Tracking numbers belong to a site; name the site.');
|
|
51
|
+
const uid = ctx.actorUid;
|
|
52
|
+
const membership = uid ? await resolveOrgMembership(uid, ctx.orgId) : null;
|
|
53
|
+
const role = (membership == null ? void 0 : membership.member) ? hostRoleFor(membership.member, hostId) : null;
|
|
54
|
+
if (!uid || role !== 'admin' && role !== 'editor') {
|
|
55
|
+
throw new TransferEngineError('forbidden', 403, 'Only a site’s admins and editors can record shipments.');
|
|
56
|
+
}
|
|
57
|
+
const owner = await getOrgForHost(hostId).catch(()=>null);
|
|
58
|
+
if (!Aglyn.checkEntitlement(owner == null ? void 0 : owner.org, 'commerce')) {
|
|
59
|
+
throw new TransferEngineError('forbidden', 403, 'This site’s plan does not include selling.');
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
hostId
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const ordersOf = (firestore, ctx)=>hostRefOf(firestore, ctx).collection('orders');
|
|
66
|
+
/** Orders by the values a file names them by: numbers through one query per 30, ids directly. */ async function findOrders(firestore, ctx, requests) {
|
|
67
|
+
const collection = ordersOf(firestore, ctx);
|
|
68
|
+
const found = new Map();
|
|
69
|
+
const numbers = new Set();
|
|
70
|
+
const ids = new Set();
|
|
71
|
+
for (const request of requests){
|
|
72
|
+
for (const value of request.values){
|
|
73
|
+
const ref = request.fieldId === 'id' ? {
|
|
74
|
+
id: value
|
|
75
|
+
} : parseShippingOrderRef(value);
|
|
76
|
+
if (!ref) continue;
|
|
77
|
+
if (ref.number !== undefined) numbers.add(ref.number);
|
|
78
|
+
if (ref.id && !ref.id.includes('/') && !/^__.*__$/.test(ref.id)) ids.add(ref.id);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const numberList = [
|
|
82
|
+
...numbers
|
|
83
|
+
];
|
|
84
|
+
for(let at = 0; at < numberList.length; at += IN_MAX){
|
|
85
|
+
const snapshot = await collection.where('number', 'in', numberList.slice(at, at + IN_MAX)).get();
|
|
86
|
+
for (const doc of snapshot.docs)found.set(doc.id, doc);
|
|
87
|
+
}
|
|
88
|
+
const idList = [
|
|
89
|
+
...ids
|
|
90
|
+
].filter((id)=>!found.has(id));
|
|
91
|
+
for(let at = 0; at < idList.length; at += 100){
|
|
92
|
+
for (const doc of (await firestore.getAll(...idList.slice(at, at + 100).map((id)=>collection.doc(id))))){
|
|
93
|
+
if (doc.exists) found.set(doc.id, doc);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return found;
|
|
97
|
+
}
|
|
98
|
+
export async function lookupTrackingOrders(ctx, requests) {
|
|
99
|
+
const found = await findOrders(firestoreOf(), ctx, requests);
|
|
100
|
+
const keys = requests.map((request)=>({
|
|
101
|
+
fieldId: request.fieldId,
|
|
102
|
+
normalizer: request.normalizer
|
|
103
|
+
}));
|
|
104
|
+
const records = new Map();
|
|
105
|
+
const entries = [];
|
|
106
|
+
for (const doc of found.values()){
|
|
107
|
+
var _doc_data;
|
|
108
|
+
const data = (_doc_data = doc.data()) != null ? _doc_data : {};
|
|
109
|
+
records.set(doc.id, trackingRecord(doc.id, data));
|
|
110
|
+
entries.push({
|
|
111
|
+
id: doc.id,
|
|
112
|
+
values: trackingMatchValues(doc.id, data)
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
lookup: buildMatchLookup(entries, keys),
|
|
117
|
+
records
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The shipments export: every order that has shipped something, newest
|
|
122
|
+
* first, one row per shipment with a tracking number. The cursor is the last
|
|
123
|
+
* order's `createdAtMs` and id, as the orders export pages.
|
|
124
|
+
*/ export async function readTrackingPage(ctx, cursor, fieldIds, options) {
|
|
125
|
+
var _ref;
|
|
126
|
+
if (!readerSeesHost(ctx, options)) return NOTHING;
|
|
127
|
+
if (options == null ? void 0 : options.filter) throw new Error('Shipments export every shipment, or those of the orders you select.');
|
|
128
|
+
const firestore = firestoreOf();
|
|
129
|
+
const collection = ordersOf(firestore, ctx);
|
|
130
|
+
const pageSize = Math.max(1, Math.min(500, (_ref = options == null ? void 0 : options.pageSize) != null ? _ref : 200));
|
|
131
|
+
let docs;
|
|
132
|
+
let next;
|
|
133
|
+
if (options == null ? void 0 : options.ids) {
|
|
134
|
+
const offset = cursor ? Number(cursor) : 0;
|
|
135
|
+
const ids = options.ids.slice(offset, offset + pageSize);
|
|
136
|
+
docs = ids.length ? (await firestore.getAll(...ids.map((id)=>collection.doc(id)))).filter((doc)=>doc.exists) : [];
|
|
137
|
+
next = offset + ids.length < options.ids.length ? String(offset + ids.length) : null;
|
|
138
|
+
} else {
|
|
139
|
+
var _last_get;
|
|
140
|
+
const query = collection.where('status', 'in', SHIPPED_STATUSES).orderBy('createdAtMs', 'desc').orderBy(firebaseAdmin.firestore.FieldPath.documentId(), 'desc');
|
|
141
|
+
const after = cursor ? JSON.parse(cursor) : null;
|
|
142
|
+
const snapshot = await (after ? query.startAfter(...after) : query).limit(pageSize).get();
|
|
143
|
+
docs = snapshot.docs;
|
|
144
|
+
const last = snapshot.docs[snapshot.docs.length - 1];
|
|
145
|
+
next = last && snapshot.docs.length === pageSize ? JSON.stringify([
|
|
146
|
+
(_last_get = last.get('createdAtMs')) != null ? _last_get : null,
|
|
147
|
+
last.id
|
|
148
|
+
]) : null;
|
|
149
|
+
}
|
|
150
|
+
const rows = docs.flatMap((doc)=>{
|
|
151
|
+
var _doc_data;
|
|
152
|
+
return trackingExportRows(doc.id, (_doc_data = doc.data()) != null ? _doc_data : {}).map((record)=>Object.fromEntries(fieldIds.map((fieldId)=>{
|
|
153
|
+
var _record_fieldId;
|
|
154
|
+
return [
|
|
155
|
+
fieldId,
|
|
156
|
+
(_record_fieldId = record[fieldId]) != null ? _record_fieldId : null
|
|
157
|
+
];
|
|
158
|
+
})));
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
rows,
|
|
162
|
+
next
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** The dry run, against every matched order read once. */ export async function planTracking(ctx, input) {
|
|
166
|
+
await shipperOf(ctx);
|
|
167
|
+
const firestore = firestoreOf();
|
|
168
|
+
const ids = [
|
|
169
|
+
...new Set(input.matches.map((match)=>match.kind === 'matched' ? match.recordId : null).filter((id)=>Boolean(id)))
|
|
170
|
+
];
|
|
171
|
+
const collection = ordersOf(firestore, ctx);
|
|
172
|
+
const orders = new Map();
|
|
173
|
+
for(let at = 0; at < ids.length; at += 100){
|
|
174
|
+
for (const doc of (await firestore.getAll(...ids.slice(at, at + 100).map((id)=>collection.doc(id))))){
|
|
175
|
+
var _doc_data;
|
|
176
|
+
if (doc.exists) orders.set(doc.id, (_doc_data = doc.data()) != null ? _doc_data : {});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return planTrackingRows(input, orders);
|
|
180
|
+
}
|
|
181
|
+
/** Records one chunk's parcels, each through the order's own shipment paths. */ export async function applyTracking(ctx, chunk, writer) {
|
|
182
|
+
const { hostId } = await shipperOf(ctx);
|
|
183
|
+
const results = [];
|
|
184
|
+
const undo = [];
|
|
185
|
+
const fail = async (row, message)=>{
|
|
186
|
+
const result = {
|
|
187
|
+
row,
|
|
188
|
+
outcome: 'failed',
|
|
189
|
+
reason: 'refusedValue',
|
|
190
|
+
message
|
|
191
|
+
};
|
|
192
|
+
results.push(result);
|
|
193
|
+
await writer.markApplied(result);
|
|
194
|
+
};
|
|
195
|
+
for (const row of chunk.rows){
|
|
196
|
+
const earlier = await writer.alreadyApplied(row.index);
|
|
197
|
+
if (earlier) {
|
|
198
|
+
results.push(earlier);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (writer.timeLeftMs() < ROW_BUDGET_MS) break;
|
|
202
|
+
const decision = row.tracking;
|
|
203
|
+
if (row.verdict !== 'update' || !decision) {
|
|
204
|
+
await fail(row.index, 'A tracking file only records parcels for orders it names.');
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (decision.action === 'ship') {
|
|
208
|
+
const outcome = await recordOrderShipment(_extends({
|
|
209
|
+
hostId,
|
|
210
|
+
orderId: decision.orderId,
|
|
211
|
+
to: 'fulfilled',
|
|
212
|
+
carrier: decision.carrier,
|
|
213
|
+
trackingNumber: decision.trackingNumber
|
|
214
|
+
}, decision.trackingUrl ? {
|
|
215
|
+
trackingUrl: decision.trackingUrl
|
|
216
|
+
} : {}, decision.lineItems ? {
|
|
217
|
+
lineItems: decision.lineItems
|
|
218
|
+
} : {}, {
|
|
219
|
+
idempotencyKey: `tracking-import:${normalizeTrackingNumber(decision.trackingNumber)}`,
|
|
220
|
+
onceByTracking: true
|
|
221
|
+
}));
|
|
222
|
+
if (outcome.outcome === 'recorded' || outcome.outcome === 'already' && outcome.fulfillment) {
|
|
223
|
+
var _fulfillment_trackingNumber, _fulfillment_carrier;
|
|
224
|
+
const fulfillment = outcome.fulfillment;
|
|
225
|
+
const result = {
|
|
226
|
+
row: row.index,
|
|
227
|
+
outcome: outcome.outcome === 'recorded' ? 'updated' : 'unchanged',
|
|
228
|
+
recordId: decision.orderId
|
|
229
|
+
};
|
|
230
|
+
// Only a parcel THIS import recorded is undone; one found already
|
|
231
|
+
// there was somebody else's.
|
|
232
|
+
const entry = outcome.outcome === 'recorded' && fulfillment ? {
|
|
233
|
+
row: row.index,
|
|
234
|
+
recordId: decision.orderId,
|
|
235
|
+
action: 'updated',
|
|
236
|
+
previous: {
|
|
237
|
+
fulfillmentId: null
|
|
238
|
+
},
|
|
239
|
+
written: {
|
|
240
|
+
fulfillmentId: fulfillment.id,
|
|
241
|
+
trackingNumber: (_fulfillment_trackingNumber = fulfillment.trackingNumber) != null ? _fulfillment_trackingNumber : null,
|
|
242
|
+
carrier: (_fulfillment_carrier = fulfillment.carrier) != null ? _fulfillment_carrier : null
|
|
243
|
+
}
|
|
244
|
+
} : undefined;
|
|
245
|
+
results.push(result);
|
|
246
|
+
if (entry) undo.push(entry);
|
|
247
|
+
await writer.markApplied(result, entry);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
await fail(row.index, outcome.outcome === 'blocked' ? `The order is ${outcome.from.replace(/_/g, ' ')} and cannot be shipped.` : outcome.outcome === 'invalid_lines' ? outcome.message : outcome.outcome === 'no_such_order' ? 'The order no longer exists.' : 'The order has nothing left to ship.');
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const outcome = await updateFulfillmentTracking(_extends({
|
|
254
|
+
hostId,
|
|
255
|
+
orderId: decision.orderId,
|
|
256
|
+
fulfillmentId: decision.fulfillmentId,
|
|
257
|
+
carrier: decision.carrier,
|
|
258
|
+
trackingNumber: decision.trackingNumber
|
|
259
|
+
}, decision.trackingUrl ? {
|
|
260
|
+
trackingUrl: decision.trackingUrl
|
|
261
|
+
} : {}));
|
|
262
|
+
if (outcome.outcome === 'updated' || outcome.outcome === 'already') {
|
|
263
|
+
var _outcome_fulfillment_trackingNumber, _outcome_fulfillment_carrier;
|
|
264
|
+
const result = {
|
|
265
|
+
row: row.index,
|
|
266
|
+
outcome: outcome.outcome === 'updated' ? 'updated' : 'unchanged',
|
|
267
|
+
recordId: decision.orderId
|
|
268
|
+
};
|
|
269
|
+
const entry = outcome.outcome === 'updated' ? {
|
|
270
|
+
row: row.index,
|
|
271
|
+
recordId: decision.orderId,
|
|
272
|
+
action: 'updated',
|
|
273
|
+
previous: _extends({
|
|
274
|
+
fulfillmentId: decision.fulfillmentId
|
|
275
|
+
}, decision.previous),
|
|
276
|
+
written: {
|
|
277
|
+
fulfillmentId: decision.fulfillmentId,
|
|
278
|
+
trackingNumber: (_outcome_fulfillment_trackingNumber = outcome.fulfillment.trackingNumber) != null ? _outcome_fulfillment_trackingNumber : null,
|
|
279
|
+
carrier: (_outcome_fulfillment_carrier = outcome.fulfillment.carrier) != null ? _outcome_fulfillment_carrier : null
|
|
280
|
+
}
|
|
281
|
+
} : undefined;
|
|
282
|
+
results.push(result);
|
|
283
|
+
if (entry) undo.push(entry);
|
|
284
|
+
await writer.markApplied(result, entry);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
await fail(row.index, outcome.outcome === 'locked' ? `The order is ${outcome.from.replace(/_/g, ' ')}; its shipments can no longer change.` : 'The shipment no longer exists.');
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
results,
|
|
291
|
+
undo
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Undoes one chunk, newest first: a parcel the import recorded is cancelled
|
|
296
|
+
* and a tracking number it replaced is put back — while the shipment still
|
|
297
|
+
* holds what the import wrote. A shipment edited since is a conflict, done
|
|
298
|
+
* only when the person's decision says `revert`.
|
|
299
|
+
*/ export async function revertTracking(ctx, snapshot, decisions) {
|
|
300
|
+
const { hostId } = await shipperOf(ctx);
|
|
301
|
+
const firestore = firestoreOf();
|
|
302
|
+
const collection = ordersOf(firestore, ctx);
|
|
303
|
+
const done = [];
|
|
304
|
+
const conflicts = [];
|
|
305
|
+
for (const entry of [
|
|
306
|
+
...snapshot.entries
|
|
307
|
+
].reverse()){
|
|
308
|
+
var _entry_written_fulfillmentId, _doc_data, _ref, _ref1, _ref2, _ref3;
|
|
309
|
+
var _entry_previous, _entry_previous1, _entry_previous2, _entry_previous3, _entry_previous4;
|
|
310
|
+
const fulfillmentId = String((_entry_written_fulfillmentId = entry.written['fulfillmentId']) != null ? _entry_written_fulfillmentId : '');
|
|
311
|
+
const doc = await collection.doc(entry.recordId).get();
|
|
312
|
+
const order = doc.exists ? (_doc_data = doc.data()) != null ? _doc_data : {} : null;
|
|
313
|
+
const current = ((_ref = order == null ? void 0 : order['fulfillments']) != null ? _ref : []).find((fulfillment)=>fulfillment['id'] === fulfillmentId);
|
|
314
|
+
if (!doc.exists || !current || current['status'] === 'cancelled') {
|
|
315
|
+
done.push({
|
|
316
|
+
action: 'nothing',
|
|
317
|
+
recordId: entry.recordId,
|
|
318
|
+
why: doc.exists ? 'alreadyReverted' : 'gone'
|
|
319
|
+
});
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const edited = normalizeTrackingNumber(current['trackingNumber']) !== normalizeTrackingNumber(entry.written['trackingNumber']);
|
|
323
|
+
if (edited && (decisions == null ? void 0 : decisions[entry.recordId]) !== 'revert') {
|
|
324
|
+
var _current_trackingNumber;
|
|
325
|
+
conflicts.push({
|
|
326
|
+
action: 'conflict',
|
|
327
|
+
recordId: entry.recordId,
|
|
328
|
+
fields: [
|
|
329
|
+
'trackingNumber'
|
|
330
|
+
],
|
|
331
|
+
values: {
|
|
332
|
+
trackingNumber: (_current_trackingNumber = current['trackingNumber']) != null ? _current_trackingNumber : null
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
const recorded = ((_entry_previous = entry.previous) == null ? void 0 : _entry_previous['fulfillmentId']) === null;
|
|
338
|
+
const outcome = recorded ? await cancelOrderFulfillment({
|
|
339
|
+
hostId,
|
|
340
|
+
orderId: entry.recordId,
|
|
341
|
+
fulfillmentId
|
|
342
|
+
}) : await updateFulfillmentTracking(_extends({
|
|
343
|
+
hostId,
|
|
344
|
+
orderId: entry.recordId,
|
|
345
|
+
fulfillmentId,
|
|
346
|
+
carrier: String((_ref1 = (_entry_previous1 = entry.previous) == null ? void 0 : _entry_previous1['carrier']) != null ? _ref1 : ''),
|
|
347
|
+
trackingNumber: String((_ref2 = (_entry_previous2 = entry.previous) == null ? void 0 : _entry_previous2['trackingNumber']) != null ? _ref2 : '')
|
|
348
|
+
}, ((_entry_previous3 = entry.previous) == null ? void 0 : _entry_previous3['trackingUrl']) ? {
|
|
349
|
+
trackingUrl: String(entry.previous['trackingUrl'])
|
|
350
|
+
} : {}));
|
|
351
|
+
if (outcome.outcome === 'locked') {
|
|
352
|
+
conflicts.push({
|
|
353
|
+
action: 'conflict',
|
|
354
|
+
recordId: entry.recordId,
|
|
355
|
+
fields: [
|
|
356
|
+
'status'
|
|
357
|
+
],
|
|
358
|
+
values: {
|
|
359
|
+
status: outcome.from
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
done.push(recorded ? {
|
|
365
|
+
action: 'delete',
|
|
366
|
+
recordId: entry.recordId
|
|
367
|
+
} : {
|
|
368
|
+
action: 'restore',
|
|
369
|
+
recordId: entry.recordId,
|
|
370
|
+
values: {
|
|
371
|
+
trackingNumber: (_ref3 = (_entry_previous4 = entry.previous) == null ? void 0 : _entry_previous4['trackingNumber']) != null ? _ref3 : null
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
done,
|
|
377
|
+
conflicts
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
export const trackingTransfer = {
|
|
381
|
+
matchKeys: TRACKING_MATCH_KEYS,
|
|
382
|
+
defaultPolicy: TRACKING_DEFAULT_POLICY,
|
|
383
|
+
readPage: (ctx, cursor, fieldIds, options)=>readTrackingPage(ctx, cursor, fieldIds, options),
|
|
384
|
+
lookup: (ctx, requests)=>lookupTrackingOrders(ctx, requests),
|
|
385
|
+
match: (_ctx, input)=>({
|
|
386
|
+
outcomes: matchTrackingRows(input.rows, input.lookup)
|
|
387
|
+
}),
|
|
388
|
+
plan: (ctx, input)=>planTracking(ctx, input),
|
|
389
|
+
apply: (ctx, chunk, writer)=>applyTracking(ctx, chunk, writer),
|
|
390
|
+
revert: (ctx, snapshot, decisions)=>revertTracking(ctx, snapshot, decisions)
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
//# sourceMappingURL=tracking.server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/tracking.server.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 {\n buildMatchLookup,\n type BuildTransferPlanInput,\n type MatchKeySpec,\n type MatchLookupRequest,\n type PlannedTransferRow,\n type TransferChunk,\n type TransferPlan,\n type TransferRowResult,\n type TransferUndoEntry,\n type TransferUndoSnapshot,\n type TransferUndoStep,\n} from '@aglyn/aglyn/data-transfer'\nimport { hostRoleFor } from '@aglyn/aglyn/app-utils/organizations'\nimport * as Aglyn from '@aglyn/aglyn/server'\nimport type {\n PluginTransferResource,\n TransferApplyResult,\n TransferApplyWriter,\n TransferLookupResult,\n TransferReadOptions,\n TransferReadPage,\n TransferResourceContext,\n TransferRevertDecisions,\n TransferRevertResult,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { firebaseAdmin, getOrgForHost, resolveOrgMembership } from '@aglyn/tenant-data-admin'\nimport { TransferEngineError } from '@aglyn/tenant-data-admin/server/transfer-jobs'\nimport { normalizeTrackingNumber, parseShippingOrderRef } from '../model/order-shipping-export'\nimport {\n cancelOrderFulfillment,\n recordOrderShipment,\n updateFulfillmentTracking,\n} from '../server/fulfill-order'\nimport { NOTHING, ROW_BUDGET_MS, firestoreOf, hostRefOf, readerSeesHost, type Firestore } from './server-common'\nimport {\n TRACKING_DEFAULT_POLICY,\n TRACKING_MATCH_KEYS,\n matchTrackingRows,\n planTrackingRows,\n trackingExportRows,\n trackingMatchValues,\n trackingRecord,\n type StoredTrackingOrder,\n type TrackingPlannedRow,\n} from './tracking-transfer'\n\n/*\n * THE TRACKING IMPORT'S SERVER HALF (AGL-3613). The plan is\n * `planTrackingRows`; this module reads the orders it plans against, writes\n * each parcel through the order's own shipment paths and undoes them.\n *\n * - WHO: the site's admins and editors — the roles the console's Fulfill\n * button has — on a plan that sells. Asked by the plan, the apply and the\n * undo, each server-side.\n * - HOW: a new parcel through `recordOrderShipment`, keyed by its tracking\n * number, so a retried chunk or a second import of the same file is one\n * parcel; the buyer is emailed as for any shipment. A replaced tracking\n * number through `updateFulfillmentTracking`.\n * - UNDO: a parcel this import recorded is cancelled (its units go back to\n * unfulfilled), and a replaced tracking number is put back — each only\n * while the shipment still holds what the import wrote; otherwise it is a\n * conflict the person decides.\n */\n\nconst IN_MAX = 30\n\n/** Orders a page of the shipments export reads: those that have shipped something. */\nconst SHIPPED_STATUSES = ['partially_fulfilled', 'fulfilled', 'delivered']\n\n/** The member importing, checked for the role and the plan, or the refusal. */\nasync function shipperOf(ctx: TransferResourceContext): Promise<{ hostId: string }> {\n const hostId = ctx.hostId\n if (!hostId) throw new TransferEngineError('invalid', 400, 'Tracking numbers belong to a site; name the site.')\n const uid = ctx.actorUid\n const membership = uid ? await resolveOrgMembership(uid, ctx.orgId) : null\n const role = membership?.member ? hostRoleFor(membership.member, hostId as never) : null\n if (!uid || (role !== 'admin' && role !== 'editor')) {\n throw new TransferEngineError('forbidden', 403, 'Only a site’s admins and editors can record shipments.')\n }\n const owner = await getOrgForHost(hostId).catch(() => null)\n if (!Aglyn.checkEntitlement(owner?.org as never, 'commerce')) {\n throw new TransferEngineError('forbidden', 403, 'This site’s plan does not include selling.')\n }\n return { hostId }\n}\n\nconst ordersOf = (firestore: Firestore, ctx: TransferResourceContext) => hostRefOf(firestore, ctx).collection('orders')\n\n/** Orders by the values a file names them by: numbers through one query per 30, ids directly. */\nasync function findOrders(\n firestore: Firestore,\n ctx: TransferResourceContext,\n requests: readonly MatchLookupRequest[],\n): Promise<Map<string, FirebaseFirestore.DocumentSnapshot>> {\n const collection = ordersOf(firestore, ctx)\n const found = new Map<string, FirebaseFirestore.DocumentSnapshot>()\n const numbers = new Set<number>()\n const ids = new Set<string>()\n for (const request of requests) {\n for (const value of request.values) {\n const ref = request.fieldId === 'id' ? { id: value } : parseShippingOrderRef(value)\n if (!ref) continue\n if (ref.number !== undefined) numbers.add(ref.number)\n if (ref.id && !ref.id.includes('/') && !/^__.*__$/.test(ref.id)) ids.add(ref.id)\n }\n }\n const numberList = [...numbers]\n for (let at = 0; at < numberList.length; at += IN_MAX) {\n const snapshot = await collection.where('number', 'in', numberList.slice(at, at + IN_MAX)).get()\n for (const doc of snapshot.docs) found.set(doc.id, doc)\n }\n const idList = [...ids].filter((id) => !found.has(id))\n for (let at = 0; at < idList.length; at += 100) {\n for (const doc of await firestore.getAll(...idList.slice(at, at + 100).map((id) => collection.doc(id)))) {\n if (doc.exists) found.set(doc.id, doc)\n }\n }\n return found\n}\n\nexport async function lookupTrackingOrders(\n ctx: TransferResourceContext,\n requests: readonly MatchLookupRequest[],\n): Promise<TransferLookupResult> {\n const found = await findOrders(firestoreOf(), ctx, requests)\n const keys: MatchKeySpec[] = requests.map((request) => ({ fieldId: request.fieldId, normalizer: request.normalizer }))\n const records = new Map<string, Readonly<Record<string, unknown>>>()\n const entries: Array<{ id: string; values: Record<string, unknown> }> = []\n for (const doc of found.values()) {\n const data = (doc.data() ?? {}) as StoredTrackingOrder\n records.set(doc.id, trackingRecord(doc.id, data))\n entries.push({ id: doc.id, values: trackingMatchValues(doc.id, data) })\n }\n return { lookup: buildMatchLookup(entries, keys), records }\n}\n\n/**\n * The shipments export: every order that has shipped something, newest\n * first, one row per shipment with a tracking number. The cursor is the last\n * order's `createdAtMs` and id, as the orders export pages.\n */\nexport async function readTrackingPage(\n ctx: TransferResourceContext,\n cursor: string | null,\n fieldIds: readonly string[],\n options?: TransferReadOptions,\n): Promise<TransferReadPage> {\n if (!readerSeesHost(ctx, options)) return NOTHING\n if (options?.filter) throw new Error('Shipments export every shipment, or those of the orders you select.')\n const firestore = firestoreOf()\n const collection = ordersOf(firestore, ctx)\n const pageSize = Math.max(1, Math.min(500, options?.pageSize ?? 200))\n let docs: FirebaseFirestore.DocumentSnapshot[]\n let next: string | null\n if (options?.ids) {\n const offset = cursor ? Number(cursor) : 0\n const ids = options.ids.slice(offset, offset + pageSize)\n docs = ids.length ? (await firestore.getAll(...ids.map((id) => collection.doc(id)))).filter((doc) => doc.exists) : []\n next = offset + ids.length < options.ids.length ? String(offset + ids.length) : null\n } else {\n const query = collection\n .where('status', 'in', SHIPPED_STATUSES)\n .orderBy('createdAtMs', 'desc')\n .orderBy(firebaseAdmin.firestore.FieldPath.documentId(), 'desc')\n const after = cursor ? (JSON.parse(cursor) as unknown[]) : null\n const snapshot = await (after ? query.startAfter(...after) : query).limit(pageSize).get()\n docs = snapshot.docs\n const last = snapshot.docs[snapshot.docs.length - 1]\n next = last && snapshot.docs.length === pageSize ? JSON.stringify([last.get('createdAtMs') ?? null, last.id]) : null\n }\n const rows = docs.flatMap((doc) =>\n trackingExportRows(doc.id, (doc.data() ?? {}) as StoredTrackingOrder).map((record) =>\n Object.fromEntries(fieldIds.map((fieldId) => [fieldId, record[fieldId] ?? null])),\n ),\n )\n return { rows, next }\n}\n\n/** The dry run, against every matched order read once. */\nexport async function planTracking(ctx: TransferResourceContext, input: BuildTransferPlanInput): Promise<TransferPlan> {\n await shipperOf(ctx)\n const firestore = firestoreOf()\n const ids = [\n ...new Set(\n input.matches\n .map((match) => (match.kind === 'matched' ? match.recordId : null))\n .filter((id): id is string => Boolean(id)),\n ),\n ]\n const collection = ordersOf(firestore, ctx)\n const orders = new Map<string, StoredTrackingOrder>()\n for (let at = 0; at < ids.length; at += 100) {\n for (const doc of await firestore.getAll(...ids.slice(at, at + 100).map((id) => collection.doc(id)))) {\n if (doc.exists) orders.set(doc.id, (doc.data() ?? {}) as StoredTrackingOrder)\n }\n }\n return planTrackingRows(input, orders)\n}\n\n/** Records one chunk's parcels, each through the order's own shipment paths. */\nexport async function applyTracking(\n ctx: TransferResourceContext,\n chunk: TransferChunk<PlannedTransferRow>,\n writer: TransferApplyWriter,\n): Promise<TransferApplyResult> {\n const { hostId } = await shipperOf(ctx)\n const results: TransferRowResult[] = []\n const undo: TransferUndoEntry[] = []\n const fail = async (row: number, message: string) => {\n const result: TransferRowResult = { row, outcome: 'failed', reason: 'refusedValue', message }\n results.push(result)\n await writer.markApplied(result)\n }\n for (const row of chunk.rows as TrackingPlannedRow[]) {\n const earlier = await writer.alreadyApplied(row.index)\n if (earlier) {\n results.push(earlier)\n continue\n }\n if (writer.timeLeftMs() < ROW_BUDGET_MS) break\n const decision = row.tracking\n if (row.verdict !== 'update' || !decision) {\n await fail(row.index, 'A tracking file only records parcels for orders it names.')\n continue\n }\n if (decision.action === 'ship') {\n const outcome = await recordOrderShipment({\n hostId,\n orderId: decision.orderId,\n to: 'fulfilled',\n carrier: decision.carrier,\n trackingNumber: decision.trackingNumber,\n ...(decision.trackingUrl ? { trackingUrl: decision.trackingUrl } : {}),\n ...(decision.lineItems ? { lineItems: decision.lineItems } : {}),\n idempotencyKey: `tracking-import:${normalizeTrackingNumber(decision.trackingNumber)}`,\n onceByTracking: true,\n })\n if (outcome.outcome === 'recorded' || (outcome.outcome === 'already' && outcome.fulfillment)) {\n const fulfillment = outcome.fulfillment\n const result: TransferRowResult = {\n row: row.index,\n outcome: outcome.outcome === 'recorded' ? 'updated' : 'unchanged',\n recordId: decision.orderId,\n }\n // Only a parcel THIS import recorded is undone; one found already\n // there was somebody else's.\n const entry: TransferUndoEntry | undefined =\n outcome.outcome === 'recorded' && fulfillment\n ? {\n row: row.index,\n recordId: decision.orderId,\n action: 'updated',\n previous: { fulfillmentId: null },\n written: {\n fulfillmentId: fulfillment.id,\n trackingNumber: fulfillment.trackingNumber ?? null,\n carrier: fulfillment.carrier ?? null,\n },\n }\n : undefined\n results.push(result)\n if (entry) undo.push(entry)\n await writer.markApplied(result, entry)\n continue\n }\n await fail(\n row.index,\n outcome.outcome === 'blocked'\n ? `The order is ${outcome.from.replace(/_/g, ' ')} and cannot be shipped.`\n : outcome.outcome === 'invalid_lines'\n ? outcome.message\n : outcome.outcome === 'no_such_order'\n ? 'The order no longer exists.'\n : 'The order has nothing left to ship.',\n )\n continue\n }\n const outcome = await updateFulfillmentTracking({\n hostId,\n orderId: decision.orderId,\n fulfillmentId: decision.fulfillmentId,\n carrier: decision.carrier,\n trackingNumber: decision.trackingNumber,\n ...(decision.trackingUrl ? { trackingUrl: decision.trackingUrl } : {}),\n })\n if (outcome.outcome === 'updated' || outcome.outcome === 'already') {\n const result: TransferRowResult = {\n row: row.index,\n outcome: outcome.outcome === 'updated' ? 'updated' : 'unchanged',\n recordId: decision.orderId,\n }\n const entry: TransferUndoEntry | undefined =\n outcome.outcome === 'updated'\n ? {\n row: row.index,\n recordId: decision.orderId,\n action: 'updated',\n previous: { fulfillmentId: decision.fulfillmentId, ...decision.previous },\n written: {\n fulfillmentId: decision.fulfillmentId,\n trackingNumber: outcome.fulfillment.trackingNumber ?? null,\n carrier: outcome.fulfillment.carrier ?? null,\n },\n }\n : undefined\n results.push(result)\n if (entry) undo.push(entry)\n await writer.markApplied(result, entry)\n continue\n }\n await fail(\n row.index,\n outcome.outcome === 'locked'\n ? `The order is ${outcome.from.replace(/_/g, ' ')}; its shipments can no longer change.`\n : 'The shipment no longer exists.',\n )\n }\n return { results, undo }\n}\n\n/**\n * Undoes one chunk, newest first: a parcel the import recorded is cancelled\n * and a tracking number it replaced is put back — while the shipment still\n * holds what the import wrote. A shipment edited since is a conflict, done\n * only when the person's decision says `revert`.\n */\nexport async function revertTracking(\n ctx: TransferResourceContext,\n snapshot: TransferUndoSnapshot,\n decisions?: TransferRevertDecisions,\n): Promise<TransferRevertResult> {\n const { hostId } = await shipperOf(ctx)\n const firestore = firestoreOf()\n const collection = ordersOf(firestore, ctx)\n const done: TransferUndoStep[] = []\n const conflicts: TransferUndoStep[] = []\n for (const entry of [...snapshot.entries].reverse()) {\n const fulfillmentId = String(entry.written['fulfillmentId'] ?? '')\n const doc = await collection.doc(entry.recordId).get()\n const order = doc.exists ? ((doc.data() ?? {}) as Record<string, unknown>) : null\n const current = ((order?.['fulfillments'] as Array<Record<string, unknown>> | undefined) ?? []).find(\n (fulfillment) => fulfillment['id'] === fulfillmentId,\n )\n if (!doc.exists || !current || current['status'] === 'cancelled') {\n done.push({ action: 'nothing', recordId: entry.recordId, why: doc.exists ? 'alreadyReverted' : 'gone' })\n continue\n }\n const edited =\n normalizeTrackingNumber(current['trackingNumber']) !== normalizeTrackingNumber(entry.written['trackingNumber'])\n if (edited && decisions?.[entry.recordId] !== 'revert') {\n conflicts.push({\n action: 'conflict',\n recordId: entry.recordId,\n fields: ['trackingNumber'],\n values: { trackingNumber: current['trackingNumber'] ?? null },\n })\n continue\n }\n const recorded = entry.previous?.['fulfillmentId'] === null\n const outcome = recorded\n ? await cancelOrderFulfillment({ hostId, orderId: entry.recordId, fulfillmentId })\n : await updateFulfillmentTracking({\n hostId,\n orderId: entry.recordId,\n fulfillmentId,\n carrier: String(entry.previous?.['carrier'] ?? ''),\n trackingNumber: String(entry.previous?.['trackingNumber'] ?? ''),\n ...(entry.previous?.['trackingUrl'] ? { trackingUrl: String(entry.previous['trackingUrl']) } : {}),\n })\n if (outcome.outcome === 'locked') {\n conflicts.push({\n action: 'conflict',\n recordId: entry.recordId,\n fields: ['status'],\n values: { status: outcome.from },\n })\n continue\n }\n done.push(\n recorded\n ? { action: 'delete', recordId: entry.recordId }\n : {\n action: 'restore',\n recordId: entry.recordId,\n values: { trackingNumber: entry.previous?.['trackingNumber'] ?? null },\n },\n )\n }\n return { done, conflicts }\n}\n\nexport const trackingTransfer: PluginTransferResource = {\n matchKeys: TRACKING_MATCH_KEYS,\n defaultPolicy: TRACKING_DEFAULT_POLICY,\n readPage: (ctx, cursor, fieldIds, options) => readTrackingPage(ctx, cursor, fieldIds, options),\n lookup: (ctx, requests) => lookupTrackingOrders(ctx, requests),\n match: (_ctx, input) => ({ outcomes: matchTrackingRows(input.rows, input.lookup) }),\n plan: (ctx, input) => planTracking(ctx, input),\n apply: (ctx, chunk, writer) => applyTracking(ctx, chunk, writer),\n revert: (ctx, snapshot, decisions) => revertTracking(ctx, snapshot, decisions),\n}\n"],"names":["buildMatchLookup","hostRoleFor","Aglyn","firebaseAdmin","getOrgForHost","resolveOrgMembership","TransferEngineError","normalizeTrackingNumber","parseShippingOrderRef","cancelOrderFulfillment","recordOrderShipment","updateFulfillmentTracking","NOTHING","ROW_BUDGET_MS","firestoreOf","hostRefOf","readerSeesHost","TRACKING_DEFAULT_POLICY","TRACKING_MATCH_KEYS","matchTrackingRows","planTrackingRows","trackingExportRows","trackingMatchValues","trackingRecord","IN_MAX","SHIPPED_STATUSES","shipperOf","ctx","hostId","uid","actorUid","membership","orgId","role","member","owner","catch","checkEntitlement","org","ordersOf","firestore","collection","findOrders","requests","found","Map","numbers","Set","ids","request","value","values","ref","fieldId","id","number","undefined","add","includes","test","numberList","at","length","snapshot","where","slice","get","doc","docs","set","idList","filter","has","getAll","map","exists","lookupTrackingOrders","keys","normalizer","records","entries","data","push","lookup","readTrackingPage","cursor","fieldIds","options","Error","pageSize","Math","max","min","next","offset","Number","String","last","query","orderBy","FieldPath","documentId","after","JSON","parse","startAfter","limit","stringify","rows","flatMap","record","Object","fromEntries","planTracking","input","matches","match","kind","recordId","Boolean","orders","applyTracking","chunk","writer","results","undo","fail","row","message","result","outcome","reason","markApplied","earlier","alreadyApplied","index","timeLeftMs","decision","tracking","verdict","action","orderId","to","carrier","trackingNumber","trackingUrl","lineItems","idempotencyKey","onceByTracking","fulfillment","entry","previous","fulfillmentId","written","from","replace","revertTracking","decisions","done","conflicts","reverse","order","current","find","why","edited","fields","recorded","status","trackingTransfer","matchKeys","defaultPolicy","readPage","_ctx","outcomes","plan","apply","revert"],"mappings":"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"}
|
|
@@ -20,8 +20,9 @@ export declare const COMMERCE_DISCOUNTS_TRANSFER = "commerce.discounts";
|
|
|
20
20
|
export declare const COMMERCE_COUPONS_TRANSFER = "commerce.coupons";
|
|
21
21
|
export declare const COMMERCE_GIFT_CARDS_TRANSFER = "commerce.gift-cards";
|
|
22
22
|
export declare const COMMERCE_CATEGORIES_TRANSFER = "commerce.categories";
|
|
23
|
+
export declare const COMMERCE_TRACKING_TRANSFER = "commerce.tracking";
|
|
23
24
|
/** Every commerce resource key, in the order the hub lists them. */
|
|
24
|
-
export declare const COMMERCE_TRANSFER_RESOURCES: readonly ["commerce.products", "commerce.categories", "commerce.orders", "commerce.discounts", "commerce.coupons", "commerce.gift-cards"];
|
|
25
|
+
export declare const COMMERCE_TRANSFER_RESOURCES: readonly ["commerce.products", "commerce.categories", "commerce.orders", "commerce.discounts", "commerce.coupons", "commerce.gift-cards", "commerce.tracking"];
|
|
25
26
|
/** The resources a file may write; the others are exported only. */
|
|
26
27
|
export declare const COMMERCE_IMPORTABLE_TRANSFERS: ReadonlySet<string>;
|
|
27
28
|
/**
|
|
@@ -27,26 +27,30 @@
|
|
|
27
27
|
* | coupons | yes | matched by code; new ones start switched off |
|
|
28
28
|
* | orders | no | an order is the record of a sale, written by checkout alone |
|
|
29
29
|
* | gift cards | yes, by issuing | each row issues a card through the issue path, confirmed by its total; owners and admins only |
|
|
30
|
+
* | tracking numbers | yes, by shipping | each row is a parcel: it ships what its order still owes, or replaces a shipped order's tracking when the person chooses (AGL-3613) |
|
|
30
31
|
*/ export const COMMERCE_PRODUCTS_TRANSFER = 'commerce.products';
|
|
31
32
|
export const COMMERCE_ORDERS_TRANSFER = 'commerce.orders';
|
|
32
33
|
export const COMMERCE_DISCOUNTS_TRANSFER = 'commerce.discounts';
|
|
33
34
|
export const COMMERCE_COUPONS_TRANSFER = 'commerce.coupons';
|
|
34
35
|
export const COMMERCE_GIFT_CARDS_TRANSFER = 'commerce.gift-cards';
|
|
35
36
|
export const COMMERCE_CATEGORIES_TRANSFER = 'commerce.categories';
|
|
37
|
+
export const COMMERCE_TRACKING_TRANSFER = 'commerce.tracking';
|
|
36
38
|
/** Every commerce resource key, in the order the hub lists them. */ export const COMMERCE_TRANSFER_RESOURCES = [
|
|
37
39
|
COMMERCE_PRODUCTS_TRANSFER,
|
|
38
40
|
COMMERCE_CATEGORIES_TRANSFER,
|
|
39
41
|
COMMERCE_ORDERS_TRANSFER,
|
|
40
42
|
COMMERCE_DISCOUNTS_TRANSFER,
|
|
41
43
|
COMMERCE_COUPONS_TRANSFER,
|
|
42
|
-
COMMERCE_GIFT_CARDS_TRANSFER
|
|
44
|
+
COMMERCE_GIFT_CARDS_TRANSFER,
|
|
45
|
+
COMMERCE_TRACKING_TRANSFER
|
|
43
46
|
];
|
|
44
47
|
/** The resources a file may write; the others are exported only. */ export const COMMERCE_IMPORTABLE_TRANSFERS = new Set([
|
|
45
48
|
COMMERCE_PRODUCTS_TRANSFER,
|
|
46
49
|
COMMERCE_CATEGORIES_TRANSFER,
|
|
47
50
|
COMMERCE_DISCOUNTS_TRANSFER,
|
|
48
51
|
COMMERCE_COUPONS_TRANSFER,
|
|
49
|
-
COMMERCE_GIFT_CARDS_TRANSFER
|
|
52
|
+
COMMERCE_GIFT_CARDS_TRANSFER,
|
|
53
|
+
COMMERCE_TRACKING_TRANSFER
|
|
50
54
|
]);
|
|
51
55
|
/**
|
|
52
56
|
* The gift card import's Confirm step (AGL-3551), and the key its answer
|