@aglyn/plugins-commerce 1.0.0-beta.285 → 1.0.0-beta.288
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/order-webhooks-card.component.js +1 -1
- package/src/lib/components/console/order-webhooks-card.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 +15 -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 +74 -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/model/workspace-site-permissions.d.ts +26 -0
- package/src/lib/model/workspace-site-permissions.js +81 -0
- package/src/lib/model/workspace-site-permissions.js.map +1 -0
- 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 +48 -0
- package/src/lib/server/commerce-site-keys.js +61 -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/order-webhooks.js +8 -8
- package/src/lib/server/order-webhooks.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 +28 -9
- package/src/lib/server/pos-ops-gate.js +50 -19
- 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-refund-authority.d.ts +3 -1
- package/src/lib/server/pos-refund-authority.js +3 -2
- package/src/lib/server/pos-refund-authority.js.map +1 -1
- package/src/lib/server/pos-return.d.ts +10 -0
- package/src/lib/server/pos-return.js +29 -7
- 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 +29 -24
- 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 +55 -42
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-shift-panel.component.tsx"],"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\n'use client'\n\nimport {\n Alert,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { doc } from 'firebase/firestore'\nimport { useFirestore, useFirestoreDoc, useUser } from '@aglyn/tenant-feature-instance'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useCallback, useState } from 'react'\nimport {\n POS_CASH_EVENT_LABELS,\n posCashVarianceCents,\n posMoney,\n type PosCashEventType,\n type PosShift,\n type PosShiftReport,\n} from '../../../model/commerce-pos-ops'\nimport { callPosOps, newPosAttemptKey, parsePosDollars } from './pos-ops-api'\nimport { usePosReceiptStore } from './pos-receipt-actions.component'\nimport {\n PosShiftReportView,\n posShiftReportDocument,\n printPosDocument,\n} from './pos-shift-report.component'\n\nexport interface PosShiftPanelProps {\n hostId: string\n registerId: string\n registerName?: string\n /** The PIN-switched cashier's assertion, so the shift names them. */\n cashierAssertion?: string\n}\n\ntype DialogKind = 'open' | 'cash' | 'report' | 'close' | null\n\n/**\n * The register's shift (AGL-3609): open it with a starting float, record cash\n * paid in, paid out and dropped to the safe, read the X report at any time,\n * and close with a count — the Z report freezes the figures and the variance.\n * Live: a shift another tablet opens on this register shows here at once.\n */\nexport function PosShiftPanel(props: PosShiftPanelProps) {\n const { hostId, registerId, cashierAssertion } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const store = usePosReceiptStore(hostId)\n const { data: register } = useFirestoreDoc<Record<string, any>>(\n () => (registerId ? doc(firestore, 'hosts', hostId, 'registers', registerId) : null),\n [firestore, hostId, registerId],\n )\n const openShiftId = String(register?.['openShiftId'] ?? '')\n const { data: shiftData } = useFirestoreDoc<PosShift>(\n () =>\n registerId && openShiftId\n ? doc(firestore, 'hosts', hostId, 'registers', registerId, 'shifts', openShiftId)\n : null,\n [firestore, hostId, registerId, openShiftId],\n )\n const shift = openShiftId && shiftData?.status === 'open' ? shiftData : null\n\n const [dialog, setDialog] = useState<DialogKind>(null)\n const [amount, setAmount] = useState('')\n const [cashType, setCashType] = useState<Exclude<PosCashEventType, 'refund'>>('paid_out')\n const [reason, setReason] = useState('')\n const [note, setNote] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [report, setReport] = useState<PosShiftReport | null>(null)\n const [closed, setClosed] = useState<(PosShift & { id: string }) | null>(null)\n const [eventKey, setEventKey] = useState('')\n\n const reset = () => {\n setAmount('')\n setReason('')\n setNote('')\n setError('')\n setBusy(false)\n }\n const close = () => {\n setDialog(null)\n setClosed(null)\n reset()\n }\n\n const call = useCallback(\n (body: Record<string, unknown>) =>\n callPosOps<Record<string, any>>(user, 'pos-shift', {\n hostId,\n registerId,\n ...(cashierAssertion ? { cashierAssertion } : {}),\n ...body,\n }),\n [user, hostId, registerId, cashierAssertion],\n )\n\n const loadReport = useCallback(async () => {\n const answer = await call({ action: 'x-report' })\n if (!answer.ok) {\n setError(answer.body.error ?? 'Could not read the shift.')\n return null\n }\n setReport(answer.body['report'] as PosShiftReport)\n return answer.body['report'] as PosShiftReport\n }, [call])\n\n const submitOpen = async () => {\n const cents = parsePosDollars(amount || '0')\n if (cents == null) return setError('Enter the starting cash, like 150.00.')\n setBusy(true)\n const answer = await call({ action: 'open', openingFloatCents: cents })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'Could not open the shift.')\n enqueueSnackbar('Shift opened', { variant: 'success', persist: false })\n close()\n }\n\n const submitCash = async () => {\n const cents = parsePosDollars(amount)\n if (!cents) return setError('Enter an amount above zero.')\n setBusy(true)\n const answer = await call({ action: 'cash-event', type: cashType, amountCents: cents, reason, eventId: eventKey })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'Could not record the cash.')\n enqueueSnackbar(`${POS_CASH_EVENT_LABELS[cashType]} recorded`, { variant: 'success', persist: false })\n close()\n }\n\n const submitClose = async () => {\n const counted = parsePosDollars(amount)\n if (counted == null) return setError('Enter the cash you counted, like 212.40.')\n setBusy(true)\n const answer = await call({ action: 'close', countedCashCents: counted, shiftId: openShiftId, note })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'Could not close the shift.')\n setClosed(answer.body['shift'] as PosShift & { id: string })\n }\n\n /**\n * The register's cloud receipt printer when it has one (AGL-3619), and the\n * browser's print dialog when it does not or the queue is unreachable.\n */\n const printReport = async (\n title: string,\n data: PosShiftReport,\n shiftId: string,\n frozen?: PosShift,\n ) => {\n const answer = await call({ action: 'print-report', shiftId, attemptKey: newPosAttemptKey() })\n if (answer.ok && answer.body['printed']) {\n enqueueSnackbar('Sent to the receipt printer', { variant: 'success', persist: false })\n return\n }\n printPosDocument(\n posShiftReportDocument({\n title,\n storeName: store.name,\n subtitle: `${props.registerName ?? 'Register'} · ${new Date().toLocaleString()}`,\n report: data,\n ...(frozen ? { shift: frozen } : {}),\n }),\n )\n }\n\n const countedCents = parsePosDollars(amount)\n return (\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n {shift ? (\n <>\n <Chip\n color=\"success\"\n size=\"small\"\n label={`Shift open since ${new Date(shift.openedAtMs).toLocaleTimeString([], {\n hour: 'numeric',\n minute: '2-digit',\n })}`}\n />\n <Button\n size=\"small\"\n onClick={() => {\n setEventKey(newPosAttemptKey())\n setDialog('cash')\n }}\n >\n {'Cash in/out'}\n </Button>\n <Button\n size=\"small\"\n onClick={() => {\n setReport(null)\n setDialog('report')\n void loadReport()\n }}\n >\n {'X report'}\n </Button>\n <Button\n size=\"small\"\n color=\"warning\"\n onClick={() => {\n setReport(null)\n setDialog('close')\n void loadReport()\n }}\n >\n {'Close shift'}\n </Button>\n </>\n ) : (\n <>\n <Chip size=\"small\" label=\"No shift open\" />\n <Button size=\"small\" variant=\"outlined\" onClick={() => setDialog('open')} disabled={!registerId}>\n {'Open shift'}\n </Button>\n </>\n )}\n </Stack>\n\n <Dialog open={dialog === 'open'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Open a shift'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Count the cash in the drawer before the first sale. Every sale and cash ' +\n 'movement until you close is counted against it.'}\n </Typography>\n <TextField\n autoFocus\n label=\"Starting cash ($)\"\n value={amount}\n onChange={(event) => setAmount(event.target.value)}\n inputMode=\"decimal\"\n placeholder=\"150.00\"\n />\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={close}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy} onClick={submitOpen}>\n {'Open shift'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={dialog === 'cash'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Cash in or out'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <TextField\n select\n label=\"What happened\"\n value={cashType}\n onChange={(event) => setCashType(event.target.value as typeof cashType)}\n >\n <MenuItem value=\"paid_in\">{'Paid in — cash added to the drawer'}</MenuItem>\n <MenuItem value=\"paid_out\">{'Paid out — cash taken for an expense'}</MenuItem>\n <MenuItem value=\"drop\">{'Safe drop — cash moved to the safe'}</MenuItem>\n </TextField>\n <TextField\n label=\"Amount ($)\"\n value={amount}\n onChange={(event) => setAmount(event.target.value)}\n inputMode=\"decimal\"\n />\n <TextField\n label={cashType === 'drop' ? 'Note (optional)' : 'Reason'}\n value={reason}\n onChange={(event) => setReason(event.target.value)}\n placeholder={cashType === 'paid_out' ? 'Milk for the coffee bar' : ''}\n />\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={close}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy} onClick={submitCash}>\n {'Record'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={dialog === 'report'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'X report'}</DialogTitle>\n <DialogContent>\n {report ? <PosShiftReportView report={report} /> : <Typography variant=\"body2\">{'Reading the shift…'}</Typography>}\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </DialogContent>\n <DialogActions>\n <Button disabled={!report} onClick={() => report && void printReport('X REPORT', report, openShiftId)}>\n {'Print'}\n </Button>\n <Button onClick={close}>{'Done'}</Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={dialog === 'close'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{closed ? 'Z report' : 'Close the shift'}</DialogTitle>\n <DialogContent>\n {closed?.report ? (\n <PosShiftReportView report={closed.report} shift={closed} />\n ) : (\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Count the drawer, then enter what is in it.'}\n </Typography>\n <TextField\n autoFocus\n label=\"Cash counted ($)\"\n value={amount}\n onChange={(event) => setAmount(event.target.value)}\n inputMode=\"decimal\"\n />\n {report && countedCents != null ? (\n <Alert\n severity={posCashVarianceCents(countedCents, report.expectedCashCents) === 0 ? 'success' : 'info'}\n >\n {`Expected ${posMoney(report.expectedCashCents)} · ${(() => {\n const variance = posCashVarianceCents(countedCents, report.expectedCashCents)\n return variance === 0\n ? 'balanced'\n : `${variance < 0 ? 'short' : 'over'} ${posMoney(Math.abs(variance))}`\n })()}`}\n </Alert>\n ) : null}\n <TextField\n label=\"Note (optional)\"\n value={note}\n onChange={(event) => setNote(event.target.value)}\n multiline\n minRows={2}\n />\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n )}\n </DialogContent>\n <DialogActions>\n {closed?.report ? (\n <>\n <Button onClick={() => void printReport('Z REPORT', closed.report!, closed.id, closed)}>{'Print'}</Button>\n <Button variant=\"contained\" onClick={close}>\n {'Done'}\n </Button>\n </>\n ) : (\n <>\n <Button onClick={close}>{'Cancel'}</Button>\n <Button variant=\"contained\" color=\"warning\" disabled={busy} onClick={submitClose}>\n {'Close shift'}\n </Button>\n </>\n )}\n </DialogActions>\n </Dialog>\n </Stack>\n )\n}\n\nPosShiftPanel.displayName = 'PosShiftPanel'\n\nexport default PosShiftPanel\n"],"names":["Alert","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","MenuItem","Stack","TextField","Typography","doc","useFirestore","useFirestoreDoc","useUser","useSnackbar","useCallback","useState","POS_CASH_EVENT_LABELS","posCashVarianceCents","posMoney","callPosOps","newPosAttemptKey","parsePosDollars","usePosReceiptStore","PosShiftReportView","posShiftReportDocument","printPosDocument","PosShiftPanel","props","hostId","registerId","cashierAssertion","firestore","data","user","enqueueSnackbar","store","register","openShiftId","String","shiftData","shift","status","dialog","setDialog","amount","setAmount","cashType","setCashType","reason","setReason","note","setNote","busy","setBusy","error","setError","report","setReport","closed","setClosed","eventKey","setEventKey","reset","close","call","body","loadReport","answer","action","ok","submitOpen","cents","openingFloatCents","variant","persist","submitCash","type","amountCents","eventId","submitClose","counted","countedCashCents","shiftId","printReport","title","frozen","attemptKey","storeName","name","subtitle","registerName","Date","toLocaleString","countedCents","spacing","direction","useFlexGap","sx","alignItems","flexWrap","color","size","label","openedAtMs","toLocaleTimeString","hour","minute","onClick","disabled","open","onClose","maxWidth","fullWidth","pt","autoFocus","value","onChange","event","target","inputMode","placeholder","severity","select","expectedCashCents","variance","Math","abs","multiline","minRows","id","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-shift-panel.component.tsx"],"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\n'use client'\n\nimport {\n Alert,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { doc } from 'firebase/firestore'\nimport { useFirestore, useFirestoreDoc, useUser } from '@aglyn/tenant-feature-instance'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { BlockedControl } from '@aglyn/shared-ui-jsx/components/blocked-control.component'\nimport { useCallback, useState } from 'react'\nimport {\n POS_CASH_EVENT_LABELS,\n posCashVarianceCents,\n posMoney,\n type PosCashEventType,\n type PosShift,\n type PosShiftReport,\n} from '../../../model/commerce-pos-ops'\nimport { callPosOps, newPosAttemptKey, parsePosDollars } from './pos-ops-api'\nimport { usePosReceiptStore } from './pos-receipt-actions.component'\nimport {\n PosShiftReportView,\n posShiftReportDocument,\n printPosDocument,\n} from './pos-shift-report.component'\n\nexport interface PosShiftPanelProps {\n hostId: string\n registerId: string\n registerName?: string\n /** The PIN-switched cashier's assertion, so the shift names them. */\n cashierAssertion?: string\n /**\n * Why this member may not run the drawer (AGL-4047): the \"Cash drawer and\n * shifts\" key refused. The shift still shows; its buttons are disabled\n * with this reason. Absent: allowed.\n */\n blocked?: string\n}\n\ntype DialogKind = 'open' | 'cash' | 'report' | 'close' | null\n\n/**\n * The register's shift (AGL-3609): open it with a starting float, record cash\n * paid in, paid out and dropped to the safe, read the X report at any time,\n * and close with a count — the Z report freezes the figures and the variance.\n * Live: a shift another tablet opens on this register shows here at once.\n */\nexport function PosShiftPanel(props: PosShiftPanelProps) {\n const { hostId, registerId, cashierAssertion } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const store = usePosReceiptStore(hostId)\n const { data: register } = useFirestoreDoc<Record<string, any>>(\n () => (registerId ? doc(firestore, 'hosts', hostId, 'registers', registerId) : null),\n [firestore, hostId, registerId],\n )\n const openShiftId = String(register?.['openShiftId'] ?? '')\n const { data: shiftData } = useFirestoreDoc<PosShift>(\n () =>\n registerId && openShiftId\n ? doc(firestore, 'hosts', hostId, 'registers', registerId, 'shifts', openShiftId)\n : null,\n [firestore, hostId, registerId, openShiftId],\n )\n const shift = openShiftId && shiftData?.status === 'open' ? shiftData : null\n\n const [dialog, setDialog] = useState<DialogKind>(null)\n const [amount, setAmount] = useState('')\n const [cashType, setCashType] = useState<Exclude<PosCashEventType, 'refund'>>('paid_out')\n const [reason, setReason] = useState('')\n const [note, setNote] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [report, setReport] = useState<PosShiftReport | null>(null)\n const [closed, setClosed] = useState<(PosShift & { id: string }) | null>(null)\n const [eventKey, setEventKey] = useState('')\n\n const reset = () => {\n setAmount('')\n setReason('')\n setNote('')\n setError('')\n setBusy(false)\n }\n const close = () => {\n setDialog(null)\n setClosed(null)\n reset()\n }\n\n const call = useCallback(\n (body: Record<string, unknown>) =>\n callPosOps<Record<string, any>>(user, 'pos-shift', {\n hostId,\n registerId,\n ...(cashierAssertion ? { cashierAssertion } : {}),\n ...body,\n }),\n [user, hostId, registerId, cashierAssertion],\n )\n\n const loadReport = useCallback(async () => {\n const answer = await call({ action: 'x-report' })\n if (!answer.ok) {\n setError(answer.body.error ?? 'Could not read the shift.')\n return null\n }\n setReport(answer.body['report'] as PosShiftReport)\n return answer.body['report'] as PosShiftReport\n }, [call])\n\n const submitOpen = async () => {\n const cents = parsePosDollars(amount || '0')\n if (cents == null) return setError('Enter the starting cash, like 150.00.')\n setBusy(true)\n const answer = await call({ action: 'open', openingFloatCents: cents })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'Could not open the shift.')\n enqueueSnackbar('Shift opened', { variant: 'success', persist: false })\n close()\n }\n\n const submitCash = async () => {\n const cents = parsePosDollars(amount)\n if (!cents) return setError('Enter an amount above zero.')\n setBusy(true)\n const answer = await call({ action: 'cash-event', type: cashType, amountCents: cents, reason, eventId: eventKey })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'Could not record the cash.')\n enqueueSnackbar(`${POS_CASH_EVENT_LABELS[cashType]} recorded`, { variant: 'success', persist: false })\n close()\n }\n\n const submitClose = async () => {\n const counted = parsePosDollars(amount)\n if (counted == null) return setError('Enter the cash you counted, like 212.40.')\n setBusy(true)\n const answer = await call({ action: 'close', countedCashCents: counted, shiftId: openShiftId, note })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'Could not close the shift.')\n setClosed(answer.body['shift'] as PosShift & { id: string })\n }\n\n /**\n * The register's cloud receipt printer when it has one (AGL-3619), and the\n * browser's print dialog when it does not or the queue is unreachable.\n */\n const printReport = async (\n title: string,\n data: PosShiftReport,\n shiftId: string,\n frozen?: PosShift,\n ) => {\n const answer = await call({ action: 'print-report', shiftId, attemptKey: newPosAttemptKey() })\n if (answer.ok && answer.body['printed']) {\n enqueueSnackbar('Sent to the receipt printer', { variant: 'success', persist: false })\n return\n }\n printPosDocument(\n posShiftReportDocument({\n title,\n storeName: store.name,\n subtitle: `${props.registerName ?? 'Register'} · ${new Date().toLocaleString()}`,\n report: data,\n ...(frozen ? { shift: frozen } : {}),\n }),\n )\n }\n\n const countedCents = parsePosDollars(amount)\n return (\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n {shift ? (\n <>\n <Chip\n color=\"success\"\n size=\"small\"\n label={`Shift open since ${new Date(shift.openedAtMs).toLocaleTimeString([], {\n hour: 'numeric',\n minute: '2-digit',\n })}`}\n />\n <BlockedControl blocked={Boolean(props.blocked)} reason={props.blocked ?? ''}>\n <Button\n size=\"small\"\n onClick={() => {\n setEventKey(newPosAttemptKey())\n setDialog('cash')\n }}\n >\n {'Cash in/out'}\n </Button>\n </BlockedControl>\n <BlockedControl blocked={Boolean(props.blocked)} reason={props.blocked ?? ''}>\n <Button\n size=\"small\"\n onClick={() => {\n setReport(null)\n setDialog('report')\n void loadReport()\n }}\n >\n {'X report'}\n </Button>\n </BlockedControl>\n <BlockedControl blocked={Boolean(props.blocked)} reason={props.blocked ?? ''}>\n <Button\n size=\"small\"\n color=\"warning\"\n onClick={() => {\n setReport(null)\n setDialog('close')\n void loadReport()\n }}\n >\n {'Close shift'}\n </Button>\n </BlockedControl>\n </>\n ) : (\n <>\n <Chip size=\"small\" label=\"No shift open\" />\n <BlockedControl blocked={Boolean(props.blocked)} reason={props.blocked ?? ''}>\n <Button size=\"small\" variant=\"outlined\" onClick={() => setDialog('open')} disabled={!registerId}>\n {'Open shift'}\n </Button>\n </BlockedControl>\n </>\n )}\n </Stack>\n\n <Dialog open={dialog === 'open'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Open a shift'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Count the cash in the drawer before the first sale. Every sale and cash ' +\n 'movement until you close is counted against it.'}\n </Typography>\n <TextField\n autoFocus\n label=\"Starting cash ($)\"\n value={amount}\n onChange={(event) => setAmount(event.target.value)}\n inputMode=\"decimal\"\n placeholder=\"150.00\"\n />\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={close}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy} onClick={submitOpen}>\n {'Open shift'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={dialog === 'cash'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Cash in or out'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <TextField\n select\n label=\"What happened\"\n value={cashType}\n onChange={(event) => setCashType(event.target.value as typeof cashType)}\n >\n <MenuItem value=\"paid_in\">{'Paid in — cash added to the drawer'}</MenuItem>\n <MenuItem value=\"paid_out\">{'Paid out — cash taken for an expense'}</MenuItem>\n <MenuItem value=\"drop\">{'Safe drop — cash moved to the safe'}</MenuItem>\n </TextField>\n <TextField\n label=\"Amount ($)\"\n value={amount}\n onChange={(event) => setAmount(event.target.value)}\n inputMode=\"decimal\"\n />\n <TextField\n label={cashType === 'drop' ? 'Note (optional)' : 'Reason'}\n value={reason}\n onChange={(event) => setReason(event.target.value)}\n placeholder={cashType === 'paid_out' ? 'Milk for the coffee bar' : ''}\n />\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={close}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy} onClick={submitCash}>\n {'Record'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={dialog === 'report'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'X report'}</DialogTitle>\n <DialogContent>\n {report ? <PosShiftReportView report={report} /> : <Typography variant=\"body2\">{'Reading the shift…'}</Typography>}\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </DialogContent>\n <DialogActions>\n <Button disabled={!report} onClick={() => report && void printReport('X REPORT', report, openShiftId)}>\n {'Print'}\n </Button>\n <Button onClick={close}>{'Done'}</Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={dialog === 'close'} onClose={close} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{closed ? 'Z report' : 'Close the shift'}</DialogTitle>\n <DialogContent>\n {closed?.report ? (\n <PosShiftReportView report={closed.report} shift={closed} />\n ) : (\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Count the drawer, then enter what is in it.'}\n </Typography>\n <TextField\n autoFocus\n label=\"Cash counted ($)\"\n value={amount}\n onChange={(event) => setAmount(event.target.value)}\n inputMode=\"decimal\"\n />\n {report && countedCents != null ? (\n <Alert\n severity={posCashVarianceCents(countedCents, report.expectedCashCents) === 0 ? 'success' : 'info'}\n >\n {`Expected ${posMoney(report.expectedCashCents)} · ${(() => {\n const variance = posCashVarianceCents(countedCents, report.expectedCashCents)\n return variance === 0\n ? 'balanced'\n : `${variance < 0 ? 'short' : 'over'} ${posMoney(Math.abs(variance))}`\n })()}`}\n </Alert>\n ) : null}\n <TextField\n label=\"Note (optional)\"\n value={note}\n onChange={(event) => setNote(event.target.value)}\n multiline\n minRows={2}\n />\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n )}\n </DialogContent>\n <DialogActions>\n {closed?.report ? (\n <>\n <Button onClick={() => void printReport('Z REPORT', closed.report!, closed.id, closed)}>{'Print'}</Button>\n <Button variant=\"contained\" onClick={close}>\n {'Done'}\n </Button>\n </>\n ) : (\n <>\n <Button onClick={close}>{'Cancel'}</Button>\n <Button variant=\"contained\" color=\"warning\" disabled={busy} onClick={submitClose}>\n {'Close shift'}\n </Button>\n </>\n )}\n </DialogActions>\n </Dialog>\n </Stack>\n )\n}\n\nPosShiftPanel.displayName = 'PosShiftPanel'\n\nexport default PosShiftPanel\n"],"names":["Alert","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","MenuItem","Stack","TextField","Typography","doc","useFirestore","useFirestoreDoc","useUser","useSnackbar","BlockedControl","useCallback","useState","POS_CASH_EVENT_LABELS","posCashVarianceCents","posMoney","callPosOps","newPosAttemptKey","parsePosDollars","usePosReceiptStore","PosShiftReportView","posShiftReportDocument","printPosDocument","PosShiftPanel","props","hostId","registerId","cashierAssertion","firestore","data","user","enqueueSnackbar","store","register","openShiftId","String","shiftData","shift","status","dialog","setDialog","amount","setAmount","cashType","setCashType","reason","setReason","note","setNote","busy","setBusy","error","setError","report","setReport","closed","setClosed","eventKey","setEventKey","reset","close","call","body","loadReport","answer","action","ok","submitOpen","cents","openingFloatCents","variant","persist","submitCash","type","amountCents","eventId","submitClose","counted","countedCashCents","shiftId","printReport","title","frozen","attemptKey","storeName","name","subtitle","registerName","Date","toLocaleString","countedCents","spacing","direction","useFlexGap","sx","alignItems","flexWrap","color","size","label","openedAtMs","toLocaleTimeString","hour","minute","blocked","Boolean","onClick","disabled","open","onClose","maxWidth","fullWidth","pt","autoFocus","value","onChange","event","target","inputMode","placeholder","severity","select","expectedCashCents","variance","Math","abs","multiline","minRows","id","displayName"],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ export declare function posProductPlan(options: {
|
|
|
28
28
|
export declare const POS_GRID_QUERY: typeof PRODUCT_LIST_QUERY;
|
|
29
29
|
/** The basket line an item-sheet choice makes: label and estimate from the product. */
|
|
30
30
|
export declare function registerLineFor(product: any, choice: PosItemChoice): RegisterLine;
|
|
31
|
-
export declare function PosConsolePage({ hostId, basePath }: ConsolePluginPageProps): import("react").JSX.Element;
|
|
31
|
+
export declare function PosConsolePage({ hostId, basePath, permissions }: ConsolePluginPageProps): import("react").JSX.Element;
|
|
32
32
|
export declare namespace PosConsolePage {
|
|
33
33
|
var displayName: string;
|
|
34
34
|
}
|
|
@@ -18,6 +18,7 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
|
18
18
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
19
19
|
import * as Aglyn from "@aglyn/aglyn";
|
|
20
20
|
import * as CommerceModel from "../../model/index.js";
|
|
21
|
+
import { posPermissionRefusal } from "../../model/plugin-permissions.js";
|
|
21
22
|
import { PRODUCT_LIST_BASE, PRODUCT_LIST_QUERY } from "../../constants/product-list-query.js";
|
|
22
23
|
import { NextPageTitle } from "@aglyn/shared-ui-next/contexts/next-page-title-provider";
|
|
23
24
|
import { useSnackbar } from "@aglyn/shared-ui-snackstack";
|
|
@@ -26,7 +27,7 @@ import { useViewportFill } from "@aglyn/shared-ui-jsx/hooks/use-viewport-fill";
|
|
|
26
27
|
import { nameSearchNormalizers } from "@aglyn/aglyn/app-utils/name-search";
|
|
27
28
|
import { Badge, Box, Button, Drawer, MenuItem, Stack, TextField, Typography, useMediaQuery, useTheme } from "@mui/material";
|
|
28
29
|
import { collection, getDocs, limit, query, where } from "firebase/firestore";
|
|
29
|
-
import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
30
|
+
import { lazy, memo, Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
30
31
|
import { useFirestore, useUser } from "@aglyn/tenant-feature-instance";
|
|
31
32
|
import { useFirestoreCollection } from "@aglyn/tenant-feature-instance";
|
|
32
33
|
import { listQueryConstraints } from "@aglyn/tenant-feature-instance/hooks/use-list-query";
|
|
@@ -45,6 +46,12 @@ import { posDisplayTipCents, usePosDisplay } from "./pos/use-pos-display.js";
|
|
|
45
46
|
import { posRegistersSettingsHref, usePosPairing } from "./pos/pos-pairing.component.js";
|
|
46
47
|
import { useConsoleWidgetSlot } from "@aglyn/aglyn/app-utils/console-widget-slot-context";
|
|
47
48
|
import { POS_ORDERS_ZONE } from "./pos-zones.js";
|
|
49
|
+
import { isPosHardwareSkuId } from "../../model/pos-hardware.js";
|
|
50
|
+
/**
|
|
51
|
+
* Card reader sales at the platform's own store (AGL-4038): attaching the
|
|
52
|
+
* buyer and the To attach list. Its own chunk, and it draws nothing on any
|
|
53
|
+
* store but that one.
|
|
54
|
+
*/ const PosHardwareBuyer = /*#__PURE__*/ lazy(()=>import("./pos/pos-hardware-buyer.component.js"));
|
|
48
55
|
import { PosOfflineBanner, PosOfflineCheckout, usePosOffline } from "./pos-offline/register-offline.js";
|
|
49
56
|
/** The till sells active products only; every read of the catalog asks it. */ const SELLABLE = {
|
|
50
57
|
field: 'status',
|
|
@@ -186,9 +193,21 @@ import { PosOfflineBanner, PosOfflineCheckout, usePosOffline } from "./pos-offli
|
|
|
186
193
|
registerId: registerId
|
|
187
194
|
});
|
|
188
195
|
});
|
|
189
|
-
export function PosConsolePage({ hostId, basePath }) {
|
|
196
|
+
export function PosConsolePage({ hostId, basePath, permissions }) {
|
|
190
197
|
var _ref, _ref1, _ref2, _liveRegister_openShiftId, _ref3, _ref4, _ref5;
|
|
191
198
|
var _usableRegisters_find, _usableRegisters_, _offline_totalsFor;
|
|
199
|
+
/*
|
|
200
|
+
* The register's FINER keys (AGL-4047) — discounts, returns, the drawer —
|
|
201
|
+
* are read here, unlike `managePos` above: the shell admits anyone who may
|
|
202
|
+
* use the register, and these say which of its controls are theirs. Only an
|
|
203
|
+
* explicit refusal disables one; a map without the key follows `managePos`,
|
|
204
|
+
* which the shell already confirmed. The routes refuse either way.
|
|
205
|
+
*/ const refusedReason = (key)=>(permissions == null ? void 0 : permissions[key]) === false ? posPermissionRefusal(key) : undefined;
|
|
206
|
+
const blockedControls = {
|
|
207
|
+
returns: refusedReason('posRefund'),
|
|
208
|
+
shift: refusedReason('posCashDrawer')
|
|
209
|
+
};
|
|
210
|
+
const discountBlocked = refusedReason('posDiscount');
|
|
192
211
|
const WidgetSlot = useConsoleWidgetSlot();
|
|
193
212
|
const firestore = useFirestore();
|
|
194
213
|
const { data: user } = useUser();
|
|
@@ -398,6 +417,22 @@ export function PosConsolePage({ hostId, basePath }) {
|
|
|
398
417
|
])), [
|
|
399
418
|
sellProducts
|
|
400
419
|
]);
|
|
420
|
+
// Whether the sale on the register sells a card reader (AGL-4038): only
|
|
421
|
+
// the platform's own store names hardware on a product, and only there
|
|
422
|
+
// does the buyer step draw.
|
|
423
|
+
const saleSellsHardware = useMemo(()=>(sale ? saleLines : lines).some((line)=>{
|
|
424
|
+
var _productsById_get;
|
|
425
|
+
return isPosHardwareSkuId((_productsById_get = productsById.get(line.productId)) == null ? void 0 : _productsById_get.hardwareSku);
|
|
426
|
+
}), [
|
|
427
|
+
sale,
|
|
428
|
+
saleLines,
|
|
429
|
+
lines,
|
|
430
|
+
productsById
|
|
431
|
+
]);
|
|
432
|
+
// Only a store whose catalog names hardware asks whether it is the seller.
|
|
433
|
+
const storeSellsHardware = useMemo(()=>products.some((product)=>isPosHardwareSkuId(product.hardwareSku)), [
|
|
434
|
+
products
|
|
435
|
+
]);
|
|
401
436
|
/** AGL-2357: warns, never blocks. */ const shortfalls = useMemo(()=>lines.map((line)=>{
|
|
402
437
|
var _line_variantId;
|
|
403
438
|
var _product_variants_, _product_variants;
|
|
@@ -811,6 +846,7 @@ export function PosConsolePage({ hostId, basePath }) {
|
|
|
811
846
|
registerName
|
|
812
847
|
} : {}, {
|
|
813
848
|
cashier: cashier,
|
|
849
|
+
blocked: blockedControls,
|
|
814
850
|
onExchange: (returned)=>{
|
|
815
851
|
var _returned_name;
|
|
816
852
|
return setCustomer(returned.email || returned.name ? {
|
|
@@ -822,7 +858,9 @@ export function PosConsolePage({ hostId, basePath }) {
|
|
|
822
858
|
} : null);
|
|
823
859
|
}
|
|
824
860
|
})) : null,
|
|
825
|
-
/*#__PURE__*/ _jsx(PosCartPanel, {
|
|
861
|
+
/*#__PURE__*/ _jsx(PosCartPanel, _extends({}, discountBlocked ? {
|
|
862
|
+
discountBlocked
|
|
863
|
+
} : {}, {
|
|
826
864
|
lines: sale ? saleLines : lines,
|
|
827
865
|
shortfalls: sale ? [] : shortfalls,
|
|
828
866
|
onQuantity: (index, quantity)=>setLines((prev)=>quantity <= 0 ? prev.filter((_line, at)=>at !== index) : prev.map((line, at)=>at === index ? _extends({}, line, {
|
|
@@ -848,16 +886,29 @@ export function PosConsolePage({ hostId, basePath }) {
|
|
|
848
886
|
},
|
|
849
887
|
discountPct: discountPct,
|
|
850
888
|
onDiscountPct: setDiscountPct,
|
|
851
|
-
customer:
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
889
|
+
customer: /*#__PURE__*/ _jsxs(_Fragment, {
|
|
890
|
+
children: [
|
|
891
|
+
sale ? null : /*#__PURE__*/ _jsx(PosCustomerLookup, _extends({
|
|
892
|
+
hostId: hostId,
|
|
893
|
+
value: customer,
|
|
894
|
+
onChange: setCustomer,
|
|
895
|
+
registerId: registerId
|
|
896
|
+
}, cashier.assertion ? {
|
|
897
|
+
cashierAssertion: cashier.assertion
|
|
898
|
+
} : {})),
|
|
899
|
+
user && storeSellsHardware ? /*#__PURE__*/ _jsx(Suspense, {
|
|
900
|
+
fallback: null,
|
|
901
|
+
children: /*#__PURE__*/ _jsx(PosHardwareBuyer, {
|
|
902
|
+
user: user,
|
|
903
|
+
hostId: hostId,
|
|
904
|
+
saleOrderId: sale && saleSellsHardware ? sale.orderId : null,
|
|
905
|
+
notify: notify
|
|
906
|
+
})
|
|
907
|
+
}) : null
|
|
908
|
+
]
|
|
909
|
+
}),
|
|
859
910
|
locked: Boolean(sale)
|
|
860
|
-
}),
|
|
911
|
+
})),
|
|
861
912
|
sale && user ? sale.status === 'paid' ? /*#__PURE__*/ _jsx(PosReceiptPanel, _extends({
|
|
862
913
|
user: user,
|
|
863
914
|
hostId: hostId,
|