@aglyn/plugins-commerce 1.0.0-beta.284 → 1.0.0-beta.287
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/README.md +1 -1
- package/package.json +13 -13
- package/src/lib/components/cart.js +25 -12
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/commerce-console-page.js +70 -13
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +2 -1
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/payment-methods-card.component.js +1 -1
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +5 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +18 -12
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-api.d.ts +76 -5
- package/src/lib/components/console/pos/pos-hardware-api.js +53 -11
- package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-buyer.component.d.ts +18 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js +629 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.d.ts +162 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js +122 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js +251 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.js +50 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
- package/src/lib/components/console/pos-cellular-control.component.d.ts +41 -0
- package/src/lib/components/console/pos-cellular-control.component.js +211 -0
- package/src/lib/components/console/pos-cellular-control.component.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +9 -1
- package/src/lib/components/console/pos-devices-card.component.js +47 -15
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +6 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +8 -1
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
- package/src/lib/components/console/pos-display-page.component.d.ts +13 -0
- package/src/lib/components/console/pos-display-page.component.js +44 -2
- package/src/lib/components/console/pos-display-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-card.component.d.ts +12 -4
- package/src/lib/components/console/pos-hardware-card.component.js +157 -36
- package/src/lib/components/console/pos-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +360 -80
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-terms-page.component.d.ts +34 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js +257 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.d.ts +27 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js +104 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.d.ts +24 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js +205 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +297 -201
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +3 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +260 -92
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +9 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +15 -6
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.d.ts +25 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js +136 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +6 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +48 -31
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -1
- package/src/lib/components/console/pos-page.component.d.ts +1 -1
- package/src/lib/components/console/pos-page.component.js +63 -12
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -1
- package/src/lib/components/console/product-check-in-fields.component.d.ts +4 -2
- package/src/lib/components/console/product-check-in-fields.component.js +60 -14
- package/src/lib/components/console/product-check-in-fields.component.js.map +1 -1
- package/src/lib/components/console/product-editor-dialog.component.js +44 -1
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-hardware-sku-field.component.d.ts +19 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js +92 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js.map +1 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.d.ts +22 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js +94 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +4 -0
- package/src/lib/components/console/product-register-fields.component.js +31 -2
- package/src/lib/components/console/product-register-fields.component.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +11 -2
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +11 -0
- package/src/lib/components/console/register-hardware-card.component.js +56 -27
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/reservation-guests-dialog.component.d.ts +28 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js +189 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js.map +1 -0
- package/src/lib/components/console/reservations-card.component.d.ts +9 -0
- package/src/lib/components/console/reservations-card.component.js +158 -23
- package/src/lib/components/console/reservations-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -1
- package/src/lib/components/console/shipstation-card.component.d.ts +1 -1
- package/src/lib/components/console/shipstation-card.component.js +3 -3
- package/src/lib/components/console/shipstation-card.component.js.map +1 -1
- package/src/lib/components/product-detail.d.ts +4 -0
- package/src/lib/components/product-detail.js +40 -5
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/product-reviews.js +28 -11
- package/src/lib/components/product-reviews.js.map +1 -1
- package/src/lib/components/reservation-widget.js +28 -5
- package/src/lib/components/reservation-widget.js.map +1 -1
- package/src/lib/components/use-day-picker.d.ts +25 -0
- package/src/lib/components/use-day-picker.js +57 -0
- package/src/lib/components/use-day-picker.js.map +1 -0
- package/src/lib/constants/operator-alerts.d.ts +55 -0
- package/src/lib/constants/operator-alerts.js +156 -1
- package/src/lib/constants/operator-alerts.js.map +1 -1
- package/src/lib/declarations.console-server.js +54 -1
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +4 -2
- package/src/lib/declarations.js +11 -4
- package/src/lib/declarations.js.map +1 -1
- package/src/lib/declarations.server.js +9 -0
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/commerce-cart.d.ts +9 -1
- package/src/lib/model/commerce-cart.js +4 -3
- package/src/lib/model/commerce-cart.js.map +1 -1
- package/src/lib/model/commerce-check-in-product.d.ts +26 -0
- package/src/lib/model/commerce-check-in-product.js +64 -2
- package/src/lib/model/commerce-check-in-product.js.map +1 -1
- package/src/lib/model/commerce-check-in-record.d.ts +127 -0
- package/src/lib/model/commerce-check-in-record.js +36 -0
- package/src/lib/model/commerce-check-in-record.js.map +1 -0
- package/src/lib/model/commerce-check-in.d.ts +91 -87
- package/src/lib/model/commerce-check-in.js +186 -62
- package/src/lib/model/commerce-check-in.js.map +1 -1
- package/src/lib/model/commerce-kiosk-offer.d.ts +31 -0
- package/src/lib/model/commerce-kiosk-offer.js +35 -0
- package/src/lib/model/commerce-kiosk-offer.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +76 -0
- package/src/lib/model/commerce-orders.js +6 -0
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-pos-day-report.d.ts +54 -1
- package/src/lib/model/commerce-pos-day-report.js +39 -2
- package/src/lib/model/commerce-pos-day-report.js.map +1 -1
- package/src/lib/model/commerce-pos-offline.d.ts +1 -1
- package/src/lib/model/commerce-pos-offline.js +6 -1
- package/src/lib/model/commerce-pos-offline.js.map +1 -1
- package/src/lib/model/commerce-pos-ops.js +3 -2
- package/src/lib/model/commerce-pos-ops.js.map +1 -1
- package/src/lib/model/commerce-pos.d.ts +36 -3
- package/src/lib/model/commerce-pos.js +14 -6
- package/src/lib/model/commerce-pos.js.map +1 -1
- package/src/lib/model/commerce-receipt.js +3 -2
- package/src/lib/model/commerce-receipt.js.map +1 -1
- package/src/lib/model/commerce-reservations.d.ts +69 -4
- package/src/lib/model/commerce-reservations.js +57 -5
- package/src/lib/model/commerce-reservations.js.map +1 -1
- package/src/lib/model/commerce.d.ts +66 -0
- package/src/lib/model/commerce.js +15 -0
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/order-list-fields.d.ts +11 -0
- package/src/lib/model/order-list-fields.js +17 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/own-store-tax-summary.d.ts +152 -0
- package/src/lib/model/own-store-tax-summary.js +288 -0
- package/src/lib/model/own-store-tax-summary.js.map +1 -0
- package/src/lib/model/plugin-permissions.d.ts +67 -0
- package/src/lib/model/plugin-permissions.js +224 -7
- package/src/lib/model/plugin-permissions.js.map +1 -1
- package/src/lib/model/pos-cellular.d.ts +223 -0
- package/src/lib/model/pos-cellular.js +293 -0
- package/src/lib/model/pos-cellular.js.map +1 -0
- package/src/lib/model/pos-hardware-in-person.d.ts +98 -0
- package/src/lib/model/pos-hardware-in-person.js +224 -0
- package/src/lib/model/pos-hardware-in-person.js.map +1 -0
- package/src/lib/model/pos-hardware-tax-summary.d.ts +166 -0
- package/src/lib/model/pos-hardware-tax-summary.js +225 -0
- package/src/lib/model/pos-hardware-tax-summary.js.map +1 -0
- package/src/lib/model/pos-hardware-terms.d.ts +74 -0
- package/src/lib/model/pos-hardware-terms.js +115 -0
- package/src/lib/model/pos-hardware-terms.js.map +1 -0
- package/src/lib/model/pos-hardware.d.ts +349 -7
- package/src/lib/model/pos-hardware.js +291 -20
- package/src/lib/model/pos-hardware.js.map +1 -1
- package/src/lib/model/product-write.d.ts +10 -0
- package/src/lib/model/product-write.js +4 -2
- package/src/lib/model/product-write.js.map +1 -1
- package/src/lib/plugin.js +16 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/billing-webhook.js +25 -1
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +7 -5
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/cart-checkout.js +20 -8
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/cart.js +29 -0
- package/src/lib/server/cart.js.map +1 -1
- package/src/lib/server/checkout.js +42 -13
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/collection-membership.d.ts +4 -0
- package/src/lib/server/collection-membership.js +5 -10
- package/src/lib/server/collection-membership.js.map +1 -1
- package/src/lib/server/commerce-site-keys.d.ts +29 -0
- package/src/lib/server/commerce-site-keys.js +40 -0
- package/src/lib/server/commerce-site-keys.js.map +1 -0
- package/src/lib/server/draft-order.js +8 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.js +7 -5
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/gift-cards.js +8 -5
- package/src/lib/server/gift-cards.js.map +1 -1
- package/src/lib/server/local-fulfillment-status.js +9 -6
- package/src/lib/server/local-fulfillment-status.js.map +1 -1
- package/src/lib/server/member-post.js +6 -5
- package/src/lib/server/member-post.js.map +1 -1
- package/src/lib/server/membership-admin-password.d.ts +4 -2
- package/src/lib/server/membership-admin-password.js +10 -8
- package/src/lib/server/membership-admin-password.js.map +1 -1
- package/src/lib/server/membership-admin-remove.d.ts +7 -5
- package/src/lib/server/membership-admin-remove.js +9 -9
- package/src/lib/server/membership-admin-remove.js.map +1 -1
- package/src/lib/server/order-notifications.js +5 -2
- package/src/lib/server/order-notifications.js.map +1 -1
- package/src/lib/server/order-print.js +7 -5
- package/src/lib/server/order-print.js.map +1 -1
- package/src/lib/server/order-receipt-send.js +8 -5
- package/src/lib/server/order-receipt-send.js.map +1 -1
- package/src/lib/server/orders-shipping-prepare.js +9 -6
- package/src/lib/server/orders-shipping-prepare.js.map +1 -1
- package/src/lib/server/own-store-tax-return-source.d.ts +47 -0
- package/src/lib/server/own-store-tax-return-source.js +312 -0
- package/src/lib/server/own-store-tax-return-source.js.map +1 -0
- package/src/lib/server/payment-methods.js +13 -9
- package/src/lib/server/payment-methods.js.map +1 -1
- package/src/lib/server/pos-auth.d.ts +37 -6
- package/src/lib/server/pos-auth.js +40 -15
- package/src/lib/server/pos-auth.js.map +1 -1
- package/src/lib/server/pos-cellular-billing.d.ts +81 -0
- package/src/lib/server/pos-cellular-billing.js +711 -0
- package/src/lib/server/pos-cellular-billing.js.map +1 -0
- package/src/lib/server/pos-cellular-notify.d.ts +47 -0
- package/src/lib/server/pos-cellular-notify.js +150 -0
- package/src/lib/server/pos-cellular-notify.js.map +1 -0
- package/src/lib/server/pos-cellular.d.ts +88 -0
- package/src/lib/server/pos-cellular.js +339 -0
- package/src/lib/server/pos-cellular.js.map +1 -0
- package/src/lib/server/pos-check-in.d.ts +5 -1
- package/src/lib/server/pos-check-in.js +296 -28
- package/src/lib/server/pos-check-in.js.map +1 -1
- package/src/lib/server/pos-day-report.js +29 -3
- package/src/lib/server/pos-day-report.js.map +1 -1
- package/src/lib/server/pos-display.d.ts +16 -0
- package/src/lib/server/pos-display.js +129 -2
- package/src/lib/server/pos-display.js.map +1 -1
- package/src/lib/server/pos-hardware-admin.d.ts +10 -1
- package/src/lib/server/pos-hardware-admin.js +250 -84
- package/src/lib/server/pos-hardware-admin.js.map +1 -1
- package/src/lib/server/pos-hardware-attach.d.ts +105 -0
- package/src/lib/server/pos-hardware-attach.js +443 -0
- package/src/lib/server/pos-hardware-attach.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-lookup.d.ts +58 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js +180 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-record.d.ts +29 -0
- package/src/lib/server/pos-hardware-buyer-record.js +86 -0
- package/src/lib/server/pos-hardware-buyer-record.js.map +1 -0
- package/src/lib/server/pos-hardware-cancel.d.ts +58 -0
- package/src/lib/server/pos-hardware-cancel.js +147 -0
- package/src/lib/server/pos-hardware-cancel.js.map +1 -0
- package/src/lib/server/pos-hardware-closure-notices.d.ts +27 -0
- package/src/lib/server/pos-hardware-closure-notices.js +85 -0
- package/src/lib/server/pos-hardware-closure-notices.js.map +1 -0
- package/src/lib/server/pos-hardware-closure.d.ts +60 -0
- package/src/lib/server/pos-hardware-closure.js +153 -0
- package/src/lib/server/pos-hardware-closure.js.map +1 -0
- package/src/lib/server/pos-hardware-in-person.d.ts +61 -0
- package/src/lib/server/pos-hardware-in-person.js +236 -0
- package/src/lib/server/pos-hardware-in-person.js.map +1 -0
- package/src/lib/server/pos-hardware-notify.d.ts +40 -2
- package/src/lib/server/pos-hardware-notify.js +195 -14
- package/src/lib/server/pos-hardware-notify.js.map +1 -1
- package/src/lib/server/pos-hardware-readers.d.ts +115 -0
- package/src/lib/server/pos-hardware-readers.js +430 -0
- package/src/lib/server/pos-hardware-readers.js.map +1 -0
- package/src/lib/server/pos-hardware-returns.d.ts +116 -0
- package/src/lib/server/pos-hardware-returns.js +502 -0
- package/src/lib/server/pos-hardware-returns.js.map +1 -0
- package/src/lib/server/pos-hardware-sale-fields.d.ts +28 -0
- package/src/lib/server/pos-hardware-sale-fields.js +44 -0
- package/src/lib/server/pos-hardware-sale-fields.js.map +1 -0
- package/src/lib/server/pos-hardware-sale.d.ts +54 -0
- package/src/lib/server/pos-hardware-sale.js +369 -0
- package/src/lib/server/pos-hardware-sale.js.map +1 -0
- package/src/lib/server/pos-hardware-tax-return-source.d.ts +99 -0
- package/src/lib/server/pos-hardware-tax-return-source.js +462 -0
- package/src/lib/server/pos-hardware-tax-return-source.js.map +1 -0
- package/src/lib/server/pos-hardware-terms.d.ts +64 -0
- package/src/lib/server/pos-hardware-terms.js +154 -0
- package/src/lib/server/pos-hardware-terms.js.map +1 -0
- package/src/lib/server/pos-hardware-user-eraser.d.ts +3 -0
- package/src/lib/server/pos-hardware-user-eraser.js +31 -7
- package/src/lib/server/pos-hardware-user-eraser.js.map +1 -1
- package/src/lib/server/pos-hardware-webhook.d.ts +5 -0
- package/src/lib/server/pos-hardware-webhook.js +51 -6
- package/src/lib/server/pos-hardware-webhook.js.map +1 -1
- package/src/lib/server/pos-hardware.d.ts +74 -1
- package/src/lib/server/pos-hardware.js +175 -10
- package/src/lib/server/pos-hardware.js.map +1 -1
- package/src/lib/server/pos-kiosk.d.ts +2 -0
- package/src/lib/server/pos-kiosk.js +17 -12
- package/src/lib/server/pos-kiosk.js.map +1 -1
- package/src/lib/server/pos-offline-card-order.d.ts +64 -0
- package/src/lib/server/pos-offline-card-order.js +102 -0
- package/src/lib/server/pos-offline-card-order.js.map +1 -0
- package/src/lib/server/pos-offline-card-reconcile.d.ts +67 -1
- package/src/lib/server/pos-offline-card-reconcile.js +215 -18
- package/src/lib/server/pos-offline-card-reconcile.js.map +1 -1
- package/src/lib/server/pos-offline-sync.d.ts +39 -0
- package/src/lib/server/pos-offline-sync.js +190 -55
- package/src/lib/server/pos-offline-sync.js.map +1 -1
- package/src/lib/server/pos-ops-gate.d.ts +15 -4
- package/src/lib/server/pos-ops-gate.js +42 -9
- package/src/lib/server/pos-ops-gate.js.map +1 -1
- package/src/lib/server/pos-ops-routes.js +24 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -1
- package/src/lib/server/pos-order-refund-ids.d.ts +28 -0
- package/src/lib/server/pos-order-refund-ids.js +31 -0
- package/src/lib/server/pos-order-refund-ids.js.map +1 -0
- package/src/lib/server/pos-order.js +52 -49
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.js +1 -1
- package/src/lib/server/pos-payment.js.map +1 -1
- package/src/lib/server/pos-reader-splash-admin.js +30 -32
- package/src/lib/server/pos-reader-splash-admin.js.map +1 -1
- package/src/lib/server/pos-reader-splash-images-route.d.ts +17 -0
- package/src/lib/server/pos-reader-splash-images-route.js +113 -0
- package/src/lib/server/pos-reader-splash-images-route.js.map +1 -0
- package/src/lib/server/pos-reader-splash-images.d.ts +51 -0
- package/src/lib/server/pos-reader-splash-images.js +123 -0
- package/src/lib/server/pos-reader-splash-images.js.map +1 -0
- package/src/lib/server/pos-reader-splash.d.ts +68 -1
- package/src/lib/server/pos-reader-splash.js +182 -11
- package/src/lib/server/pos-reader-splash.js.map +1 -1
- package/src/lib/server/pos-readers.d.ts +29 -0
- package/src/lib/server/pos-readers.js +134 -35
- package/src/lib/server/pos-readers.js.map +1 -1
- package/src/lib/server/pos-return.d.ts +10 -0
- package/src/lib/server/pos-return.js +26 -1
- package/src/lib/server/pos-return.js.map +1 -1
- package/src/lib/server/pos-sale.js +6 -1
- package/src/lib/server/pos-sale.js.map +1 -1
- package/src/lib/server/pos-shift.js +11 -0
- package/src/lib/server/pos-shift.js.map +1 -1
- package/src/lib/server/pos-staff-pin.js +25 -20
- package/src/lib/server/pos-staff-pin.js.map +1 -1
- package/src/lib/server/pos-terminal.d.ts +14 -4
- package/src/lib/server/pos-terminal.js +34 -38
- package/src/lib/server/pos-terminal.js.map +1 -1
- package/src/lib/server/printers.d.ts +7 -3
- package/src/lib/server/printers.js +18 -12
- package/src/lib/server/printers.js.map +1 -1
- package/src/lib/server/product-drafts.d.ts +11 -1
- package/src/lib/server/product-drafts.js +12 -8
- package/src/lib/server/product-drafts.js.map +1 -1
- package/src/lib/server/product.d.ts +15 -1
- package/src/lib/server/product.js +16 -3
- package/src/lib/server/product.js.map +1 -1
- package/src/lib/server/products-write.d.ts +26 -2
- package/src/lib/server/products-write.js +19 -7
- package/src/lib/server/products-write.js.map +1 -1
- package/src/lib/server/refund.js +34 -11
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reservation-availability-query.d.ts +8 -0
- package/src/lib/server/reservation-availability-query.js +11 -1
- package/src/lib/server/reservation-availability-query.js.map +1 -1
- package/src/lib/server/reservation-availability.d.ts +1 -1
- package/src/lib/server/reservation-availability.js +7 -2
- package/src/lib/server/reservation-availability.js.map +1 -1
- package/src/lib/server/reservation-guests.d.ts +32 -0
- package/src/lib/server/reservation-guests.js +285 -0
- package/src/lib/server/reservation-guests.js.map +1 -0
- package/src/lib/server/reservation-walk-in.d.ts +11 -1
- package/src/lib/server/reservation-walk-in.js +56 -12
- package/src/lib/server/reservation-walk-in.js.map +1 -1
- package/src/lib/server/reserve.js +18 -5
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/returns.js +9 -6
- package/src/lib/server/returns.js.map +1 -1
- package/src/lib/server/reviews.d.ts +22 -2
- package/src/lib/server/reviews.js +88 -20
- package/src/lib/server/reviews.js.map +1 -1
- package/src/lib/server/shipping-connectors.js +10 -11
- package/src/lib/server/shipping-connectors.js.map +1 -1
- package/src/lib/server/site-page-resolver.js +20 -3
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/store-day.d.ts +33 -0
- package/src/lib/server/store-day.js +46 -0
- package/src/lib/server/store-day.js.map +1 -0
- package/src/lib/server/store-setup-ai-writer.d.ts +2 -1
- package/src/lib/server/store-setup-ai-writer.js +5 -6
- package/src/lib/server/store-setup-ai-writer.js.map +1 -1
- package/src/lib/server/storefront-tax.d.ts +13 -0
- package/src/lib/server/storefront-tax.js +8 -1
- package/src/lib/server/storefront-tax.js.map +1 -1
- package/src/lib/server/tax-return-source.d.ts +32 -3
- package/src/lib/server/tax-return-source.js +99 -20
- package/src/lib/server/tax-return-source.js.map +1 -1
- package/src/lib/server.js +100 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/fake-firestore.js +58 -16
- package/src/lib/testing/fake-firestore.js.map +1 -1
- package/src/lib/testing/pos-ops-memory-firestore.js +18 -4
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -1
- package/src/lib/testing/site-register-permissions.d.ts +29 -0
- package/src/lib/testing/site-register-permissions.js +38 -0
- package/src/lib/testing/site-register-permissions.js.map +1 -0
- package/src/lib/transfer/tracking.server.js +8 -5
- package/src/lib/transfer/tracking.server.js.map +1 -1
- package/src/lib/utils/add-to-cart.d.ts +2 -0
- package/src/lib/utils/add-to-cart.js +6 -3
- package/src/lib/utils/add-to-cart.js.map +1 -1
|
@@ -0,0 +1,502 @@
|
|
|
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 { formatOperatorAlertAmount } from "@aglyn/aglyn/app-utils/operator-alerts";
|
|
18
|
+
import { firebaseAdmin, raiseOperatorAlert } from "@aglyn/tenant-data-admin";
|
|
19
|
+
import * as CommerceModel from "../model/index.js";
|
|
20
|
+
import { posOrderRefundRecord, POS_ORDER_REFUNDS_COLLECTION } from "../model/commerce-pos-day-report.js";
|
|
21
|
+
import { POS_STRIPE_TENDERS } from "../model/commerce-pos-ops.js";
|
|
22
|
+
import { formatPosHardwareCents, isPosHardwareSkuId, POS_HARDWARE_ORDER_ID, POS_HARDWARE_RETURN_REASON_MAX, posHardwareSaleRecord, posHardwareSaleSetOptions } from "../model/pos-hardware.js";
|
|
23
|
+
import { COMMERCE_POS_HARDWARE_RETURN_REQUESTED } from "../constants/operator-alerts.js";
|
|
24
|
+
import { hardwareOrdersRef, posHardwareOrderNumber, posHardwareSaleRef } from "./pos-hardware.js";
|
|
25
|
+
import { posStripe } from "./pos-stripe.js";
|
|
26
|
+
import { createStripeRefund } from "./stripe-refund.js";
|
|
27
|
+
import { posOrderRefundHardwareId } from "./pos-order-refund-ids.js";
|
|
28
|
+
/*==========================================
|
|
29
|
+
* RETURNING A CARD READER SOLD IN PERSON (AGL-4038).
|
|
30
|
+
*
|
|
31
|
+
* Three ways, and all of them pay back from the SELLING store's takings,
|
|
32
|
+
* the way the sale was paid — never from the platform's Checkout, which an
|
|
33
|
+
* in-person sale never used:
|
|
34
|
+
*
|
|
35
|
+
* 1. At the selling store's register, at a later event: the register's own
|
|
36
|
+
* return (`pos-return.ts`) refunds the sale's tenders as for anything
|
|
37
|
+
* else, and the hardware's share of it is written here onto the
|
|
38
|
+
* hardware order and its retained sale record.
|
|
39
|
+
* 2. From the staff Hardware orders page: the card the sale was paid with
|
|
40
|
+
* is refunded through the register sale's own Stripe refund (a
|
|
41
|
+
* destination charge, so the money comes back out of the store's
|
|
42
|
+
* connected account), recorded on the register sale as any refund is,
|
|
43
|
+
* and on the hardware order. A sale paid in cash can only be refunded
|
|
44
|
+
* at the register.
|
|
45
|
+
* 3. Requested by the buyer from their own purchase history: staff are
|
|
46
|
+
* alerted, and refund it (2) or decline it.
|
|
47
|
+
*
|
|
48
|
+
* Each refund is written once by its key, and the order says Refunded once
|
|
49
|
+
* every hardware item on it has come back. Returns follow the hardware terms
|
|
50
|
+
* of sale; nothing here decides them.
|
|
51
|
+
*
|
|
52
|
+
* AN ORDER SHIPPED TO THE BUYER (AGL-4038) is asked back the same way (3)
|
|
53
|
+
* once it has shipped, and declined the same way. Staff refund it as a
|
|
54
|
+
* return ({@link refundReturnedOnlinePosHardwareOrder}): the items and their
|
|
55
|
+
* tax, less any restocking fee Stripe charged, on the platform's own
|
|
56
|
+
* account, since the platform's Checkout took the payment.
|
|
57
|
+
*=========================================*/ export class PosHardwareReturnRefusal extends Error {
|
|
58
|
+
constructor(message, status){
|
|
59
|
+
super(message), this.status = status;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function firestore() {
|
|
63
|
+
return firebaseAdmin.app().firestore();
|
|
64
|
+
}
|
|
65
|
+
const units = (order)=>{
|
|
66
|
+
var _order_lines;
|
|
67
|
+
return ((_order_lines = order.lines) != null ? _order_lines : []).reduce((sum, line)=>sum + (Number(line.quantity) || 0), 0);
|
|
68
|
+
};
|
|
69
|
+
/** The order with one more refund on it, or as it was when the key was already used. */ export function withPosHardwareRefund(order, refund) {
|
|
70
|
+
var _order_refunds, _order_totalCents, _ref, _refund_stripeRefundId;
|
|
71
|
+
const refunds = (_order_refunds = order.refunds) != null ? _order_refunds : [];
|
|
72
|
+
if (refunds.some((held)=>held.key === refund.key)) return order;
|
|
73
|
+
const next = [
|
|
74
|
+
...refunds,
|
|
75
|
+
refund
|
|
76
|
+
];
|
|
77
|
+
const refundedCents = next.reduce((sum, held)=>sum + held.cents, 0);
|
|
78
|
+
const returned = next.reduce((sum, held)=>sum + held.quantity, 0);
|
|
79
|
+
const whole = refundedCents >= ((_order_totalCents = order.totalCents) != null ? _order_totalCents : 0) || returned > 0 && returned >= units(order);
|
|
80
|
+
return _extends({}, order, {
|
|
81
|
+
refunds: next,
|
|
82
|
+
refundedCents,
|
|
83
|
+
refundedAtMs: refund.atMs,
|
|
84
|
+
refundId: (_ref = (_refund_stripeRefundId = refund.stripeRefundId) != null ? _refund_stripeRefundId : order.refundId) != null ? _ref : null
|
|
85
|
+
}, whole ? {
|
|
86
|
+
status: 'refunded'
|
|
87
|
+
} : {}, order.returnRequest && order.returnRequest.state === 'requested' ? {
|
|
88
|
+
returnRequest: _extends({}, order.returnRequest, {
|
|
89
|
+
state: 'refunded',
|
|
90
|
+
decidedAtMs: refund.atMs
|
|
91
|
+
})
|
|
92
|
+
} : {}, {
|
|
93
|
+
updatedAtMs: refund.atMs
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Writes one refund onto a hardware order and its sale record, once. */ async function applyRefund(orderId, refund) {
|
|
97
|
+
const saleRef = posHardwareSaleRef(orderId);
|
|
98
|
+
return firestore().runTransaction(async (transaction)=>{
|
|
99
|
+
var _sale_get;
|
|
100
|
+
const sale = await transaction.get(saleRef);
|
|
101
|
+
if (!sale.exists) return null;
|
|
102
|
+
const ref = hardwareOrdersRef(String((_sale_get = sale.get('orgId')) != null ? _sale_get : '')).doc(orderId);
|
|
103
|
+
const snapshot = await transaction.get(ref);
|
|
104
|
+
if (!snapshot.exists) return null;
|
|
105
|
+
const before = snapshot.data();
|
|
106
|
+
const after = withPosHardwareRefund(before, refund);
|
|
107
|
+
if (after === before) return before;
|
|
108
|
+
transaction.set(ref, after);
|
|
109
|
+
transaction.set(saleRef, posHardwareSaleRecord(orderId, after), posHardwareSaleSetOptions(after));
|
|
110
|
+
return after;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* A return at the selling store's register (way 1): the hardware's share of
|
|
115
|
+
* what the return refunded, by the lines it took back. Never throws into the
|
|
116
|
+
* return; the money has already gone back.
|
|
117
|
+
*/ export async function recordRegisterHardwareReturn(input) {
|
|
118
|
+
const { config } = input;
|
|
119
|
+
if (!config || input.hostId !== config.sellerHostId || !input.lines.length) return null;
|
|
120
|
+
try {
|
|
121
|
+
var _register_get, _register_get1, _input_now;
|
|
122
|
+
const hostRef = firestore().collection('hosts').doc(input.hostId);
|
|
123
|
+
const register = await hostRef.collection('orders').doc(input.registerOrderId).get();
|
|
124
|
+
const orderId = String((_register_get = register.get('hardwareOrderId')) != null ? _register_get : '');
|
|
125
|
+
if (!POS_HARDWARE_ORDER_ID.test(orderId)) return null;
|
|
126
|
+
const lineItems = (_register_get1 = register.get('lineItems')) != null ? _register_get1 : [];
|
|
127
|
+
const productIds = [
|
|
128
|
+
...new Set(input.lines.map((line)=>{
|
|
129
|
+
var _ref;
|
|
130
|
+
var _lineItems_line_index;
|
|
131
|
+
return String((_ref = (_lineItems_line_index = lineItems[line.index]) == null ? void 0 : _lineItems_line_index.productId) != null ? _ref : '');
|
|
132
|
+
}))
|
|
133
|
+
].filter(Boolean);
|
|
134
|
+
const products = new Map((await Promise.all(productIds.map((id)=>hostRef.collection('products').doc(id).get()))).map((doc)=>[
|
|
135
|
+
String(doc.id),
|
|
136
|
+
doc.get('hardwareSku')
|
|
137
|
+
]));
|
|
138
|
+
const hardware = input.lines.filter((line)=>{
|
|
139
|
+
var _ref;
|
|
140
|
+
var _lineItems_line_index;
|
|
141
|
+
return isPosHardwareSkuId(products.get(String((_ref = (_lineItems_line_index = lineItems[line.index]) == null ? void 0 : _lineItems_line_index.productId) != null ? _ref : '')));
|
|
142
|
+
});
|
|
143
|
+
if (!hardware.length) return null;
|
|
144
|
+
const linesCents = input.lines.reduce((sum, line)=>sum + Math.max(0, Math.round(line.refundCents)), 0);
|
|
145
|
+
const hardwareCents = hardware.reduce((sum, line)=>sum + Math.max(0, Math.round(line.refundCents)), 0);
|
|
146
|
+
// What actually went back, in the lines' own proportion: a card that
|
|
147
|
+
// refused after another tender paid back leaves a part-return.
|
|
148
|
+
const refunded = Math.max(0, Math.round(input.refundCents));
|
|
149
|
+
const cents = linesCents > 0 && refunded < linesCents ? Math.floor((refunded * hardwareCents * 2 + linesCents) / (linesCents * 2)) : hardwareCents;
|
|
150
|
+
return await applyRefund(orderId, {
|
|
151
|
+
key: `register:${input.returnId}`,
|
|
152
|
+
via: 'register',
|
|
153
|
+
cents,
|
|
154
|
+
quantity: hardware.reduce((sum, line)=>sum + Math.max(0, Math.round(line.quantity)), 0),
|
|
155
|
+
atMs: (_input_now = input.now) != null ? _input_now : Date.now(),
|
|
156
|
+
stripeRefundId: null
|
|
157
|
+
});
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error('[pos-hardware-returns] a register return was not written to its hardware order', input.registerOrderId, error);
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Refunds what is left of an in-person order from the staff page (way 2),
|
|
165
|
+
* through the register sale's own card refund. Refused for a sale paid by
|
|
166
|
+
* anything Stripe cannot refund, which goes back at the register instead.
|
|
167
|
+
*/ export async function refundInPersonPosHardwareOrder(input) {
|
|
168
|
+
var _before_totalCents, _before_refundedCents, _ref, _ref1, _before_refunds, _input_now, _before_refunds1;
|
|
169
|
+
var _before_posSale, _before_posSale1, _sale_totals;
|
|
170
|
+
const { config } = input;
|
|
171
|
+
if (!config) throw new PosHardwareReturnRefusal('Card reader sales in person are off.', 409);
|
|
172
|
+
const ref = hardwareOrdersRef(input.orgId).doc(input.orderId);
|
|
173
|
+
const snapshot = await ref.get();
|
|
174
|
+
if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order', 404);
|
|
175
|
+
const before = snapshot.data();
|
|
176
|
+
if (before.source !== 'in_person' || ((_before_posSale = before.posSale) == null ? void 0 : _before_posSale.hostId) !== config.sellerHostId) {
|
|
177
|
+
throw new PosHardwareReturnRefusal('Only a card reader sold in person here is refunded this way.', 409);
|
|
178
|
+
}
|
|
179
|
+
if (before.status === 'refunded' || before.status === 'canceled') return {
|
|
180
|
+
before,
|
|
181
|
+
order: before
|
|
182
|
+
};
|
|
183
|
+
const cents = Math.max(0, ((_before_totalCents = before.totalCents) != null ? _before_totalCents : 0) - ((_before_refundedCents = before.refundedCents) != null ? _before_refundedCents : 0));
|
|
184
|
+
if (!cents) throw new PosHardwareReturnRefusal('Nothing is left to refund on this order.', 409);
|
|
185
|
+
const registerOrderId = String((_ref = (_before_posSale1 = before.posSale) == null ? void 0 : _before_posSale1.orderId) != null ? _ref : '');
|
|
186
|
+
const registerRef = firestore().collection('hosts').doc(config.sellerHostId).collection('orders').doc(registerOrderId);
|
|
187
|
+
const register = await registerRef.get();
|
|
188
|
+
if (!register.exists) throw new PosHardwareReturnRefusal('The register sale is missing.', 404);
|
|
189
|
+
const sale = register.data();
|
|
190
|
+
const card = CommerceModel.orderPayments(sale).filter((payment)=>payment.status === 'succeeded' && POS_STRIPE_TENDERS.has(payment.method) && payment.paymentIntentId).find((payment)=>payment.amountCents >= cents);
|
|
191
|
+
if (!(card == null ? void 0 : card.paymentIntentId)) {
|
|
192
|
+
throw new PosHardwareReturnRefusal('This card reader was not paid by one card that can take this refund. Refund it as a return at the selling store’s register instead.', 409);
|
|
193
|
+
}
|
|
194
|
+
const totalCents = Number((_ref1 = (_sale_totals = sale.totals) == null ? void 0 : _sale_totals.totalCents) != null ? _ref1 : 0);
|
|
195
|
+
// Reserve on the register sale first, as its own refunds do, so a refund
|
|
196
|
+
// there and one here cannot both take the same money.
|
|
197
|
+
const reserved = await firestore().runTransaction(async (transaction)=>{
|
|
198
|
+
var _data, _fresh_refundedCents;
|
|
199
|
+
const fresh = (_data = (await transaction.get(registerRef)).data()) != null ? _data : {};
|
|
200
|
+
const already = Number((_fresh_refundedCents = fresh['refundedCents']) != null ? _fresh_refundedCents : 0);
|
|
201
|
+
if (already + cents > totalCents) return false;
|
|
202
|
+
transaction.set(registerRef, {
|
|
203
|
+
refundedCents: already + cents
|
|
204
|
+
}, {
|
|
205
|
+
merge: true
|
|
206
|
+
});
|
|
207
|
+
return true;
|
|
208
|
+
});
|
|
209
|
+
if (!reserved) {
|
|
210
|
+
throw new PosHardwareReturnRefusal('The register sale was already refunded. Check it on the store’s orders.', 409);
|
|
211
|
+
}
|
|
212
|
+
const attempt = ((_before_refunds = before.refunds) != null ? _before_refunds : []).filter((held)=>held.via === 'staff').length + 1;
|
|
213
|
+
const refund = await createStripeRefund({
|
|
214
|
+
paymentIntentId: card.paymentIntentId,
|
|
215
|
+
amountCents: cents,
|
|
216
|
+
idempotencyKey: `pos-hw-refund-${input.orderId}-${attempt}`,
|
|
217
|
+
metadata: {
|
|
218
|
+
hostId: config.sellerHostId,
|
|
219
|
+
orderId: registerOrderId,
|
|
220
|
+
hardwareOrderId: input.orderId,
|
|
221
|
+
kind: 'pos-hardware-refund'
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
if ('error' in refund) {
|
|
225
|
+
// Stripe said no, so no money moved: the reservation goes back.
|
|
226
|
+
await firestore().runTransaction(async (transaction)=>{
|
|
227
|
+
var _get;
|
|
228
|
+
const current = Number((_get = (await transaction.get(registerRef)).get('refundedCents')) != null ? _get : 0);
|
|
229
|
+
transaction.set(registerRef, {
|
|
230
|
+
refundedCents: Math.max(0, current - cents)
|
|
231
|
+
}, {
|
|
232
|
+
merge: true
|
|
233
|
+
});
|
|
234
|
+
}).catch(()=>undefined);
|
|
235
|
+
throw new PosHardwareReturnRefusal(refund.error, refund.status === 409 ? 409 : 502);
|
|
236
|
+
}
|
|
237
|
+
const now = (_input_now = input.now) != null ? _input_now : Date.now();
|
|
238
|
+
const registerRefund = posOrderRefundRecord({
|
|
239
|
+
orderId: registerOrderId,
|
|
240
|
+
order: sale,
|
|
241
|
+
refundedCents: cents,
|
|
242
|
+
paymentIntentId: card.paymentIntentId,
|
|
243
|
+
cashierId: null,
|
|
244
|
+
source: 'staff',
|
|
245
|
+
stripeRefundId: refund.refundId || null,
|
|
246
|
+
atMs: now
|
|
247
|
+
});
|
|
248
|
+
await firestore().runTransaction(async (transaction)=>{
|
|
249
|
+
var _data, _fresh_refundedCents;
|
|
250
|
+
const fresh = (_data = (await transaction.get(registerRef)).data()) != null ? _data : {};
|
|
251
|
+
const refundedCents = Number((_fresh_refundedCents = fresh['refundedCents']) != null ? _fresh_refundedCents : 0);
|
|
252
|
+
transaction.set(registerRef, _extends({}, refundedCents >= totalCents ? {
|
|
253
|
+
status: 'refunded'
|
|
254
|
+
} : {}, {
|
|
255
|
+
updatedAtMs: now,
|
|
256
|
+
timeline: firebaseAdmin.firestore.FieldValue.arrayUnion({
|
|
257
|
+
atMs: now,
|
|
258
|
+
event: 'refund',
|
|
259
|
+
detail: `Card reader refunded from the staff hardware page: ${formatPosHardwareCents(cents)}`
|
|
260
|
+
})
|
|
261
|
+
}), {
|
|
262
|
+
merge: true
|
|
263
|
+
});
|
|
264
|
+
if (registerRefund) {
|
|
265
|
+
transaction.set(firestore().collection('hosts').doc(config.sellerHostId).collection('registers').doc(registerRefund.registerId).collection(POS_ORDER_REFUNDS_COLLECTION).doc(refund.refundId || posOrderRefundHardwareId(registerOrderId, attempt)), registerRefund);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
const order = await applyRefund(input.orderId, {
|
|
269
|
+
key: `staff:${attempt}`,
|
|
270
|
+
via: 'staff',
|
|
271
|
+
cents,
|
|
272
|
+
quantity: Math.max(0, units(before) - ((_before_refunds1 = before.refunds) != null ? _before_refunds1 : []).reduce((sum, held)=>sum + held.quantity, 0)),
|
|
273
|
+
atMs: now,
|
|
274
|
+
stripeRefundId: refund.refundId || null
|
|
275
|
+
});
|
|
276
|
+
return {
|
|
277
|
+
before,
|
|
278
|
+
order: order != null ? order : before
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* The statuses an online order may be asked back in (AGL-4038): once it has
|
|
283
|
+
* shipped. Before that, changing or canceling it is for support, who cancel
|
|
284
|
+
* and refund it in full from the staff page.
|
|
285
|
+
*/ export const POS_HARDWARE_ONLINE_RETURNABLE = [
|
|
286
|
+
'shipped',
|
|
287
|
+
'delivered',
|
|
288
|
+
'registered'
|
|
289
|
+
];
|
|
290
|
+
/**
|
|
291
|
+
* The buyer asks to return an order (way 3), from their own purchase
|
|
292
|
+
* history: once while a request is open, with a reason. Staff are alerted.
|
|
293
|
+
* An in-person order any time before it is refunded; an online one once it
|
|
294
|
+
* has shipped (AGL-4038), which staff refund as a return
|
|
295
|
+
* ({@link refundReturnedOnlinePosHardwareOrder}) or decline. Never for an
|
|
296
|
+
* order already refunded.
|
|
297
|
+
*/ export async function requestPosHardwareReturn(input) {
|
|
298
|
+
var _input_reason, _input_now;
|
|
299
|
+
const reason = String((_input_reason = input.reason) != null ? _input_reason : '').trim().slice(0, POS_HARDWARE_RETURN_REASON_MAX);
|
|
300
|
+
if (reason.length < 3) throw new PosHardwareReturnRefusal('Say why you are returning it.', 400);
|
|
301
|
+
if (!POS_HARDWARE_ORDER_ID.test(input.orderId)) throw new PosHardwareReturnRefusal('No such order.', 404);
|
|
302
|
+
const ref = hardwareOrdersRef(input.orgId).doc(input.orderId);
|
|
303
|
+
const now = (_input_now = input.now) != null ? _input_now : Date.now();
|
|
304
|
+
const outcome = await firestore().runTransaction(async (transaction)=>{
|
|
305
|
+
var _before_returnRequest;
|
|
306
|
+
const snapshot = await transaction.get(ref);
|
|
307
|
+
if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order.', 404);
|
|
308
|
+
const before = snapshot.data();
|
|
309
|
+
if (before.status === 'refunded' || before.status === 'canceled') {
|
|
310
|
+
throw new PosHardwareReturnRefusal('This order was already refunded.', 409);
|
|
311
|
+
}
|
|
312
|
+
if (before.source !== 'in_person' && !POS_HARDWARE_ONLINE_RETURNABLE.includes(before.status)) {
|
|
313
|
+
throw new PosHardwareReturnRefusal('This order has not shipped yet. To change or cancel it, contact support.', 409);
|
|
314
|
+
}
|
|
315
|
+
if (((_before_returnRequest = before.returnRequest) == null ? void 0 : _before_returnRequest.state) === 'requested') return {
|
|
316
|
+
order: before,
|
|
317
|
+
created: false
|
|
318
|
+
};
|
|
319
|
+
const after = _extends({}, before, {
|
|
320
|
+
returnRequest: {
|
|
321
|
+
state: 'requested',
|
|
322
|
+
reason,
|
|
323
|
+
requestedBy: input.uid,
|
|
324
|
+
requestedAtMs: now,
|
|
325
|
+
decidedBy: null,
|
|
326
|
+
decidedAtMs: null,
|
|
327
|
+
note: null
|
|
328
|
+
},
|
|
329
|
+
updatedAtMs: now
|
|
330
|
+
});
|
|
331
|
+
transaction.set(ref, after);
|
|
332
|
+
return {
|
|
333
|
+
order: after,
|
|
334
|
+
created: true
|
|
335
|
+
};
|
|
336
|
+
});
|
|
337
|
+
if (outcome.created) {
|
|
338
|
+
try {
|
|
339
|
+
var _outcome_order_totalCents, _outcome_order_lines;
|
|
340
|
+
var _outcome_order_posSale;
|
|
341
|
+
await raiseOperatorAlert(COMMERCE_POS_HARDWARE_RETURN_REQUESTED, {
|
|
342
|
+
dedupeKey: `${input.orderId}:${now}`,
|
|
343
|
+
orgId: input.orgId,
|
|
344
|
+
hostId: outcome.order.hostId || ((_outcome_order_posSale = outcome.order.posSale) == null ? void 0 : _outcome_order_posSale.hostId) || '',
|
|
345
|
+
context: {
|
|
346
|
+
orderNumber: posHardwareOrderNumber(input.orderId),
|
|
347
|
+
amount: formatOperatorAlertAmount((_outcome_order_totalCents = outcome.order.totalCents) != null ? _outcome_order_totalCents : 0),
|
|
348
|
+
orgId: input.orgId,
|
|
349
|
+
items: ((_outcome_order_lines = outcome.order.lines) != null ? _outcome_order_lines : []).map((line)=>`${line.quantity} × ${line.name}`).join(', '),
|
|
350
|
+
reason
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
} catch (error) {
|
|
354
|
+
console.error('[pos-hardware-returns] return request alert failed', input.orderId, error);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return outcome.order;
|
|
358
|
+
}
|
|
359
|
+
/** Staff decline an open return request, with a note for the buyer. */ export async function declinePosHardwareReturn(input) {
|
|
360
|
+
var _input_note, _input_now;
|
|
361
|
+
const note = String((_input_note = input.note) != null ? _input_note : '').trim().slice(0, POS_HARDWARE_RETURN_REASON_MAX) || null;
|
|
362
|
+
const ref = hardwareOrdersRef(input.orgId).doc(input.orderId);
|
|
363
|
+
const now = (_input_now = input.now) != null ? _input_now : Date.now();
|
|
364
|
+
return firestore().runTransaction(async (transaction)=>{
|
|
365
|
+
var _before_returnRequest;
|
|
366
|
+
const snapshot = await transaction.get(ref);
|
|
367
|
+
if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order', 404);
|
|
368
|
+
const before = snapshot.data();
|
|
369
|
+
if (((_before_returnRequest = before.returnRequest) == null ? void 0 : _before_returnRequest.state) !== 'requested') {
|
|
370
|
+
throw new PosHardwareReturnRefusal('There is no open return request on this order.', 409);
|
|
371
|
+
}
|
|
372
|
+
const order = _extends({}, before, {
|
|
373
|
+
returnRequest: _extends({}, before.returnRequest, {
|
|
374
|
+
state: 'declined',
|
|
375
|
+
decidedBy: input.actorUid,
|
|
376
|
+
decidedAtMs: now,
|
|
377
|
+
note
|
|
378
|
+
}),
|
|
379
|
+
updatedAtMs: now
|
|
380
|
+
});
|
|
381
|
+
transaction.set(ref, order);
|
|
382
|
+
return {
|
|
383
|
+
before,
|
|
384
|
+
order
|
|
385
|
+
};
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/** The idempotency key of an online return's refund: the order and the amount. */ export function posHardwareReturnRefundKey(orderId, cents) {
|
|
389
|
+
return `pos-hw-return-${orderId}-${cents}`;
|
|
390
|
+
}
|
|
391
|
+
/** What an online return gives back: the items and their tax, never the original shipping. */ export function posHardwareReturnRefundableCents(order) {
|
|
392
|
+
var _order_totalCents, _ref;
|
|
393
|
+
var _order_shipping;
|
|
394
|
+
return Math.max(0, ((_order_totalCents = order.totalCents) != null ? _order_totalCents : 0) - ((_ref = (_order_shipping = order.shipping) == null ? void 0 : _order_shipping.cents) != null ? _ref : 0));
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Staff refund an ONLINE order the buyer sent back (AGL-4038), from the
|
|
398
|
+
* staff Hardware orders page, once its return was requested: the price of
|
|
399
|
+
* the items and the tax on them, less any restocking fee Stripe charged for
|
|
400
|
+
* the return, to the card it was paid with on the platform's own account.
|
|
401
|
+
* The original shipping is not refunded, under the hardware terms of sale.
|
|
402
|
+
*
|
|
403
|
+
* Claimed first, as a cancel is (`refundRequestedAtMs`), so two presses make
|
|
404
|
+
* one refund; the Stripe key names the order and the amount, so a retry of
|
|
405
|
+
* the same refund is the same refund. The order says Refunded, its return
|
|
406
|
+
* request Refunded, and the refund is written once by its key, with the
|
|
407
|
+
* sale record in the same transaction.
|
|
408
|
+
*/ export async function refundReturnedOnlinePosHardwareOrder(input) {
|
|
409
|
+
var _input_now;
|
|
410
|
+
var _asked_body;
|
|
411
|
+
const fee = input.restockingFeeCents === undefined || input.restockingFeeCents === null || input.restockingFeeCents === '' ? 0 : Number(input.restockingFeeCents);
|
|
412
|
+
if (!Number.isSafeInteger(fee) || fee < 0) {
|
|
413
|
+
throw new PosHardwareReturnRefusal('Enter the restocking fee in whole cents, or 0.', 400);
|
|
414
|
+
}
|
|
415
|
+
if (!POS_HARDWARE_ORDER_ID.test(input.orderId)) throw new PosHardwareReturnRefusal('No such order', 404);
|
|
416
|
+
const now = (_input_now = input.now) != null ? _input_now : Date.now;
|
|
417
|
+
const ref = hardwareOrdersRef(input.orgId).doc(input.orderId);
|
|
418
|
+
const claimed = await firestore().runTransaction(async (transaction)=>{
|
|
419
|
+
var _before_returnRequest;
|
|
420
|
+
const snapshot = await transaction.get(ref);
|
|
421
|
+
if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order', 404);
|
|
422
|
+
const before = snapshot.data();
|
|
423
|
+
if (before.source === 'in_person') {
|
|
424
|
+
throw new PosHardwareReturnRefusal('A reader sold in person is refunded with Refund.', 409);
|
|
425
|
+
}
|
|
426
|
+
if (((_before_returnRequest = before.returnRequest) == null ? void 0 : _before_returnRequest.state) !== 'requested') {
|
|
427
|
+
throw new PosHardwareReturnRefusal('There is no open return request on this order.', 409);
|
|
428
|
+
}
|
|
429
|
+
if (!POS_HARDWARE_ONLINE_RETURNABLE.includes(before.status)) {
|
|
430
|
+
throw new PosHardwareReturnRefusal('Only an order that has shipped is refunded as a return.', 409);
|
|
431
|
+
}
|
|
432
|
+
if (!before.stripePaymentIntentId) throw new PosHardwareReturnRefusal('This order has no payment to refund.', 409);
|
|
433
|
+
if (before.refundRequestedAtMs && now() - before.refundRequestedAtMs < 2 * 60 * 1000) {
|
|
434
|
+
throw new PosHardwareReturnRefusal('A refund of this order is already in progress.', 409);
|
|
435
|
+
}
|
|
436
|
+
const cents = posHardwareReturnRefundableCents(before) - fee;
|
|
437
|
+
if (cents <= 0) throw new PosHardwareReturnRefusal('The restocking fee leaves nothing to refund.', 400);
|
|
438
|
+
transaction.update(ref, {
|
|
439
|
+
refundRequestedAtMs: now()
|
|
440
|
+
});
|
|
441
|
+
return {
|
|
442
|
+
before: before,
|
|
443
|
+
cents
|
|
444
|
+
};
|
|
445
|
+
});
|
|
446
|
+
const { before, cents } = claimed;
|
|
447
|
+
const asked = await posStripe('POST', 'refunds', {
|
|
448
|
+
params: {
|
|
449
|
+
payment_intent: before.stripePaymentIntentId,
|
|
450
|
+
amount: cents,
|
|
451
|
+
'metadata[type]': 'pos-hardware-return',
|
|
452
|
+
'metadata[orderId]': input.orderId,
|
|
453
|
+
'metadata[orgId]': input.orgId
|
|
454
|
+
},
|
|
455
|
+
idempotencyKey: posHardwareReturnRefundKey(input.orderId, cents)
|
|
456
|
+
});
|
|
457
|
+
if (!asked.ok || !((_asked_body = asked.body) == null ? void 0 : _asked_body.id)) {
|
|
458
|
+
var _ref;
|
|
459
|
+
var _asked_body_error, _asked_body1;
|
|
460
|
+
await ref.update({
|
|
461
|
+
refundRequestedAtMs: firebaseAdmin.firestore.FieldValue.delete()
|
|
462
|
+
}).catch(()=>undefined);
|
|
463
|
+
throw new PosHardwareReturnRefusal(String((_ref = (_asked_body1 = asked.body) == null ? void 0 : (_asked_body_error = _asked_body1.error) == null ? void 0 : _asked_body_error.message) != null ? _ref : '') || 'Stripe refused the refund.', asked.status === 400 ? 409 : 502);
|
|
464
|
+
}
|
|
465
|
+
const at = now();
|
|
466
|
+
const stripeRefundId = String(asked.body.id);
|
|
467
|
+
const saleRef = posHardwareSaleRef(input.orderId);
|
|
468
|
+
const order = await firestore().runTransaction(async (transaction)=>{
|
|
469
|
+
const snapshot = await transaction.get(ref);
|
|
470
|
+
const current = snapshot.data();
|
|
471
|
+
const settled = _extends({}, current);
|
|
472
|
+
delete settled.refundRequestedAtMs;
|
|
473
|
+
const refunded = withPosHardwareRefund(settled, {
|
|
474
|
+
key: `return:${stripeRefundId}`,
|
|
475
|
+
via: 'staff',
|
|
476
|
+
cents,
|
|
477
|
+
quantity: units(settled),
|
|
478
|
+
atMs: at,
|
|
479
|
+
stripeRefundId
|
|
480
|
+
});
|
|
481
|
+
const after = _extends({}, refunded, {
|
|
482
|
+
// Every item came back: the order is Refunded, whatever was kept.
|
|
483
|
+
status: 'refunded',
|
|
484
|
+
refundedAtMs: at,
|
|
485
|
+
returnRequest: refunded.returnRequest ? _extends({}, refunded.returnRequest, {
|
|
486
|
+
state: 'refunded',
|
|
487
|
+
decidedBy: input.actorUid,
|
|
488
|
+
decidedAtMs: at
|
|
489
|
+
}) : refunded.returnRequest
|
|
490
|
+
});
|
|
491
|
+
transaction.set(ref, after);
|
|
492
|
+
transaction.set(saleRef, posHardwareSaleRecord(input.orderId, after), posHardwareSaleSetOptions(after));
|
|
493
|
+
return after;
|
|
494
|
+
});
|
|
495
|
+
return {
|
|
496
|
+
before,
|
|
497
|
+
order,
|
|
498
|
+
cents
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
//# sourceMappingURL=pos-hardware-returns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-hardware-returns.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { formatOperatorAlertAmount } from '@aglyn/aglyn/app-utils/operator-alerts'\nimport { firebaseAdmin, raiseOperatorAlert } from '@aglyn/tenant-data-admin'\nimport * as CommerceModel from '../model'\nimport { posOrderRefundRecord, POS_ORDER_REFUNDS_COLLECTION } from '../model/commerce-pos-day-report'\nimport { POS_STRIPE_TENDERS, type PosTenderSource } from '../model/commerce-pos-ops'\nimport {\n formatPosHardwareCents,\n isPosHardwareSkuId,\n POS_HARDWARE_ORDER_ID,\n POS_HARDWARE_RETURN_REASON_MAX,\n posHardwareSaleRecord,\n posHardwareSaleSetOptions,\n type PosHardwareInPersonConfig,\n type PosHardwareOrder,\n type PosHardwareRefund,\n} from '../model/pos-hardware'\nimport { COMMERCE_POS_HARDWARE_RETURN_REQUESTED } from '../constants/operator-alerts'\nimport { hardwareOrdersRef, posHardwareOrderNumber, posHardwareSaleRef } from './pos-hardware'\nimport { posStripe } from './pos-stripe'\nimport { createStripeRefund } from './stripe-refund'\nimport { posOrderRefundHardwareId } from './pos-order-refund-ids'\n\n/*==========================================\n * RETURNING A CARD READER SOLD IN PERSON (AGL-4038).\n *\n * Three ways, and all of them pay back from the SELLING store's takings,\n * the way the sale was paid — never from the platform's Checkout, which an\n * in-person sale never used:\n *\n * 1. At the selling store's register, at a later event: the register's own\n * return (`pos-return.ts`) refunds the sale's tenders as for anything\n * else, and the hardware's share of it is written here onto the\n * hardware order and its retained sale record.\n * 2. From the staff Hardware orders page: the card the sale was paid with\n * is refunded through the register sale's own Stripe refund (a\n * destination charge, so the money comes back out of the store's\n * connected account), recorded on the register sale as any refund is,\n * and on the hardware order. A sale paid in cash can only be refunded\n * at the register.\n * 3. Requested by the buyer from their own purchase history: staff are\n * alerted, and refund it (2) or decline it.\n *\n * Each refund is written once by its key, and the order says Refunded once\n * every hardware item on it has come back. Returns follow the hardware terms\n * of sale; nothing here decides them.\n *\n * AN ORDER SHIPPED TO THE BUYER (AGL-4038) is asked back the same way (3)\n * once it has shipped, and declined the same way. Staff refund it as a\n * return ({@link refundReturnedOnlinePosHardwareOrder}): the items and their\n * tax, less any restocking fee Stripe charged, on the platform's own\n * account, since the platform's Checkout took the payment.\n *=========================================*/\n\nexport class PosHardwareReturnRefusal extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message)\n }\n}\n\nfunction firestore() {\n return firebaseAdmin.app().firestore()\n}\n\nconst units = (order: Pick<PosHardwareOrder, 'lines'>) =>\n (order.lines ?? []).reduce((sum, line) => sum + (Number(line.quantity) || 0), 0)\n\n/** The order with one more refund on it, or as it was when the key was already used. */\nexport function withPosHardwareRefund(order: PosHardwareOrder, refund: PosHardwareRefund): PosHardwareOrder {\n const refunds = order.refunds ?? []\n if (refunds.some((held) => held.key === refund.key)) return order\n const next = [...refunds, refund]\n const refundedCents = next.reduce((sum, held) => sum + held.cents, 0)\n const returned = next.reduce((sum, held) => sum + held.quantity, 0)\n const whole = refundedCents >= (order.totalCents ?? 0) || (returned > 0 && returned >= units(order))\n return {\n ...order,\n refunds: next,\n refundedCents,\n refundedAtMs: refund.atMs,\n refundId: refund.stripeRefundId ?? order.refundId ?? null,\n ...(whole ? { status: 'refunded' as const } : {}),\n ...(order.returnRequest && order.returnRequest.state === 'requested'\n ? { returnRequest: { ...order.returnRequest, state: 'refunded' as const, decidedAtMs: refund.atMs } }\n : {}),\n updatedAtMs: refund.atMs,\n }\n}\n\n/** Writes one refund onto a hardware order and its sale record, once. */\nasync function applyRefund(orderId: string, refund: PosHardwareRefund): Promise<PosHardwareOrder | null> {\n const saleRef = posHardwareSaleRef(orderId)\n return firestore().runTransaction(async (transaction: any) => {\n const sale = await transaction.get(saleRef)\n if (!sale.exists) return null\n const ref = hardwareOrdersRef(String(sale.get('orgId') ?? '')).doc(orderId)\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) return null\n const before = snapshot.data() as PosHardwareOrder\n const after = withPosHardwareRefund(before, refund)\n if (after === before) return before\n transaction.set(ref, after)\n transaction.set(saleRef, posHardwareSaleRecord(orderId, after), posHardwareSaleSetOptions(after))\n return after\n })\n}\n\n/**\n * A return at the selling store's register (way 1): the hardware's share of\n * what the return refunded, by the lines it took back. Never throws into the\n * return; the money has already gone back.\n */\nexport async function recordRegisterHardwareReturn(input: {\n config: PosHardwareInPersonConfig | null\n hostId: string\n registerOrderId: string\n returnId: string\n refundCents: number\n lines: ReadonlyArray<{ index: number; quantity: number; refundCents: number }>\n now?: number\n}): Promise<PosHardwareOrder | null> {\n const { config } = input\n if (!config || input.hostId !== config.sellerHostId || !input.lines.length) return null\n try {\n const hostRef = firestore().collection('hosts').doc(input.hostId)\n const register = await hostRef.collection('orders').doc(input.registerOrderId).get()\n const orderId = String(register.get('hardwareOrderId') ?? '')\n if (!POS_HARDWARE_ORDER_ID.test(orderId)) return null\n const lineItems = (register.get('lineItems') ?? []) as CommerceModel.OrderLineItem[]\n const productIds = [...new Set(input.lines.map((line) => String(lineItems[line.index]?.productId ?? '')))].filter(Boolean)\n const products = new Map(\n (await Promise.all(productIds.map((id) => hostRef.collection('products').doc(id).get()))).map((doc: any) => [\n String(doc.id),\n doc.get('hardwareSku'),\n ]),\n )\n const hardware = input.lines.filter((line) =>\n isPosHardwareSkuId(products.get(String(lineItems[line.index]?.productId ?? ''))),\n )\n if (!hardware.length) return null\n const linesCents = input.lines.reduce((sum, line) => sum + Math.max(0, Math.round(line.refundCents)), 0)\n const hardwareCents = hardware.reduce((sum, line) => sum + Math.max(0, Math.round(line.refundCents)), 0)\n // What actually went back, in the lines' own proportion: a card that\n // refused after another tender paid back leaves a part-return.\n const refunded = Math.max(0, Math.round(input.refundCents))\n const cents =\n linesCents > 0 && refunded < linesCents\n ? Math.floor((refunded * hardwareCents * 2 + linesCents) / (linesCents * 2))\n : hardwareCents\n return await applyRefund(orderId, {\n key: `register:${input.returnId}`,\n via: 'register',\n cents,\n quantity: hardware.reduce((sum, line) => sum + Math.max(0, Math.round(line.quantity)), 0),\n atMs: input.now ?? Date.now(),\n stripeRefundId: null,\n })\n } catch (error) {\n console.error('[pos-hardware-returns] a register return was not written to its hardware order', input.registerOrderId, error)\n return null\n }\n}\n\n/**\n * Refunds what is left of an in-person order from the staff page (way 2),\n * through the register sale's own card refund. Refused for a sale paid by\n * anything Stripe cannot refund, which goes back at the register instead.\n */\nexport async function refundInPersonPosHardwareOrder(input: {\n config: PosHardwareInPersonConfig | null\n orgId: string\n orderId: string\n actorUid: string\n now?: number\n}): Promise<{ before: PosHardwareOrder; order: PosHardwareOrder }> {\n const { config } = input\n if (!config) throw new PosHardwareReturnRefusal('Card reader sales in person are off.', 409)\n const ref = hardwareOrdersRef(input.orgId).doc(input.orderId)\n const snapshot = await ref.get()\n if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order', 404)\n const before = snapshot.data() as PosHardwareOrder\n if (before.source !== 'in_person' || before.posSale?.hostId !== config.sellerHostId) {\n throw new PosHardwareReturnRefusal('Only a card reader sold in person here is refunded this way.', 409)\n }\n if (before.status === 'refunded' || before.status === 'canceled') return { before, order: before }\n const cents = Math.max(0, (before.totalCents ?? 0) - (before.refundedCents ?? 0))\n if (!cents) throw new PosHardwareReturnRefusal('Nothing is left to refund on this order.', 409)\n const registerOrderId = String(before.posSale?.orderId ?? '')\n const registerRef = firestore().collection('hosts').doc(config.sellerHostId).collection('orders').doc(registerOrderId)\n const register = await registerRef.get()\n if (!register.exists) throw new PosHardwareReturnRefusal('The register sale is missing.', 404)\n const sale = register.data() as PosTenderSource & CommerceModel.HostOrder & { refundedCents?: number }\n const card = CommerceModel.orderPayments(sale as never)\n .filter((payment) => payment.status === 'succeeded' && POS_STRIPE_TENDERS.has(payment.method) && payment.paymentIntentId)\n .find((payment) => payment.amountCents >= cents)\n if (!card?.paymentIntentId) {\n throw new PosHardwareReturnRefusal(\n 'This card reader was not paid by one card that can take this refund. Refund it as a return at the selling store’s register instead.',\n 409,\n )\n }\n const totalCents = Number(sale.totals?.totalCents ?? 0)\n // Reserve on the register sale first, as its own refunds do, so a refund\n // there and one here cannot both take the same money.\n const reserved = await firestore().runTransaction(async (transaction: any) => {\n const fresh = (await transaction.get(registerRef)).data() ?? {}\n const already = Number(fresh['refundedCents'] ?? 0)\n if (already + cents > totalCents) return false\n transaction.set(registerRef, { refundedCents: already + cents }, { merge: true })\n return true\n })\n if (!reserved) {\n throw new PosHardwareReturnRefusal('The register sale was already refunded. Check it on the store’s orders.', 409)\n }\n const attempt = (before.refunds ?? []).filter((held) => held.via === 'staff').length + 1\n const refund = await createStripeRefund({\n paymentIntentId: card.paymentIntentId,\n amountCents: cents,\n idempotencyKey: `pos-hw-refund-${input.orderId}-${attempt}`,\n metadata: {\n hostId: config.sellerHostId,\n orderId: registerOrderId,\n hardwareOrderId: input.orderId,\n kind: 'pos-hardware-refund',\n },\n })\n if ('error' in refund) {\n // Stripe said no, so no money moved: the reservation goes back.\n await firestore()\n .runTransaction(async (transaction: any) => {\n const current = Number((await transaction.get(registerRef)).get('refundedCents') ?? 0)\n transaction.set(registerRef, { refundedCents: Math.max(0, current - cents) }, { merge: true })\n })\n .catch(() => undefined)\n throw new PosHardwareReturnRefusal(refund.error, refund.status === 409 ? 409 : 502)\n }\n const now = input.now ?? Date.now()\n const registerRefund = posOrderRefundRecord({\n orderId: registerOrderId,\n order: sale as PosTenderSource & { registerId?: unknown },\n refundedCents: cents,\n paymentIntentId: card.paymentIntentId,\n cashierId: null,\n source: 'staff',\n stripeRefundId: refund.refundId || null,\n atMs: now,\n })\n await firestore().runTransaction(async (transaction: any) => {\n const fresh = (await transaction.get(registerRef)).data() ?? {}\n const refundedCents = Number(fresh['refundedCents'] ?? 0)\n transaction.set(\n registerRef,\n {\n ...(refundedCents >= totalCents ? { status: 'refunded' } : {}),\n updatedAtMs: now,\n timeline: firebaseAdmin.firestore.FieldValue.arrayUnion({\n atMs: now,\n event: 'refund',\n detail: `Card reader refunded from the staff hardware page: ${formatPosHardwareCents(cents)}`,\n }),\n },\n { merge: true },\n )\n if (registerRefund) {\n transaction.set(\n firestore()\n .collection('hosts')\n .doc(config.sellerHostId)\n .collection('registers')\n .doc(registerRefund.registerId)\n .collection(POS_ORDER_REFUNDS_COLLECTION)\n .doc(refund.refundId || posOrderRefundHardwareId(registerOrderId, attempt)),\n registerRefund,\n )\n }\n })\n const order = await applyRefund(input.orderId, {\n key: `staff:${attempt}`,\n via: 'staff',\n cents,\n quantity: Math.max(0, units(before) - (before.refunds ?? []).reduce((sum, held) => sum + held.quantity, 0)),\n atMs: now,\n stripeRefundId: refund.refundId || null,\n })\n return { before, order: order ?? before }\n}\n\n/**\n * The statuses an online order may be asked back in (AGL-4038): once it has\n * shipped. Before that, changing or canceling it is for support, who cancel\n * and refund it in full from the staff page.\n */\nexport const POS_HARDWARE_ONLINE_RETURNABLE: readonly PosHardwareOrder['status'][] = ['shipped', 'delivered', 'registered']\n\n/**\n * The buyer asks to return an order (way 3), from their own purchase\n * history: once while a request is open, with a reason. Staff are alerted.\n * An in-person order any time before it is refunded; an online one once it\n * has shipped (AGL-4038), which staff refund as a return\n * ({@link refundReturnedOnlinePosHardwareOrder}) or decline. Never for an\n * order already refunded.\n */\nexport async function requestPosHardwareReturn(input: {\n orgId: string\n orderId: string\n uid: string\n reason: unknown\n now?: number\n}): Promise<PosHardwareOrder> {\n const reason = String(input.reason ?? '').trim().slice(0, POS_HARDWARE_RETURN_REASON_MAX)\n if (reason.length < 3) throw new PosHardwareReturnRefusal('Say why you are returning it.', 400)\n if (!POS_HARDWARE_ORDER_ID.test(input.orderId)) throw new PosHardwareReturnRefusal('No such order.', 404)\n const ref = hardwareOrdersRef(input.orgId).doc(input.orderId)\n const now = input.now ?? Date.now()\n const outcome = await firestore().runTransaction(async (transaction: any) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order.', 404)\n const before = snapshot.data() as PosHardwareOrder\n if (before.status === 'refunded' || before.status === 'canceled') {\n throw new PosHardwareReturnRefusal('This order was already refunded.', 409)\n }\n if (before.source !== 'in_person' && !POS_HARDWARE_ONLINE_RETURNABLE.includes(before.status)) {\n throw new PosHardwareReturnRefusal(\n 'This order has not shipped yet. To change or cancel it, contact support.',\n 409,\n )\n }\n if (before.returnRequest?.state === 'requested') return { order: before, created: false }\n const after: PosHardwareOrder = {\n ...before,\n returnRequest: {\n state: 'requested',\n reason,\n requestedBy: input.uid,\n requestedAtMs: now,\n decidedBy: null,\n decidedAtMs: null,\n note: null,\n },\n updatedAtMs: now,\n }\n transaction.set(ref, after)\n return { order: after, created: true }\n })\n if (outcome.created) {\n try {\n await raiseOperatorAlert(COMMERCE_POS_HARDWARE_RETURN_REQUESTED, {\n dedupeKey: `${input.orderId}:${now}`,\n orgId: input.orgId,\n hostId: outcome.order.hostId || outcome.order.posSale?.hostId || '',\n context: {\n orderNumber: posHardwareOrderNumber(input.orderId),\n amount: formatOperatorAlertAmount(outcome.order.totalCents ?? 0),\n orgId: input.orgId,\n items: (outcome.order.lines ?? []).map((line) => `${line.quantity} × ${line.name}`).join(', '),\n reason,\n },\n })\n } catch (error) {\n console.error('[pos-hardware-returns] return request alert failed', input.orderId, error)\n }\n }\n return outcome.order\n}\n\n/** Staff decline an open return request, with a note for the buyer. */\nexport async function declinePosHardwareReturn(input: {\n orgId: string\n orderId: string\n actorUid: string\n note: unknown\n now?: number\n}): Promise<{ before: PosHardwareOrder; order: PosHardwareOrder }> {\n const note = String(input.note ?? '').trim().slice(0, POS_HARDWARE_RETURN_REASON_MAX) || null\n const ref = hardwareOrdersRef(input.orgId).doc(input.orderId)\n const now = input.now ?? Date.now()\n return firestore().runTransaction(async (transaction: any) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order', 404)\n const before = snapshot.data() as PosHardwareOrder\n if (before.returnRequest?.state !== 'requested') {\n throw new PosHardwareReturnRefusal('There is no open return request on this order.', 409)\n }\n const order: PosHardwareOrder = {\n ...before,\n returnRequest: { ...before.returnRequest, state: 'declined', decidedBy: input.actorUid, decidedAtMs: now, note },\n updatedAtMs: now,\n }\n transaction.set(ref, order)\n return { before, order }\n })\n}\n\n/** The idempotency key of an online return's refund: the order and the amount. */\nexport function posHardwareReturnRefundKey(orderId: string, cents: number): string {\n return `pos-hw-return-${orderId}-${cents}`\n}\n\n/** What an online return gives back: the items and their tax, never the original shipping. */\nexport function posHardwareReturnRefundableCents(order: Pick<PosHardwareOrder, 'totalCents' | 'shipping'>): number {\n return Math.max(0, (order.totalCents ?? 0) - (order.shipping?.cents ?? 0))\n}\n\n/**\n * Staff refund an ONLINE order the buyer sent back (AGL-4038), from the\n * staff Hardware orders page, once its return was requested: the price of\n * the items and the tax on them, less any restocking fee Stripe charged for\n * the return, to the card it was paid with on the platform's own account.\n * The original shipping is not refunded, under the hardware terms of sale.\n *\n * Claimed first, as a cancel is (`refundRequestedAtMs`), so two presses make\n * one refund; the Stripe key names the order and the amount, so a retry of\n * the same refund is the same refund. The order says Refunded, its return\n * request Refunded, and the refund is written once by its key, with the\n * sale record in the same transaction.\n */\nexport async function refundReturnedOnlinePosHardwareOrder(input: {\n orgId: string\n orderId: string\n actorUid: string\n restockingFeeCents: unknown\n now?: () => number\n}): Promise<{ before: PosHardwareOrder; order: PosHardwareOrder; cents: number }> {\n const fee = input.restockingFeeCents === undefined || input.restockingFeeCents === null || input.restockingFeeCents === '' ? 0 : Number(input.restockingFeeCents)\n if (!Number.isSafeInteger(fee) || fee < 0) {\n throw new PosHardwareReturnRefusal('Enter the restocking fee in whole cents, or 0.', 400)\n }\n if (!POS_HARDWARE_ORDER_ID.test(input.orderId)) throw new PosHardwareReturnRefusal('No such order', 404)\n const now = input.now ?? Date.now\n const ref = hardwareOrdersRef(input.orgId).doc(input.orderId)\n const claimed = await firestore().runTransaction(async (transaction: any) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) throw new PosHardwareReturnRefusal('No such order', 404)\n const before = snapshot.data() as PosHardwareOrder & { refundRequestedAtMs?: number }\n if (before.source === 'in_person') {\n throw new PosHardwareReturnRefusal('A reader sold in person is refunded with Refund.', 409)\n }\n if (before.returnRequest?.state !== 'requested') {\n throw new PosHardwareReturnRefusal('There is no open return request on this order.', 409)\n }\n if (!POS_HARDWARE_ONLINE_RETURNABLE.includes(before.status)) {\n throw new PosHardwareReturnRefusal('Only an order that has shipped is refunded as a return.', 409)\n }\n if (!before.stripePaymentIntentId) throw new PosHardwareReturnRefusal('This order has no payment to refund.', 409)\n if (before.refundRequestedAtMs && now() - before.refundRequestedAtMs < 2 * 60 * 1000) {\n throw new PosHardwareReturnRefusal('A refund of this order is already in progress.', 409)\n }\n const cents = posHardwareReturnRefundableCents(before) - fee\n if (cents <= 0) throw new PosHardwareReturnRefusal('The restocking fee leaves nothing to refund.', 400)\n transaction.update(ref, { refundRequestedAtMs: now() })\n return { before: before as PosHardwareOrder, cents }\n })\n const { before, cents } = claimed\n const asked = await posStripe('POST', 'refunds', {\n params: {\n payment_intent: before.stripePaymentIntentId,\n amount: cents,\n 'metadata[type]': 'pos-hardware-return',\n 'metadata[orderId]': input.orderId,\n 'metadata[orgId]': input.orgId,\n },\n idempotencyKey: posHardwareReturnRefundKey(input.orderId, cents),\n })\n if (!asked.ok || !asked.body?.id) {\n await ref.update({ refundRequestedAtMs: firebaseAdmin.firestore.FieldValue.delete() }).catch(() => undefined)\n throw new PosHardwareReturnRefusal(\n String(asked.body?.error?.message ?? '') || 'Stripe refused the refund.',\n asked.status === 400 ? 409 : 502,\n )\n }\n const at = now()\n const stripeRefundId = String(asked.body.id)\n const saleRef = posHardwareSaleRef(input.orderId)\n const order = await firestore().runTransaction(async (transaction: any) => {\n const snapshot = await transaction.get(ref)\n const current = snapshot.data() as PosHardwareOrder & { refundRequestedAtMs?: number }\n const settled: PosHardwareOrder = { ...current }\n delete (settled as { refundRequestedAtMs?: number }).refundRequestedAtMs\n const refunded = withPosHardwareRefund(settled, {\n key: `return:${stripeRefundId}`,\n via: 'staff',\n cents,\n quantity: units(settled),\n atMs: at,\n stripeRefundId,\n })\n const after: PosHardwareOrder = {\n ...refunded,\n // Every item came back: the order is Refunded, whatever was kept.\n status: 'refunded',\n refundedAtMs: at,\n returnRequest: refunded.returnRequest\n ? { ...refunded.returnRequest, state: 'refunded', decidedBy: input.actorUid, decidedAtMs: at }\n : refunded.returnRequest,\n }\n transaction.set(ref, after)\n transaction.set(saleRef, posHardwareSaleRecord(input.orderId, after), posHardwareSaleSetOptions(after))\n return after\n })\n return { before, order, cents }\n}\n\n"],"names":["formatOperatorAlertAmount","firebaseAdmin","raiseOperatorAlert","CommerceModel","posOrderRefundRecord","POS_ORDER_REFUNDS_COLLECTION","POS_STRIPE_TENDERS","formatPosHardwareCents","isPosHardwareSkuId","POS_HARDWARE_ORDER_ID","POS_HARDWARE_RETURN_REASON_MAX","posHardwareSaleRecord","posHardwareSaleSetOptions","COMMERCE_POS_HARDWARE_RETURN_REQUESTED","hardwareOrdersRef","posHardwareOrderNumber","posHardwareSaleRef","posStripe","createStripeRefund","posOrderRefundHardwareId","PosHardwareReturnRefusal","Error","message","status","firestore","app","units","order","lines","reduce","sum","line","Number","quantity","withPosHardwareRefund","refund","refunds","some","held","key","next","refundedCents","cents","returned","whole","totalCents","refundedAtMs","atMs","refundId","stripeRefundId","returnRequest","state","decidedAtMs","updatedAtMs","applyRefund","orderId","saleRef","runTransaction","transaction","sale","get","exists","ref","String","doc","snapshot","before","data","after","set","recordRegisterHardwareReturn","input","config","hostId","sellerHostId","length","register","hostRef","collection","registerOrderId","test","lineItems","productIds","Set","map","index","productId","filter","Boolean","products","Map","Promise","all","id","hardware","linesCents","Math","max","round","refundCents","hardwareCents","refunded","floor","returnId","via","now","Date","error","console","refundInPersonPosHardwareOrder","orgId","source","posSale","registerRef","card","orderPayments","payment","has","method","paymentIntentId","find","amountCents","totals","reserved","fresh","already","merge","attempt","idempotencyKey","metadata","hardwareOrderId","kind","current","catch","undefined","registerRefund","cashierId","timeline","FieldValue","arrayUnion","event","detail","registerId","POS_HARDWARE_ONLINE_RETURNABLE","requestPosHardwareReturn","reason","trim","slice","outcome","includes","created","requestedBy","uid","requestedAtMs","decidedBy","note","dedupeKey","context","orderNumber","amount","items","name","join","declinePosHardwareReturn","actorUid","posHardwareReturnRefundKey","posHardwareReturnRefundableCents","shipping","refundReturnedOnlinePosHardwareOrder","asked","fee","restockingFeeCents","isSafeInteger","claimed","stripePaymentIntentId","refundRequestedAtMs","update","params","payment_intent","ok","body","delete","at","settled"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
export declare function posHardwareSaleFields(input: {
|
|
18
|
+
hostId: string;
|
|
19
|
+
orgId: string | null | undefined;
|
|
20
|
+
lineItems: ReadonlyArray<{
|
|
21
|
+
productId: string;
|
|
22
|
+
}>;
|
|
23
|
+
products: ReadonlyMap<string, {
|
|
24
|
+
hardwareSku?: unknown;
|
|
25
|
+
} | null | undefined>;
|
|
26
|
+
}, env?: Record<string, string | undefined>): {
|
|
27
|
+
hardwareSalePending?: true;
|
|
28
|
+
};
|