@aglyn/plugins-commerce 1.0.0-beta.230 → 1.0.0-beta.232

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/catalog-organization-card.component.js +1 -0
  39. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  40. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  41. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  42. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  43. package/src/lib/components/console/host-orders-card.component.js +88 -6
  44. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  45. package/src/lib/components/console/locations-card.component.js +164 -57
  46. package/src/lib/components/console/locations-card.component.js.map +1 -1
  47. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  48. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  49. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  50. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  51. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  52. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  53. package/src/lib/components/console/order-invoice.component.js +81 -0
  54. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  55. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  56. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  57. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  58. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  59. package/src/lib/components/console/order-returns.component.js +142 -0
  60. package/src/lib/components/console/order-returns.component.js.map +1 -0
  61. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  62. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  63. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  64. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  65. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  66. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  67. package/src/lib/components/console/order-zones.d.ts +155 -0
  68. package/src/lib/components/console/order-zones.js +40 -0
  69. package/src/lib/components/console/order-zones.js.map +1 -0
  70. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  71. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  72. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  73. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  74. package/src/lib/components/console/pos/pos-api.js +101 -0
  75. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  77. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  78. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  80. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  81. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  83. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  84. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  86. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  87. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  89. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  90. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  92. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  93. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  94. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  95. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  96. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  97. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  98. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  99. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  100. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  101. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  102. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  103. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  104. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  105. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  107. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  108. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  110. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  111. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  113. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  114. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  115. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  116. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  117. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  118. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  119. package/src/lib/components/console/pos-display-page.component.js +407 -0
  120. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  122. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  123. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  125. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  126. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  128. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  129. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  131. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  132. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  134. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  135. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  140. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  141. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  143. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  144. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  152. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  153. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  155. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  156. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  157. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  158. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  159. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  161. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  162. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  164. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  165. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  166. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  167. package/src/lib/components/console/pos-page.component.js +756 -654
  168. package/src/lib/components/console/pos-page.component.js.map +1 -1
  169. package/src/lib/components/console/pos-zones.d.ts +23 -0
  170. package/src/lib/components/console/pos-zones.js +31 -0
  171. package/src/lib/components/console/pos-zones.js.map +1 -0
  172. package/src/lib/components/console/product-editor-dialog.component.js +61 -71
  173. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  174. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  175. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  176. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  177. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  178. package/src/lib/components/console/product-register-fields.component.js +241 -0
  179. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  180. package/src/lib/components/console/product-zones.d.ts +44 -0
  181. package/src/lib/components/console/product-zones.js.map +1 -1
  182. package/src/lib/components/console/products-hub-card.component.js +23 -20
  183. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  184. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  185. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  186. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  187. package/src/lib/components/console/registers-card.component.js +24 -5
  188. package/src/lib/components/console/registers-card.component.js.map +1 -1
  189. package/src/lib/components/console/return-actions.d.ts +38 -0
  190. package/src/lib/components/console/return-actions.js +76 -0
  191. package/src/lib/components/console/return-actions.js.map +1 -0
  192. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  193. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  194. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  195. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  196. package/src/lib/components/console/return-settings-card.component.js +195 -0
  197. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  198. package/src/lib/components/console/return-zones.d.ts +87 -0
  199. package/src/lib/components/console/return-zones.js +31 -0
  200. package/src/lib/components/console/return-zones.js.map +1 -0
  201. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  202. package/src/lib/components/console/returns-card.component.js +159 -0
  203. package/src/lib/components/console/returns-card.component.js.map +1 -0
  204. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  205. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  206. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  207. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  208. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  209. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  210. package/src/lib/components/console/shipstation-card.component.js +345 -0
  211. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  212. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  213. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  214. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  215. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  216. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  217. package/src/lib/components/console/store-settings-card.component.js +2 -66
  218. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  219. package/src/lib/components/console/store-zones.d.ts +42 -0
  220. package/src/lib/components/console/store-zones.js +39 -0
  221. package/src/lib/components/console/store-zones.js.map +1 -0
  222. package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
  223. package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
  224. package/src/lib/components/order-status.d.ts +36 -0
  225. package/src/lib/components/order-status.js +502 -0
  226. package/src/lib/components/order-status.js.map +1 -0
  227. package/src/lib/components/product-detail.js +41 -2
  228. package/src/lib/components/product-detail.js.map +1 -1
  229. package/src/lib/components/return-request.d.ts +32 -0
  230. package/src/lib/components/return-request.js +576 -0
  231. package/src/lib/components/return-request.js.map +1 -0
  232. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  233. package/src/lib/components/storefront-payment-appearance.js +114 -0
  234. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  235. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  236. package/src/lib/components/storefront-payment-element.js +332 -33
  237. package/src/lib/components/storefront-payment-element.js.map +1 -1
  238. package/src/lib/constants/order-status.d.ts +22 -0
  239. package/src/lib/constants/order-status.js +22 -0
  240. package/src/lib/constants/order-status.js.map +1 -0
  241. package/src/lib/constants/return-request.d.ts +27 -0
  242. package/src/lib/constants/return-request.js +32 -0
  243. package/src/lib/constants/return-request.js.map +1 -0
  244. package/src/lib/constants/stock-movement-query.js +2 -1
  245. package/src/lib/constants/stock-movement-query.js.map +1 -1
  246. package/src/lib/declarations.console-server.js +9 -0
  247. package/src/lib/declarations.console-server.js.map +1 -1
  248. package/src/lib/declarations.server.d.ts +2 -1
  249. package/src/lib/declarations.server.js +68 -1
  250. package/src/lib/declarations.server.js.map +1 -1
  251. package/src/lib/model/buyer-notifications.d.ts +59 -0
  252. package/src/lib/model/buyer-notifications.js +97 -0
  253. package/src/lib/model/buyer-notifications.js.map +1 -0
  254. package/src/lib/model/commerce-orders.d.ts +171 -2
  255. package/src/lib/model/commerce-orders.js +26 -16
  256. package/src/lib/model/commerce-orders.js.map +1 -1
  257. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  258. package/src/lib/model/commerce-payment-methods.js +247 -0
  259. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  260. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  261. package/src/lib/model/commerce-pos-ops.js +721 -0
  262. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  263. package/src/lib/model/commerce-pos.d.ts +263 -0
  264. package/src/lib/model/commerce-pos.js +375 -0
  265. package/src/lib/model/commerce-pos.js.map +1 -0
  266. package/src/lib/model/commerce-printers.d.ts +211 -0
  267. package/src/lib/model/commerce-printers.js +181 -0
  268. package/src/lib/model/commerce-printers.js.map +1 -0
  269. package/src/lib/model/commerce-receipt.d.ts +97 -0
  270. package/src/lib/model/commerce-receipt.js +180 -0
  271. package/src/lib/model/commerce-receipt.js.map +1 -0
  272. package/src/lib/model/commerce-returns.d.ts +207 -0
  273. package/src/lib/model/commerce-returns.js +300 -0
  274. package/src/lib/model/commerce-returns.js.map +1 -0
  275. package/src/lib/model/commerce-shipping.d.ts +44 -1
  276. package/src/lib/model/commerce-shipping.js +53 -9
  277. package/src/lib/model/commerce-shipping.js.map +1 -1
  278. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  279. package/src/lib/model/commerce-tax-engine.js +129 -0
  280. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  281. package/src/lib/model/commerce.d.ts +91 -2
  282. package/src/lib/model/commerce.js +89 -1
  283. package/src/lib/model/commerce.js.map +1 -1
  284. package/src/lib/model/index.d.ts +16 -0
  285. package/src/lib/model/index.js +16 -0
  286. package/src/lib/model/index.js.map +1 -1
  287. package/src/lib/model/order-events.d.ts +154 -0
  288. package/src/lib/model/order-events.js +153 -0
  289. package/src/lib/model/order-events.js.map +1 -0
  290. package/src/lib/model/order-fulfillment.d.ts +117 -0
  291. package/src/lib/model/order-fulfillment.js +217 -0
  292. package/src/lib/model/order-fulfillment.js.map +1 -0
  293. package/src/lib/model/order-history.d.ts +58 -0
  294. package/src/lib/model/order-history.js +22 -0
  295. package/src/lib/model/order-history.js.map +1 -0
  296. package/src/lib/model/order-list-fields.d.ts +9 -1
  297. package/src/lib/model/order-list-fields.js +7 -1
  298. package/src/lib/model/order-list-fields.js.map +1 -1
  299. package/src/lib/model/order-shipping-export.d.ts +91 -0
  300. package/src/lib/model/order-shipping-export.js +192 -0
  301. package/src/lib/model/order-shipping-export.js.map +1 -0
  302. package/src/lib/model/order-status-view.d.ts +103 -0
  303. package/src/lib/model/order-status-view.js +156 -0
  304. package/src/lib/model/order-status-view.js.map +1 -0
  305. package/src/lib/model/order-webhooks.d.ts +142 -0
  306. package/src/lib/model/order-webhooks.js +91 -0
  307. package/src/lib/model/order-webhooks.js.map +1 -0
  308. package/src/lib/model/product-channel.d.ts +56 -0
  309. package/src/lib/model/product-channel.js +86 -0
  310. package/src/lib/model/product-channel.js.map +1 -0
  311. package/src/lib/model/product-modifiers.d.ts +80 -0
  312. package/src/lib/model/product-modifiers.js +140 -0
  313. package/src/lib/model/product-modifiers.js.map +1 -0
  314. package/src/lib/model/product-write.d.ts +186 -0
  315. package/src/lib/model/product-write.js +116 -0
  316. package/src/lib/model/product-write.js.map +1 -0
  317. package/src/lib/model/shippingeasy.d.ts +94 -0
  318. package/src/lib/model/shippingeasy.js +267 -0
  319. package/src/lib/model/shippingeasy.js.map +1 -0
  320. package/src/lib/model/shipstation.d.ts +125 -0
  321. package/src/lib/model/shipstation.js +399 -0
  322. package/src/lib/model/shipstation.js.map +1 -0
  323. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  324. package/src/lib/model/smart-collection-reads.js +63 -0
  325. package/src/lib/model/smart-collection-reads.js.map +1 -0
  326. package/src/lib/model/tracking-url.d.ts +74 -0
  327. package/src/lib/model/tracking-url.js +159 -0
  328. package/src/lib/model/tracking-url.js.map +1 -0
  329. package/src/lib/plugin-config.d.ts +13 -0
  330. package/src/lib/plugin-config.js +77 -5
  331. package/src/lib/plugin-config.js.map +1 -1
  332. package/src/lib/plugin.js +26 -0
  333. package/src/lib/plugin.js.map +1 -1
  334. package/src/lib/pos-ops-config.d.ts +39 -0
  335. package/src/lib/pos-ops-config.js +88 -0
  336. package/src/lib/pos-ops-config.js.map +1 -0
  337. package/src/lib/printing/print-document.d.ts +106 -0
  338. package/src/lib/printing/print-document.js +464 -0
  339. package/src/lib/printing/print-document.js.map +1 -0
  340. package/src/lib/printing/product-labels.d.ts +58 -0
  341. package/src/lib/printing/product-labels.js +116 -0
  342. package/src/lib/printing/product-labels.js.map +1 -0
  343. package/src/lib/printing/render-epson.d.ts +57 -0
  344. package/src/lib/printing/render-epson.js +135 -0
  345. package/src/lib/printing/render-epson.js.map +1 -0
  346. package/src/lib/printing/render-star.d.ts +45 -0
  347. package/src/lib/printing/render-star.js +100 -0
  348. package/src/lib/printing/render-star.js.map +1 -0
  349. package/src/lib/printing/render-text.d.ts +25 -0
  350. package/src/lib/printing/render-text.js +53 -0
  351. package/src/lib/printing/render-text.js.map +1 -0
  352. package/src/lib/server/api-v1/openapi.js +27 -4
  353. package/src/lib/server/api-v1/openapi.js.map +1 -1
  354. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  355. package/src/lib/server/api-v1/order-view.js +120 -0
  356. package/src/lib/server/api-v1/order-view.js.map +1 -0
  357. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  358. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  359. package/src/lib/server/billing-webhook.js +135 -28
  360. package/src/lib/server/billing-webhook.js.map +1 -1
  361. package/src/lib/server/cancel-order.js +29 -0
  362. package/src/lib/server/cancel-order.js.map +1 -1
  363. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  364. package/src/lib/server/carrier-rates-availability.js +76 -0
  365. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  366. package/src/lib/server/carrier-shipping.d.ts +84 -0
  367. package/src/lib/server/carrier-shipping.js +135 -0
  368. package/src/lib/server/carrier-shipping.js.map +1 -0
  369. package/src/lib/server/cart-checkout.d.ts +2 -0
  370. package/src/lib/server/cart-checkout.js +226 -22
  371. package/src/lib/server/cart-checkout.js.map +1 -1
  372. package/src/lib/server/channel-order-updates.d.ts +50 -0
  373. package/src/lib/server/channel-order-updates.js +290 -0
  374. package/src/lib/server/channel-order-updates.js.map +1 -0
  375. package/src/lib/server/channel-orders.d.ts +85 -0
  376. package/src/lib/server/channel-orders.js +543 -0
  377. package/src/lib/server/channel-orders.js.map +1 -0
  378. package/src/lib/server/checkout-extras.d.ts +64 -0
  379. package/src/lib/server/checkout-extras.js +157 -0
  380. package/src/lib/server/checkout-extras.js.map +1 -0
  381. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  382. package/src/lib/server/checkout-status.js +111 -0
  383. package/src/lib/server/checkout-status.js.map +1 -0
  384. package/src/lib/server/checkout.js +86 -9
  385. package/src/lib/server/checkout.js.map +1 -1
  386. package/src/lib/server/draft-order.js +34 -5
  387. package/src/lib/server/draft-order.js.map +1 -1
  388. package/src/lib/server/fulfill-order.d.ts +127 -10
  389. package/src/lib/server/fulfill-order.js +451 -49
  390. package/src/lib/server/fulfill-order.js.map +1 -1
  391. package/src/lib/server/legacy-feed.d.ts +28 -0
  392. package/src/lib/server/legacy-feed.js +52 -0
  393. package/src/lib/server/legacy-feed.js.map +1 -0
  394. package/src/lib/server/native-checkout.d.ts +34 -15
  395. package/src/lib/server/native-checkout.js +32 -17
  396. package/src/lib/server/native-checkout.js.map +1 -1
  397. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  398. package/src/lib/server/order-event-host-emit.js +30 -0
  399. package/src/lib/server/order-event-host-emit.js.map +1 -0
  400. package/src/lib/server/order-event-triggers.d.ts +37 -0
  401. package/src/lib/server/order-event-triggers.js +119 -0
  402. package/src/lib/server/order-event-triggers.js.map +1 -0
  403. package/src/lib/server/order-events.d.ts +62 -0
  404. package/src/lib/server/order-events.js +109 -0
  405. package/src/lib/server/order-events.js.map +1 -0
  406. package/src/lib/server/order-history.d.ts +23 -0
  407. package/src/lib/server/order-history.js +65 -0
  408. package/src/lib/server/order-history.js.map +1 -0
  409. package/src/lib/server/order-notifications.d.ts +185 -0
  410. package/src/lib/server/order-notifications.js +567 -0
  411. package/src/lib/server/order-notifications.js.map +1 -0
  412. package/src/lib/server/order-receipt-send.d.ts +39 -0
  413. package/src/lib/server/order-receipt-send.js +151 -0
  414. package/src/lib/server/order-receipt-send.js.map +1 -0
  415. package/src/lib/server/order-status-token.d.ts +31 -0
  416. package/src/lib/server/order-status-token.js +75 -0
  417. package/src/lib/server/order-status-token.js.map +1 -0
  418. package/src/lib/server/order-status.d.ts +58 -0
  419. package/src/lib/server/order-status.js +141 -0
  420. package/src/lib/server/order-status.js.map +1 -0
  421. package/src/lib/server/order-webhooks.d.ts +108 -0
  422. package/src/lib/server/order-webhooks.js +622 -0
  423. package/src/lib/server/order-webhooks.js.map +1 -0
  424. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  425. package/src/lib/server/orders-shipping-prepare.js +121 -0
  426. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  427. package/src/lib/server/payment-method-domains.d.ts +209 -0
  428. package/src/lib/server/payment-method-domains.js +444 -0
  429. package/src/lib/server/payment-method-domains.js.map +1 -0
  430. package/src/lib/server/payment-methods.d.ts +77 -0
  431. package/src/lib/server/payment-methods.js +284 -0
  432. package/src/lib/server/payment-methods.js.map +1 -0
  433. package/src/lib/server/pos-auth.d.ts +50 -0
  434. package/src/lib/server/pos-auth.js +121 -0
  435. package/src/lib/server/pos-auth.js.map +1 -0
  436. package/src/lib/server/pos-customer.d.ts +49 -0
  437. package/src/lib/server/pos-customer.js +257 -0
  438. package/src/lib/server/pos-customer.js.map +1 -0
  439. package/src/lib/server/pos-display.d.ts +57 -0
  440. package/src/lib/server/pos-display.js +419 -0
  441. package/src/lib/server/pos-display.js.map +1 -0
  442. package/src/lib/server/pos-fee-month.d.ts +34 -0
  443. package/src/lib/server/pos-fee-month.js +36 -0
  444. package/src/lib/server/pos-fee-month.js.map +1 -0
  445. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  446. package/src/lib/server/pos-ops-gate.js +295 -0
  447. package/src/lib/server/pos-ops-gate.js.map +1 -0
  448. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  449. package/src/lib/server/pos-ops-routes.js +36 -0
  450. package/src/lib/server/pos-ops-routes.js.map +1 -0
  451. package/src/lib/server/pos-order.d.ts +1 -18
  452. package/src/lib/server/pos-order.js +222 -42
  453. package/src/lib/server/pos-order.js.map +1 -1
  454. package/src/lib/server/pos-payment.d.ts +39 -0
  455. package/src/lib/server/pos-payment.js +922 -0
  456. package/src/lib/server/pos-payment.js.map +1 -0
  457. package/src/lib/server/pos-print.d.ts +82 -0
  458. package/src/lib/server/pos-print.js +193 -0
  459. package/src/lib/server/pos-print.js.map +1 -0
  460. package/src/lib/server/pos-readers.d.ts +27 -0
  461. package/src/lib/server/pos-readers.js +276 -0
  462. package/src/lib/server/pos-readers.js.map +1 -0
  463. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  464. package/src/lib/server/pos-refund-authority.js +72 -0
  465. package/src/lib/server/pos-refund-authority.js.map +1 -0
  466. package/src/lib/server/pos-return.d.ts +58 -0
  467. package/src/lib/server/pos-return.js +891 -0
  468. package/src/lib/server/pos-return.js.map +1 -0
  469. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  470. package/src/lib/server/pos-sale-stamp.js +84 -0
  471. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  472. package/src/lib/server/pos-sale.d.ts +170 -0
  473. package/src/lib/server/pos-sale.js +461 -0
  474. package/src/lib/server/pos-sale.js.map +1 -0
  475. package/src/lib/server/pos-shift.d.ts +45 -0
  476. package/src/lib/server/pos-shift.js +484 -0
  477. package/src/lib/server/pos-shift.js.map +1 -0
  478. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  479. package/src/lib/server/pos-staff-pin.js +339 -0
  480. package/src/lib/server/pos-staff-pin.js.map +1 -0
  481. package/src/lib/server/pos-stripe.d.ts +91 -0
  482. package/src/lib/server/pos-stripe.js +129 -0
  483. package/src/lib/server/pos-stripe.js.map +1 -0
  484. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  485. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  486. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  487. package/src/lib/server/pos-terminal.d.ts +218 -0
  488. package/src/lib/server/pos-terminal.js +1014 -0
  489. package/src/lib/server/pos-terminal.js.map +1 -0
  490. package/src/lib/server/print-queue.d.ts +124 -0
  491. package/src/lib/server/print-queue.js +301 -0
  492. package/src/lib/server/print-queue.js.map +1 -0
  493. package/src/lib/server/printer-poll.d.ts +75 -0
  494. package/src/lib/server/printer-poll.js +325 -0
  495. package/src/lib/server/printer-poll.js.map +1 -0
  496. package/src/lib/server/printer-secret.d.ts +39 -0
  497. package/src/lib/server/printer-secret.js +56 -0
  498. package/src/lib/server/printer-secret.js.map +1 -0
  499. package/src/lib/server/printers.d.ts +114 -0
  500. package/src/lib/server/printers.js +546 -0
  501. package/src/lib/server/printers.js.map +1 -0
  502. package/src/lib/server/product-catalog.d.ts +42 -0
  503. package/src/lib/server/product-catalog.js +309 -0
  504. package/src/lib/server/product-catalog.js.map +1 -0
  505. package/src/lib/server/product-drafts.d.ts +5 -1
  506. package/src/lib/server/product-drafts.js +3 -3
  507. package/src/lib/server/product-drafts.js.map +1 -1
  508. package/src/lib/server/product-writer.d.ts +19 -0
  509. package/src/lib/server/product-writer.js +261 -0
  510. package/src/lib/server/product-writer.js.map +1 -0
  511. package/src/lib/server/products-write.d.ts +61 -0
  512. package/src/lib/server/products-write.js +375 -0
  513. package/src/lib/server/products-write.js.map +1 -0
  514. package/src/lib/server/refund.js +110 -45
  515. package/src/lib/server/refund.js.map +1 -1
  516. package/src/lib/server/reserve.js +2 -0
  517. package/src/lib/server/reserve.js.map +1 -1
  518. package/src/lib/server/return-status-action.d.ts +37 -0
  519. package/src/lib/server/return-status-action.js +57 -0
  520. package/src/lib/server/return-status-action.js.map +1 -0
  521. package/src/lib/server/returns.d.ts +119 -0
  522. package/src/lib/server/returns.js +938 -0
  523. package/src/lib/server/returns.js.map +1 -0
  524. package/src/lib/server/shipment-records.d.ts +36 -0
  525. package/src/lib/server/shipment-records.js +289 -0
  526. package/src/lib/server/shipment-records.js.map +1 -0
  527. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  528. package/src/lib/server/shipping-connector-gates.js +97 -0
  529. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  530. package/src/lib/server/shipping-connectors.d.ts +29 -0
  531. package/src/lib/server/shipping-connectors.js +236 -0
  532. package/src/lib/server/shipping-connectors.js.map +1 -0
  533. package/src/lib/server/shippingeasy.d.ts +238 -0
  534. package/src/lib/server/shippingeasy.js +787 -0
  535. package/src/lib/server/shippingeasy.js.map +1 -0
  536. package/src/lib/server/shipstation.d.ts +129 -0
  537. package/src/lib/server/shipstation.js +483 -0
  538. package/src/lib/server/shipstation.js.map +1 -0
  539. package/src/lib/server/site-page-resolver.d.ts +5 -0
  540. package/src/lib/server/site-page-resolver.js +156 -1
  541. package/src/lib/server/site-page-resolver.js.map +1 -1
  542. package/src/lib/server/stock-levels.d.ts +21 -0
  543. package/src/lib/server/stock-levels.js +263 -0
  544. package/src/lib/server/stock-levels.js.map +1 -0
  545. package/src/lib/server/stripe-refund.d.ts +47 -0
  546. package/src/lib/server/stripe-refund.js +87 -0
  547. package/src/lib/server/stripe-refund.js.map +1 -0
  548. package/src/lib/server/supplier-update.js +46 -5
  549. package/src/lib/server/supplier-update.js.map +1 -1
  550. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  551. package/src/lib/server/tax-engine-quote.js +105 -0
  552. package/src/lib/server/tax-engine-quote.js.map +1 -0
  553. package/src/lib/server.js +143 -2
  554. package/src/lib/server.js.map +1 -1
  555. package/src/lib/site.js +12 -0
  556. package/src/lib/site.js.map +1 -1
  557. package/src/lib/subprocessors.d.ts +26 -0
  558. package/src/lib/subprocessors.js +50 -0
  559. package/src/lib/subprocessors.js.map +1 -0
  560. package/src/lib/tenant-emails.js +461 -3
  561. package/src/lib/tenant-emails.js.map +1 -1
  562. package/src/lib/testing/fake-firestore.d.ts +45 -0
  563. package/src/lib/testing/fake-firestore.js +189 -0
  564. package/src/lib/testing/fake-firestore.js.map +1 -0
  565. package/src/lib/testing/memory-firestore.d.ts +136 -0
  566. package/src/lib/testing/memory-firestore.js +282 -0
  567. package/src/lib/testing/memory-firestore.js.map +1 -0
  568. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  569. package/src/lib/testing/pos-ops-harness.js +184 -0
  570. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  571. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  572. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  573. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  574. package/src/lib/transfer/products.server.d.ts +5 -0
  575. package/src/lib/transfer/products.server.js +2 -2
  576. package/src/lib/transfer/products.server.js.map +1 -1
  577. package/src/lib/transfer/records-transfer.d.ts +11 -1
  578. package/src/lib/transfer/records-transfer.js +127 -5
  579. package/src/lib/transfer/records-transfer.js.map +1 -1
  580. package/src/lib/transfer/records.server.d.ts +9 -2
  581. package/src/lib/transfer/records.server.js +58 -7
  582. package/src/lib/transfer/records.server.js.map +1 -1
  583. package/src/lib/transfer/register-transfer-resources.js +40 -1
  584. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  585. package/src/lib/transfer/register-transfer-ui.js +4 -1
  586. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  587. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  588. package/src/lib/transfer/shipping-presets.js +156 -0
  589. package/src/lib/transfer/shipping-presets.js.map +1 -0
  590. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  591. package/src/lib/transfer/tracking-transfer.js +546 -0
  592. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  593. package/src/lib/transfer/tracking.server.d.ts +37 -0
  594. package/src/lib/transfer/tracking.server.js +393 -0
  595. package/src/lib/transfer/tracking.server.js.map +1 -0
  596. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  597. package/src/lib/transfer/transfer-keys.js +6 -2
  598. package/src/lib/transfer/transfer-keys.js.map +1 -1
  599. package/src/lib/utils/code128.d.ts +37 -0
  600. package/src/lib/utils/code128.js +199 -0
  601. package/src/lib/utils/code128.js.map +1 -0
  602. package/src/lib/utils/order-invoice.d.ts +55 -0
  603. package/src/lib/utils/order-invoice.js +127 -0
  604. package/src/lib/utils/order-invoice.js.map +1 -0
  605. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  606. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  607. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  608. package/src/lib/server/feed.js +0 -69
  609. package/src/lib/server/feed.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-page.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'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport type { ConsolePluginPageProps } from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport {\n PRODUCT_LIST_BASE,\n PRODUCT_LIST_QUERY,\n} from '../../constants/product-list-query'\nimport { escapeHtml } from '../../utils/escape-html'\nimport { NextPageTitle } from '@aglyn/shared-ui-next/contexts/next-page-title-provider'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { ListQueryNotices } from '@aglyn/shared-ui-jsx/components/list-query-notices.component'\nimport type { ListFilterRequest } from '@aglyn/shared-ui-jsx/const/list-filter'\nimport { planListQuery } from '@aglyn/shared-ui-jsx/const/list-query-plan'\nimport { nameSearchNormalizers } from '@aglyn/aglyn/app-utils/name-search'\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardActionArea,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { QRCodeSVG } from 'qrcode.react'\nimport {\n collection,\n getDocs,\n limit,\n query,\n where,\n} from 'firebase/firestore'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport { useFirestoreCollection } from '@aglyn/tenant-feature-instance'\nimport { listQueryConstraints } from '@aglyn/tenant-feature-instance/hooks/use-list-query'\nimport { useOrgPlan } from '@aglyn/tenant-feature-instance'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\n\n/** How a sale is being settled. Passed to `settle` explicitly (AGL-1682). */\ntype Tender = 'cash' | 'link' | 'folio'\n\ninterface RegisterLine {\n productId: string\n variantId?: string\n name: string\n variantLabel?: string\n unitAmountCents: number\n quantity: number\n}\n\nconst usd = (cents: number) => `$${(cents / 100).toFixed(2)}`\n\n/** The till sells active products only; every read of the catalog asks it. */\nconst SELLABLE: ListFilterRequest = { field: 'status', op: 'equals', value: 'active' }\n\n/**\n * How many products the till's grid shows. The grid is a picker, not the\n * catalog: typing narrows it on the query, so a name reaches every product.\n */\nconst POS_GRID_CEILING = 500\n\n/**\n * The products hub's query (AGL-3321), narrowed to what the till may sell:\n * live products (`deletedAt == null`, the list's scope), `status == active`,\n * and any typed word as the search on `nameTokens` — or, for a scan, the\n * whole scanned code as a SKU or barcode clause. Every shape is one the hub's\n * composites already serve.\n */\nexport function posProductPlan(options: {\n search?: string\n code?: { field: 'barcodes' | 'skus'; value: string }\n}) {\n const typed = options.search?.trim()\n return planListQuery(\n PRODUCT_LIST_QUERY,\n {\n base: PRODUCT_LIST_BASE,\n clauses: [\n SELLABLE,\n ...(options.code\n ? [{ field: options.code.field, op: 'contains', value: options.code.value }]\n : []),\n ],\n search: typed ? [typed] : [],\n },\n nameSearchNormalizers,\n )\n}\n\n/**\n * POS register (AGL-312): touch-first full-screen sale surface —\n * product grid with search/barcode (keyboard-wedge scanners type into\n * the search box and press Enter), a register cart with a whole-sale\n * discount, and cash / QR-card / reservation-folio settlement through\n * the server-priced pos-order API. Receipts print via the browser.\n */\n/*\n * `managePos` is NOT read here. The nav item in `plugin.ts` declares it and\n * the shell refuses the route before this component is constructed, so a\n * reader without the key never reaches this file and there is no unpermitted\n * state for it to render — the same arrangement the entitlement gate has.\n *\n * Re-adding a check off the `permissions` prop would be a second answer to a\n * settled question, and a laxer one: a prop absent because the map has not\n * landed reads as permitted here, while the shell holds the route on that\n * same condition rather than guessing. `server/pos-order.ts` remains the\n * enforcement point for the sale itself.\n */\nexport function PosConsolePage({ hostId }: ConsolePluginPageProps) {\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n\n const [search, setSearch] = useState('')\n const gridPlan = useMemo(() => posProductPlan({ search }), [search])\n const { data: productDocs } = useFirestoreCollection<any>(\n /*\n * The till's grid, narrowed by the QUERY rather than by the rows it\n * happened to fetch (AGL-2501, AGL-2292, AGL-3321).\n *\n * `limit(500)` with no `orderBy` was document-id order over\n * `createResourceUid()` — an arbitrary five hundred, filtered afterwards\n * for status, deletion and the typed search. All three are the query's\n * now (`posProductPlan`), so the window is the first five hundred\n * SELLABLE products by name and a typed name reaches the whole catalog.\n * The scan does not come through here at all — see `handleSearchEnter`,\n * which is a lookup rather than a filter.\n */\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(gridPlan),\n limit(POS_GRID_CEILING),\n ),\n [firestore, hostId, gridPlan],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'locations'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { org, ready: planReady } = useOrgPlan(hostId)\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n // Only registers within the plan cap can transact (pos-order.ts enforces\n // this at sale time by creation rank, AGL-482) — offer only those.\n //\n // Not until the org doc has arrived (AGL-1064): an absent org resolves to\n // the free tier's `posRegisters: 0`, which empties this list and tells a\n // paying seller their registers exceed a plan nobody has read yet.\n // Per SITE (AGL-1775): the plan's cap plus the register seats the org has\n // allocated to this host out of the purchased pool. `checkQuota` on the\n // org-level `posRegisters` no longer carries the pool and would hide\n // registers this site is paying for.\n const registerCap = Aglyn.checkHostRegisterQuota(\n org,\n hostId,\n registers.length,\n ).limit\n const withinCap = CommerceModel.registersWithinCap(registers, registerCap)\n const usableRegisters = planReady\n ? registers.filter((r: any) => withinCap.has(r.$id))\n : []\n /*\n * The stays a sale can be charged to, asked for BY STATUS (AGL-3321). This\n * read the first hundred reservations in document-id order and kept the\n * checked-in ones, so a guest in the house was missing from the folio\n * picker whenever a hundred other bookings sorted before theirs.\n */\n const { data: reservationDocs } = useFirestoreCollection<any>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'reservations'),\n where('status', '==', 'checked_in'),\n limit(100),\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const openStays = reservationDocs ?? []\n\n const [lines, setLines] = useState<RegisterLine[]>([])\n const [discountPct, setDiscountPct] = useState(0)\n const [customerEmail, setCustomerEmail] = useState('')\n const [locationId, setLocationId] = useState('')\n // Register (AGL-472): a sale must run through a named register so the\n // `posRegisters` cap is meaningful and takings are attributable.\n const [registerId, setRegisterId] = useState('')\n // Default to the first register once they load; if that register pins a\n // location, adopt it (the cashier can still override below).\n useEffect(() => {\n if (registerId || usableRegisters.length === 0) return\n const first = usableRegisters[0]\n setRegisterId(first.$id)\n if (first.locationId) setLocationId(first.locationId)\n }, [usableRegisters, registerId])\n // `paying` routes the settlement DIALOGS — nothing else. It is deliberately\n // not the tender `settle` acts on (AGL-1682): it used to be both, and the\n // Card button had to `setPaying('link')` and call `settle()` in one handler,\n // where `settle` still closed over the pre-click `null` and returned at its\n // own guard. Card has no dialog of its own — the QR dialog is gated on\n // `cardUrl` — so the card path sets nothing here at all.\n const [paying, setPaying] = useState<Tender | null>(null)\n const [cashReceived, setCashReceived] = useState('')\n const [folioReservation, setFolioReservation] = useState('')\n const [cardUrl, setCardUrl] = useState('')\n const [busy, setBusy] = useState(false)\n // Re-entrancy guard for `settle`, deliberately a ref and not `busy`. `busy`\n // is for RENDERING (it disables the settle buttons); a second tap arriving\n // before React has re-rendered would read the pre-click `false` out of the\n // handler's closure exactly the way `paying` was read above. The ref is\n // written and read synchronously, so it holds whatever the scheduler does.\n // It is no longer the last line of defence — the server dedupes on the\n // attempt key below (AGL-1691) — but it is still the cheap one, and it stops\n // the redundant round trip rather than merely making it harmless.\n const inFlight = useRef(false)\n /**\n * Idempotency key for ONE settlement attempt (AGL-1691).\n *\n * The guards above are all client-side and none of them survives a reload, a\n * lost response, or a retry. `/api/commerce/pos-order` now dedupes on this\n * key, but only if the key is right, and the key is the whole design:\n *\n * - Minted lazily on the first settle of a basket, NOT per `settle()` call.\n * Per-call would defeat the point — two taps would mint two keys and the\n * server would see two distinct sales.\n * - Retired whenever the register's contents change (the effect below),\n * which covers the sale completing and clearing the lines. So a cashier\n * ringing the same coffee twice gets a NEW key and a real second order —\n * de-duplicating that would be a worse bug than the one being fixed.\n */\n const attemptKey = useRef('')\n useEffect(() => {\n // A different basket is a different attempt. Also fires when `settle`\n // clears the lines, which is what retires a spent key.\n attemptKey.current = ''\n }, [lines, discountPct])\n const [lastReceipt, setLastReceipt] = useState<{\n lines: RegisterLine[]\n totalCents: number\n changeCents: number\n } | null>(null)\n\n const products = useMemo(\n () =>\n // Status, deletion and the search are all the query's (`posProductPlan`).\n [...(productDocs ?? [])]\n .map((product: any) => ({\n ...CommerceModel.liftLegacyProduct(product),\n $id: product.$id,\n })),\n [productDocs],\n )\n /*\n * The grid is what the query returned. Re-filtering it by the same text\n * would narrow it AGAIN and more strictly: the server matches a word prefix\n * (\"cof\" finds \"Coffee\"), the old compare wanted the whole typed string as a\n * substring, so \"flat white\" was sent as \"flat\" and then hidden again by a\n * row that never contained \"flat white\". Rows found, then dropped.\n */\n const visible = products\n\n const productsById = useMemo(\n () => new Map(products.map((product: any) => [product.$id, product])),\n [products],\n )\n /**\n * WHAT THE COUNT SAYS, at the line the cashier is looking at (AGL-2357).\n *\n * The register ignored `oversellPolicy` entirely — `pos-order.ts` had no\n * `canPurchase` call — so a merchant who chose \"deny\" in the product editor\n * silently got \"backorder\" at the counter. That silence is the defect.\n *\n * WARNS, NEVER BLOCKS (the decision on AGL-2357). Nothing here touches\n * `disabled` on the settle buttons, and nothing gates `settle`: a till is the\n * wrong place for a stale number to stop a real sale, because the cashier is\n * holding the goods. Honouring the policy behind a manager override is the\n * post-launch shape (AGL-2372).\n *\n * Indexed alongside `lines` rather than keyed, because the line list is\n * rendered by index and two lines of the same product/variant cannot exist —\n * `addProduct` merges them into one quantity.\n */\n const shortfalls = useMemo(\n () =>\n lines.map((line) => {\n const product: any = productsById.get(line.productId)\n if (!product) return null\n return CommerceModel.stockShortfall(\n product,\n line.variantId ?? product.variants?.[0]?.id,\n line.quantity,\n )\n }),\n [lines, productsById],\n )\n\n const itemsCents = lines.reduce(\n (sum, line) => sum + line.unitAmountCents * line.quantity,\n 0,\n )\n const discountCents = Math.round((itemsCents * discountPct) / 100)\n const dueCents = itemsCents - discountCents\n\n const addProduct = useCallback((product: any, variant?: any) => {\n const pick = variant ?? product.variants[0]\n setLines((prev) => {\n const key = `${product.$id}:${pick.id}`\n const existing = prev.find(\n (line) => `${line.productId}:${line.variantId ?? pick.id}` === key,\n )\n if (existing) {\n return prev.map((line) =>\n line === existing\n ? { ...line, quantity: line.quantity + 1 }\n : line,\n )\n }\n return [\n ...prev,\n {\n productId: product.$id,\n ...(pick.id !== 'default' ? { variantId: pick.id } : {}),\n name: product.name,\n ...(Object.keys(pick.options ?? {}).length\n ? { variantLabel: Object.values(pick.options ?? {}).join(' / ') }\n : {}),\n unitAmountCents: Math.round(Number(pick.priceUsd) * 100),\n quantity: 1,\n },\n ]\n })\n }, [])\n\n /**\n * The barcode wedge: a scanner types the code and presses Enter.\n *\n * A LOOKUP against the whole catalog, not a scan of the rows on screen\n * (AGL-2501). It used to walk `products` — the grid's `limit(500)` window —\n * so a shop whose catalog was larger than that had items whose barcode\n * simply did nothing when scanned. At a till, holding the goods, with a\n * customer waiting.\n *\n * `barcodes` and `skus` are top-level arrays the write path flattens out of\n * `variants`, because Firestore cannot query a field inside an array of\n * objects. Barcode is tried first: it is what the scanner produced, and a\n * SKU that happens to equal another product's barcode should not win over\n * the code actually scanned.\n *\n * ⚠️ A MISS NOW SAYS SO. The old loop returned silently, so an unknown code\n * and a code outside the window were indistinguishable from a scanner that\n * had not fired — the cashier's only signal was that nothing happened.\n */\n const handleSearchEnter = useCallback(async () => {\n const needle = search.trim().toLowerCase()\n if (!needle) return\n const lookup = async (field: 'barcodes' | 'skus') => {\n const found = await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(posProductPlan({ code: { field, value: needle } })),\n limit(1),\n ),\n )\n return found.docs[0]\n }\n let hit: Awaited<ReturnType<typeof lookup>>\n try {\n hit = (await lookup('barcodes')) ?? (await lookup('skus'))\n } catch (error) {\n console.error(error)\n return void enqueueSnackbar('Could not reach the catalog — try again', {\n variant: 'warning',\n persist: false,\n })\n }\n if (!hit) {\n return void enqueueSnackbar(`No product matches “${search.trim()}”`, {\n variant: 'warning',\n persist: false,\n })\n }\n const product = {\n ...CommerceModel.liftLegacyProduct(hit.data() as any),\n $id: hit.id,\n }\n const variant =\n product.variants.find(\n (item: any) =>\n item.barcode?.trim().toLowerCase() === needle ||\n item.sku?.trim().toLowerCase() === needle,\n ) ?? product.variants[0]\n addProduct(product, variant)\n setSearch('')\n }, [search, firestore, hostId, addProduct, enqueueSnackbar])\n\n /**\n * Take payment. The tender is an ARGUMENT, never read back out of state\n * (AGL-1682) — every caller already knows which button was pressed, and the\n * one caller that had to announce it through `setPaying` first could not\n * then observe its own write.\n */\n const settle = useCallback(async (tender: Tender) => {\n if (inFlight.current || lines.length === 0) return\n if (!registerId) {\n return void enqueueSnackbar(\n 'Select a register before taking payment',\n { variant: 'warning', persist: false },\n )\n }\n inFlight.current = true\n setBusy(true)\n // Reuse the key across retries of this basket; mint one if this is the\n // first attempt (AGL-1691). `randomUUID` needs a secure context, which the\n // console always is, but fall back rather than throw on a settle.\n if (!attemptKey.current) {\n attemptKey.current =\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now()}-${Math.random().toString(36).slice(2)}`\n }\n try {\n const response = await authorizedFetch(user, '/api/commerce/pos-order', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': attemptKey.current,\n },\n body: JSON.stringify({\n hostId,\n lines,\n discountPct,\n payment: tender,\n registerId,\n customerEmail: customerEmail || undefined,\n locationId: locationId || undefined,\n cashReceivedCents: Math.round(Number(cashReceived) * 100) || 0,\n reservationId: tender === 'folio' ? folioReservation : undefined,\n }),\n })\n const payload = await response.json()\n if (!response.ok) {\n return void enqueueSnackbar(payload?.error ?? 'Sale failed', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n if (tender === 'link' && payload.url) {\n setCardUrl(payload.url)\n return\n }\n setLastReceipt({\n lines,\n totalCents: payload.totals?.totalCents ?? dueCents,\n changeCents: payload.changeCents ?? 0,\n })\n setLines([])\n setDiscountPct(0)\n setCustomerEmail('')\n setCashReceived('')\n setPaying(null)\n enqueueSnackbar(\n payload.changeCents > 0\n ? `Paid — change ${usd(payload.changeCents)}`\n : 'Paid',\n { variant: 'success', persist: false },\n )\n } finally {\n inFlight.current = false\n setBusy(false)\n }\n }, [\n lines,\n registerId,\n user,\n hostId,\n discountPct,\n customerEmail,\n locationId,\n cashReceived,\n folioReservation,\n dueCents,\n enqueueSnackbar,\n ])\n\n /**\n * Close the card QR dialog. Clears the cart, because by the time this dialog\n * exists the order is already on the server awaiting the webhook — leaving\n * the lines behind meant a backdrop click or Escape dropped the cashier back\n * on a full register that would mint a SECOND pending order and a SECOND\n * Checkout session for the same basket on the next tap (AGL-1682). `Done`\n * always did this; `onClose` did not, and only `onClose` can fire by\n * accident.\n */\n const closeCardDialog = useCallback(() => {\n setCardUrl('')\n setLines([])\n setPaying(null)\n }, [])\n\n const printReceipt = useCallback(() => {\n if (!lastReceipt) return\n const win = window.open('', '_blank', 'width=320,height=600')\n if (!win) return\n // ESCAPED (AGL-2283), the same construction as the packing slip: a\n // `document.write` into an `about:blank` popup that inherits the console's\n // origin. These names are merchant-authored rather than shopper-typed, so\n // the reach is a merchant's own session — still not a reason to build\n // markup out of unescaped product text.\n win.document.write(\n `<pre style=\"font-family:monospace;font-size:12px\">` +\n lastReceipt.lines\n .map(\n (line) =>\n `${escapeHtml(line.quantity)}x ${escapeHtml(line.name)}${line.variantLabel ? ` (${escapeHtml(line.variantLabel)})` : ''}` +\n ` ${usd(line.unitAmountCents * line.quantity)}`,\n )\n .join('\\n') +\n `\\n\\nTOTAL ${usd(lastReceipt.totalCents)}` +\n (lastReceipt.changeCents\n ? `\\nCHANGE ${usd(lastReceipt.changeCents)}`\n : '') +\n `\\n${new Date().toLocaleString()}` +\n `</pre>`,\n )\n win.document.close()\n // Print from HERE, not from a `<script>` written into the receipt\n // (AGL-523). `window.open('')` yields an about:blank document that\n // INHERITS the opener's CSP, so an injected inline script has no nonce and\n // `strict-dynamic` means `'self'` will not save it either. Under the\n // enforcing policy that script is blocked, the receipt window opens, and\n // the print dialog never appears — a silent break of the one action the\n // window exists for.\n //\n // This call is in the opener, whose script Next has already nonced.\n win.focus()\n win.print()\n }, [lastReceipt])\n\n return (\n <>\n <NextPageTitle screen={'POS'} />\n <Box sx={{ display: 'flex', height: '100vh', overflow: 'hidden' }}>\n {/* Product grid */}\n <Box sx={{ flex: 1, p: 2, overflowY: 'auto' }}>\n <TextField\n placeholder=\"Search or scan barcode…\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') void handleSearchEnter()\n }}\n size=\"small\"\n fullWidth\n autoFocus\n sx={{ mb: 2 }}\n />\n <Box sx={{ mb: gridPlan.notices.length ? 2 : 0 }}>\n <ListQueryNotices refused={[]} notices={gridPlan.notices} />\n </Box>\n <Box\n sx={{\n display: 'grid',\n gap: 1.5,\n gridTemplateColumns: 'repeat(auto-fill, minmax(140px, 1fr))',\n }}\n >\n {visible.map((product: any) => (\n <Card key={product.$id} variant=\"outlined\">\n <CardActionArea\n onClick={() => addProduct(product)}\n sx={{ p: 1.5, minHeight: 88 }}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }} noWrap>\n {product.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`$${product.variants[0]?.priceUsd ?? 0}`}\n {product.variants.length > 1\n ? ` · ${product.variants.length} variants`\n : ''}\n </Typography>\n </CardActionArea>\n {product.variants.length > 1 ? (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5, p: 0.5 }}>\n {product.variants.slice(0, 6).map((variant: any) => (\n <Chip\n key={variant.id}\n label={\n Object.values(variant.options ?? {}).join('/') ||\n 'Default'\n }\n size=\"small\"\n onClick={() => addProduct(product, variant)}\n />\n ))}\n </Box>\n ) : null}\n </Card>\n ))}\n </Box>\n </Box>\n\n {/* Register */}\n <Box\n sx={{\n width: 380,\n borderLeft: 1,\n borderColor: 'divider',\n display: 'flex',\n flexDirection: 'column',\n p: 2,\n gap: 1,\n }}\n >\n <Typography variant=\"h6\">{'Register'}</Typography>\n {!planReady ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Checking your plan…'}\n </Typography>\n ) : usableRegisters.length === 0 ? (\n <Typography variant=\"body2\" color=\"warning.main\">\n {registers.length > 0\n ? 'Your registers exceed your plan — remove extras or ' +\n 'upgrade in Billing to take payments.'\n : 'No POS register yet. Add one under Commerce → Settings → ' +\n 'POS registers before taking payments.'}\n </Typography>\n ) : usableRegisters.length > 1 ? (\n <TextField\n label=\"Register\"\n value={registerId}\n onChange={(event) => setRegisterId(event.target.value)}\n size=\"small\"\n select\n >\n {usableRegisters.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {usableRegisters[0]?.name}\n </Typography>\n )}\n {(locationDocs?.length ?? 0) > 1 ? (\n <TextField\n label=\"Location\"\n value={locationId}\n onChange={(event) => setLocationId(event.target.value)}\n size=\"small\"\n select\n >\n {(locationDocs ?? []).map((location: any) => (\n <MenuItem key={location.$id} value={location.$id}>\n {location.name}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <Box sx={{ flex: 1, overflowY: 'auto' }}>\n {lines.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Tap products to add them.'}\n </Typography>\n ) : (\n lines.map((line, index) => (\n <Box key={index} sx={{ py: 0.5 }}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center' }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1 }} noWrap>\n {`${line.quantity}× ${line.name}`}\n {line.variantLabel ? ` (${line.variantLabel})` : ''}\n </Typography>\n <Typography variant=\"body2\">\n {usd(line.unitAmountCents * line.quantity)}\n </Typography>\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() =>\n setLines((prev) =>\n prev.filter((_item, itemIndex) => itemIndex !== index),\n )\n }\n >\n {'✕'}\n </Button>\n </Stack>\n {shortfalls[index] ? (\n // AGL-2357: said, not enforced. The cashier reads it and\n // rings the sale through — the settle buttons below are\n // untouched by this.\n <Typography variant=\"caption\" color=\"warning.main\">\n {`Only ${shortfalls[index]?.available} in stock — selling ${line.quantity}`}\n </Typography>\n ) : null}\n </Box>\n ))\n )}\n </Box>\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Discount %\"\n value={discountPct || ''}\n onChange={(event) =>\n setDiscountPct(\n Math.min(100, Math.max(0, Number(event.target.value) || 0)),\n )\n }\n size=\"small\"\n sx={{ width: 110 }}\n slotProps={{ htmlInput: { inputMode: 'numeric' } }}\n />\n <TextField\n label=\"Customer email\"\n value={customerEmail}\n onChange={(event) => setCustomerEmail(event.target.value)}\n size=\"small\"\n sx={{ flex: 1 }}\n />\n </Stack>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <Typography variant=\"h6\">{'Due'}</Typography>\n <Typography variant=\"h6\">{usd(dueCents)}</Typography>\n </Box>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={lines.length === 0}\n onClick={() => setPaying('cash')}\n sx={{ flex: 1 }}\n >\n {'Cash'}\n </Button>\n <Button\n variant=\"contained\"\n disabled={busy || lines.length === 0}\n onClick={() => void settle('link')}\n sx={{ flex: 1 }}\n >\n {'Card (QR)'}\n </Button>\n <Button\n variant=\"outlined\"\n disabled={lines.length === 0 || openStays.length === 0}\n onClick={() => setPaying('folio')}\n sx={{ flex: 1 }}\n >\n {'Room'}\n </Button>\n </Stack>\n {lastReceipt ? (\n <Button size=\"small\" onClick={printReceipt}>\n {'Print last receipt'}\n </Button>\n ) : null}\n </Box>\n </Box>\n\n {/* Cash dialog */}\n <Dialog open={paying === 'cash'} onClose={() => setPaying(null)} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{`Cash — due ${usd(dueCents)}`}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <TextField\n label=\"Cash received ($)\"\n value={cashReceived}\n onChange={(event) =>\n setCashReceived(event.target.value.replace(/[^0-9.]/g, ''))\n }\n size=\"small\"\n autoFocus\n sx={{ mt: 1 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n {Number(cashReceived) * 100 >= dueCents && cashReceived ? (\n <Alert severity=\"success\">\n {`Change: ${usd(Math.round(Number(cashReceived) * 100) - dueCents)}`}\n </Alert>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setPaying(null)}>{'Cancel'}</Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={busy || Math.round(Number(cashReceived) * 100) < dueCents}\n // `onClick={settle}` would hand MUI's click event to `tender`.\n onClick={() => void settle('cash')}\n >\n {'Complete sale'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Folio dialog */}\n <Dialog open={paying === 'folio'} onClose={() => setPaying(null)} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{`Charge to room — ${usd(dueCents)}`}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <TextField\n label=\"Checked-in stay\"\n value={folioReservation}\n onChange={(event) => setFolioReservation(event.target.value)}\n size=\"small\"\n select\n sx={{ mt: 1 }}\n >\n {openStays.map((stay: any) => (\n <MenuItem key={stay.$id} value={stay.$id}>\n {stay.guestName ?? stay.guestEmail ?? stay.$id}\n </MenuItem>\n ))}\n </TextField>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setPaying(null)}>{'Cancel'}</Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={busy || !folioReservation}\n onClick={() => void settle('folio')}\n >\n {'Charge folio'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Card QR dialog */}\n <Dialog open={Boolean(cardUrl)} onClose={closeCardDialog} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Customer pays by card'}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {'Show this QR (or open the link on the customer display); the ' +\n 'order completes automatically once paid. Stripe Terminal ' +\n 'readers can replace this step later.'}\n </Typography>\n {/* Encoded in this browser, never fetched (AGL-1671). The previous\n revision pointed an `<img>` at api.qrserver.com, which put the\n LIVE Stripe payment URL — a link that pays the order for whoever\n opens it — in a query string to a third party with no contract,\n no DPA and no logging guarantee, on every card sale. It also\n meant a register with no internet could not take a card.\n\n `level=\"L\"` is what that endpoint was being asked for (its\n default `ecc`). The two numbers are MEASURED, not matched: a\n 317-character Stripe Checkout URL is a 61x61 symbol, so the old\n 220px/no-quiet-zone render gave 3.61px per module. `marginSize`\n adds the 4-module quiet zone the spec requires and goQR omitted\n — which matters more here than it looks, since the dialog paper\n is dark in dark mode and the symbol had no white border of its\n own. Paying for that out of 220px would shrink modules to\n 3.19px; 256px puts them at 3.71px, so every module is LARGER\n than what shipped and the quiet zone is free. `maxWidth=\"xs\"`\n leaves ~396px of content, so it still centres with room. */}\n <Box sx={{ display: 'flex', justifyContent: 'center' }}>\n <QRCodeSVG\n value={cardUrl}\n size={256}\n level=\"L\"\n marginSize={4}\n title=\"Payment QR\"\n role=\"img\"\n />\n </Box>\n <Button size=\"small\" href={cardUrl} target=\"_blank\">\n {'Open payment page'}\n </Button>\n </DialogContent>\n <DialogActions>\n <Button onClick={closeCardDialog}>{'Done'}</Button>\n </DialogActions>\n </Dialog>\n </>\n )\n}\nPosConsolePage.displayName = 'PosConsolePage'\n\nexport default PosConsolePage\n"],"names":["Aglyn","CommerceModel","PRODUCT_LIST_BASE","PRODUCT_LIST_QUERY","escapeHtml","NextPageTitle","useSnackbar","ListQueryNotices","planListQuery","nameSearchNormalizers","Alert","Box","Button","Card","CardActionArea","Chip","Dialog","DialogActions","DialogContent","DialogTitle","MenuItem","Stack","TextField","Typography","QRCodeSVG","collection","getDocs","limit","query","where","useCallback","useEffect","useMemo","useRef","useState","useFirestore","useUser","useFirestoreCollection","listQueryConstraints","useOrgPlan","authorizedFetch","usd","cents","toFixed","SELLABLE","field","op","value","POS_GRID_CEILING","posProductPlan","options","typed","search","trim","base","clauses","code","PosConsolePage","hostId","usableRegisters","firestore","data","user","enqueueSnackbar","setSearch","gridPlan","productDocs","idField","locationDocs","registerDocs","org","ready","planReady","registers","sort","a","b","String","name","localeCompare","registerCap","checkHostRegisterQuota","length","withinCap","registersWithinCap","filter","r","has","$id","reservationDocs","openStays","lines","setLines","discountPct","setDiscountPct","customerEmail","setCustomerEmail","locationId","setLocationId","registerId","setRegisterId","first","paying","setPaying","cashReceived","setCashReceived","folioReservation","setFolioReservation","cardUrl","setCardUrl","busy","setBusy","inFlight","attemptKey","current","lastReceipt","setLastReceipt","products","map","product","liftLegacyProduct","visible","productsById","Map","shortfalls","line","get","productId","stockShortfall","variantId","variants","id","quantity","itemsCents","reduce","sum","unitAmountCents","discountCents","Math","round","dueCents","addProduct","variant","pick","prev","key","existing","find","Object","keys","variantLabel","values","join","Number","priceUsd","handleSearchEnter","needle","toLowerCase","lookup","found","docs","hit","error","console","persist","item","barcode","sku","settle","tender","globalThis","crypto","randomUUID","Date","now","random","toString","slice","payload","response","method","headers","body","JSON","stringify","payment","undefined","cashReceivedCents","reservationId","json","ok","allowDuplicate","url","totalCents","totals","changeCents","closeCardDialog","printReceipt","win","window","open","document","write","toLocaleString","close","focus","print","screen","sx","display","height","overflow","flex","p","overflowY","placeholder","onChange","event","target","onKeyDown","size","fullWidth","autoFocus","mb","notices","refused","gap","gridTemplateColumns","onClick","minHeight","fontWeight","noWrap","color","flexWrap","label","width","borderLeft","borderColor","flexDirection","select","register","location","index","py","direction","spacing","alignItems","_item","itemIndex","available","min","max","slotProps","htmlInput","inputMode","justifyContent","disabled","onClose","maxWidth","replace","mt","severity","stay","guestName","guestEmail","Boolean","level","marginSize","title","role","href","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-page.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'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport type { ConsolePluginPageProps } from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport {\n PRODUCT_LIST_BASE,\n PRODUCT_LIST_QUERY,\n} from '../../constants/product-list-query'\nimport { NextPageTitle } from '@aglyn/shared-ui-next/contexts/next-page-title-provider'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport type { ListFilterRequest } from '@aglyn/shared-ui-jsx/const/list-filter'\nimport { planListQuery } from '@aglyn/shared-ui-jsx/const/list-query-plan'\nimport { useViewportFill } from '@aglyn/shared-ui-jsx/hooks/use-viewport-fill'\nimport { nameSearchNormalizers } from '@aglyn/aglyn/app-utils/name-search'\nimport {\n Badge,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Drawer,\n MenuItem,\n Stack,\n TextField,\n Typography,\n useMediaQuery,\n useTheme,\n} from '@mui/material'\nimport {\n collection,\n getDocs,\n limit,\n query,\n where,\n} from 'firebase/firestore'\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport { useFirestoreCollection } from '@aglyn/tenant-feature-instance'\nimport { listQueryConstraints } from '@aglyn/tenant-feature-instance/hooks/use-list-query'\nimport { useOrgPlan } from '@aglyn/tenant-feature-instance'\nimport {\n newAttemptKey,\n openPosSale,\n posRegisterContext,\n PosRequestError,\n usd,\n type PosRegisterContext,\n type PosSaleSummary,\n} from './pos/pos-api'\nimport { PosCartPanel, type RegisterLine } from './pos/pos-cart-panel.component'\nimport { ScanAdornment } from '../../barcode/scan-button.component'\nimport { useScannerWedge } from '../../barcode/scanner-wedge'\nimport {\n PosCustomerLookup,\n PosLastReceipt,\n PosOperationsBar,\n usePosCashier,\n usePosOpsSettings,\n type PosSelectedCustomer,\n} from './pos-ops/register-ops'\nimport { POS_QUICK_KEYS, POS_TOUCH_PX, PosProductGrid } from './pos/pos-product-grid.component'\nimport { PosItemDialog, posItemNeedsChoice, type PosItemChoice } from './pos/pos-item-dialog.component'\nimport { PosReceiptPanel } from './pos/pos-receipt-panel.component'\nimport { PosTenderPanel } from './pos/pos-tender-panel.component'\nimport { posDisplayTipCents, usePosDisplay } from './pos/use-pos-display'\nimport {\n type ConsoleWidgetSlotRenderer,\n useConsoleWidgetSlot,\n} from '@aglyn/aglyn/app-utils/console-widget-slot-context'\nimport { POS_ORDERS_ZONE } from './pos-zones'\n\n/** The till sells active products only; every read of the catalog asks it. */\nconst SELLABLE: ListFilterRequest = { field: 'status', op: 'equals', value: 'active' }\n\n/**\n * How many products the till's grid shows. The grid is a picker, not the\n * catalog: typing narrows it on the query, so a name reaches every product.\n */\nconst POS_GRID_CEILING = 500\n\n/**\n * The products hub's query (AGL-3321), narrowed to what the till may sell:\n * live products (`deletedAt == null`, the list's scope), `status == active`,\n * and any typed word as the search on `nameTokens` — or, for a scan, the\n * whole scanned code as a SKU or barcode clause. Every shape is one the hub's\n * composites already serve.\n */\nexport function posProductPlan(options: {\n search?: string\n code?: { field: 'barcodes' | 'skus'; value: string }\n /** A category chip (AGL-3607): served by the storefront's own composite. */\n categoryId?: string\n /** The Quick keys chip (AGL-3607): products marked `posQuickKey`. */\n quickKeys?: boolean\n}) {\n const typed = options.search?.trim()\n const plan = planListQuery(\n POS_GRID_QUERY,\n {\n base: PRODUCT_LIST_BASE,\n clauses: [\n SELLABLE,\n ...(options.code\n ? [{ field: options.code.field, op: 'contains', value: options.code.value }]\n : []),\n ...(options.categoryId\n ? [{ field: 'categoryIds', op: 'contains', value: options.categoryId }]\n : []),\n ],\n // A chip and a typed word are both array clauses, and Firestore takes\n // one: with a chip on, the word narrows by name prefix instead.\n search: typed && !options.categoryId ? [typed] : [],\n },\n nameSearchNormalizers,\n )\n // The Quick keys chip (AGL-3607) is a boolean equality the list planner\n // does not model, added beside the scope and status it composes with —\n // `deletedAt ==, status ==, posQuickKey ==, nameLower ASC` is declared in\n // the index file. A typed word searches the whole catalog instead: a\n // cashier who types is looking past the quick keys.\n if (options.quickKeys && !typed && !options.code) {\n return {\n ...plan,\n filters: [...plan.filters, { path: 'posQuickKey', op: '==', value: true }],\n } as typeof plan\n }\n return plan\n}\n\n/**\n * The grid's query: the products hub's, plus the category a chip picks\n * (AGL-3607). `categoryIds CONTAINS, nameLower ASC` is a composite the\n * storefront catalog already declares.\n */\nexport const POS_GRID_QUERY = {\n ...PRODUCT_LIST_QUERY,\n fields: [\n ...PRODUCT_LIST_QUERY.fields,\n {\n column: 'categoryIds',\n kind: 'exact' as const,\n path: 'categoryIds',\n tokensPath: 'categoryIds',\n operators: ['contains'],\n },\n ],\n} as typeof PRODUCT_LIST_QUERY\n\n/**\n * POS register (AGL-312, AGL-3607): a tablet-first sale surface — the\n * product grid with search, scan and category chips, the basket, and a\n * tender panel that takes one or more payments against an open sale (cash,\n * card reader, a native Tap to Pay bridge, a typed card, the QR link, gift\n * cards and room charges) until the balance is zero. A paired customer\n * display mirrors the basket and takes the tip and the receipt (AGL-3608).\n *\n * On a wide screen (900px and up) the grid and the register sit side by\n * side; below that the register is a bottom sheet behind a sticky total bar.\n */\n/*\n * `managePos` is NOT read here. The nav item in `plugin.ts` declares it and\n * the shell refuses the route before this component is constructed, so a\n * reader without the key never reaches this file and there is no unpermitted\n * state for it to render — the same arrangement the entitlement gate has.\n *\n * Re-adding a check off the `permissions` prop would be a second answer to a\n * settled question, and a laxer one: a prop absent because the map has not\n * landed reads as permitted here, while the shell holds the route on that\n * same condition rather than guessing. The server routes remain the\n * enforcement point for every sale and every payment.\n */\n/** Where a register device remembers the category chip it was left on. */\nconst POS_CATEGORY_KEY = 'aglyn.pos.category'\n\n/** The basket line an item-sheet choice makes: label and estimate from the product. */\nexport function registerLineFor(\n product: any,\n choice: PosItemChoice,\n): RegisterLine {\n const { variant, modifiers, quantity } = choice\n const resolved = CommerceModel.resolveLineModifiers(product, modifiers)\n const picked = resolved.ok ? resolved.modifiers : []\n const label = CommerceModel.lineLabelWithModifiers(\n Object.keys(variant.options ?? {}).length\n ? Object.values(variant.options ?? {}).join(' / ')\n : undefined,\n picked,\n )\n return {\n productId: product.$id,\n ...(variant.id !== 'default' ? { variantId: variant.id } : {}),\n name: product.name,\n ...(label ? { variantLabel: label } : {}),\n unitAmountCents:\n Math.round(Number(variant.priceUsd) * 100) + (resolved.ok ? resolved.extraCents : 0),\n quantity,\n ...(modifiers.length ? { modifiers } : {}),\n }\n}\n\n/** Same product, variant and choices: the lines that merge into one. */\nfunction lineKey(line: Pick<RegisterLine, 'productId' | 'variantId' | 'modifiers'>): string {\n return `${line.productId}:${line.variantId ?? ''}:${CommerceModel.modifierSelectionKey(line.modifiers)}`\n}\n\n/**\n * The register's zone (AGL-3644), drawn again only when what it is handed\n * changes: the till redraws on every tap, and the shell's renderer is not\n * memoized (the order dialog's reasoning).\n */\nconst PosOrdersZone = memo(function PosOrdersZone(props: {\n renderer: ConsoleWidgetSlotRenderer\n hostId: string\n registerId: string | null\n}) {\n const { renderer: Renderer, hostId, registerId } = props\n return <Renderer slot={POS_ORDERS_ZONE.id} hostId={hostId} orgId={undefined} registerId={registerId} />\n})\n\nexport function PosConsolePage({ hostId }: ConsolePluginPageProps) {\n const WidgetSlot = useConsoleWidgetSlot()\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const theme = useTheme()\n const wide = useMediaQuery(theme.breakpoints.up('md'))\n\n const [search, setSearch] = useState('')\n // The chip a register opens on is remembered per device: a counter that\n // rings from its quick keys reopens on them.\n const [categoryId, setCategoryIdState] = useState(() => {\n try {\n return window.localStorage.getItem(POS_CATEGORY_KEY) ?? ''\n } catch {\n return ''\n }\n })\n const setCategoryId = useCallback((id: string) => {\n setCategoryIdState(id)\n try {\n window.localStorage.setItem(POS_CATEGORY_KEY, id)\n } catch {\n // Storage blocked: the chip still works for this visit.\n }\n }, [])\n const gridPlan = useMemo(\n () =>\n categoryId === POS_QUICK_KEYS\n ? posProductPlan({ search, quickKeys: true })\n : posProductPlan({ search, categoryId }),\n [search, categoryId],\n )\n const { data: productDocs } = useFirestoreCollection<any>(\n /*\n * The till's grid, narrowed by the QUERY rather than by the rows it\n * happened to fetch (AGL-2501, AGL-2292, AGL-3321): the first five\n * hundred SELLABLE products by name, and a typed name reaches the whole\n * catalog. The scan does not come through here — see `handleSearchEnter`.\n */\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(gridPlan),\n limit(POS_GRID_CEILING),\n ),\n [firestore, hostId, gridPlan],\n { idField: '$id' },\n )\n const { data: categoryDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'productCategories'), limit(30)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'locations'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { org, ready: planReady } = useOrgPlan(hostId)\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n // Only registers within the plan cap can transact (AGL-482), and not until\n // the org doc has arrived (AGL-1064). Per SITE (AGL-1775).\n const registerCap = Aglyn.checkHostRegisterQuota(org, hostId, registers.length).limit\n const withinCap = CommerceModel.registersWithinCap(registers, registerCap)\n const usableRegisters = planReady ? registers.filter((r: any) => withinCap.has(r.$id)) : []\n /*\n * The stays a sale can be charged to, asked for BY STATUS (AGL-3321).\n */\n const { data: reservationDocs } = useFirestoreCollection<any>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'reservations'),\n where('status', '==', 'checked_in'),\n limit(100),\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const openStays = reservationDocs ?? []\n\n const [lines, setLines] = useState<RegisterLine[]>([])\n const [discountPct, setDiscountPct] = useState(0)\n // The customer the lookup attached (AGL-3609); their email is the sale's.\n const [customer, setCustomer] = useState<PosSelectedCustomer | null>(null)\n const customerEmail = customer?.email ?? ''\n const [locationId, setLocationId] = useState('')\n const [registerId, setRegisterId] = useState('')\n useEffect(() => {\n if (registerId || usableRegisters.length === 0) return\n const first = usableRegisters[0]\n setRegisterId(first.$id)\n if (first.locationId) setLocationId(first.locationId)\n }, [usableRegisters, registerId])\n const registerName = String(\n usableRegisters.find((register: any) => register.$id === registerId)?.name ?? '',\n )\n // Who is ringing (AGL-3609): a PIN-switched cashier, and the idle lock.\n const opsSettings = usePosOpsSettings(hostId)\n const cashier = usePosCashier({\n hostId,\n registerId,\n autoLockMinutes: opsSettings.autoLockMinutes,\n })\n // The last completed sale, whose receipt can still be printed (AGL-3609).\n const [lastReceipt, setLastReceipt] = useState<{ orderId: string } | null>(null)\n\n const [context, setContext] = useState<PosRegisterContext | null>(null)\n // Keyed on the uid, not the user object: a session refresh hands back a\n // new object for the same person, and re-reading the context on every one\n // would re-render the register in a loop.\n const userRef = useRef(user)\n userRef.current = user\n const uid = user?.uid ?? ''\n useEffect(() => {\n const signedIn = userRef.current\n if (!signedIn) return\n let active = true\n posRegisterContext(signedIn, hostId)\n .then((answer) => {\n // Only a whole answer: a register that half-knows its tenders would\n // offer one the server then refuses.\n if (active && answer?.settings && answer?.terminal) setContext(answer)\n })\n .catch(() => undefined)\n return () => {\n active = false\n }\n }, [uid, hostId])\n\n /** The open sale, once the basket has been priced and payment started. */\n const [sale, setSale] = useState<PosSaleSummary | null>(null)\n const [saleLines, setSaleLines] = useState<RegisterLine[]>([])\n const [opening, setOpening] = useState(false)\n const [sheetOpen, setSheetOpen] = useState(false)\n const [pairing, setPairing] = useState<{ code: string; expiresAtMs: number } | null>(null)\n const display = usePosDisplay(user, hostId, registerId)\n\n /**\n * One key per basket (AGL-1691): minted on the first Charge and retired\n * whenever the basket changes, so a retried Charge finds the same sale and\n * ringing the same coffee twice is two sales.\n */\n const attemptKey = useRef('')\n const fill = useViewportFill({ min: 480 })\n useEffect(() => {\n attemptKey.current = ''\n }, [lines, discountPct])\n\n const products = useMemo(\n () =>\n [...(productDocs ?? [])].map((product: any) => ({\n ...CommerceModel.liftLegacyProduct(product),\n $id: product.$id,\n })),\n [productDocs],\n )\n const productsById = useMemo(\n () => new Map(products.map((product: any) => [product.$id, product])),\n [products],\n )\n /** AGL-2357: warns, never blocks. */\n const shortfalls = useMemo(\n () =>\n lines.map((line) => {\n const product: any = productsById.get(line.productId)\n if (!product) return null\n return CommerceModel.stockShortfall(\n product,\n line.variantId ?? product.variants?.[0]?.id,\n line.quantity,\n )\n }),\n [lines, productsById],\n )\n\n const itemsCents = lines.reduce((sum, line) => sum + line.unitAmountCents * line.quantity, 0)\n const discountCents = Math.round((itemsCents * discountPct) / 100)\n const estimateCents = itemsCents - discountCents\n const units = lines.reduce((sum, line) => sum + line.quantity, 0)\n\n const notify = useCallback(\n (message: string, variant: 'success' | 'error' | 'warning' | 'info') => {\n enqueueSnackbar(message, { variant, persist: false, allowDuplicate: true })\n },\n [enqueueSnackbar],\n )\n\n /**\n * Adds a line, or more of an identical one: the same product, variant and\n * modifiers merge, so two oat lattes are one line of two and an oat latte\n * beside a whole-milk one stays two lines.\n */\n const addProduct = useCallback(\n (product: any, variant?: any, modifiers: CommerceModel.ModifierSelection[] = [], quantity = 1) => {\n const next = registerLineFor(product, {\n variant: variant ?? product.variants[0],\n modifiers,\n quantity,\n })\n setLines((prev) => {\n const existing = prev.find((line) => lineKey(line) === lineKey(next))\n if (existing) {\n return prev.map((line) =>\n line === existing\n ? { ...line, quantity: Math.min(99, line.quantity + next.quantity) }\n : line,\n )\n }\n return [...prev, next]\n })\n },\n [],\n )\n\n /** The item sheet: a product to add, or a basket line to change. */\n const [itemSheet, setItemSheet] = useState<{\n product: any\n editIndex?: number\n initial?: { variantId?: string; modifiers?: CommerceModel.ModifierSelection[]; quantity: number }\n } | null>(null)\n // Every product rung up this sale, so a line can be reopened after the\n // grid has moved on to another category or search.\n const productCache = useRef(new Map<string, any>())\n const tapProduct = useCallback(\n (product: any, variant?: any) => {\n productCache.current.set(product.$id, product)\n if (posItemNeedsChoice(product) && !(variant && CommerceModel.productModifierGroups(product).length === 0)) {\n setItemSheet({\n product,\n ...(variant ? { initial: { variantId: variant.id, quantity: 1 } } : {}),\n })\n return\n }\n addProduct(product, variant)\n },\n [addProduct],\n )\n const basketCounts = useMemo(() => {\n const counts = new Map<string, number>()\n for (const line of lines) counts.set(line.productId, (counts.get(line.productId) ?? 0) + line.quantity)\n return counts\n }, [lines])\n\n /**\n * The barcode wedge: a LOOKUP against the whole catalog (AGL-2501),\n * barcode first, and a miss says so.\n */\n const lookupCode = useCallback(async (scanned: string) => {\n const needle = scanned.trim().toLowerCase()\n if (!needle || sale) return\n const lookup = async (field: 'barcodes' | 'skus') => {\n const found = await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(posProductPlan({ code: { field, value: needle } })),\n limit(1),\n ),\n )\n return found.docs[0]\n }\n let hit: Awaited<ReturnType<typeof lookup>>\n try {\n hit = (await lookup('barcodes')) ?? (await lookup('skus'))\n } catch (error) {\n console.error(error)\n return void notify('Could not reach the catalog — try again', 'warning')\n }\n if (!hit) return void notify(`No product matches “${scanned.trim()}”`, 'warning')\n const product = { ...CommerceModel.liftLegacyProduct(hit.data() as any), $id: hit.id }\n const variant =\n product.variants.find(\n (item: any) =>\n item.barcode?.trim().toLowerCase() === needle || item.sku?.trim().toLowerCase() === needle,\n ) ?? product.variants[0]\n // A scanned variant is the variant; a product with modifiers still asks\n // for them, with that variant already picked.\n tapProduct(product, variant)\n setSearch('')\n }, [sale, firestore, hostId, tapProduct, notify])\n const handleSearchEnter = useCallback(() => lookupCode(search), [lookupCode, search])\n // A scanner fired while focus is on a product or a button (AGL-3619), and\n // the camera; neither while a sale is taking payment or an item is open.\n useScannerWedge((code) => void lookupCode(code), !sale && !itemSheet)\n const scanAdornment = useMemo(\n () => <ScanAdornment label=\"Scan a barcode with the camera\" onScan={(code) => void lookupCode(code)} />,\n [lookupCode],\n )\n\n /** Prices the basket on the server and opens the sale for payment. */\n // A ref, not `opening`: two taps inside one React batch both read the\n // pre-click state, and only a ref is written before the second reads it\n // (the AGL-1682 lesson).\n const chargeInFlight = useRef(false)\n const charge = useCallback(async () => {\n if (chargeInFlight.current || lines.length === 0 || !user) return\n if (!registerId) return void notify('Select a register before taking payment', 'warning')\n if (!attemptKey.current) attemptKey.current = newAttemptKey()\n chargeInFlight.current = true\n setOpening(true)\n try {\n const opened = await openPosSale(user, attemptKey.current, {\n hostId,\n registerId,\n lines,\n discountPct,\n ...(customerEmail ? { customerEmail } : {}),\n ...(customer ? { customer } : {}),\n ...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {}),\n ...(locationId ? { locationId } : {}),\n })\n setSaleLines(lines)\n setSale({\n orderId: opened.orderId,\n status: 'pending',\n totalCents: opened.totals.totalCents,\n paidCents: 0,\n dueCents: opened.totals.totalCents,\n tenderableCents: opened.totals.totalCents,\n tipCents: 0,\n payments: [],\n })\n setSheetOpen(true)\n } catch (error) {\n notify(error instanceof PosRequestError ? error.message : 'Sale failed', 'error')\n } finally {\n chargeInFlight.current = false\n setOpening(false)\n }\n }, [lines, user, registerId, hostId, discountPct, customerEmail, customer, cashier.assertion, locationId, notify])\n\n const resetSale = useCallback(() => {\n if (sale?.status === 'paid') setLastReceipt({ orderId: sale.orderId })\n setSale(null)\n setSaleLines([])\n setLines([])\n setDiscountPct(0)\n setCustomer(null)\n setSheetOpen(false)\n }, [sale])\n\n // The customer display mirrors the basket while nothing else is on it.\n const mirrored = sale ? saleLines : lines\n // Whether the display was last left showing a basket. A paid sale leaves it\n // on the thank-you the server wrote, which an empty new basket must not\n // cut short with the idle screen; the next item added takes it over.\n // True at first, so a register that opens empty clears whatever a previous\n // session left on the screen.\n const displayShowsBasket = useRef(true)\n // The tip picked for the payment about to be taken; the ledger has it only\n // once that payment is recorded. Gone with the sale.\n const [pendingTipCents, setPendingTipCents] = useState(0)\n useEffect(() => {\n if (!sale || sale.status === 'paid') setPendingTipCents(0)\n }, [sale])\n useEffect(() => {\n if (sale?.status === 'paid') displayShowsBasket.current = false\n }, [sale?.status])\n useEffect(() => {\n if (!display.connected || display.asking) return\n if (sale?.payments.some((payment) => payment.status === 'pending' && payment.method === 'card_present')) {\n return\n }\n if (sale?.status === 'paid') return\n if (!mirrored.length && !displayShowsBasket.current) return\n const timer = setTimeout(() => {\n displayShowsBasket.current = mirrored.length > 0\n void display.show(\n mirrored.length\n ? {\n mode: 'cart',\n cart: {\n lines: mirrored.map((line) => ({\n name: line.name,\n ...(line.variantLabel ? { variantLabel: line.variantLabel } : {}),\n quantity: line.quantity,\n amountCents: line.unitAmountCents * line.quantity,\n })),\n itemsCents,\n discountCents,\n taxCents: sale ? Math.max(0, sale.totalCents - estimateCents) : 0,\n totalCents: sale ? sale.totalCents : estimateCents,\n ...(sale\n ? {\n paidCents: sale.paidCents,\n dueCents: sale.dueCents,\n tipCents: posDisplayTipCents(sale, pendingTipCents),\n }\n : {}),\n },\n }\n : { mode: 'idle' },\n )\n }, 400)\n return () => clearTimeout(timer)\n }, [display, mirrored, sale, itemsCents, discountCents, estimateCents, pendingTipCents])\n\n const registerPicker = !planReady ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Checking your plan…'}\n </Typography>\n ) : usableRegisters.length === 0 ? (\n <Typography variant=\"body2\" color=\"warning.main\">\n {registers.length > 0\n ? 'Your registers exceed your plan — remove extras or upgrade in Billing to take payments.'\n : 'No POS register yet. Add one under Commerce → Settings → POS registers before taking payments.'}\n </Typography>\n ) : usableRegisters.length > 1 ? (\n <TextField\n label=\"Register\"\n value={registerId}\n onChange={(event) => setRegisterId(event.target.value)}\n size=\"small\"\n select\n disabled={Boolean(sale)}\n >\n {usableRegisters.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {usableRegisters[0]?.name}\n </Typography>\n )\n\n /**\n * On a narrow screen the register's bar owns the bottom edge, so it moves\n * the console's floating launchers clear of itself through the shell's\n * `--aglyn-dock-inset-bottom` seam; a launcher left in the corner sat on\n * top of Charge.\n */\n const bottomBarRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n const node = bottomBarRef.current\n if (wide || !node) return undefined\n const root = document.documentElement\n const property = '--aglyn-dock-inset-bottom'\n const publish = () => {\n root.style.setProperty(property, `${Math.round(node.getBoundingClientRect().height) + 20}px`)\n }\n publish()\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(publish)\n observer?.observe(node)\n return () => {\n observer?.disconnect()\n root.style.removeProperty(property)\n }\n }, [wide])\n\n const registerPanel = (\n <Stack spacing={1.5} sx={{ minHeight: 0, flex: 1 }}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"h6\" sx={{ flex: 1 }}>\n {'Register'}\n </Typography>\n {registerId ? (\n <Button\n size=\"small\"\n onClick={async () => {\n try {\n setPairing(await display.pairingCode())\n } catch (error) {\n notify(error instanceof PosRequestError ? error.message : 'Could not make a code', 'error')\n }\n }}\n >\n {display.connected ? 'Display connected' : 'Pair display'}\n </Button>\n ) : null}\n </Stack>\n {registerPicker}\n {(locationDocs?.length ?? 0) > 1 ? (\n <TextField\n label=\"Location\"\n value={locationId}\n onChange={(event) => setLocationId(event.target.value)}\n size=\"small\"\n select\n disabled={Boolean(sale)}\n >\n {(locationDocs ?? []).map((location: any) => (\n <MenuItem key={location.$id} value={location.$id}>\n {location.name}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {registerId ? (\n <PosOperationsBar\n hostId={hostId}\n registerId={registerId}\n {...(registerName ? { registerName } : {})}\n cashier={cashier}\n onExchange={(returned) =>\n setCustomer(\n returned.email || returned.name\n ? { kind: 'none', id: '', name: returned.name ?? '', email: returned.email, phone: null }\n : null,\n )\n }\n />\n ) : null}\n <PosCartPanel\n lines={sale ? saleLines : lines}\n shortfalls={sale ? [] : shortfalls}\n onQuantity={(index, quantity) =>\n setLines((prev) =>\n quantity <= 0\n ? prev.filter((_line, at) => at !== index)\n : prev.map((line, at) => (at === index ? { ...line, quantity: Math.min(99, quantity) } : line)),\n )\n }\n onRemove={(index) => setLines((prev) => prev.filter((_line, at) => at !== index))}\n onEdit={(index) => {\n const line = lines[index]\n const product = line\n ? (productCache.current.get(line.productId) ?? productsById.get(line.productId))\n : undefined\n if (!line || !product) return\n setItemSheet({\n product,\n editIndex: index,\n initial: {\n ...(line.variantId ? { variantId: line.variantId } : {}),\n ...(line.modifiers ? { modifiers: line.modifiers } : {}),\n quantity: line.quantity,\n },\n })\n }}\n discountPct={discountPct}\n onDiscountPct={setDiscountPct}\n customer={\n sale ? null : <PosCustomerLookup hostId={hostId} value={customer} onChange={setCustomer} />\n }\n locked={Boolean(sale)}\n />\n {sale && user ? (\n sale.status === 'paid' ? (\n <PosReceiptPanel\n user={user}\n hostId={hostId}\n sale={sale}\n context={context}\n display={display}\n onNewSale={resetSale}\n registerId={registerId}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n notify={notify}\n />\n ) : (\n <PosTenderPanel\n user={user}\n hostId={hostId}\n registerId={registerId}\n sale={sale}\n context={context}\n stays={openStays}\n display={display}\n onSale={setSale}\n onVoided={() => {\n setSale(null)\n setSaleLines([])\n }}\n onTipChange={setPendingTipCents}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n notify={notify}\n />\n )\n ) : (\n <>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <Typography variant=\"h6\">{'Due'}</Typography>\n <Typography variant=\"h6\">{usd(estimateCents)}</Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Tax is added when you charge.'}\n </Typography>\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={opening || lines.length === 0 || !registerId}\n onClick={() => void charge()}\n sx={{ minHeight: 56 }}\n >\n {opening ? 'Pricing…' : `Charge ${usd(estimateCents)}`}\n </Button>\n {lastReceipt ? (\n <PosLastReceipt\n hostId={hostId}\n orderId={lastReceipt.orderId}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n />\n ) : null}\n </>\n )}\n </Stack>\n )\n\n return (\n <>\n <NextPageTitle screen={'POS'} />\n <Box\n ref={fill.ref}\n sx={{\n display: 'flex',\n // From under the console's header, nav and page title to the\n // bottom of the window, not a whole window tall below them.\n height: fill.height,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ flex: 1, p: 2, overflowY: 'auto', pb: wide ? 2 : 12 }}>\n {/* Orders other channels send to the counter (AGL-3644). */}\n {WidgetSlot ? <PosOrdersZone renderer={WidgetSlot} hostId={hostId} registerId={registerId || null} /> : null}\n <PosProductGrid\n search={search}\n onSearch={setSearch}\n onSearchEnter={() => void handleSearchEnter()}\n scanAdornment={scanAdornment}\n categories={(categoryDocs ?? []).map((category: any) => ({\n $id: category.$id,\n name: String(category.name ?? 'Category'),\n }))}\n categoryId={categoryId}\n onCategory={setCategoryId}\n notices={gridPlan.notices}\n hostId={hostId}\n products={products}\n basketCounts={basketCounts}\n onTap={(product) => {\n if (sale) return void notify('Finish or void the open sale first', 'info')\n tapProduct(product)\n }}\n />\n </Box>\n {wide ? (\n <Box\n sx={{\n width: { md: 400, lg: 440 },\n borderLeft: 1,\n borderColor: 'divider',\n display: 'flex',\n flexDirection: 'column',\n p: 2,\n overflowY: 'auto',\n }}\n >\n {registerPanel}\n </Box>\n ) : null}\n </Box>\n {!wide ? (\n <>\n <Box\n ref={bottomBarRef}\n sx={{\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n p: 1.5,\n bgcolor: 'background.paper',\n borderTop: 1,\n borderColor: 'divider',\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n zIndex: theme.zIndex.appBar,\n }}\n >\n <Badge badgeContent={units} color=\"primary\">\n <Button\n variant=\"outlined\"\n onClick={() => setSheetOpen(true)}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {sale ? 'Payment' : 'Cart'}\n </Button>\n </Badge>\n <Typography variant=\"h6\" sx={{ flex: 1, textAlign: 'right' }}>\n {usd(sale ? sale.dueCents : estimateCents)}\n </Typography>\n {!sale ? (\n <Button\n variant=\"contained\"\n disabled={opening || lines.length === 0 || !registerId}\n onClick={() => void charge()}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {'Charge'}\n </Button>\n ) : null}\n </Box>\n <Drawer\n anchor=\"bottom\"\n open={sheetOpen}\n onClose={() => setSheetOpen(false)}\n slotProps={{ paper: { sx: { maxHeight: '90dvh', p: 2, borderTopLeftRadius: 16, borderTopRightRadius: 16 } } }}\n >\n {registerPanel}\n </Drawer>\n </>\n ) : null}\n <PosItemDialog\n product={itemSheet?.product ?? null}\n initial={itemSheet?.initial}\n onClose={() => setItemSheet(null)}\n onConfirm={(choice) => {\n const sheet = itemSheet\n setItemSheet(null)\n if (!sheet) return\n if (sheet.editIndex === undefined) {\n addProduct(sheet.product, choice.variant, choice.modifiers, choice.quantity)\n return\n }\n const at = sheet.editIndex\n setLines((prev) =>\n prev.map((line, index) => (index === at ? registerLineFor(sheet.product, choice) : line)),\n )\n }}\n {...(itemSheet?.editIndex !== undefined\n ? {\n onRemove: () => {\n const at = itemSheet.editIndex\n setItemSheet(null)\n setLines((prev) => prev.filter((_line, index) => index !== at))\n },\n }\n : {})}\n />\n <Dialog open={Boolean(pairing)} onClose={() => setPairing(null)} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Pair a customer display'}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {'On the tablet facing your customer, open this address and enter the code. ' +\n 'The code works once and expires in 10 minutes.'}\n </Typography>\n <Typography variant=\"body1\" sx={{ wordBreak: 'break-all' }}>\n {`${typeof window === 'undefined' ? '' : window.location.origin}/kiosk/commerce/pos-display`}\n </Typography>\n <Typography variant=\"h3\" component=\"p\" sx={{ textAlign: 'center', letterSpacing: 8 }}>\n {pairing?.code}\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setPairing(null)}>{'Done'}</Button>\n </DialogActions>\n </Dialog>\n </>\n )\n}\nPosConsolePage.displayName = 'PosConsolePage'\n\nexport default PosConsolePage\n"],"names":["Aglyn","CommerceModel","PRODUCT_LIST_BASE","PRODUCT_LIST_QUERY","NextPageTitle","useSnackbar","planListQuery","useViewportFill","nameSearchNormalizers","Badge","Box","Button","Dialog","DialogActions","DialogContent","DialogTitle","Drawer","MenuItem","Stack","TextField","Typography","useMediaQuery","useTheme","collection","getDocs","limit","query","where","memo","useCallback","useEffect","useMemo","useRef","useState","useFirestore","useUser","useFirestoreCollection","listQueryConstraints","useOrgPlan","newAttemptKey","openPosSale","posRegisterContext","PosRequestError","usd","PosCartPanel","ScanAdornment","useScannerWedge","PosCustomerLookup","PosLastReceipt","PosOperationsBar","usePosCashier","usePosOpsSettings","POS_QUICK_KEYS","POS_TOUCH_PX","PosProductGrid","PosItemDialog","posItemNeedsChoice","PosReceiptPanel","PosTenderPanel","posDisplayTipCents","usePosDisplay","useConsoleWidgetSlot","POS_ORDERS_ZONE","SELLABLE","field","op","value","POS_GRID_CEILING","posProductPlan","options","typed","search","trim","plan","POS_GRID_QUERY","base","clauses","code","categoryId","quickKeys","filters","path","fields","column","kind","tokensPath","operators","POS_CATEGORY_KEY","registerLineFor","product","choice","variant","modifiers","quantity","resolved","resolveLineModifiers","picked","ok","label","lineLabelWithModifiers","Object","keys","length","values","join","undefined","productId","$id","id","variantId","name","variantLabel","unitAmountCents","Math","round","Number","priceUsd","extraCents","lineKey","line","modifierSelectionKey","PosOrdersZone","props","renderer","Renderer","hostId","registerId","slot","orgId","PosConsolePage","usableRegisters","WidgetSlot","firestore","data","user","enqueueSnackbar","theme","wide","breakpoints","up","setSearch","setCategoryIdState","window","localStorage","getItem","setCategoryId","setItem","gridPlan","productDocs","idField","categoryDocs","locationDocs","registerDocs","org","ready","planReady","registers","sort","a","b","String","localeCompare","registerCap","checkHostRegisterQuota","withinCap","registersWithinCap","filter","r","has","reservationDocs","openStays","lines","setLines","discountPct","setDiscountPct","customer","setCustomer","customerEmail","email","locationId","setLocationId","setRegisterId","first","registerName","find","register","opsSettings","cashier","autoLockMinutes","lastReceipt","setLastReceipt","context","setContext","userRef","current","uid","signedIn","active","then","answer","settings","terminal","catch","sale","setSale","saleLines","setSaleLines","opening","setOpening","sheetOpen","setSheetOpen","pairing","setPairing","display","attemptKey","fill","min","products","map","liftLegacyProduct","productsById","Map","shortfalls","get","stockShortfall","variants","itemsCents","reduce","sum","discountCents","estimateCents","units","notify","message","persist","allowDuplicate","addProduct","next","prev","existing","itemSheet","setItemSheet","productCache","tapProduct","set","productModifierGroups","initial","basketCounts","counts","lookupCode","scanned","needle","toLowerCase","lookup","found","docs","hit","error","console","item","barcode","sku","handleSearchEnter","scanAdornment","onScan","chargeInFlight","charge","opened","assertion","cashierAssertion","orderId","status","totalCents","totals","paidCents","dueCents","tenderableCents","tipCents","payments","resetSale","mirrored","displayShowsBasket","pendingTipCents","setPendingTipCents","connected","asking","some","payment","method","timer","setTimeout","show","mode","cart","amountCents","taxCents","max","clearTimeout","registerPicker","color","onChange","event","target","size","select","disabled","Boolean","bottomBarRef","node","root","document","documentElement","property","publish","style","setProperty","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","removeProperty","registerPanel","spacing","sx","minHeight","flex","direction","alignItems","onClick","pairingCode","location","onExchange","returned","phone","onQuantity","index","_line","at","onRemove","onEdit","editIndex","onDiscountPct","locked","onNewSale","cashierName","stays","onSale","onVoided","onTipChange","justifyContent","screen","ref","overflow","p","overflowY","pb","onSearch","onSearchEnter","categories","category","onCategory","notices","onTap","width","md","lg","borderLeft","borderColor","flexDirection","position","left","right","bottom","bgcolor","borderTop","gap","zIndex","appBar","badgeContent","textAlign","anchor","open","onClose","slotProps","paper","maxHeight","borderTopLeftRadius","borderTopRightRadius","onConfirm","sheet","maxWidth","fullWidth","mt","wordBreak","origin","component","letterSpacing","displayName"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The register's zone (AGL-3644): `posOrders`, above the till's product grid,
3
+ * where orders another channel sends to the counter — a delivery app's, say
4
+ * — wait to be accepted, made and handed over.
5
+ *
6
+ * Declared here because zones are declared by the plugin that hosts them. A
7
+ * widget from another plugin restates these props rather than importing
8
+ * this package, and it writes no order of this plugin's itself: what it
9
+ * records goes through core's channel-orders seam, under this plugin's rules.
10
+ * The register's own gate — `managePos` and the `pos` entitlement — stands
11
+ * in front of the page, and a widget's routes ask it again.
12
+ */
13
+ /** What `posOrders` hands a widget. */
14
+ export interface ConsolePosOrdersZoneProps {
15
+ hostId: string;
16
+ /** The org the page names; `undefined` where the host does not know it. */
17
+ orgId: string | undefined;
18
+ /** The register the till is open on, or `null` before one is chosen. */
19
+ registerId: string | null;
20
+ }
21
+ export declare const POS_ORDERS_ZONE: import("@aglyn/aglyn/plugin-manager/plugin-zones").PluginZone<ConsolePosOrdersZoneProps>;
22
+ /** Declares it, from the console registrar. */
23
+ export declare function registerCommercePosZones(): void;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { definePluginZone, registerPluginZone } from "@aglyn/aglyn/plugin-manager/plugin-zones";
17
+ import { BUNDLE_ID } from "../../constants/bundle-common.js";
18
+ export const POS_ORDERS_ZONE = definePluginZone('posOrders');
19
+ /** Declares it, from the console registrar. */ export function registerCommercePosZones() {
20
+ registerPluginZone({
21
+ zone: POS_ORDERS_ZONE,
22
+ label: 'Register orders',
23
+ surface: 'console',
24
+ layout: 'bare',
25
+ description: 'Above the POS register’s product grid. A widget here shows orders another channel sends to the counter, for staff to accept, make and hand over; it records them through its own routes and core’s channel-orders seam, never by writing an order.'
26
+ }, {
27
+ pluginId: BUNDLE_ID
28
+ });
29
+ }
30
+
31
+ //# sourceMappingURL=pos-zones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-zones.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n definePluginZone,\n registerPluginZone,\n} from '@aglyn/aglyn/plugin-manager/plugin-zones'\nimport { BUNDLE_ID } from '../../constants/bundle-common'\n\n/**\n * The register's zone (AGL-3644): `posOrders`, above the till's product grid,\n * where orders another channel sends to the counter — a delivery app's, say\n * — wait to be accepted, made and handed over.\n *\n * Declared here because zones are declared by the plugin that hosts them. A\n * widget from another plugin restates these props rather than importing\n * this package, and it writes no order of this plugin's itself: what it\n * records goes through core's channel-orders seam, under this plugin's rules.\n * The register's own gate — `managePos` and the `pos` entitlement — stands\n * in front of the page, and a widget's routes ask it again.\n */\n\n/** What `posOrders` hands a widget. */\nexport interface ConsolePosOrdersZoneProps {\n hostId: string\n /** The org the page names; `undefined` where the host does not know it. */\n orgId: string | undefined\n /** The register the till is open on, or `null` before one is chosen. */\n registerId: string | null\n}\n\nexport const POS_ORDERS_ZONE = definePluginZone<ConsolePosOrdersZoneProps>('posOrders')\n\n/** Declares it, from the console registrar. */\nexport function registerCommercePosZones(): void {\n registerPluginZone(\n {\n zone: POS_ORDERS_ZONE,\n label: 'Register orders',\n surface: 'console',\n layout: 'bare',\n description:\n 'Above the POS register’s product grid. A widget here shows orders another channel sends to the counter, for staff to accept, make and hand over; it records them through its own routes and core’s channel-orders seam, never by writing an order.',\n },\n { pluginId: BUNDLE_ID },\n )\n}\n"],"names":["definePluginZone","registerPluginZone","BUNDLE_ID","POS_ORDERS_ZONE","registerCommercePosZones","zone","label","surface","layout","description","pluginId"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD,SACEA,gBAAgB,EAChBC,kBAAkB,QACb,2CAA0C;AACjD,SAASC,SAAS,QAAQ,mCAA+B;AAwBzD,OAAO,MAAMC,kBAAkBH,iBAA4C,aAAY;AAEvF,6CAA6C,GAC7C,OAAO,SAASI;IACdH,mBACE;QACEI,MAAMF;QACNG,OAAO;QACPC,SAAS;QACTC,QAAQ;QACRC,aACE;IACJ,GACA;QAAEC,UAAUR;IAAU;AAE1B"}