@aglyn/plugins-commerce 1.0.0-beta.285 → 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.
Files changed (420) hide show
  1. package/README.md +1 -1
  2. package/package.json +13 -13
  3. package/src/lib/components/cart.js +25 -12
  4. package/src/lib/components/cart.js.map +1 -1
  5. package/src/lib/components/commerce-console-page.js +70 -13
  6. package/src/lib/components/commerce-console-page.js.map +1 -1
  7. package/src/lib/components/console/order-detail-dialog.component.js +2 -1
  8. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  9. package/src/lib/components/console/payment-methods-card.component.js +1 -1
  10. package/src/lib/components/console/payment-methods-card.component.js.map +1 -1
  11. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +5 -0
  12. package/src/lib/components/console/pos/pos-cart-panel.component.js +18 -12
  13. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -1
  14. package/src/lib/components/console/pos/pos-hardware-api.d.ts +76 -5
  15. package/src/lib/components/console/pos/pos-hardware-api.js +53 -11
  16. package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -1
  17. package/src/lib/components/console/pos/pos-hardware-buyer.component.d.ts +18 -0
  18. package/src/lib/components/console/pos/pos-hardware-buyer.component.js +629 -0
  19. package/src/lib/components/console/pos/pos-hardware-buyer.component.js.map +1 -0
  20. package/src/lib/components/console/pos/pos-hardware-sale-api.d.ts +162 -0
  21. package/src/lib/components/console/pos/pos-hardware-sale-api.js +122 -0
  22. package/src/lib/components/console/pos/pos-hardware-sale-api.js.map +1 -0
  23. package/src/lib/components/console/pos/pos-hardware-sale-terms.component.d.ts +39 -0
  24. package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js +251 -0
  25. package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js.map +1 -0
  26. package/src/lib/components/console/pos/use-pos-display.js +50 -0
  27. package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
  28. package/src/lib/components/console/pos-cellular-control.component.d.ts +41 -0
  29. package/src/lib/components/console/pos-cellular-control.component.js +211 -0
  30. package/src/lib/components/console/pos-cellular-control.component.js.map +1 -0
  31. package/src/lib/components/console/pos-devices-card.component.d.ts +9 -1
  32. package/src/lib/components/console/pos-devices-card.component.js +47 -15
  33. package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
  34. package/src/lib/components/console/pos-display/pos-display-api.d.ts +6 -0
  35. package/src/lib/components/console/pos-display/pos-display-api.js +8 -1
  36. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
  37. package/src/lib/components/console/pos-display-page.component.d.ts +13 -0
  38. package/src/lib/components/console/pos-display-page.component.js +44 -2
  39. package/src/lib/components/console/pos-display-page.component.js.map +1 -1
  40. package/src/lib/components/console/pos-hardware-card.component.d.ts +12 -4
  41. package/src/lib/components/console/pos-hardware-card.component.js +157 -36
  42. package/src/lib/components/console/pos-hardware-card.component.js.map +1 -1
  43. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +360 -80
  44. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -1
  45. package/src/lib/components/console/pos-hardware-terms-page.component.d.ts +34 -0
  46. package/src/lib/components/console/pos-hardware-terms-page.component.js +257 -0
  47. package/src/lib/components/console/pos-hardware-terms-page.component.js.map +1 -0
  48. package/src/lib/components/console/pos-hardware-terms-sign-page.component.d.ts +27 -0
  49. package/src/lib/components/console/pos-hardware-terms-sign-page.component.js +104 -0
  50. package/src/lib/components/console/pos-hardware-terms-sign-page.component.js.map +1 -0
  51. package/src/lib/components/console/pos-hardware-waiting-card.component.d.ts +24 -0
  52. package/src/lib/components/console/pos-hardware-waiting-card.component.js +205 -0
  53. package/src/lib/components/console/pos-hardware-waiting-card.component.js.map +1 -0
  54. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +297 -201
  55. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -1
  56. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +3 -0
  57. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +260 -92
  58. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
  59. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +9 -0
  60. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +15 -6
  61. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
  62. package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.d.ts +25 -0
  63. package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js +136 -0
  64. package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js.map +1 -0
  65. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +6 -0
  66. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +48 -31
  67. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -1
  68. package/src/lib/components/console/pos-page.component.d.ts +1 -1
  69. package/src/lib/components/console/pos-page.component.js +63 -12
  70. package/src/lib/components/console/pos-page.component.js.map +1 -1
  71. package/src/lib/components/console/pos-reader-splash-setting.component.js +1 -1
  72. package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -1
  73. package/src/lib/components/console/product-check-in-fields.component.d.ts +4 -2
  74. package/src/lib/components/console/product-check-in-fields.component.js +60 -14
  75. package/src/lib/components/console/product-check-in-fields.component.js.map +1 -1
  76. package/src/lib/components/console/product-editor-dialog.component.js +44 -1
  77. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  78. package/src/lib/components/console/product-hardware-sku-field.component.d.ts +19 -0
  79. package/src/lib/components/console/product-hardware-sku-field.component.js +92 -0
  80. package/src/lib/components/console/product-hardware-sku-field.component.js.map +1 -0
  81. package/src/lib/components/console/product-kiosk-offer-field.component.d.ts +22 -0
  82. package/src/lib/components/console/product-kiosk-offer-field.component.js +94 -0
  83. package/src/lib/components/console/product-kiosk-offer-field.component.js.map +1 -0
  84. package/src/lib/components/console/product-register-fields.component.d.ts +4 -0
  85. package/src/lib/components/console/product-register-fields.component.js +31 -2
  86. package/src/lib/components/console/product-register-fields.component.js.map +1 -1
  87. package/src/lib/components/console/products-hub-card.component.js +11 -2
  88. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  89. package/src/lib/components/console/register-hardware-card.component.d.ts +11 -0
  90. package/src/lib/components/console/register-hardware-card.component.js +56 -27
  91. package/src/lib/components/console/register-hardware-card.component.js.map +1 -1
  92. package/src/lib/components/console/reservation-guests-dialog.component.d.ts +28 -0
  93. package/src/lib/components/console/reservation-guests-dialog.component.js +189 -0
  94. package/src/lib/components/console/reservation-guests-dialog.component.js.map +1 -0
  95. package/src/lib/components/console/reservations-card.component.d.ts +9 -0
  96. package/src/lib/components/console/reservations-card.component.js +158 -23
  97. package/src/lib/components/console/reservations-card.component.js.map +1 -1
  98. package/src/lib/components/console/shippingeasy-card.component.js +1 -1
  99. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -1
  100. package/src/lib/components/console/shipstation-card.component.d.ts +1 -1
  101. package/src/lib/components/console/shipstation-card.component.js +3 -3
  102. package/src/lib/components/console/shipstation-card.component.js.map +1 -1
  103. package/src/lib/components/product-detail.d.ts +4 -0
  104. package/src/lib/components/product-detail.js +40 -5
  105. package/src/lib/components/product-detail.js.map +1 -1
  106. package/src/lib/components/product-reviews.js +28 -11
  107. package/src/lib/components/product-reviews.js.map +1 -1
  108. package/src/lib/components/reservation-widget.js +28 -5
  109. package/src/lib/components/reservation-widget.js.map +1 -1
  110. package/src/lib/components/use-day-picker.d.ts +25 -0
  111. package/src/lib/components/use-day-picker.js +57 -0
  112. package/src/lib/components/use-day-picker.js.map +1 -0
  113. package/src/lib/constants/operator-alerts.d.ts +55 -0
  114. package/src/lib/constants/operator-alerts.js +156 -1
  115. package/src/lib/constants/operator-alerts.js.map +1 -1
  116. package/src/lib/declarations.console-server.js +54 -1
  117. package/src/lib/declarations.console-server.js.map +1 -1
  118. package/src/lib/declarations.d.ts +4 -2
  119. package/src/lib/declarations.js +11 -4
  120. package/src/lib/declarations.js.map +1 -1
  121. package/src/lib/declarations.server.js +9 -0
  122. package/src/lib/declarations.server.js.map +1 -1
  123. package/src/lib/model/commerce-cart.d.ts +9 -1
  124. package/src/lib/model/commerce-cart.js +4 -3
  125. package/src/lib/model/commerce-cart.js.map +1 -1
  126. package/src/lib/model/commerce-check-in-product.d.ts +26 -0
  127. package/src/lib/model/commerce-check-in-product.js +64 -2
  128. package/src/lib/model/commerce-check-in-product.js.map +1 -1
  129. package/src/lib/model/commerce-check-in-record.d.ts +127 -0
  130. package/src/lib/model/commerce-check-in-record.js +36 -0
  131. package/src/lib/model/commerce-check-in-record.js.map +1 -0
  132. package/src/lib/model/commerce-check-in.d.ts +91 -87
  133. package/src/lib/model/commerce-check-in.js +186 -62
  134. package/src/lib/model/commerce-check-in.js.map +1 -1
  135. package/src/lib/model/commerce-kiosk-offer.d.ts +31 -0
  136. package/src/lib/model/commerce-kiosk-offer.js +35 -0
  137. package/src/lib/model/commerce-kiosk-offer.js.map +1 -0
  138. package/src/lib/model/commerce-orders.d.ts +76 -0
  139. package/src/lib/model/commerce-orders.js +6 -0
  140. package/src/lib/model/commerce-orders.js.map +1 -1
  141. package/src/lib/model/commerce-pos-day-report.d.ts +54 -1
  142. package/src/lib/model/commerce-pos-day-report.js +39 -2
  143. package/src/lib/model/commerce-pos-day-report.js.map +1 -1
  144. package/src/lib/model/commerce-pos-offline.d.ts +1 -1
  145. package/src/lib/model/commerce-pos-offline.js +6 -1
  146. package/src/lib/model/commerce-pos-offline.js.map +1 -1
  147. package/src/lib/model/commerce-pos-ops.js +3 -2
  148. package/src/lib/model/commerce-pos-ops.js.map +1 -1
  149. package/src/lib/model/commerce-pos.d.ts +36 -3
  150. package/src/lib/model/commerce-pos.js +14 -6
  151. package/src/lib/model/commerce-pos.js.map +1 -1
  152. package/src/lib/model/commerce-receipt.js +3 -2
  153. package/src/lib/model/commerce-receipt.js.map +1 -1
  154. package/src/lib/model/commerce-reservations.d.ts +69 -4
  155. package/src/lib/model/commerce-reservations.js +57 -5
  156. package/src/lib/model/commerce-reservations.js.map +1 -1
  157. package/src/lib/model/commerce.d.ts +66 -0
  158. package/src/lib/model/commerce.js +15 -0
  159. package/src/lib/model/commerce.js.map +1 -1
  160. package/src/lib/model/order-list-fields.d.ts +11 -0
  161. package/src/lib/model/order-list-fields.js +17 -1
  162. package/src/lib/model/order-list-fields.js.map +1 -1
  163. package/src/lib/model/own-store-tax-summary.d.ts +152 -0
  164. package/src/lib/model/own-store-tax-summary.js +288 -0
  165. package/src/lib/model/own-store-tax-summary.js.map +1 -0
  166. package/src/lib/model/plugin-permissions.d.ts +67 -0
  167. package/src/lib/model/plugin-permissions.js +224 -7
  168. package/src/lib/model/plugin-permissions.js.map +1 -1
  169. package/src/lib/model/pos-cellular.d.ts +223 -0
  170. package/src/lib/model/pos-cellular.js +293 -0
  171. package/src/lib/model/pos-cellular.js.map +1 -0
  172. package/src/lib/model/pos-hardware-in-person.d.ts +98 -0
  173. package/src/lib/model/pos-hardware-in-person.js +224 -0
  174. package/src/lib/model/pos-hardware-in-person.js.map +1 -0
  175. package/src/lib/model/pos-hardware-tax-summary.d.ts +166 -0
  176. package/src/lib/model/pos-hardware-tax-summary.js +225 -0
  177. package/src/lib/model/pos-hardware-tax-summary.js.map +1 -0
  178. package/src/lib/model/pos-hardware-terms.d.ts +74 -0
  179. package/src/lib/model/pos-hardware-terms.js +115 -0
  180. package/src/lib/model/pos-hardware-terms.js.map +1 -0
  181. package/src/lib/model/pos-hardware.d.ts +349 -7
  182. package/src/lib/model/pos-hardware.js +291 -20
  183. package/src/lib/model/pos-hardware.js.map +1 -1
  184. package/src/lib/model/product-write.d.ts +10 -0
  185. package/src/lib/model/product-write.js +4 -2
  186. package/src/lib/model/product-write.js.map +1 -1
  187. package/src/lib/plugin.js +16 -0
  188. package/src/lib/plugin.js.map +1 -1
  189. package/src/lib/server/billing-webhook.js +25 -1
  190. package/src/lib/server/billing-webhook.js.map +1 -1
  191. package/src/lib/server/cancel-order.js +7 -5
  192. package/src/lib/server/cancel-order.js.map +1 -1
  193. package/src/lib/server/cart-checkout.js +20 -8
  194. package/src/lib/server/cart-checkout.js.map +1 -1
  195. package/src/lib/server/cart.js +29 -0
  196. package/src/lib/server/cart.js.map +1 -1
  197. package/src/lib/server/checkout.js +42 -13
  198. package/src/lib/server/checkout.js.map +1 -1
  199. package/src/lib/server/collection-membership.d.ts +4 -0
  200. package/src/lib/server/collection-membership.js +5 -10
  201. package/src/lib/server/collection-membership.js.map +1 -1
  202. package/src/lib/server/commerce-site-keys.d.ts +29 -0
  203. package/src/lib/server/commerce-site-keys.js +40 -0
  204. package/src/lib/server/commerce-site-keys.js.map +1 -0
  205. package/src/lib/server/draft-order.js +8 -5
  206. package/src/lib/server/draft-order.js.map +1 -1
  207. package/src/lib/server/fulfill-order.js +7 -5
  208. package/src/lib/server/fulfill-order.js.map +1 -1
  209. package/src/lib/server/gift-cards.js +8 -5
  210. package/src/lib/server/gift-cards.js.map +1 -1
  211. package/src/lib/server/local-fulfillment-status.js +9 -6
  212. package/src/lib/server/local-fulfillment-status.js.map +1 -1
  213. package/src/lib/server/member-post.js +6 -5
  214. package/src/lib/server/member-post.js.map +1 -1
  215. package/src/lib/server/membership-admin-password.d.ts +4 -2
  216. package/src/lib/server/membership-admin-password.js +10 -8
  217. package/src/lib/server/membership-admin-password.js.map +1 -1
  218. package/src/lib/server/membership-admin-remove.d.ts +7 -5
  219. package/src/lib/server/membership-admin-remove.js +9 -9
  220. package/src/lib/server/membership-admin-remove.js.map +1 -1
  221. package/src/lib/server/order-notifications.js +5 -2
  222. package/src/lib/server/order-notifications.js.map +1 -1
  223. package/src/lib/server/order-print.js +7 -5
  224. package/src/lib/server/order-print.js.map +1 -1
  225. package/src/lib/server/order-receipt-send.js +8 -5
  226. package/src/lib/server/order-receipt-send.js.map +1 -1
  227. package/src/lib/server/orders-shipping-prepare.js +9 -6
  228. package/src/lib/server/orders-shipping-prepare.js.map +1 -1
  229. package/src/lib/server/own-store-tax-return-source.d.ts +47 -0
  230. package/src/lib/server/own-store-tax-return-source.js +312 -0
  231. package/src/lib/server/own-store-tax-return-source.js.map +1 -0
  232. package/src/lib/server/payment-methods.js +13 -9
  233. package/src/lib/server/payment-methods.js.map +1 -1
  234. package/src/lib/server/pos-auth.d.ts +37 -6
  235. package/src/lib/server/pos-auth.js +40 -15
  236. package/src/lib/server/pos-auth.js.map +1 -1
  237. package/src/lib/server/pos-cellular-billing.d.ts +81 -0
  238. package/src/lib/server/pos-cellular-billing.js +711 -0
  239. package/src/lib/server/pos-cellular-billing.js.map +1 -0
  240. package/src/lib/server/pos-cellular-notify.d.ts +47 -0
  241. package/src/lib/server/pos-cellular-notify.js +150 -0
  242. package/src/lib/server/pos-cellular-notify.js.map +1 -0
  243. package/src/lib/server/pos-cellular.d.ts +88 -0
  244. package/src/lib/server/pos-cellular.js +339 -0
  245. package/src/lib/server/pos-cellular.js.map +1 -0
  246. package/src/lib/server/pos-check-in.d.ts +5 -1
  247. package/src/lib/server/pos-check-in.js +296 -28
  248. package/src/lib/server/pos-check-in.js.map +1 -1
  249. package/src/lib/server/pos-day-report.js +29 -3
  250. package/src/lib/server/pos-day-report.js.map +1 -1
  251. package/src/lib/server/pos-display.d.ts +16 -0
  252. package/src/lib/server/pos-display.js +129 -2
  253. package/src/lib/server/pos-display.js.map +1 -1
  254. package/src/lib/server/pos-hardware-admin.d.ts +10 -1
  255. package/src/lib/server/pos-hardware-admin.js +250 -84
  256. package/src/lib/server/pos-hardware-admin.js.map +1 -1
  257. package/src/lib/server/pos-hardware-attach.d.ts +105 -0
  258. package/src/lib/server/pos-hardware-attach.js +443 -0
  259. package/src/lib/server/pos-hardware-attach.js.map +1 -0
  260. package/src/lib/server/pos-hardware-buyer-lookup.d.ts +58 -0
  261. package/src/lib/server/pos-hardware-buyer-lookup.js +180 -0
  262. package/src/lib/server/pos-hardware-buyer-lookup.js.map +1 -0
  263. package/src/lib/server/pos-hardware-buyer-record.d.ts +29 -0
  264. package/src/lib/server/pos-hardware-buyer-record.js +86 -0
  265. package/src/lib/server/pos-hardware-buyer-record.js.map +1 -0
  266. package/src/lib/server/pos-hardware-cancel.d.ts +58 -0
  267. package/src/lib/server/pos-hardware-cancel.js +147 -0
  268. package/src/lib/server/pos-hardware-cancel.js.map +1 -0
  269. package/src/lib/server/pos-hardware-closure-notices.d.ts +27 -0
  270. package/src/lib/server/pos-hardware-closure-notices.js +85 -0
  271. package/src/lib/server/pos-hardware-closure-notices.js.map +1 -0
  272. package/src/lib/server/pos-hardware-closure.d.ts +60 -0
  273. package/src/lib/server/pos-hardware-closure.js +153 -0
  274. package/src/lib/server/pos-hardware-closure.js.map +1 -0
  275. package/src/lib/server/pos-hardware-in-person.d.ts +61 -0
  276. package/src/lib/server/pos-hardware-in-person.js +236 -0
  277. package/src/lib/server/pos-hardware-in-person.js.map +1 -0
  278. package/src/lib/server/pos-hardware-notify.d.ts +40 -2
  279. package/src/lib/server/pos-hardware-notify.js +195 -14
  280. package/src/lib/server/pos-hardware-notify.js.map +1 -1
  281. package/src/lib/server/pos-hardware-readers.d.ts +115 -0
  282. package/src/lib/server/pos-hardware-readers.js +430 -0
  283. package/src/lib/server/pos-hardware-readers.js.map +1 -0
  284. package/src/lib/server/pos-hardware-returns.d.ts +116 -0
  285. package/src/lib/server/pos-hardware-returns.js +502 -0
  286. package/src/lib/server/pos-hardware-returns.js.map +1 -0
  287. package/src/lib/server/pos-hardware-sale-fields.d.ts +28 -0
  288. package/src/lib/server/pos-hardware-sale-fields.js +44 -0
  289. package/src/lib/server/pos-hardware-sale-fields.js.map +1 -0
  290. package/src/lib/server/pos-hardware-sale.d.ts +54 -0
  291. package/src/lib/server/pos-hardware-sale.js +369 -0
  292. package/src/lib/server/pos-hardware-sale.js.map +1 -0
  293. package/src/lib/server/pos-hardware-tax-return-source.d.ts +99 -0
  294. package/src/lib/server/pos-hardware-tax-return-source.js +462 -0
  295. package/src/lib/server/pos-hardware-tax-return-source.js.map +1 -0
  296. package/src/lib/server/pos-hardware-terms.d.ts +64 -0
  297. package/src/lib/server/pos-hardware-terms.js +154 -0
  298. package/src/lib/server/pos-hardware-terms.js.map +1 -0
  299. package/src/lib/server/pos-hardware-user-eraser.d.ts +3 -0
  300. package/src/lib/server/pos-hardware-user-eraser.js +31 -7
  301. package/src/lib/server/pos-hardware-user-eraser.js.map +1 -1
  302. package/src/lib/server/pos-hardware-webhook.d.ts +5 -0
  303. package/src/lib/server/pos-hardware-webhook.js +51 -6
  304. package/src/lib/server/pos-hardware-webhook.js.map +1 -1
  305. package/src/lib/server/pos-hardware.d.ts +74 -1
  306. package/src/lib/server/pos-hardware.js +175 -10
  307. package/src/lib/server/pos-hardware.js.map +1 -1
  308. package/src/lib/server/pos-kiosk.d.ts +2 -0
  309. package/src/lib/server/pos-kiosk.js +17 -12
  310. package/src/lib/server/pos-kiosk.js.map +1 -1
  311. package/src/lib/server/pos-offline-card-order.d.ts +64 -0
  312. package/src/lib/server/pos-offline-card-order.js +102 -0
  313. package/src/lib/server/pos-offline-card-order.js.map +1 -0
  314. package/src/lib/server/pos-offline-card-reconcile.d.ts +67 -1
  315. package/src/lib/server/pos-offline-card-reconcile.js +215 -18
  316. package/src/lib/server/pos-offline-card-reconcile.js.map +1 -1
  317. package/src/lib/server/pos-offline-sync.d.ts +39 -0
  318. package/src/lib/server/pos-offline-sync.js +190 -55
  319. package/src/lib/server/pos-offline-sync.js.map +1 -1
  320. package/src/lib/server/pos-ops-gate.d.ts +15 -4
  321. package/src/lib/server/pos-ops-gate.js +42 -9
  322. package/src/lib/server/pos-ops-gate.js.map +1 -1
  323. package/src/lib/server/pos-ops-routes.js +24 -0
  324. package/src/lib/server/pos-ops-routes.js.map +1 -1
  325. package/src/lib/server/pos-order-refund-ids.d.ts +28 -0
  326. package/src/lib/server/pos-order-refund-ids.js +31 -0
  327. package/src/lib/server/pos-order-refund-ids.js.map +1 -0
  328. package/src/lib/server/pos-order.js +52 -49
  329. package/src/lib/server/pos-order.js.map +1 -1
  330. package/src/lib/server/pos-payment.js +1 -1
  331. package/src/lib/server/pos-payment.js.map +1 -1
  332. package/src/lib/server/pos-reader-splash-admin.js +30 -32
  333. package/src/lib/server/pos-reader-splash-admin.js.map +1 -1
  334. package/src/lib/server/pos-reader-splash-images-route.d.ts +17 -0
  335. package/src/lib/server/pos-reader-splash-images-route.js +113 -0
  336. package/src/lib/server/pos-reader-splash-images-route.js.map +1 -0
  337. package/src/lib/server/pos-reader-splash-images.d.ts +51 -0
  338. package/src/lib/server/pos-reader-splash-images.js +123 -0
  339. package/src/lib/server/pos-reader-splash-images.js.map +1 -0
  340. package/src/lib/server/pos-reader-splash.d.ts +68 -1
  341. package/src/lib/server/pos-reader-splash.js +182 -11
  342. package/src/lib/server/pos-reader-splash.js.map +1 -1
  343. package/src/lib/server/pos-readers.d.ts +29 -0
  344. package/src/lib/server/pos-readers.js +134 -35
  345. package/src/lib/server/pos-readers.js.map +1 -1
  346. package/src/lib/server/pos-return.d.ts +10 -0
  347. package/src/lib/server/pos-return.js +26 -1
  348. package/src/lib/server/pos-return.js.map +1 -1
  349. package/src/lib/server/pos-sale.js +6 -1
  350. package/src/lib/server/pos-sale.js.map +1 -1
  351. package/src/lib/server/pos-shift.js +11 -0
  352. package/src/lib/server/pos-shift.js.map +1 -1
  353. package/src/lib/server/pos-staff-pin.js +25 -20
  354. package/src/lib/server/pos-staff-pin.js.map +1 -1
  355. package/src/lib/server/pos-terminal.d.ts +14 -4
  356. package/src/lib/server/pos-terminal.js +34 -38
  357. package/src/lib/server/pos-terminal.js.map +1 -1
  358. package/src/lib/server/printers.d.ts +7 -3
  359. package/src/lib/server/printers.js +18 -12
  360. package/src/lib/server/printers.js.map +1 -1
  361. package/src/lib/server/product-drafts.d.ts +11 -1
  362. package/src/lib/server/product-drafts.js +12 -8
  363. package/src/lib/server/product-drafts.js.map +1 -1
  364. package/src/lib/server/product.d.ts +15 -1
  365. package/src/lib/server/product.js +16 -3
  366. package/src/lib/server/product.js.map +1 -1
  367. package/src/lib/server/products-write.d.ts +26 -2
  368. package/src/lib/server/products-write.js +19 -7
  369. package/src/lib/server/products-write.js.map +1 -1
  370. package/src/lib/server/refund.js +34 -11
  371. package/src/lib/server/refund.js.map +1 -1
  372. package/src/lib/server/reservation-availability-query.d.ts +8 -0
  373. package/src/lib/server/reservation-availability-query.js +11 -1
  374. package/src/lib/server/reservation-availability-query.js.map +1 -1
  375. package/src/lib/server/reservation-availability.d.ts +1 -1
  376. package/src/lib/server/reservation-availability.js +7 -2
  377. package/src/lib/server/reservation-availability.js.map +1 -1
  378. package/src/lib/server/reservation-guests.d.ts +32 -0
  379. package/src/lib/server/reservation-guests.js +285 -0
  380. package/src/lib/server/reservation-guests.js.map +1 -0
  381. package/src/lib/server/reservation-walk-in.d.ts +11 -1
  382. package/src/lib/server/reservation-walk-in.js +56 -12
  383. package/src/lib/server/reservation-walk-in.js.map +1 -1
  384. package/src/lib/server/reserve.js +18 -5
  385. package/src/lib/server/reserve.js.map +1 -1
  386. package/src/lib/server/returns.js +9 -6
  387. package/src/lib/server/returns.js.map +1 -1
  388. package/src/lib/server/reviews.d.ts +22 -2
  389. package/src/lib/server/reviews.js +88 -20
  390. package/src/lib/server/reviews.js.map +1 -1
  391. package/src/lib/server/shipping-connectors.js +10 -11
  392. package/src/lib/server/shipping-connectors.js.map +1 -1
  393. package/src/lib/server/site-page-resolver.js +20 -3
  394. package/src/lib/server/site-page-resolver.js.map +1 -1
  395. package/src/lib/server/store-day.d.ts +33 -0
  396. package/src/lib/server/store-day.js +46 -0
  397. package/src/lib/server/store-day.js.map +1 -0
  398. package/src/lib/server/store-setup-ai-writer.d.ts +2 -1
  399. package/src/lib/server/store-setup-ai-writer.js +5 -6
  400. package/src/lib/server/store-setup-ai-writer.js.map +1 -1
  401. package/src/lib/server/storefront-tax.d.ts +13 -0
  402. package/src/lib/server/storefront-tax.js +8 -1
  403. package/src/lib/server/storefront-tax.js.map +1 -1
  404. package/src/lib/server/tax-return-source.d.ts +32 -3
  405. package/src/lib/server/tax-return-source.js +99 -20
  406. package/src/lib/server/tax-return-source.js.map +1 -1
  407. package/src/lib/server.js +100 -2
  408. package/src/lib/server.js.map +1 -1
  409. package/src/lib/testing/fake-firestore.js +58 -16
  410. package/src/lib/testing/fake-firestore.js.map +1 -1
  411. package/src/lib/testing/pos-ops-memory-firestore.js +18 -4
  412. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -1
  413. package/src/lib/testing/site-register-permissions.d.ts +29 -0
  414. package/src/lib/testing/site-register-permissions.js +38 -0
  415. package/src/lib/testing/site-register-permissions.js.map +1 -0
  416. package/src/lib/transfer/tracking.server.js +8 -5
  417. package/src/lib/transfer/tracking.server.js.map +1 -1
  418. package/src/lib/utils/add-to-cart.d.ts +2 -0
  419. package/src/lib/utils/add-to-cart.js +6 -3
  420. 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: sale ? null : /*#__PURE__*/ _jsx(PosCustomerLookup, _extends({
852
- hostId: hostId,
853
- value: customer,
854
- onChange: setCustomer,
855
- registerId: registerId
856
- }, cashier.assertion ? {
857
- cashierAssertion: cashier.assertion
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,