@aglyn/plugins-commerce 1.0.0-beta.285 → 1.0.0-beta.288

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/README.md +1 -1
  2. package/package.json +13 -13
  3. package/src/lib/components/cart.js +25 -12
  4. package/src/lib/components/cart.js.map +1 -1
  5. package/src/lib/components/commerce-console-page.js +70 -13
  6. package/src/lib/components/commerce-console-page.js.map +1 -1
  7. package/src/lib/components/console/order-detail-dialog.component.js +2 -1
  8. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  9. package/src/lib/components/console/order-webhooks-card.component.js +1 -1
  10. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -1
  11. package/src/lib/components/console/payment-methods-card.component.js +1 -1
  12. package/src/lib/components/console/payment-methods-card.component.js.map +1 -1
  13. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +5 -0
  14. package/src/lib/components/console/pos/pos-cart-panel.component.js +18 -12
  15. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -1
  16. package/src/lib/components/console/pos/pos-hardware-api.d.ts +76 -5
  17. package/src/lib/components/console/pos/pos-hardware-api.js +53 -11
  18. package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -1
  19. package/src/lib/components/console/pos/pos-hardware-buyer.component.d.ts +18 -0
  20. package/src/lib/components/console/pos/pos-hardware-buyer.component.js +629 -0
  21. package/src/lib/components/console/pos/pos-hardware-buyer.component.js.map +1 -0
  22. package/src/lib/components/console/pos/pos-hardware-sale-api.d.ts +162 -0
  23. package/src/lib/components/console/pos/pos-hardware-sale-api.js +122 -0
  24. package/src/lib/components/console/pos/pos-hardware-sale-api.js.map +1 -0
  25. package/src/lib/components/console/pos/pos-hardware-sale-terms.component.d.ts +39 -0
  26. package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js +251 -0
  27. package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js.map +1 -0
  28. package/src/lib/components/console/pos/use-pos-display.js +50 -0
  29. package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
  30. package/src/lib/components/console/pos-cellular-control.component.d.ts +41 -0
  31. package/src/lib/components/console/pos-cellular-control.component.js +211 -0
  32. package/src/lib/components/console/pos-cellular-control.component.js.map +1 -0
  33. package/src/lib/components/console/pos-devices-card.component.d.ts +9 -1
  34. package/src/lib/components/console/pos-devices-card.component.js +47 -15
  35. package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
  36. package/src/lib/components/console/pos-display/pos-display-api.d.ts +6 -0
  37. package/src/lib/components/console/pos-display/pos-display-api.js +8 -1
  38. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
  39. package/src/lib/components/console/pos-display-page.component.d.ts +13 -0
  40. package/src/lib/components/console/pos-display-page.component.js +44 -2
  41. package/src/lib/components/console/pos-display-page.component.js.map +1 -1
  42. package/src/lib/components/console/pos-hardware-card.component.d.ts +12 -4
  43. package/src/lib/components/console/pos-hardware-card.component.js +157 -36
  44. package/src/lib/components/console/pos-hardware-card.component.js.map +1 -1
  45. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +360 -80
  46. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -1
  47. package/src/lib/components/console/pos-hardware-terms-page.component.d.ts +34 -0
  48. package/src/lib/components/console/pos-hardware-terms-page.component.js +257 -0
  49. package/src/lib/components/console/pos-hardware-terms-page.component.js.map +1 -0
  50. package/src/lib/components/console/pos-hardware-terms-sign-page.component.d.ts +27 -0
  51. package/src/lib/components/console/pos-hardware-terms-sign-page.component.js +104 -0
  52. package/src/lib/components/console/pos-hardware-terms-sign-page.component.js.map +1 -0
  53. package/src/lib/components/console/pos-hardware-waiting-card.component.d.ts +24 -0
  54. package/src/lib/components/console/pos-hardware-waiting-card.component.js +205 -0
  55. package/src/lib/components/console/pos-hardware-waiting-card.component.js.map +1 -0
  56. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +297 -201
  57. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -1
  58. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +3 -0
  59. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +260 -92
  60. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
  61. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +9 -0
  62. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +15 -6
  63. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
  64. package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.d.ts +25 -0
  65. package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js +136 -0
  66. package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js.map +1 -0
  67. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +6 -0
  68. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +48 -31
  69. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -1
  70. package/src/lib/components/console/pos-page.component.d.ts +1 -1
  71. package/src/lib/components/console/pos-page.component.js +63 -12
  72. package/src/lib/components/console/pos-page.component.js.map +1 -1
  73. package/src/lib/components/console/pos-reader-splash-setting.component.js +1 -1
  74. package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -1
  75. package/src/lib/components/console/product-check-in-fields.component.d.ts +4 -2
  76. package/src/lib/components/console/product-check-in-fields.component.js +60 -14
  77. package/src/lib/components/console/product-check-in-fields.component.js.map +1 -1
  78. package/src/lib/components/console/product-editor-dialog.component.js +44 -1
  79. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  80. package/src/lib/components/console/product-hardware-sku-field.component.d.ts +19 -0
  81. package/src/lib/components/console/product-hardware-sku-field.component.js +92 -0
  82. package/src/lib/components/console/product-hardware-sku-field.component.js.map +1 -0
  83. package/src/lib/components/console/product-kiosk-offer-field.component.d.ts +22 -0
  84. package/src/lib/components/console/product-kiosk-offer-field.component.js +94 -0
  85. package/src/lib/components/console/product-kiosk-offer-field.component.js.map +1 -0
  86. package/src/lib/components/console/product-register-fields.component.d.ts +4 -0
  87. package/src/lib/components/console/product-register-fields.component.js +31 -2
  88. package/src/lib/components/console/product-register-fields.component.js.map +1 -1
  89. package/src/lib/components/console/products-hub-card.component.js +11 -2
  90. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  91. package/src/lib/components/console/register-hardware-card.component.d.ts +11 -0
  92. package/src/lib/components/console/register-hardware-card.component.js +56 -27
  93. package/src/lib/components/console/register-hardware-card.component.js.map +1 -1
  94. package/src/lib/components/console/reservation-guests-dialog.component.d.ts +28 -0
  95. package/src/lib/components/console/reservation-guests-dialog.component.js +189 -0
  96. package/src/lib/components/console/reservation-guests-dialog.component.js.map +1 -0
  97. package/src/lib/components/console/reservations-card.component.d.ts +9 -0
  98. package/src/lib/components/console/reservations-card.component.js +158 -23
  99. package/src/lib/components/console/reservations-card.component.js.map +1 -1
  100. package/src/lib/components/console/shippingeasy-card.component.js +1 -1
  101. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -1
  102. package/src/lib/components/console/shipstation-card.component.d.ts +1 -1
  103. package/src/lib/components/console/shipstation-card.component.js +3 -3
  104. package/src/lib/components/console/shipstation-card.component.js.map +1 -1
  105. package/src/lib/components/product-detail.d.ts +4 -0
  106. package/src/lib/components/product-detail.js +40 -5
  107. package/src/lib/components/product-detail.js.map +1 -1
  108. package/src/lib/components/product-reviews.js +28 -11
  109. package/src/lib/components/product-reviews.js.map +1 -1
  110. package/src/lib/components/reservation-widget.js +28 -5
  111. package/src/lib/components/reservation-widget.js.map +1 -1
  112. package/src/lib/components/use-day-picker.d.ts +25 -0
  113. package/src/lib/components/use-day-picker.js +57 -0
  114. package/src/lib/components/use-day-picker.js.map +1 -0
  115. package/src/lib/constants/operator-alerts.d.ts +55 -0
  116. package/src/lib/constants/operator-alerts.js +156 -1
  117. package/src/lib/constants/operator-alerts.js.map +1 -1
  118. package/src/lib/declarations.console-server.js +54 -1
  119. package/src/lib/declarations.console-server.js.map +1 -1
  120. package/src/lib/declarations.d.ts +4 -2
  121. package/src/lib/declarations.js +15 -4
  122. package/src/lib/declarations.js.map +1 -1
  123. package/src/lib/declarations.server.js +9 -0
  124. package/src/lib/declarations.server.js.map +1 -1
  125. package/src/lib/model/commerce-cart.d.ts +9 -1
  126. package/src/lib/model/commerce-cart.js +4 -3
  127. package/src/lib/model/commerce-cart.js.map +1 -1
  128. package/src/lib/model/commerce-check-in-product.d.ts +26 -0
  129. package/src/lib/model/commerce-check-in-product.js +64 -2
  130. package/src/lib/model/commerce-check-in-product.js.map +1 -1
  131. package/src/lib/model/commerce-check-in-record.d.ts +127 -0
  132. package/src/lib/model/commerce-check-in-record.js +36 -0
  133. package/src/lib/model/commerce-check-in-record.js.map +1 -0
  134. package/src/lib/model/commerce-check-in.d.ts +91 -87
  135. package/src/lib/model/commerce-check-in.js +186 -62
  136. package/src/lib/model/commerce-check-in.js.map +1 -1
  137. package/src/lib/model/commerce-kiosk-offer.d.ts +31 -0
  138. package/src/lib/model/commerce-kiosk-offer.js +35 -0
  139. package/src/lib/model/commerce-kiosk-offer.js.map +1 -0
  140. package/src/lib/model/commerce-orders.d.ts +76 -0
  141. package/src/lib/model/commerce-orders.js +6 -0
  142. package/src/lib/model/commerce-orders.js.map +1 -1
  143. package/src/lib/model/commerce-pos-day-report.d.ts +54 -1
  144. package/src/lib/model/commerce-pos-day-report.js +39 -2
  145. package/src/lib/model/commerce-pos-day-report.js.map +1 -1
  146. package/src/lib/model/commerce-pos-offline.d.ts +1 -1
  147. package/src/lib/model/commerce-pos-offline.js +6 -1
  148. package/src/lib/model/commerce-pos-offline.js.map +1 -1
  149. package/src/lib/model/commerce-pos-ops.js +3 -2
  150. package/src/lib/model/commerce-pos-ops.js.map +1 -1
  151. package/src/lib/model/commerce-pos.d.ts +36 -3
  152. package/src/lib/model/commerce-pos.js +14 -6
  153. package/src/lib/model/commerce-pos.js.map +1 -1
  154. package/src/lib/model/commerce-receipt.js +3 -2
  155. package/src/lib/model/commerce-receipt.js.map +1 -1
  156. package/src/lib/model/commerce-reservations.d.ts +69 -4
  157. package/src/lib/model/commerce-reservations.js +57 -5
  158. package/src/lib/model/commerce-reservations.js.map +1 -1
  159. package/src/lib/model/commerce.d.ts +66 -0
  160. package/src/lib/model/commerce.js +15 -0
  161. package/src/lib/model/commerce.js.map +1 -1
  162. package/src/lib/model/order-list-fields.d.ts +11 -0
  163. package/src/lib/model/order-list-fields.js +17 -1
  164. package/src/lib/model/order-list-fields.js.map +1 -1
  165. package/src/lib/model/own-store-tax-summary.d.ts +152 -0
  166. package/src/lib/model/own-store-tax-summary.js +288 -0
  167. package/src/lib/model/own-store-tax-summary.js.map +1 -0
  168. package/src/lib/model/plugin-permissions.d.ts +74 -0
  169. package/src/lib/model/plugin-permissions.js +224 -7
  170. package/src/lib/model/plugin-permissions.js.map +1 -1
  171. package/src/lib/model/pos-cellular.d.ts +223 -0
  172. package/src/lib/model/pos-cellular.js +293 -0
  173. package/src/lib/model/pos-cellular.js.map +1 -0
  174. package/src/lib/model/pos-hardware-in-person.d.ts +98 -0
  175. package/src/lib/model/pos-hardware-in-person.js +224 -0
  176. package/src/lib/model/pos-hardware-in-person.js.map +1 -0
  177. package/src/lib/model/pos-hardware-tax-summary.d.ts +166 -0
  178. package/src/lib/model/pos-hardware-tax-summary.js +225 -0
  179. package/src/lib/model/pos-hardware-tax-summary.js.map +1 -0
  180. package/src/lib/model/pos-hardware-terms.d.ts +74 -0
  181. package/src/lib/model/pos-hardware-terms.js +115 -0
  182. package/src/lib/model/pos-hardware-terms.js.map +1 -0
  183. package/src/lib/model/pos-hardware.d.ts +349 -7
  184. package/src/lib/model/pos-hardware.js +291 -20
  185. package/src/lib/model/pos-hardware.js.map +1 -1
  186. package/src/lib/model/product-write.d.ts +10 -0
  187. package/src/lib/model/product-write.js +4 -2
  188. package/src/lib/model/product-write.js.map +1 -1
  189. package/src/lib/model/workspace-site-permissions.d.ts +26 -0
  190. package/src/lib/model/workspace-site-permissions.js +81 -0
  191. package/src/lib/model/workspace-site-permissions.js.map +1 -0
  192. package/src/lib/plugin.js +16 -0
  193. package/src/lib/plugin.js.map +1 -1
  194. package/src/lib/server/billing-webhook.js +25 -1
  195. package/src/lib/server/billing-webhook.js.map +1 -1
  196. package/src/lib/server/cancel-order.js +7 -5
  197. package/src/lib/server/cancel-order.js.map +1 -1
  198. package/src/lib/server/cart-checkout.js +20 -8
  199. package/src/lib/server/cart-checkout.js.map +1 -1
  200. package/src/lib/server/cart.js +29 -0
  201. package/src/lib/server/cart.js.map +1 -1
  202. package/src/lib/server/checkout.js +42 -13
  203. package/src/lib/server/checkout.js.map +1 -1
  204. package/src/lib/server/collection-membership.d.ts +4 -0
  205. package/src/lib/server/collection-membership.js +5 -10
  206. package/src/lib/server/collection-membership.js.map +1 -1
  207. package/src/lib/server/commerce-site-keys.d.ts +48 -0
  208. package/src/lib/server/commerce-site-keys.js +61 -0
  209. package/src/lib/server/commerce-site-keys.js.map +1 -0
  210. package/src/lib/server/draft-order.js +8 -5
  211. package/src/lib/server/draft-order.js.map +1 -1
  212. package/src/lib/server/fulfill-order.js +7 -5
  213. package/src/lib/server/fulfill-order.js.map +1 -1
  214. package/src/lib/server/gift-cards.js +8 -5
  215. package/src/lib/server/gift-cards.js.map +1 -1
  216. package/src/lib/server/local-fulfillment-status.js +9 -6
  217. package/src/lib/server/local-fulfillment-status.js.map +1 -1
  218. package/src/lib/server/member-post.js +6 -5
  219. package/src/lib/server/member-post.js.map +1 -1
  220. package/src/lib/server/membership-admin-password.d.ts +4 -2
  221. package/src/lib/server/membership-admin-password.js +10 -8
  222. package/src/lib/server/membership-admin-password.js.map +1 -1
  223. package/src/lib/server/membership-admin-remove.d.ts +7 -5
  224. package/src/lib/server/membership-admin-remove.js +9 -9
  225. package/src/lib/server/membership-admin-remove.js.map +1 -1
  226. package/src/lib/server/order-notifications.js +5 -2
  227. package/src/lib/server/order-notifications.js.map +1 -1
  228. package/src/lib/server/order-print.js +7 -5
  229. package/src/lib/server/order-print.js.map +1 -1
  230. package/src/lib/server/order-receipt-send.js +8 -5
  231. package/src/lib/server/order-receipt-send.js.map +1 -1
  232. package/src/lib/server/order-webhooks.js +8 -8
  233. package/src/lib/server/order-webhooks.js.map +1 -1
  234. package/src/lib/server/orders-shipping-prepare.js +9 -6
  235. package/src/lib/server/orders-shipping-prepare.js.map +1 -1
  236. package/src/lib/server/own-store-tax-return-source.d.ts +47 -0
  237. package/src/lib/server/own-store-tax-return-source.js +312 -0
  238. package/src/lib/server/own-store-tax-return-source.js.map +1 -0
  239. package/src/lib/server/payment-methods.js +13 -9
  240. package/src/lib/server/payment-methods.js.map +1 -1
  241. package/src/lib/server/pos-auth.d.ts +37 -6
  242. package/src/lib/server/pos-auth.js +40 -15
  243. package/src/lib/server/pos-auth.js.map +1 -1
  244. package/src/lib/server/pos-cellular-billing.d.ts +81 -0
  245. package/src/lib/server/pos-cellular-billing.js +711 -0
  246. package/src/lib/server/pos-cellular-billing.js.map +1 -0
  247. package/src/lib/server/pos-cellular-notify.d.ts +47 -0
  248. package/src/lib/server/pos-cellular-notify.js +150 -0
  249. package/src/lib/server/pos-cellular-notify.js.map +1 -0
  250. package/src/lib/server/pos-cellular.d.ts +88 -0
  251. package/src/lib/server/pos-cellular.js +339 -0
  252. package/src/lib/server/pos-cellular.js.map +1 -0
  253. package/src/lib/server/pos-check-in.d.ts +5 -1
  254. package/src/lib/server/pos-check-in.js +296 -28
  255. package/src/lib/server/pos-check-in.js.map +1 -1
  256. package/src/lib/server/pos-day-report.js +29 -3
  257. package/src/lib/server/pos-day-report.js.map +1 -1
  258. package/src/lib/server/pos-display.d.ts +16 -0
  259. package/src/lib/server/pos-display.js +129 -2
  260. package/src/lib/server/pos-display.js.map +1 -1
  261. package/src/lib/server/pos-hardware-admin.d.ts +10 -1
  262. package/src/lib/server/pos-hardware-admin.js +250 -84
  263. package/src/lib/server/pos-hardware-admin.js.map +1 -1
  264. package/src/lib/server/pos-hardware-attach.d.ts +105 -0
  265. package/src/lib/server/pos-hardware-attach.js +443 -0
  266. package/src/lib/server/pos-hardware-attach.js.map +1 -0
  267. package/src/lib/server/pos-hardware-buyer-lookup.d.ts +58 -0
  268. package/src/lib/server/pos-hardware-buyer-lookup.js +180 -0
  269. package/src/lib/server/pos-hardware-buyer-lookup.js.map +1 -0
  270. package/src/lib/server/pos-hardware-buyer-record.d.ts +29 -0
  271. package/src/lib/server/pos-hardware-buyer-record.js +86 -0
  272. package/src/lib/server/pos-hardware-buyer-record.js.map +1 -0
  273. package/src/lib/server/pos-hardware-cancel.d.ts +58 -0
  274. package/src/lib/server/pos-hardware-cancel.js +147 -0
  275. package/src/lib/server/pos-hardware-cancel.js.map +1 -0
  276. package/src/lib/server/pos-hardware-closure-notices.d.ts +27 -0
  277. package/src/lib/server/pos-hardware-closure-notices.js +85 -0
  278. package/src/lib/server/pos-hardware-closure-notices.js.map +1 -0
  279. package/src/lib/server/pos-hardware-closure.d.ts +60 -0
  280. package/src/lib/server/pos-hardware-closure.js +153 -0
  281. package/src/lib/server/pos-hardware-closure.js.map +1 -0
  282. package/src/lib/server/pos-hardware-in-person.d.ts +61 -0
  283. package/src/lib/server/pos-hardware-in-person.js +236 -0
  284. package/src/lib/server/pos-hardware-in-person.js.map +1 -0
  285. package/src/lib/server/pos-hardware-notify.d.ts +40 -2
  286. package/src/lib/server/pos-hardware-notify.js +195 -14
  287. package/src/lib/server/pos-hardware-notify.js.map +1 -1
  288. package/src/lib/server/pos-hardware-readers.d.ts +115 -0
  289. package/src/lib/server/pos-hardware-readers.js +430 -0
  290. package/src/lib/server/pos-hardware-readers.js.map +1 -0
  291. package/src/lib/server/pos-hardware-returns.d.ts +116 -0
  292. package/src/lib/server/pos-hardware-returns.js +502 -0
  293. package/src/lib/server/pos-hardware-returns.js.map +1 -0
  294. package/src/lib/server/pos-hardware-sale-fields.d.ts +28 -0
  295. package/src/lib/server/pos-hardware-sale-fields.js +44 -0
  296. package/src/lib/server/pos-hardware-sale-fields.js.map +1 -0
  297. package/src/lib/server/pos-hardware-sale.d.ts +54 -0
  298. package/src/lib/server/pos-hardware-sale.js +369 -0
  299. package/src/lib/server/pos-hardware-sale.js.map +1 -0
  300. package/src/lib/server/pos-hardware-tax-return-source.d.ts +99 -0
  301. package/src/lib/server/pos-hardware-tax-return-source.js +462 -0
  302. package/src/lib/server/pos-hardware-tax-return-source.js.map +1 -0
  303. package/src/lib/server/pos-hardware-terms.d.ts +64 -0
  304. package/src/lib/server/pos-hardware-terms.js +154 -0
  305. package/src/lib/server/pos-hardware-terms.js.map +1 -0
  306. package/src/lib/server/pos-hardware-user-eraser.d.ts +3 -0
  307. package/src/lib/server/pos-hardware-user-eraser.js +31 -7
  308. package/src/lib/server/pos-hardware-user-eraser.js.map +1 -1
  309. package/src/lib/server/pos-hardware-webhook.d.ts +5 -0
  310. package/src/lib/server/pos-hardware-webhook.js +51 -6
  311. package/src/lib/server/pos-hardware-webhook.js.map +1 -1
  312. package/src/lib/server/pos-hardware.d.ts +74 -1
  313. package/src/lib/server/pos-hardware.js +175 -10
  314. package/src/lib/server/pos-hardware.js.map +1 -1
  315. package/src/lib/server/pos-kiosk.d.ts +2 -0
  316. package/src/lib/server/pos-kiosk.js +17 -12
  317. package/src/lib/server/pos-kiosk.js.map +1 -1
  318. package/src/lib/server/pos-offline-card-order.d.ts +64 -0
  319. package/src/lib/server/pos-offline-card-order.js +102 -0
  320. package/src/lib/server/pos-offline-card-order.js.map +1 -0
  321. package/src/lib/server/pos-offline-card-reconcile.d.ts +67 -1
  322. package/src/lib/server/pos-offline-card-reconcile.js +215 -18
  323. package/src/lib/server/pos-offline-card-reconcile.js.map +1 -1
  324. package/src/lib/server/pos-offline-sync.d.ts +39 -0
  325. package/src/lib/server/pos-offline-sync.js +190 -55
  326. package/src/lib/server/pos-offline-sync.js.map +1 -1
  327. package/src/lib/server/pos-ops-gate.d.ts +28 -9
  328. package/src/lib/server/pos-ops-gate.js +50 -19
  329. package/src/lib/server/pos-ops-gate.js.map +1 -1
  330. package/src/lib/server/pos-ops-routes.js +24 -0
  331. package/src/lib/server/pos-ops-routes.js.map +1 -1
  332. package/src/lib/server/pos-order-refund-ids.d.ts +28 -0
  333. package/src/lib/server/pos-order-refund-ids.js +31 -0
  334. package/src/lib/server/pos-order-refund-ids.js.map +1 -0
  335. package/src/lib/server/pos-order.js +52 -49
  336. package/src/lib/server/pos-order.js.map +1 -1
  337. package/src/lib/server/pos-payment.js +1 -1
  338. package/src/lib/server/pos-payment.js.map +1 -1
  339. package/src/lib/server/pos-reader-splash-admin.js +30 -32
  340. package/src/lib/server/pos-reader-splash-admin.js.map +1 -1
  341. package/src/lib/server/pos-reader-splash-images-route.d.ts +17 -0
  342. package/src/lib/server/pos-reader-splash-images-route.js +113 -0
  343. package/src/lib/server/pos-reader-splash-images-route.js.map +1 -0
  344. package/src/lib/server/pos-reader-splash-images.d.ts +51 -0
  345. package/src/lib/server/pos-reader-splash-images.js +123 -0
  346. package/src/lib/server/pos-reader-splash-images.js.map +1 -0
  347. package/src/lib/server/pos-reader-splash.d.ts +68 -1
  348. package/src/lib/server/pos-reader-splash.js +182 -11
  349. package/src/lib/server/pos-reader-splash.js.map +1 -1
  350. package/src/lib/server/pos-readers.d.ts +29 -0
  351. package/src/lib/server/pos-readers.js +134 -35
  352. package/src/lib/server/pos-readers.js.map +1 -1
  353. package/src/lib/server/pos-refund-authority.d.ts +3 -1
  354. package/src/lib/server/pos-refund-authority.js +3 -2
  355. package/src/lib/server/pos-refund-authority.js.map +1 -1
  356. package/src/lib/server/pos-return.d.ts +10 -0
  357. package/src/lib/server/pos-return.js +29 -7
  358. package/src/lib/server/pos-return.js.map +1 -1
  359. package/src/lib/server/pos-sale.js +6 -1
  360. package/src/lib/server/pos-sale.js.map +1 -1
  361. package/src/lib/server/pos-shift.js +11 -0
  362. package/src/lib/server/pos-shift.js.map +1 -1
  363. package/src/lib/server/pos-staff-pin.js +29 -24
  364. package/src/lib/server/pos-staff-pin.js.map +1 -1
  365. package/src/lib/server/pos-terminal.d.ts +14 -4
  366. package/src/lib/server/pos-terminal.js +34 -38
  367. package/src/lib/server/pos-terminal.js.map +1 -1
  368. package/src/lib/server/printers.d.ts +7 -3
  369. package/src/lib/server/printers.js +18 -12
  370. package/src/lib/server/printers.js.map +1 -1
  371. package/src/lib/server/product-drafts.d.ts +11 -1
  372. package/src/lib/server/product-drafts.js +12 -8
  373. package/src/lib/server/product-drafts.js.map +1 -1
  374. package/src/lib/server/product.d.ts +15 -1
  375. package/src/lib/server/product.js +16 -3
  376. package/src/lib/server/product.js.map +1 -1
  377. package/src/lib/server/products-write.d.ts +26 -2
  378. package/src/lib/server/products-write.js +19 -7
  379. package/src/lib/server/products-write.js.map +1 -1
  380. package/src/lib/server/refund.js +55 -42
  381. package/src/lib/server/refund.js.map +1 -1
  382. package/src/lib/server/reservation-availability-query.d.ts +8 -0
  383. package/src/lib/server/reservation-availability-query.js +11 -1
  384. package/src/lib/server/reservation-availability-query.js.map +1 -1
  385. package/src/lib/server/reservation-availability.d.ts +1 -1
  386. package/src/lib/server/reservation-availability.js +7 -2
  387. package/src/lib/server/reservation-availability.js.map +1 -1
  388. package/src/lib/server/reservation-guests.d.ts +32 -0
  389. package/src/lib/server/reservation-guests.js +285 -0
  390. package/src/lib/server/reservation-guests.js.map +1 -0
  391. package/src/lib/server/reservation-walk-in.d.ts +11 -1
  392. package/src/lib/server/reservation-walk-in.js +56 -12
  393. package/src/lib/server/reservation-walk-in.js.map +1 -1
  394. package/src/lib/server/reserve.js +18 -5
  395. package/src/lib/server/reserve.js.map +1 -1
  396. package/src/lib/server/returns.js +9 -6
  397. package/src/lib/server/returns.js.map +1 -1
  398. package/src/lib/server/reviews.d.ts +22 -2
  399. package/src/lib/server/reviews.js +88 -20
  400. package/src/lib/server/reviews.js.map +1 -1
  401. package/src/lib/server/shipping-connectors.js +10 -11
  402. package/src/lib/server/shipping-connectors.js.map +1 -1
  403. package/src/lib/server/site-page-resolver.js +20 -3
  404. package/src/lib/server/site-page-resolver.js.map +1 -1
  405. package/src/lib/server/store-day.d.ts +33 -0
  406. package/src/lib/server/store-day.js +46 -0
  407. package/src/lib/server/store-day.js.map +1 -0
  408. package/src/lib/server/store-setup-ai-writer.d.ts +2 -1
  409. package/src/lib/server/store-setup-ai-writer.js +5 -6
  410. package/src/lib/server/store-setup-ai-writer.js.map +1 -1
  411. package/src/lib/server/storefront-tax.d.ts +13 -0
  412. package/src/lib/server/storefront-tax.js +8 -1
  413. package/src/lib/server/storefront-tax.js.map +1 -1
  414. package/src/lib/server/tax-return-source.d.ts +32 -3
  415. package/src/lib/server/tax-return-source.js +99 -20
  416. package/src/lib/server/tax-return-source.js.map +1 -1
  417. package/src/lib/server.js +100 -2
  418. package/src/lib/server.js.map +1 -1
  419. package/src/lib/testing/fake-firestore.js +58 -16
  420. package/src/lib/testing/fake-firestore.js.map +1 -1
  421. package/src/lib/testing/pos-ops-memory-firestore.js +18 -4
  422. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -1
  423. package/src/lib/testing/site-register-permissions.d.ts +29 -0
  424. package/src/lib/testing/site-register-permissions.js +38 -0
  425. package/src/lib/testing/site-register-permissions.js.map +1 -0
  426. package/src/lib/transfer/tracking.server.js +8 -5
  427. package/src/lib/transfer/tracking.server.js.map +1 -1
  428. package/src/lib/utils/add-to-cart.d.ts +2 -0
  429. package/src/lib/utils/add-to-cart.js +6 -3
  430. package/src/lib/utils/add-to-cart.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-check-in.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 { resolveSiteTimeZone } from '@aglyn/aglyn/app-utils/collection-entry-date'\nimport { zonedDayKey } from '@aglyn/shared-util-timestamp/zoned-time'\nimport type { PluginApiHandler, PluginApiRequest } from '@aglyn/aglyn/server'\nimport {\n changedCheckInCustomerFields,\n checkInCustomerKey,\n checkInCustomers,\n checkInDayCsv,\n checkInDayMs,\n checkInDayTotals,\n checkInSearchToken,\n CHECK_IN_BATCH_MAX,\n CHECK_IN_DAY_CEILING,\n CHECK_IN_SEARCH_CUSTOMERS,\n CHECK_IN_SEARCH_ROWS,\n dueCheckInsForOrder,\n dueCheckInsForReservation,\n newCheckInDocument,\n normalizeWristband,\n sortCheckInRows,\n type CheckInRow,\n type CheckInWristband,\n type DueCheckIn,\n type HostCheckIn,\n} from '../model/commerce-check-in'\nimport { posDayReportRange } from '../model/commerce-pos-day-report'\nimport type { HostOrder } from '../model/commerce-orders'\nimport {\n authorizePosOps,\n defaultPosOpsDeps,\n posOpsBody,\n posOpsCleanId,\n posOpsIdempotencyKey,\n resolvePosCashier,\n type PosOpsDeps,\n type PosOpsStaff,\n} from './pos-ops-gate'\nimport { onPosSaleCompleted, type PosSaleCompletedEvent } from './pos-sale'\n\n/*==========================================\n * CHECK-IN AT THE WINDOW (AGL-4043): `/api/commerce/pos-check-in`.\n *\n * POST { hostId, action: 'search', text, day? }\n * POST { hostId, action: 'customer', customerKey | email | contactId, day?, reconcile?: false | 'if-used' }\n * POST { hostId, action: 'check_in', checkIns: [{ id, wristband? }], registerId?, cashierAssertion? }\n * POST { hostId, action: 'undo', id }\n * POST { hostId, action: 'wristband', id, wristband }\n * GET ?hostId=…&day=YYYY-MM-DD[&format=csv] the day's list\n *\n * `day` is today in the site's time zone when absent. Who may use it is who\n * may work the register (`authorizePosOps`). A check-in is idempotent on the\n * `Idempotency-Key` header: a retried tap answers the check-in it made, not\n * \"already checked in\".\n *\n * WHAT IS DUE is written down, not filtered at read: each due person is a\n * `checkIns` document (see `model/commerce-check-in.ts`), so a search is a\n * query on `dayKey ==` and `searchTokens array-contains` with an index. The\n * documents are written from their sources:\n *\n * - a register sale, the moment it completes (the sale-completed seam);\n * - and every source, by {@link reconcileCheckInDay}: the day's orders\n * (`createdAtMs` in the day, the automatic single-field index) and the\n * stays that began within a year before it (`checkInDayMs`, likewise),\n * at most every {@link CHECK_IN_RECONCILE_MS} per day, on the next search\n * or list. So an online order paid a minute ago is found on the next\n * search after that.\n *\n * Reconciling only ever CREATES what is missing, refreshes a waiting\n * person's name and address, and removes a waiting person whose order was\n * refunded or cancelled. A checked-in person is never touched: each change\n * to an existing document is a transaction that re-reads it first.\n *=========================================*/\n\n/** How stale a day's reconcile may be before a search or the list redoes it. */\nexport const CHECK_IN_RECONCILE_MS = 30_000\n\n/** How far back a stay may have begun and still cover the day. */\nconst STAY_LOOKBACK_MS = 366 * 86_400_000\n\ntype Outcome =\n | { status: number; body: Record<string, unknown> }\n | { status: 200; csv: string; filename: string }\n\nconst queryValue = (value: unknown): string =>\n String(Array.isArray(value) ? (value[0] ?? '') : (value ?? '')).trim()\n\n/** A check-in id as the routes accept one. */\nfunction cleanCheckInId(value: unknown): string {\n const id = String(value ?? '').trim()\n return /^[or]_[A-Za-z0-9_-]{1,300}$/.test(id) ? id : ''\n}\n\nexport interface CheckInDay {\n dayKey: string\n startMs: number\n endMs: number\n timeZone: string\n}\n\n/** The day asked for, in the site's zone; today there when absent. */\nexport async function readCheckInDay(\n deps: PosOpsDeps,\n hostRef: FirebaseFirestore.DocumentReference,\n org: Record<string, any> | null,\n rawDay: unknown,\n): Promise<({ ok: true } & CheckInDay) | { ok: false; error: string }> {\n const host = await hostRef.get()\n const timeZone = resolveSiteTimeZone(\n org as { timeZone?: string } | null,\n (host.data() ?? null) as { timeZone?: string } | null,\n )\n const day = String(rawDay ?? '').trim()\n const range = posDayReportRange({ from: day, to: day, nowMs: deps.now(), timeZone })\n if ('error' in range) return { ok: false, error: 'Choose the day as YYYY-MM-DD.' }\n return { ok: true, dayKey: range.from, startMs: range.startMs, endMs: range.endMs, timeZone }\n}\n\n/** Reads documents by reference, a few hundred at a time. */\nasync function readAll(\n firestore: FirebaseFirestore.Firestore,\n refs: FirebaseFirestore.DocumentReference[],\n): Promise<FirebaseFirestore.DocumentSnapshot[]> {\n const out: FirebaseFirestore.DocumentSnapshot[] = []\n for (let at = 0; at < refs.length; at += 300) {\n out.push(...(await firestore.getAll(...refs.slice(at, at + 300))))\n }\n return out\n}\n\n/** The products an order set names, as stored now. */\nasync function productsFor(\n deps: PosOpsDeps,\n hostRef: FirebaseFirestore.DocumentReference,\n orders: ReadonlyArray<Partial<HostOrder>>,\n): Promise<Map<string, Record<string, any>>> {\n const ids = new Set<string>()\n for (const order of orders) {\n for (const line of Array.isArray(order.lineItems) ? order.lineItems : []) {\n if (line?.productId && posOpsCleanId(line.productId)) ids.add(line.productId)\n }\n }\n const snapshots = await readAll(\n deps.firestore(),\n [...ids].map((id) => hostRef.collection('products').doc(id)),\n )\n const products = new Map<string, Record<string, any>>()\n for (const snapshot of snapshots) {\n if (snapshot.exists) products.set(snapshot.id, (snapshot.data() ?? {}) as Record<string, any>)\n }\n return products\n}\n\nconst isAlreadyExists = (error: unknown): boolean => {\n const code = (error as { code?: unknown })?.code\n return code === 6 || code === 'already-exists' || /ALREADY_EXISTS/.test(String((error as Error)?.message))\n}\n\n/** Creates the due check-ins that are missing; an existing one is left exactly as it is. */\nasync function createMissing(\n checkIns: FirebaseFirestore.CollectionReference,\n due: ReadonlyMap<string, DueCheckIn>,\n existing: ReadonlySet<string>,\n nowMs: number,\n): Promise<number> {\n const missing = [...due].filter(([id]) => !existing.has(id))\n let created = 0\n for (let at = 0; at < missing.length; at += 100) {\n await Promise.all(\n missing.slice(at, at + 100).map(async ([id, entry]) => {\n try {\n await checkIns.doc(id).create(newCheckInDocument(entry, nowMs))\n created += 1\n } catch (error) {\n // Another device wrote it first, which is the same document.\n if (!isAlreadyExists(error)) throw error\n }\n }),\n )\n }\n return created\n}\n\n/**\n * Brings a day's check-ins in line with its orders and stays, at most every\n * {@link CHECK_IN_RECONCILE_MS} unless `force`. Answers whether a source\n * held more than one day reads.\n */\nexport async function reconcileCheckInDay(\n deps: PosOpsDeps,\n hostRef: FirebaseFirestore.DocumentReference,\n day: CheckInDay,\n options: { force?: boolean; onlyIfUsed?: boolean } = {},\n): Promise<{ truncated: boolean }> {\n const nowMs = deps.now()\n const markerRef = hostRef.collection('checkInDays').doc(day.dayKey)\n if (!options.force) {\n const marker = await markerRef.get()\n // A day nobody has checked anyone in on yet is left alone by a caller\n // that only asks in passing: a store that never checks anybody in pays\n // nothing for the register's customer panel.\n if (!marker.exists && options.onlyIfUsed) return { truncated: false }\n if (marker.exists && nowMs - Number(marker.get('reconciledAtMs') ?? 0) < CHECK_IN_RECONCILE_MS) {\n return { truncated: marker.get('truncated') === true }\n }\n }\n const dayMs = checkInDayMs(day.dayKey) ?? 0\n const checkIns = hostRef.collection('checkIns')\n const [ordersSnapshot, staysSnapshot, existingSnapshot] = await Promise.all([\n hostRef\n .collection('orders')\n .where('createdAtMs', '>=', day.startMs)\n .where('createdAtMs', '<', day.endMs)\n .orderBy('createdAtMs')\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get(),\n hostRef\n .collection('reservations')\n .where('checkInDayMs', '<=', dayMs)\n .where('checkInDayMs', '>', dayMs - STAY_LOOKBACK_MS)\n .orderBy('checkInDayMs', 'desc')\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get(),\n checkIns.where('dayKey', '==', day.dayKey).limit(CHECK_IN_DAY_CEILING + 1).get(),\n ])\n const truncated =\n ordersSnapshot.docs.length > CHECK_IN_DAY_CEILING ||\n staysSnapshot.docs.length > CHECK_IN_DAY_CEILING ||\n existingSnapshot.docs.length > CHECK_IN_DAY_CEILING\n const orders = ordersSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING)\n const stays = staysSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING)\n\n const products = await productsFor(\n deps,\n hostRef,\n orders.map((doc) => doc.data() as Partial<HostOrder>),\n )\n const resourceIds = [\n ...new Set(stays.map((doc) => String(doc.get('resourceId') ?? '')).filter((id) => posOpsCleanId(id))),\n ]\n const resourceNames = new Map<string, string>()\n for (const snapshot of await readAll(\n deps.firestore(),\n resourceIds.map((id) => hostRef.collection('resources').doc(id)),\n )) {\n if (snapshot.exists) resourceNames.set(snapshot.id, String(snapshot.get('name') ?? ''))\n }\n\n const due = new Map<string, DueCheckIn>()\n const readOrders = new Set<string>()\n const readStays = new Set<string>()\n for (const doc of orders) {\n readOrders.add(doc.id)\n for (const [id, entry] of dueCheckInsForOrder({\n orderId: doc.id,\n order: doc.data() as Partial<HostOrder>,\n products,\n dayKey: day.dayKey,\n })) {\n due.set(id, entry)\n }\n }\n for (const doc of stays) {\n readStays.add(doc.id)\n for (const [id, entry] of dueCheckInsForReservation({\n reservationId: doc.id,\n reservation: doc.data() as Record<string, any>,\n resourceName: resourceNames.get(String(doc.get('resourceId') ?? '')) ?? null,\n dayKey: day.dayKey,\n })) {\n due.set(id, entry)\n }\n }\n\n const existing = new Set(existingSnapshot.docs.map((doc) => doc.id))\n await createMissing(checkIns, due, existing, nowMs)\n\n // A waiting person whose source this pass READ and no longer finds due\n // goes; one whose name or address changed is refreshed. Each re-reads its\n // document in a transaction, so a check-in made meanwhile stands.\n const changes = existingSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING).flatMap((doc) => {\n const stored = doc.data() as Partial<HostCheckIn>\n if (stored.status !== 'expected') return []\n const wanted = due.get(doc.id)\n if (!wanted) {\n const sourceRead =\n (stored.source === 'order' && stored.orderId && readOrders.has(stored.orderId)) ||\n (stored.source === 'reservation' && stored.reservationId && readStays.has(stored.reservationId))\n return sourceRead ? [{ ref: doc.ref, patch: null }] : []\n }\n const patch = changedCheckInCustomerFields(stored, wanted)\n return patch ? [{ ref: doc.ref, patch }] : []\n })\n const firestore = deps.firestore()\n for (const change of changes) {\n await firestore.runTransaction(async (transaction) => {\n const fresh = await transaction.get(change.ref)\n if (!fresh.exists || fresh.get('status') !== 'expected') return\n if (change.patch) transaction.update(change.ref, { ...change.patch, updatedAtMs: nowMs })\n else transaction.delete(change.ref)\n })\n }\n await markerRef.set({ dayKey: day.dayKey, reconciledAtMs: nowMs, truncated })\n return { truncated }\n}\n\n/**\n * The check-ins a register sale makes, written the moment it completes so\n * the person who just paid at the window is found on the next search. The\n * day is the sale's own, in the site's zone.\n */\nexport async function recordSaleCheckIns(deps: PosOpsDeps, event: PosSaleCompletedEvent): Promise<number> {\n const hostId = posOpsCleanId(event.hostId)\n const orderId = posOpsCleanId(event.orderId)\n if (!hostId || !orderId) return 0\n const lines = Array.isArray(event.order?.lineItems) ? event.order.lineItems : []\n if (!lines.length) return 0\n const hostRef = deps.firestore().collection('hosts').doc(hostId)\n const products = await productsFor(deps, hostRef, [event.order])\n if (![...products.values()].length) return 0\n const [host, owner] = await Promise.all([hostRef.get(), deps.orgForHost(hostId)])\n const timeZone = resolveSiteTimeZone(\n (owner?.org ?? null) as { timeZone?: string } | null,\n (host.data() ?? null) as { timeZone?: string } | null,\n )\n const dayKey = zonedDayKey(Number(event.order.createdAtMs ?? deps.now()), timeZone)\n const due = dueCheckInsForOrder({ orderId, order: event.order, products, dayKey })\n if (!due.size) return 0\n return createMissing(hostRef.collection('checkIns'), due, new Set(), deps.now())\n}\n\nlet subscribed = false\n\n/** Writes a register sale's check-ins as it completes. Never throws into the sale. */\nexport function registerPosSaleCheckIns(): void {\n if (subscribed) return\n subscribed = true\n onPosSaleCompleted(async (event) => {\n try {\n await recordSaleCheckIns(defaultPosOpsDeps(), event)\n } catch (error) {\n console.error('[pos-check-in] sale check-ins not written', event.orderId, error)\n }\n })\n}\n\n/*==========================================\n * THE ROUTE\n *=========================================*/\n\nconst rowOf = (doc: FirebaseFirestore.DocumentSnapshot): CheckInRow =>\n ({ ...(doc.data() as HostCheckIn), id: doc.id })\n\n/** Who checks people in: the member a PIN put at the register, else the signed-in one. */\nasync function checkerOf(\n deps: PosOpsDeps,\n staff: PosOpsStaff,\n body: Record<string, any>,\n): Promise<{ uid: string; name: string }> {\n const registerId = posOpsCleanId(body['registerId'])\n const uid = registerId\n ? (await resolvePosCashier(deps, staff, registerId, body['cashierAssertion'])).cashierId\n : staff.uid\n return { uid, name: await deps.memberName(uid) }\n}\n\nexport async function handlePosCheckIn(deps: PosOpsDeps, req: PluginApiRequest): Promise<Outcome> {\n if (req.method === 'GET') return handleDayList(deps, req)\n if (req.method !== 'POST') return { status: 405, body: { error: 'Method not allowed' } }\n const body = posOpsBody(req)\n const gate = await authorizePosOps(deps, req, body['hostId'])\n if ('error' in gate) return { status: gate.status, body: { error: gate.error } }\n const staff = gate.staff\n const checkIns = staff.hostRef.collection('checkIns')\n const action = String(body['action'] ?? '')\n\n switch (action) {\n case 'search': {\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, body['day'])\n if ('error' in day) return { status: 400, body: { error: day.error } }\n const text = String(body['text'] ?? '').trim().slice(0, 120)\n const token = checkInSearchToken(text)\n if (text.length < 2 || !token) {\n return { status: 200, body: { dayKey: day.dayKey, timeZone: day.timeZone, customers: [] } }\n }\n await reconcileCheckInDay(deps, staff.hostRef, day)\n const snapshot = await checkIns\n .where('dayKey', '==', day.dayKey)\n .where('searchTokens', 'array-contains', token)\n .limit(CHECK_IN_SEARCH_ROWS)\n .get()\n return {\n status: 200,\n body: {\n dayKey: day.dayKey,\n timeZone: day.timeZone,\n customers: checkInCustomers(snapshot.docs.map(rowOf)).slice(0, CHECK_IN_SEARCH_CUSTOMERS),\n },\n }\n }\n\n case 'customer': {\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, body['day'])\n if ('error' in day) return { status: 400, body: { error: day.error } }\n const typedKey = String(body['customerKey'] ?? '').trim().slice(0, 300)\n const customerKey =\n typedKey ||\n checkInCustomerKey({\n email: String(body['email'] ?? '').slice(0, 200),\n contactId: posOpsCleanId(body['contactId']) || null,\n fallback: '',\n })\n if (!customerKey) {\n return { status: 400, body: { error: 'Choose a customer.' } }\n }\n // The register's customer panel asks on every customer it attaches\n // (`reconcile: 'if-used'`), so it brings the day in line only on a day\n // the window is already checking people in.\n if (body['reconcile'] !== false) {\n await reconcileCheckInDay(deps, staff.hostRef, day, { onlyIfUsed: body['reconcile'] === 'if-used' })\n }\n const snapshot = await checkIns\n .where('dayKey', '==', day.dayKey)\n .where('customerKey', '==', customerKey)\n .limit(CHECK_IN_DAY_CEILING)\n .get()\n const rows = sortCheckInRows(snapshot.docs.map(rowOf))\n return {\n status: 200,\n body: {\n dayKey: day.dayKey,\n timeZone: day.timeZone,\n customer: checkInCustomers(rows)[0] ?? null,\n checkIns: rows,\n },\n }\n }\n\n case 'check_in': {\n const entries = Array.isArray(body['checkIns']) ? (body['checkIns'] as unknown[]) : []\n if (!entries.length) return { status: 400, body: { error: 'Choose who to check in.' } }\n if (entries.length > CHECK_IN_BATCH_MAX) {\n return { status: 400, body: { error: `Check in ${CHECK_IN_BATCH_MAX} people or fewer at a time.` } }\n }\n const wanted = new Map<string, CheckInWristband | null>()\n for (const entry of entries) {\n const id = cleanCheckInId((entry as Record<string, unknown>)?.['id'])\n if (!id) return { status: 400, body: { error: 'That is not a check-in.' } }\n const wristband = normalizeWristband((entry as Record<string, unknown>)['wristband'])\n if ('error' in wristband) return { status: 400, body: { error: wristband.error } }\n wanted.set(id, wristband.wristband)\n }\n const attempt = posOpsIdempotencyKey(req) || null\n const checker = await checkerOf(deps, staff, body)\n const nowMs = deps.now()\n const outcome = await deps.firestore().runTransaction(async (transaction) => {\n const done: CheckInRow[] = []\n const already: CheckInRow[] = []\n const missing: string[] = []\n const writes: Array<{ ref: FirebaseFirestore.DocumentReference; patch: Partial<HostCheckIn> }> = []\n for (const [id, wristband] of wanted) {\n const ref = checkIns.doc(id)\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) {\n missing.push(id)\n continue\n }\n const row = rowOf(snapshot)\n if (row.status === 'checked_in') {\n if (attempt && row.checkInAttempt === attempt) done.push(row)\n else already.push(row)\n continue\n }\n const patch: Partial<HostCheckIn> = {\n status: 'checked_in',\n checkedInAtMs: nowMs,\n checkedInBy: checker.uid,\n checkedInByName: checker.name,\n wristband,\n checkInAttempt: attempt,\n updatedAtMs: nowMs,\n }\n writes.push({ ref, patch })\n done.push({ ...row, ...patch })\n }\n for (const write of writes) transaction.update(write.ref, write.patch)\n return { done, already, missing }\n })\n if (outcome.missing.length && !outcome.done.length && !outcome.already.length) {\n return { status: 404, body: { error: 'That check-in is no longer due.' } }\n }\n return {\n status: 200,\n body: { checkedIn: outcome.done, alreadyCheckedIn: outcome.already, missing: outcome.missing },\n }\n }\n\n case 'undo':\n case 'wristband': {\n const id = cleanCheckInId(body['id'])\n if (!id) return { status: 400, body: { error: 'That is not a check-in.' } }\n let wristband: CheckInWristband | null = null\n if (action === 'wristband') {\n const parsed = normalizeWristband(body['wristband'])\n if ('error' in parsed) return { status: 400, body: { error: parsed.error } }\n wristband = parsed.wristband\n }\n const checker = action === 'undo' ? await checkerOf(deps, staff, body) : null\n const nowMs = deps.now()\n const ref = checkIns.doc(id)\n const outcome = await deps.firestore().runTransaction(async (transaction) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) return { status: 404, error: 'That check-in is no longer due.' } as const\n const row = rowOf(snapshot)\n if (row.status !== 'checked_in') {\n return { status: 409, error: 'They are not checked in yet.' } as const\n }\n const patch: Partial<HostCheckIn> =\n action === 'undo'\n ? {\n status: 'expected',\n checkedInAtMs: null,\n checkedInBy: null,\n checkedInByName: null,\n wristband: null,\n checkInAttempt: null,\n undoneAtMs: nowMs,\n undoneBy: checker?.uid ?? staff.uid,\n updatedAtMs: nowMs,\n }\n : { wristband, updatedAtMs: nowMs }\n transaction.update(ref, patch)\n return { status: 200, row: { ...row, ...patch } } as const\n })\n if ('error' in outcome) return { status: outcome.status, body: { error: outcome.error } }\n return { status: 200, body: { checkIn: outcome.row } }\n }\n\n default:\n return { status: 400, body: { error: 'Unknown action' } }\n }\n}\n\nasync function handleDayList(deps: PosOpsDeps, req: PluginApiRequest): Promise<Outcome> {\n const query = req.query ?? {}\n const gate = await authorizePosOps(deps, req, queryValue(query['hostId']))\n if ('error' in gate) return { status: gate.status, body: { error: gate.error } }\n const format = queryValue(query['format']).toLowerCase()\n if (format && format !== 'json' && format !== 'csv') {\n return { status: 400, body: { error: 'Choose json or csv.' } }\n }\n const { staff } = gate\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, queryValue(query['day']))\n if ('error' in day) return { status: 400, body: { error: day.error } }\n const { truncated } = await reconcileCheckInDay(deps, staff.hostRef, day)\n const snapshot = await staff.hostRef\n .collection('checkIns')\n .where('dayKey', '==', day.dayKey)\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get()\n const rows = sortCheckInRows(snapshot.docs.slice(0, CHECK_IN_DAY_CEILING).map(rowOf))\n if (format === 'csv') {\n return { status: 200, csv: checkInDayCsv(rows, day.timeZone), filename: `check-ins-${day.dayKey}.csv` }\n }\n return {\n status: 200,\n body: {\n dayKey: day.dayKey,\n timeZone: day.timeZone,\n totals: checkInDayTotals(rows),\n checkIns: rows,\n truncated: truncated || snapshot.docs.length > CHECK_IN_DAY_CEILING,\n },\n }\n}\n\nexport function createPosCheckInHandler(deps: () => PosOpsDeps = defaultPosOpsDeps): PluginApiHandler {\n return async (req, res) => {\n try {\n const outcome = await handlePosCheckIn(deps(), req)\n res.setHeader('Cache-Control', 'private, no-store')\n if ('csv' in outcome) {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8')\n res.setHeader('Content-Disposition', `attachment; filename=\"${outcome.filename}\"`)\n return res.status(200).send(outcome.csv)\n }\n return res.status(outcome.status).json(outcome.body)\n } catch (error) {\n console.error('[pos-check-in] failed', error)\n return res.status(500).json({ error: 'Check-in failed. Try again.' })\n }\n }\n}\n\nexport const posCheckInHandler = createPosCheckInHandler()\n"],"names":["resolveSiteTimeZone","zonedDayKey","changedCheckInCustomerFields","checkInCustomerKey","checkInCustomers","checkInDayCsv","checkInDayMs","checkInDayTotals","checkInSearchToken","CHECK_IN_BATCH_MAX","CHECK_IN_DAY_CEILING","CHECK_IN_SEARCH_CUSTOMERS","CHECK_IN_SEARCH_ROWS","dueCheckInsForOrder","dueCheckInsForReservation","newCheckInDocument","normalizeWristband","sortCheckInRows","posDayReportRange","authorizePosOps","defaultPosOpsDeps","posOpsBody","posOpsCleanId","posOpsIdempotencyKey","resolvePosCashier","onPosSaleCompleted","CHECK_IN_RECONCILE_MS","STAY_LOOKBACK_MS","queryValue","value","String","Array","isArray","trim","cleanCheckInId","id","test","readCheckInDay","deps","hostRef","org","rawDay","host","get","timeZone","data","day","range","from","to","nowMs","now","ok","error","dayKey","startMs","endMs","readAll","firestore","refs","out","at","length","push","getAll","slice","productsFor","orders","ids","Set","order","line","lineItems","productId","add","snapshots","map","collection","doc","products","Map","snapshot","exists","set","isAlreadyExists","code","message","createMissing","checkIns","due","existing","missing","filter","has","created","Promise","all","entry","create","reconcileCheckInDay","options","markerRef","force","marker","onlyIfUsed","truncated","Number","dayMs","ordersSnapshot","staysSnapshot","existingSnapshot","where","orderBy","limit","docs","stays","resourceIds","resourceNames","readOrders","readStays","orderId","reservationId","reservation","resourceName","changes","flatMap","stored","status","wanted","sourceRead","source","ref","patch","change","runTransaction","transaction","fresh","update","updatedAtMs","delete","reconciledAtMs","recordSaleCheckIns","event","hostId","lines","values","owner","orgForHost","createdAtMs","size","subscribed","registerPosSaleCheckIns","console","rowOf","checkerOf","staff","body","registerId","uid","cashierId","name","memberName","handlePosCheckIn","req","method","handleDayList","gate","action","text","token","customers","typedKey","customerKey","email","contactId","fallback","rows","customer","entries","wristband","attempt","checker","outcome","done","already","writes","row","checkInAttempt","checkedInAtMs","checkedInBy","checkedInByName","write","checkedIn","alreadyCheckedIn","parsed","undoneAtMs","undoneBy","checkIn","query","format","toLowerCase","csv","filename","totals","createPosCheckInHandler","res","setHeader","send","json","posCheckInHandler"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-check-in.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 { resolveSiteTimeZone } from '@aglyn/aglyn/app-utils/collection-entry-date'\nimport { zonedDayKey } from '@aglyn/shared-util-timestamp/zoned-time'\nimport type { PluginApiHandler, PluginApiRequest } from '@aglyn/aglyn/server'\nimport {\n changedCheckInCustomerFields,\n checkInCustomerKey,\n checkInCustomers,\n checkInDayCsv,\n checkInDayMs,\n checkInDayTotals,\n checkInSearchToken,\n CHECK_IN_BATCH_MAX,\n CHECK_IN_DAY_CEILING,\n CHECK_IN_SEARCH_CUSTOMERS,\n CHECK_IN_SEARCH_ROWS,\n dueCheckInsForOrder,\n dueCheckInsForReservation,\n newCheckInDocument,\n normalizeWristband,\n rainCheckProblem,\n sortCheckInRows,\n type CheckInRainCheck,\n type CheckInRow,\n type CheckInWristband,\n type DueCheckIn,\n type HostCheckIn,\n STAY_CHECK_IN_SETTINGS_DOC,\n storedStayCheckIns,\n} from '../model/commerce-check-in'\nimport { posDayReportRange } from '../model/commerce-pos-day-report'\nimport type { HostOrder } from '../model/commerce-orders'\nimport {\n readStayCheckInMode as readStayCheckInModeValue,\n stayChecksInPerGuest,\n STAY_CHECK_IN_MODES,\n type HostResource,\n type StayCheckInMode,\n} from '../model/commerce-reservations'\nimport {\n authorizePosOps,\n defaultPosOpsDeps,\n posOpsBody,\n posOpsCleanId,\n posOpsIdempotencyKey,\n resolvePosCashier,\n type PosOpsDeps,\n type PosOpsStaff,\n} from './pos-ops-gate'\nimport { onPosSaleCompleted, type PosSaleCompletedEvent } from './pos-sale'\n\n/*==========================================\n * CHECK-IN AT THE WINDOW (AGL-4043): `/api/commerce/pos-check-in`.\n *\n * POST { hostId, action: 'search', text, day? }\n * POST { hostId, action: 'customer', customerKey | email | contactId, day?, reconcile?: false | 'if-used' }\n * POST { hostId, action: 'check_in', checkIns: [{ id, wristband? }], registerId?, cashierAssertion? }\n * POST { hostId, action: 'undo', id }\n * POST { hostId, action: 'wristband', id, wristband }\n * POST { hostId, action: 'stay_mode', mode: 'resource' | 'stay' | 'guest', day? }\n * POST { hostId, action: 'rain_check', id, kind: 'open' | 'date', day? }\n * POST { hostId, action: 'undo_rain_check', id }\n * GET ?hostId=…&day=YYYY-MM-DD[&format=csv] the day's list\n *\n * `day` is today in the site's time zone when absent. Who may use it is who\n * may work the register (`authorizePosOps`). A check-in is idempotent on the\n * `Idempotency-Key` header: a retried tap answers the check-in it made, not\n * \"already checked in\".\n *\n * WHAT IS DUE is written down, not filtered at read: each due person is a\n * `checkIns` document (see `model/commerce-check-in.ts`), so a search is a\n * query on `dayKey ==` and `searchTokens array-contains` with an index. The\n * documents are written from their sources:\n *\n * - a register sale, the moment it completes (the sale-completed seam);\n * - and every source, by {@link reconcileCheckInDay}: the day's orders\n * (`createdAtMs` in the day, the automatic single-field index), the\n * orders bought on another day for this one (`useDayKeys array-contains`\n * the day, likewise automatic) and the stays that began within a year\n * before it (`checkInDayMs`, likewise), at most every\n * {@link CHECK_IN_RECONCILE_MS} per day, on the next search or list. So\n * an online order paid a minute ago is found on the next search after\n * that.\n *\n * RAIN CHECKS (`rain_check`, `undo_rain_check`) move one person's pass to a\n * later day, or leave it open for any later day; an open one is found on a\n * later day by `rainCheckOpen == true` and `dayKey <` the day, beside the\n * day's own (indexes: rainCheckOpen, searchTokens, dayKey; and\n * rainCheckOpen, customerKey, dayKey). Checking in an open one claims it on\n * the day it is used. Each is a transaction on the one document, gated as\n * check-in is.\n *\n * Reconciling only ever CREATES what is missing, refreshes a waiting\n * person's name and address, and removes a waiting person whose order was\n * refunded or cancelled. A checked-in person is never touched: each change\n * to an existing document is a transaction that re-reads it first.\n *=========================================*/\n\n/** How stale a day's reconcile may be before a search or the list redoes it. */\nexport const CHECK_IN_RECONCILE_MS = 30_000\n\n/** How far back a stay may have begun and still cover the day. */\nconst STAY_LOOKBACK_MS = 366 * 86_400_000\n\ntype Outcome =\n | { status: number; body: Record<string, unknown> }\n | { status: 200; csv: string; filename: string }\n\nconst queryValue = (value: unknown): string =>\n String(Array.isArray(value) ? (value[0] ?? '') : (value ?? '')).trim()\n\n/** A check-in id as the routes accept one. */\nfunction cleanCheckInId(value: unknown): string {\n const id = String(value ?? '').trim()\n return /^[or]_[A-Za-z0-9_-]{1,300}$/.test(id) ? id : ''\n}\n\nexport interface CheckInDay {\n dayKey: string\n startMs: number\n endMs: number\n timeZone: string\n}\n\n/** The day asked for, in the site's zone; today there when absent. */\nexport async function readCheckInDay(\n deps: PosOpsDeps,\n hostRef: FirebaseFirestore.DocumentReference,\n org: Record<string, any> | null,\n rawDay: unknown,\n): Promise<({ ok: true } & CheckInDay) | { ok: false; error: string }> {\n const host = await hostRef.get()\n const timeZone = resolveSiteTimeZone(\n org as { timeZone?: string } | null,\n (host.data() ?? null) as { timeZone?: string } | null,\n )\n const day = String(rawDay ?? '').trim()\n const range = posDayReportRange({ from: day, to: day, nowMs: deps.now(), timeZone })\n if ('error' in range) return { ok: false, error: 'Choose the day as YYYY-MM-DD.' }\n return { ok: true, dayKey: range.from, startMs: range.startMs, endMs: range.endMs, timeZone }\n}\n\n// Where the store's stay check-in control lives, beside the rules that read it.\nexport { STAY_CHECK_IN_SETTINGS_DOC }\n\n/** The store's control for how stays are checked in; each resource's own setting when unset. */\nexport async function readStayCheckInMode(hostRef: FirebaseFirestore.DocumentReference): Promise<StayCheckInMode> {\n const snapshot = await hostRef.collection('settings').doc(STAY_CHECK_IN_SETTINGS_DOC).get()\n return readStayCheckInModeValue(snapshot.exists ? snapshot.get('stays') : undefined)\n}\n\n/** Reads documents by reference, a few hundred at a time. */\nasync function readAll(\n firestore: FirebaseFirestore.Firestore,\n refs: FirebaseFirestore.DocumentReference[],\n): Promise<FirebaseFirestore.DocumentSnapshot[]> {\n const out: FirebaseFirestore.DocumentSnapshot[] = []\n for (let at = 0; at < refs.length; at += 300) {\n out.push(...(await firestore.getAll(...refs.slice(at, at + 300))))\n }\n return out\n}\n\n/** The products an order set names, as stored now. */\nasync function productsFor(\n deps: PosOpsDeps,\n hostRef: FirebaseFirestore.DocumentReference,\n orders: ReadonlyArray<Partial<HostOrder>>,\n): Promise<Map<string, Record<string, any>>> {\n const ids = new Set<string>()\n for (const order of orders) {\n for (const line of Array.isArray(order.lineItems) ? order.lineItems : []) {\n if (line?.productId && posOpsCleanId(line.productId)) ids.add(line.productId)\n }\n }\n const snapshots = await readAll(\n deps.firestore(),\n [...ids].map((id) => hostRef.collection('products').doc(id)),\n )\n const products = new Map<string, Record<string, any>>()\n for (const snapshot of snapshots) {\n if (snapshot.exists) products.set(snapshot.id, (snapshot.data() ?? {}) as Record<string, any>)\n }\n return products\n}\n\nconst isAlreadyExists = (error: unknown): boolean => {\n const code = (error as { code?: unknown })?.code\n return code === 6 || code === 'already-exists' || /ALREADY_EXISTS/.test(String((error as Error)?.message))\n}\n\n/** Creates the due check-ins that are missing; an existing one is left exactly as it is. */\nasync function createMissing(\n checkIns: FirebaseFirestore.CollectionReference,\n due: ReadonlyMap<string, DueCheckIn>,\n existing: ReadonlySet<string>,\n nowMs: number,\n): Promise<number> {\n const missing = [...due].filter(([id]) => !existing.has(id))\n let created = 0\n for (let at = 0; at < missing.length; at += 100) {\n await Promise.all(\n missing.slice(at, at + 100).map(async ([id, entry]) => {\n try {\n await checkIns.doc(id).create(newCheckInDocument(entry, nowMs))\n created += 1\n } catch (error) {\n // Another device wrote it first, which is the same document.\n if (!isAlreadyExists(error)) throw error\n }\n }),\n )\n }\n return created\n}\n\n/**\n * Brings a day's check-ins in line with its orders and stays, at most every\n * {@link CHECK_IN_RECONCILE_MS} unless `force`. Answers whether a source\n * held more than one day reads.\n */\nexport async function reconcileCheckInDay(\n deps: PosOpsDeps,\n hostRef: FirebaseFirestore.DocumentReference,\n day: CheckInDay,\n options: { force?: boolean; onlyIfUsed?: boolean } = {},\n): Promise<{ truncated: boolean }> {\n const nowMs = deps.now()\n const markerRef = hostRef.collection('checkInDays').doc(day.dayKey)\n if (!options.force) {\n const marker = await markerRef.get()\n // A day nobody has checked anyone in on yet is left alone by a caller\n // that only asks in passing: a store that never checks anybody in pays\n // nothing for the register's customer panel.\n if (!marker.exists && options.onlyIfUsed) return { truncated: false }\n if (marker.exists && nowMs - Number(marker.get('reconciledAtMs') ?? 0) < CHECK_IN_RECONCILE_MS) {\n return { truncated: marker.get('truncated') === true }\n }\n }\n const dayMs = checkInDayMs(day.dayKey) ?? 0\n const checkIns = hostRef.collection('checkIns')\n const [ordersSnapshot, forTheDaySnapshot, staysSnapshot, existingSnapshot] = await Promise.all([\n hostRef\n .collection('orders')\n .where('createdAtMs', '>=', day.startMs)\n .where('createdAtMs', '<', day.endMs)\n .orderBy('createdAtMs')\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get(),\n // Passes bought on another day for this one: the days the buyer chose,\n // stamped on the order by every creator (`withOrderListFields`).\n hostRef\n .collection('orders')\n .where('useDayKeys', 'array-contains', day.dayKey)\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get(),\n hostRef\n .collection('reservations')\n .where('checkInDayMs', '<=', dayMs)\n .where('checkInDayMs', '>', dayMs - STAY_LOOKBACK_MS)\n .orderBy('checkInDayMs', 'desc')\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get(),\n checkIns.where('dayKey', '==', day.dayKey).limit(CHECK_IN_DAY_CEILING + 1).get(),\n ])\n const truncated =\n ordersSnapshot.docs.length > CHECK_IN_DAY_CEILING ||\n forTheDaySnapshot.docs.length > CHECK_IN_DAY_CEILING ||\n staysSnapshot.docs.length > CHECK_IN_DAY_CEILING ||\n existingSnapshot.docs.length > CHECK_IN_DAY_CEILING\n const orders = [\n ...new Map(\n [...ordersSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING), ...forTheDaySnapshot.docs.slice(0, CHECK_IN_DAY_CEILING)].map(\n (doc) => [doc.id, doc] as const,\n ),\n ).values(),\n ]\n const stays = staysSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING)\n\n const products = await productsFor(\n deps,\n hostRef,\n orders.map((doc) => doc.data() as Partial<HostOrder>),\n )\n const resourceIds = [\n ...new Set(stays.map((doc) => String(doc.get('resourceId') ?? '')).filter((id) => posOpsCleanId(id))),\n ]\n const resourceNames = new Map<string, string>()\n const perGuestResources = new Set<string>()\n // How stays are checked in (AGL-4043): the store's control, else each\n // resource's own setting. Read only on a day with stays to check in.\n const stayMode = stays.length ? await readStayCheckInMode(hostRef) : 'resource'\n for (const snapshot of await readAll(\n deps.firestore(),\n resourceIds.map((id) => hostRef.collection('resources').doc(id)),\n )) {\n if (!snapshot.exists) continue\n resourceNames.set(snapshot.id, String(snapshot.get('name') ?? ''))\n if (stayChecksInPerGuest(snapshot.data() as HostResource, stayMode)) perGuestResources.add(snapshot.id)\n }\n\n const due = new Map<string, DueCheckIn>()\n // Every unit the orders read still owe, on whatever day: a pass moved here\n // or away by a rain check, or bought for another day, is owed but not due\n // today, and a waiting one is removed only when its order no longer owes it.\n const owed = new Set<string>()\n const readOrders = new Set<string>()\n const readStays = new Set<string>()\n for (const doc of orders) {\n readOrders.add(doc.id)\n const order = doc.data() as Partial<HostOrder>\n for (const [id, entry] of dueCheckInsForOrder({\n orderId: doc.id,\n order,\n products,\n // The day it was bought, on the site's calendar: the day a line the\n // buyer chose no day for is due.\n purchaseDayKey: zonedDayKey(Number(order.createdAtMs ?? day.startMs), day.timeZone),\n })) {\n owed.add(id)\n if (entry.dayKey === day.dayKey) due.set(id, entry)\n }\n }\n // Each stay's check-ins already stored on the day: a guest checked in keeps\n // their place when the stay's count comes down (`stayCheckInPlan`).\n const storedByStay = storedStayCheckIns(existingSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING))\n for (const doc of stays) {\n readStays.add(doc.id)\n const resourceId = String(doc.get('resourceId') ?? '')\n for (const [id, entry] of dueCheckInsForReservation({\n reservationId: doc.id,\n reservation: doc.data() as Record<string, any>,\n resourceName: resourceNames.get(resourceId) ?? null,\n dayKey: day.dayKey,\n // A resource gone since the stay was booked is checked in once per stay.\n perGuest: perGuestResources.has(resourceId) || (stayMode === 'guest' && !resourceNames.has(resourceId)),\n existing: storedByStay.get(doc.id) ?? [],\n })) {\n owed.add(id)\n due.set(id, entry)\n }\n }\n\n const existing = new Set(existingSnapshot.docs.map((doc) => doc.id))\n await createMissing(checkIns, due, existing, nowMs)\n\n // A waiting person whose source this pass READ and no longer finds due\n // goes; one whose name or address changed is refreshed. Each re-reads its\n // document in a transaction, so a check-in made meanwhile stands.\n const changes = existingSnapshot.docs.slice(0, CHECK_IN_DAY_CEILING).flatMap((doc) => {\n const stored = doc.data() as Partial<HostCheckIn>\n if (stored.status !== 'expected') return []\n const wanted = due.get(doc.id)\n if (!wanted) {\n const sourceRead =\n (stored.source === 'order' && stored.orderId && readOrders.has(stored.orderId)) ||\n (stored.source === 'reservation' && stored.reservationId && readStays.has(stored.reservationId))\n return sourceRead && !owed.has(doc.id) ? [{ ref: doc.ref, patch: null }] : []\n }\n const patch = changedCheckInCustomerFields(stored, wanted)\n return patch ? [{ ref: doc.ref, patch }] : []\n })\n const firestore = deps.firestore()\n for (const change of changes) {\n await firestore.runTransaction(async (transaction) => {\n const fresh = await transaction.get(change.ref)\n if (!fresh.exists || fresh.get('status') !== 'expected') return\n if (change.patch) transaction.update(change.ref, { ...change.patch, updatedAtMs: nowMs })\n else transaction.delete(change.ref)\n })\n }\n await markerRef.set({ dayKey: day.dayKey, reconciledAtMs: nowMs, truncated })\n return { truncated }\n}\n\n/**\n * The check-ins a register sale makes, written the moment it completes so\n * the person who just paid at the window is found on the next search. The\n * day is the sale's own, in the site's zone.\n */\nexport async function recordSaleCheckIns(deps: PosOpsDeps, event: PosSaleCompletedEvent): Promise<number> {\n const hostId = posOpsCleanId(event.hostId)\n const orderId = posOpsCleanId(event.orderId)\n if (!hostId || !orderId) return 0\n const lines = Array.isArray(event.order?.lineItems) ? event.order.lineItems : []\n if (!lines.length) return 0\n const hostRef = deps.firestore().collection('hosts').doc(hostId)\n const products = await productsFor(deps, hostRef, [event.order])\n if (![...products.values()].length) return 0\n const [host, owner] = await Promise.all([hostRef.get(), deps.orgForHost(hostId)])\n const timeZone = resolveSiteTimeZone(\n (owner?.org ?? null) as { timeZone?: string } | null,\n (host.data() ?? null) as { timeZone?: string } | null,\n )\n const purchaseDayKey = zonedDayKey(Number(event.order.createdAtMs ?? deps.now()), timeZone)\n const due = dueCheckInsForOrder({ orderId, order: event.order, products, purchaseDayKey })\n if (!due.size) return 0\n return createMissing(hostRef.collection('checkIns'), due, new Set(), deps.now())\n}\n\nlet subscribed = false\n\n/** Writes a register sale's check-ins as it completes. Never throws into the sale. */\nexport function registerPosSaleCheckIns(): void {\n if (subscribed) return\n subscribed = true\n onPosSaleCompleted(async (event) => {\n try {\n await recordSaleCheckIns(defaultPosOpsDeps(), event)\n } catch (error) {\n console.error('[pos-check-in] sale check-ins not written', event.orderId, error)\n }\n })\n}\n\n/*==========================================\n * THE ROUTE\n *=========================================*/\n\nconst rowOf = (doc: FirebaseFirestore.DocumentSnapshot): CheckInRow =>\n ({ ...(doc.data() as HostCheckIn), id: doc.id })\n\n/**\n * The open rain checks from days before `dayKey` that also match `field`:\n * passes good on any later day, which a later day's search and customer\n * lookup offer beside the day's own (`rainCheckOpen`, the field, `dayKey`).\n */\nfunction openRainChecks(\n checkIns: FirebaseFirestore.CollectionReference,\n dayKey: string,\n field: { name: 'searchTokens'; token: string } | { name: 'customerKey'; key: string },\n ceiling: number,\n): Promise<FirebaseFirestore.QuerySnapshot> {\n const open = checkIns.where('rainCheckOpen', '==', true)\n const matched =\n field.name === 'searchTokens'\n ? open.where('searchTokens', 'array-contains', field.token)\n : open.where('customerKey', '==', field.key)\n return matched.where('dayKey', '<', dayKey).limit(ceiling).get()\n}\n\n/** The rows of several snapshots, each once. */\nfunction uniqueRows(...snapshots: FirebaseFirestore.QuerySnapshot[]): CheckInRow[] {\n const rows = new Map<string, CheckInRow>()\n for (const snapshot of snapshots) for (const doc of snapshot.docs) rows.set(doc.id, rowOf(doc))\n return [...rows.values()]\n}\n\n/** Who checks people in: the member a PIN put at the register, else the signed-in one. */\nasync function checkerOf(\n deps: PosOpsDeps,\n staff: PosOpsStaff,\n body: Record<string, any>,\n): Promise<{ uid: string; name: string }> {\n const registerId = posOpsCleanId(body['registerId'])\n const uid = registerId\n ? (await resolvePosCashier(deps, staff, registerId, body['cashierAssertion'])).cashierId\n : staff.uid\n return { uid, name: await deps.memberName(uid) }\n}\n\nexport async function handlePosCheckIn(deps: PosOpsDeps, req: PluginApiRequest): Promise<Outcome> {\n if (req.method === 'GET') return handleDayList(deps, req)\n if (req.method !== 'POST') return { status: 405, body: { error: 'Method not allowed' } }\n const body = posOpsBody(req)\n const gate = await authorizePosOps(deps, req, body['hostId'])\n if ('error' in gate) return { status: gate.status, body: { error: gate.error } }\n const staff = gate.staff\n const checkIns = staff.hostRef.collection('checkIns')\n const action = String(body['action'] ?? '')\n\n switch (action) {\n case 'search': {\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, body['day'])\n if ('error' in day) return { status: 400, body: { error: day.error } }\n const text = String(body['text'] ?? '').trim().slice(0, 120)\n const token = checkInSearchToken(text)\n if (text.length < 2 || !token) {\n return { status: 200, body: { dayKey: day.dayKey, timeZone: day.timeZone, customers: [] } }\n }\n await reconcileCheckInDay(deps, staff.hostRef, day)\n const [snapshot, rainChecks] = await Promise.all([\n checkIns\n .where('dayKey', '==', day.dayKey)\n .where('searchTokens', 'array-contains', token)\n .limit(CHECK_IN_SEARCH_ROWS)\n .get(),\n openRainChecks(checkIns, day.dayKey, { name: 'searchTokens', token }, CHECK_IN_SEARCH_ROWS),\n ])\n return {\n status: 200,\n body: {\n dayKey: day.dayKey,\n timeZone: day.timeZone,\n customers: checkInCustomers(uniqueRows(snapshot, rainChecks)).slice(0, CHECK_IN_SEARCH_CUSTOMERS),\n },\n }\n }\n\n case 'customer': {\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, body['day'])\n if ('error' in day) return { status: 400, body: { error: day.error } }\n const typedKey = String(body['customerKey'] ?? '').trim().slice(0, 300)\n const customerKey =\n typedKey ||\n checkInCustomerKey({\n email: String(body['email'] ?? '').slice(0, 200),\n contactId: posOpsCleanId(body['contactId']) || null,\n fallback: '',\n })\n if (!customerKey) {\n return { status: 400, body: { error: 'Choose a customer.' } }\n }\n // The register's customer panel asks on every customer it attaches\n // (`reconcile: 'if-used'`), so it brings the day in line only on a day\n // the window is already checking people in.\n if (body['reconcile'] !== false) {\n await reconcileCheckInDay(deps, staff.hostRef, day, { onlyIfUsed: body['reconcile'] === 'if-used' })\n }\n const [snapshot, rainChecks] = await Promise.all([\n checkIns\n .where('dayKey', '==', day.dayKey)\n .where('customerKey', '==', customerKey)\n .limit(CHECK_IN_DAY_CEILING)\n .get(),\n openRainChecks(checkIns, day.dayKey, { name: 'customerKey', key: customerKey }, CHECK_IN_SEARCH_ROWS),\n ])\n const rows = sortCheckInRows(uniqueRows(snapshot, rainChecks))\n return {\n status: 200,\n body: {\n dayKey: day.dayKey,\n timeZone: day.timeZone,\n customer: checkInCustomers(rows)[0] ?? null,\n checkIns: rows,\n },\n }\n }\n\n case 'check_in': {\n const entries = Array.isArray(body['checkIns']) ? (body['checkIns'] as unknown[]) : []\n if (!entries.length) return { status: 400, body: { error: 'Choose who to check in.' } }\n if (entries.length > CHECK_IN_BATCH_MAX) {\n return { status: 400, body: { error: `Check in ${CHECK_IN_BATCH_MAX} people or fewer at a time.` } }\n }\n const wanted = new Map<string, CheckInWristband | null>()\n for (const entry of entries) {\n const id = cleanCheckInId((entry as Record<string, unknown>)?.['id'])\n if (!id) return { status: 400, body: { error: 'That is not a check-in.' } }\n const wristband = normalizeWristband((entry as Record<string, unknown>)['wristband'])\n if ('error' in wristband) return { status: 400, body: { error: wristband.error } }\n wanted.set(id, wristband.wristband)\n }\n const attempt = posOpsIdempotencyKey(req) || null\n const checker = await checkerOf(deps, staff, body)\n // The day the window is working: an open rain check checked in is used\n // on it, and moves to it.\n const workingDay = await readCheckInDay(deps, staff.hostRef, staff.org, body['day'])\n if ('error' in workingDay) return { status: 400, body: { error: workingDay.error } }\n const nowMs = deps.now()\n const outcome = await deps.firestore().runTransaction(async (transaction) => {\n const done: CheckInRow[] = []\n const already: CheckInRow[] = []\n const missing: string[] = []\n const writes: Array<{ ref: FirebaseFirestore.DocumentReference; patch: Partial<HostCheckIn> }> = []\n for (const [id, wristband] of wanted) {\n const ref = checkIns.doc(id)\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) {\n missing.push(id)\n continue\n }\n const row = rowOf(snapshot)\n if (row.status === 'checked_in') {\n if (attempt && row.checkInAttempt === attempt) done.push(row)\n else already.push(row)\n continue\n }\n const patch: Partial<HostCheckIn> = {\n status: 'checked_in',\n checkedInAtMs: nowMs,\n checkedInBy: checker.uid,\n checkedInByName: checker.name,\n wristband,\n checkInAttempt: attempt,\n updatedAtMs: nowMs,\n // An open rain check is used today: it leaves the day it waited\n // on for this one, and says when it was claimed.\n ...(row.rainCheckOpen === true && row.rainCheck\n ? {\n dayKey: workingDay.dayKey,\n rainCheckOpen: false,\n rainCheck: { ...row.rainCheck, claimedDayKey: workingDay.dayKey },\n }\n : {}),\n }\n writes.push({ ref, patch })\n done.push({ ...row, ...patch })\n }\n for (const write of writes) transaction.update(write.ref, write.patch)\n return { done, already, missing }\n })\n if (outcome.missing.length && !outcome.done.length && !outcome.already.length) {\n return { status: 404, body: { error: 'That check-in is no longer due.' } }\n }\n return {\n status: 200,\n body: { checkedIn: outcome.done, alreadyCheckedIn: outcome.already, missing: outcome.missing },\n }\n }\n\n case 'undo':\n case 'wristband': {\n const id = cleanCheckInId(body['id'])\n if (!id) return { status: 400, body: { error: 'That is not a check-in.' } }\n let wristband: CheckInWristband | null = null\n if (action === 'wristband') {\n const parsed = normalizeWristband(body['wristband'])\n if ('error' in parsed) return { status: 400, body: { error: parsed.error } }\n wristband = parsed.wristband\n }\n const checker = action === 'undo' ? await checkerOf(deps, staff, body) : null\n const nowMs = deps.now()\n const ref = checkIns.doc(id)\n const outcome = await deps.firestore().runTransaction(async (transaction) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) return { status: 404, error: 'That check-in is no longer due.' } as const\n const row = rowOf(snapshot)\n if (row.status !== 'checked_in') {\n return { status: 409, error: 'They are not checked in yet.' } as const\n }\n // Undoing the check-in of a rain check used today opens it again, on\n // the day it waited on.\n const reopened: Partial<HostCheckIn> =\n row.rainCheck?.kind === 'open' && row.rainCheck.claimedDayKey\n ? {\n dayKey: row.rainCheck.fromDayKey,\n rainCheckOpen: true,\n rainCheck: { ...row.rainCheck, claimedDayKey: null },\n }\n : {}\n const patch: Partial<HostCheckIn> =\n action === 'undo'\n ? {\n status: 'expected',\n checkedInAtMs: null,\n checkedInBy: null,\n checkedInByName: null,\n wristband: null,\n checkInAttempt: null,\n undoneAtMs: nowMs,\n undoneBy: checker?.uid ?? staff.uid,\n updatedAtMs: nowMs,\n ...reopened,\n }\n : { wristband, updatedAtMs: nowMs }\n transaction.update(ref, patch)\n return { status: 200, row: { ...row, ...patch } } as const\n })\n if ('error' in outcome) return { status: outcome.status, body: { error: outcome.error } }\n return { status: 200, body: { checkIn: outcome.row } }\n }\n\n case 'stay_mode': {\n // The store's quick control for stays (AGL-4043): one check-in per\n // stay, one per guest, or each resource's own setting. The day asked\n // for is brought in line at once, so the window sees the change.\n const mode = body['mode']\n if (!(STAY_CHECK_IN_MODES as readonly unknown[]).includes(mode)) {\n return { status: 400, body: { error: 'Choose per resource, one per stay or one per guest.' } }\n }\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, body['day'])\n if ('error' in day) return { status: 400, body: { error: day.error } }\n await staff.hostRef\n .collection('settings')\n .doc(STAY_CHECK_IN_SETTINGS_DOC)\n .set({ stays: mode, updatedAtMs: deps.now(), updatedBy: staff.uid }, { merge: true })\n await reconcileCheckInDay(deps, staff.hostRef, day, { force: true })\n return { status: 200, body: { stayCheckIn: mode, dayKey: day.dayKey } }\n }\n\n case 'rain_check':\n case 'undo_rain_check': {\n const id = cleanCheckInId(body['id'])\n if (!id) return { status: 400, body: { error: 'That is not a check-in.' } }\n const kind = body['kind'] === 'date' ? 'date' : body['kind'] === 'open' ? 'open' : null\n if (action === 'rain_check' && !kind) {\n return { status: 400, body: { error: 'Choose an open rain check or a new day.' } }\n }\n const askedDay = String(body['day'] ?? '').trim()\n // Today on the store's calendar: a pass is never moved to a day that\n // has passed.\n const today = await readCheckInDay(deps, staff.hostRef, staff.org, '')\n if ('error' in today) return { status: 400, body: { error: today.error } }\n const checker = await checkerOf(deps, staff, body)\n const nowMs = deps.now()\n const ref = checkIns.doc(id)\n const outcome = await deps.firestore().runTransaction(async (transaction) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) return { status: 404, error: 'That check-in is no longer due.' } as const\n const row = rowOf(snapshot)\n if (action === 'undo_rain_check') {\n // Nothing to take back: already undone, and a retry says so the same way.\n if (!row.rainCheck) return { status: 200, row } as const\n if (row.status !== 'expected') {\n return { status: 409, error: 'They are already checked in. Undo the check-in first.' } as const\n }\n const patch: Partial<HostCheckIn> = {\n dayKey: row.rainCheck.fromDayKey,\n rainCheck: null,\n rainCheckOpen: false,\n rainCheckUndoneAtMs: nowMs,\n rainCheckUndoneBy: checker.uid,\n updatedAtMs: nowMs,\n }\n transaction.update(ref, patch)\n return { status: 200, row: { ...row, ...patch } } as const\n }\n // The same rain check asked again (a retried tap) answers what it made.\n if (\n row.status === 'expected' &&\n ((kind === 'open' && row.rainCheckOpen === true) ||\n (kind === 'date' && row.rainCheck?.kind === 'date' && row.rainCheck.toDayKey === askedDay))\n ) {\n return { status: 200, row } as const\n }\n const problem = rainCheckProblem(row, { kind: kind!, dayKey: askedDay }, today.dayKey)\n if (problem) return { status: row.status === 'expected' ? 400 : 409, error: problem } as const\n const rainCheck: CheckInRainCheck = {\n kind: kind!,\n fromDayKey: row.dayKey,\n toDayKey: kind === 'date' ? askedDay : null,\n claimedDayKey: null,\n byUid: checker.uid,\n byName: checker.name || null,\n atMs: nowMs,\n }\n const patch: Partial<HostCheckIn> = {\n ...(kind === 'date' ? { dayKey: askedDay } : {}),\n rainCheck,\n rainCheckOpen: kind === 'open',\n updatedAtMs: nowMs,\n }\n transaction.update(ref, patch)\n return { status: 200, row: { ...row, ...patch } } as const\n })\n if ('error' in outcome) return { status: outcome.status, body: { error: outcome.error } }\n return { status: 200, body: { checkIn: outcome.row } }\n }\n\n default:\n return { status: 400, body: { error: 'Unknown action' } }\n }\n}\n\nasync function handleDayList(deps: PosOpsDeps, req: PluginApiRequest): Promise<Outcome> {\n const query = req.query ?? {}\n const gate = await authorizePosOps(deps, req, queryValue(query['hostId']))\n if ('error' in gate) return { status: gate.status, body: { error: gate.error } }\n const format = queryValue(query['format']).toLowerCase()\n if (format && format !== 'json' && format !== 'csv') {\n return { status: 400, body: { error: 'Choose json or csv.' } }\n }\n const { staff } = gate\n const day = await readCheckInDay(deps, staff.hostRef, staff.org, queryValue(query['day']))\n if ('error' in day) return { status: 400, body: { error: day.error } }\n const { truncated } = await reconcileCheckInDay(deps, staff.hostRef, day)\n const snapshot = await staff.hostRef\n .collection('checkIns')\n .where('dayKey', '==', day.dayKey)\n .limit(CHECK_IN_DAY_CEILING + 1)\n .get()\n const [rows, stayCheckIn] = await Promise.all([\n Promise.resolve(sortCheckInRows(snapshot.docs.slice(0, CHECK_IN_DAY_CEILING).map(rowOf))),\n readStayCheckInMode(staff.hostRef),\n ])\n if (format === 'csv') {\n return { status: 200, csv: checkInDayCsv(rows, day.timeZone), filename: `check-ins-${day.dayKey}.csv` }\n }\n return {\n status: 200,\n body: {\n dayKey: day.dayKey,\n timeZone: day.timeZone,\n totals: checkInDayTotals(rows),\n checkIns: rows,\n // How stays are checked in, for the screen's quick control.\n stayCheckIn,\n truncated: truncated || snapshot.docs.length > CHECK_IN_DAY_CEILING,\n },\n }\n}\n\nexport function createPosCheckInHandler(deps: () => PosOpsDeps = defaultPosOpsDeps): PluginApiHandler {\n return async (req, res) => {\n try {\n const outcome = await handlePosCheckIn(deps(), req)\n res.setHeader('Cache-Control', 'private, no-store')\n if ('csv' in outcome) {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8')\n res.setHeader('Content-Disposition', `attachment; filename=\"${outcome.filename}\"`)\n return res.status(200).send(outcome.csv)\n }\n return res.status(outcome.status).json(outcome.body)\n } catch (error) {\n console.error('[pos-check-in] failed', error)\n return res.status(500).json({ error: 'Check-in failed. Try again.' })\n }\n }\n}\n\nexport const posCheckInHandler = createPosCheckInHandler()\n"],"names":["resolveSiteTimeZone","zonedDayKey","changedCheckInCustomerFields","checkInCustomerKey","checkInCustomers","checkInDayCsv","checkInDayMs","checkInDayTotals","checkInSearchToken","CHECK_IN_BATCH_MAX","CHECK_IN_DAY_CEILING","CHECK_IN_SEARCH_CUSTOMERS","CHECK_IN_SEARCH_ROWS","dueCheckInsForOrder","dueCheckInsForReservation","newCheckInDocument","normalizeWristband","rainCheckProblem","sortCheckInRows","STAY_CHECK_IN_SETTINGS_DOC","storedStayCheckIns","posDayReportRange","readStayCheckInMode","readStayCheckInModeValue","stayChecksInPerGuest","STAY_CHECK_IN_MODES","authorizePosOps","defaultPosOpsDeps","posOpsBody","posOpsCleanId","posOpsIdempotencyKey","resolvePosCashier","onPosSaleCompleted","CHECK_IN_RECONCILE_MS","STAY_LOOKBACK_MS","queryValue","value","String","Array","isArray","trim","cleanCheckInId","id","test","readCheckInDay","deps","hostRef","org","rawDay","host","get","timeZone","data","day","range","from","to","nowMs","now","ok","error","dayKey","startMs","endMs","snapshot","collection","doc","exists","undefined","readAll","firestore","refs","out","at","length","push","getAll","slice","productsFor","orders","ids","Set","order","line","lineItems","productId","add","snapshots","map","products","Map","set","isAlreadyExists","code","message","createMissing","checkIns","due","existing","missing","filter","has","created","Promise","all","entry","create","reconcileCheckInDay","options","markerRef","force","marker","onlyIfUsed","truncated","Number","dayMs","ordersSnapshot","forTheDaySnapshot","staysSnapshot","existingSnapshot","where","orderBy","limit","docs","values","stays","resourceIds","resourceNames","perGuestResources","stayMode","owed","readOrders","readStays","orderId","purchaseDayKey","createdAtMs","storedByStay","resourceId","reservationId","reservation","resourceName","perGuest","changes","flatMap","stored","status","wanted","sourceRead","source","ref","patch","change","runTransaction","transaction","fresh","update","updatedAtMs","delete","reconciledAtMs","recordSaleCheckIns","event","hostId","lines","owner","orgForHost","size","subscribed","registerPosSaleCheckIns","console","rowOf","openRainChecks","field","ceiling","open","matched","name","token","key","uniqueRows","rows","checkerOf","staff","body","registerId","uid","cashierId","memberName","handlePosCheckIn","req","method","handleDayList","gate","action","text","customers","rainChecks","typedKey","customerKey","email","contactId","fallback","customer","entries","wristband","attempt","checker","workingDay","outcome","done","already","writes","row","checkInAttempt","checkedInAtMs","checkedInBy","checkedInByName","rainCheckOpen","rainCheck","claimedDayKey","write","checkedIn","alreadyCheckedIn","parsed","reopened","kind","fromDayKey","undoneAtMs","undoneBy","checkIn","mode","includes","updatedBy","merge","stayCheckIn","askedDay","today","rainCheckUndoneAtMs","rainCheckUndoneBy","toDayKey","problem","byUid","byName","atMs","query","format","toLowerCase","resolve","csv","filename","totals","createPosCheckInHandler","res","setHeader","send","json","posCheckInHandler"],"mappings":"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"}
@@ -15,7 +15,7 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
15
15
  * See the License for the specific language governing permissions and
16
16
  * limitations under the License.
17
17
  */ import { resolveSiteTimeZone } from "@aglyn/aglyn/app-utils/collection-entry-date";
18
- import { computePosDayReport, posDayReportCsv, posDayReportRange, POS_DAY_REPORT_RETURNS_CEILING, POS_DAY_REPORT_SALES_CEILING, POS_DAY_REPORT_SHIFTS_CEILING } from "../model/commerce-pos-day-report.js";
18
+ import { computePosDayReport, posDayReportCsv, posDayReportRange, POS_ORDER_REFUNDS_COLLECTION, POS_DAY_REPORT_RETURNS_CEILING, POS_DAY_REPORT_SALES_CEILING, POS_DAY_REPORT_SHIFTS_CEILING } from "../model/commerce-pos-day-report.js";
19
19
  import { authorizePosOps, defaultPosOpsDeps } from "./pos-ops-gate.js";
20
20
  import { readPosShiftReport } from "./pos-shift.js";
21
21
  import { POS_CURRENCY } from "./pos-stripe.js";
@@ -35,6 +35,9 @@ import { POS_CURRENCY } from "./pos-stripe.js";
35
35
  *
36
36
  * orders channel == 'pos', createdAtMs in range (channel ASC, createdAtMs DESC)
37
37
  * returns per register, atMs in range automatic single field
38
+ * refunds per register, atMs in range automatic single field
39
+ * (`orderRefunds`: a register sale refunded from the order dialog
40
+ * or in Stripe, on the day it was given; AGL-4037)
38
41
  * shifts per register, openedAtMs in range automatic single field
39
42
  * shifts per register, closedAtMs in range automatic single field
40
43
  * shifts the open one and those a sale names by id (`getAll`)
@@ -95,12 +98,16 @@ function shiftOf(id, data) {
95
98
  return (_doc_data = doc.data()) != null ? _doc_data : {};
96
99
  });
97
100
  const perRegister = await Promise.all(registers.map(async (register)=>{
98
- const [returnsSnapshot, openedSnapshot, closedSnapshot] = await Promise.all([
101
+ const [returnsSnapshot, refundsSnapshot, openedSnapshot, closedSnapshot] = await Promise.all([
99
102
  register.ref.collection('returns').where('atMs', '>=', startMs).where('atMs', '<', endMs).limit(POS_DAY_REPORT_RETURNS_CEILING + 1).get(),
103
+ // Every other refund of this register's sales, given in the range:
104
+ // from the order dialog or in Stripe (AGL-4037). Read as stored, its
105
+ // amount and tender written when the money went back.
106
+ register.ref.collection(POS_ORDER_REFUNDS_COLLECTION).where('atMs', '>=', startMs).where('atMs', '<', endMs).limit(POS_DAY_REPORT_RETURNS_CEILING + 1).get(),
100
107
  register.ref.collection('shifts').where('openedAtMs', '>=', startMs).where('openedAtMs', '<', endMs).limit(POS_DAY_REPORT_SHIFTS_CEILING + 1).get(),
101
108
  register.ref.collection('shifts').where('closedAtMs', '>=', startMs).where('closedAtMs', '<', endMs).limit(POS_DAY_REPORT_SHIFTS_CEILING + 1).get()
102
109
  ]);
103
- if (returnsSnapshot.docs.length > POS_DAY_REPORT_RETURNS_CEILING || openedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING || closedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING) {
110
+ if (returnsSnapshot.docs.length > POS_DAY_REPORT_RETURNS_CEILING || refundsSnapshot.docs.length > POS_DAY_REPORT_RETURNS_CEILING || openedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING || closedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING) {
104
111
  truncated = true;
105
112
  }
106
113
  const returns = returnsSnapshot.docs.slice(0, POS_DAY_REPORT_RETURNS_CEILING).map((doc)=>{
@@ -123,6 +130,25 @@ function shiftOf(id, data) {
123
130
  })
124
131
  });
125
132
  });
133
+ for (const doc of refundsSnapshot.docs.slice(0, POS_DAY_REPORT_RETURNS_CEILING)){
134
+ var _doc_data, _data_refundedCents;
135
+ const data = (_doc_data = doc.data()) != null ? _doc_data : {};
136
+ const tenders = Array.isArray(data['tenders']) ? data['tenders'] : [];
137
+ returns.push(_extends({
138
+ registerId: register.id
139
+ }, data['cashierId'] ? {
140
+ cashierId: String(data['cashierId'])
141
+ } : {}, {
142
+ refundedCents: Number((_data_refundedCents = data['refundedCents']) != null ? _data_refundedCents : 0),
143
+ tenders: tenders.map((tender)=>{
144
+ var _tender_amountCents;
145
+ return {
146
+ method: tender.method,
147
+ amountCents: Number((_tender_amountCents = tender.amountCents) != null ? _tender_amountCents : 0)
148
+ };
149
+ })
150
+ }));
151
+ }
126
152
  return {
127
153
  register,
128
154
  returns,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-day-report.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolveSiteTimeZone } from '@aglyn/aglyn/app-utils/collection-entry-date'\nimport type { PluginApiHandler, PluginApiRequest } from '@aglyn/aglyn/server'\nimport {\n computePosDayReport,\n posDayReportCsv,\n posDayReportRange,\n POS_DAY_REPORT_RETURNS_CEILING,\n POS_DAY_REPORT_SALES_CEILING,\n POS_DAY_REPORT_SHIFTS_CEILING,\n type PosDayReport,\n type PosDayReturn,\n type PosDaySale,\n type PosDayShift,\n} from '../model/commerce-pos-day-report'\nimport type { PosCashEvent, PosShift } from '../model/commerce-pos-ops'\nimport { authorizePosOps, defaultPosOpsDeps, type PosOpsDeps } from './pos-ops-gate'\nimport { readPosShiftReport } from './pos-shift'\nimport { POS_CURRENCY } from './pos-stripe'\n\n/*==========================================\n * DAY AND EVENT TOTALS (AGL-4037): `GET /api/commerce/pos-day-report`.\n *\n * ?hostId=… the site (required)\n * &from=YYYY-MM-DD the first day; today in the store's zone when absent\n * &to=YYYY-MM-DD the last day, inclusive; `from` when absent; 31 days at most\n * &format=csv the same report as a spreadsheet download\n *\n * Who may read it is who may work the register (`authorizePosOps`): a site\n * admin or editor whose Manage POS permission is on, on a plan with POS. The\n * dispatcher's lockdown gate runs before this, as for every register route.\n *\n * Every read is a query an index serves, never a loaded window filtered here:\n *\n * orders channel == 'pos', createdAtMs in range (channel ASC, createdAtMs DESC)\n * returns per register, atMs in range automatic single field\n * shifts per register, openedAtMs in range automatic single field\n * shifts per register, closedAtMs in range automatic single field\n * shifts the open one and those a sale names by id (`getAll`)\n *\n * The figures are `computePosDayReport`, which is the shift report's own\n * calculator over the range.\n *=========================================*/\n\n/** The most registers a report walks: the console lists 25. */\nconst REGISTERS_CEILING = 50\n\ntype Outcome =\n | { status: number; body: Record<string, unknown> }\n | { status: 200; csv: string; filename: string }\n\nconst queryValue = (value: unknown): string =>\n String(Array.isArray(value) ? (value[0] ?? '') : (value ?? '')).trim()\n\nfunction shiftOf(id: string, data: Record<string, any> | undefined): PosDayShift | null {\n if (!data) return null\n return {\n ...(data as PosShift),\n id,\n status: data['status'] === 'closed' ? 'closed' : 'open',\n openedAtMs: Number(data['openedAtMs'] ?? 0),\n openingFloatCents: Number(data['openingFloatCents'] ?? 0),\n cashEvents: Array.isArray(data['cashEvents']) ? (data['cashEvents'] as PosCashEvent[]) : [],\n }\n}\n\n/** The store's currency (`settings/store.currency`), lower case; the register's when unset. */\nasync function storeCurrency(hostRef: FirebaseFirestore.DocumentReference): Promise<string> {\n const snapshot = await hostRef.collection('settings').doc('store').get().catch(() => null)\n const chosen = String(snapshot?.exists ? (snapshot.get('currency') ?? '') : '')\n .trim()\n .toLowerCase()\n return /^[a-z]{3}$/.test(chosen) ? chosen : POS_CURRENCY\n}\n\n/** Reads the range and computes the report; the route and its specs both call this. */\nexport async function readPosDayReport(\n deps: PosOpsDeps,\n input: {\n hostRef: FirebaseFirestore.DocumentReference\n hostId: string\n org: Record<string, any> | null\n from?: unknown\n to?: unknown\n },\n): Promise<{ ok: true; report: PosDayReport } | { ok: false; status: number; error: string }> {\n const { hostRef } = input\n const [hostSnapshot, currency] = await Promise.all([hostRef.get(), storeCurrency(hostRef)])\n const timeZone = resolveSiteTimeZone(\n input.org as { timeZone?: string } | null,\n (hostSnapshot.data() ?? null) as { timeZone?: string } | null,\n )\n const nowMs = deps.now()\n const range = posDayReportRange({ from: input.from, to: input.to, nowMs, timeZone })\n if ('error' in range) return { ok: false, status: 400, error: range.error }\n const { startMs, endMs } = range\n\n const registersSnapshot = await hostRef.collection('registers').limit(REGISTERS_CEILING).get()\n const registers = registersSnapshot.docs\n const registerNames: Record<string, string> = {}\n for (const register of registers) registerNames[register.id] = String(register.get('name') ?? '')\n\n const salesSnapshot = await hostRef\n .collection('orders')\n .where('channel', '==', 'pos')\n .where('createdAtMs', '>=', startMs)\n .where('createdAtMs', '<', endMs)\n .orderBy('createdAtMs', 'desc')\n .limit(POS_DAY_REPORT_SALES_CEILING + 1)\n .get()\n let truncated = salesSnapshot.docs.length > POS_DAY_REPORT_SALES_CEILING\n const sales = salesSnapshot.docs\n .slice(0, POS_DAY_REPORT_SALES_CEILING)\n .map((doc) => (doc.data() ?? {}) as PosDaySale)\n\n const perRegister = await Promise.all(\n registers.map(async (register) => {\n const [returnsSnapshot, openedSnapshot, closedSnapshot] = await Promise.all([\n register.ref\n .collection('returns')\n .where('atMs', '>=', startMs)\n .where('atMs', '<', endMs)\n .limit(POS_DAY_REPORT_RETURNS_CEILING + 1)\n .get(),\n register.ref\n .collection('shifts')\n .where('openedAtMs', '>=', startMs)\n .where('openedAtMs', '<', endMs)\n .limit(POS_DAY_REPORT_SHIFTS_CEILING + 1)\n .get(),\n register.ref\n .collection('shifts')\n .where('closedAtMs', '>=', startMs)\n .where('closedAtMs', '<', endMs)\n .limit(POS_DAY_REPORT_SHIFTS_CEILING + 1)\n .get(),\n ])\n if (\n returnsSnapshot.docs.length > POS_DAY_REPORT_RETURNS_CEILING ||\n openedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING ||\n closedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING\n ) {\n truncated = true\n }\n const returns: PosDayReturn[] = returnsSnapshot.docs\n .slice(0, POS_DAY_REPORT_RETURNS_CEILING)\n .map((doc) => {\n const data = (doc.data() ?? {}) as Record<string, any>\n const tenders = Array.isArray(data['tenders']) ? data['tenders'] : []\n return {\n registerId: register.id,\n ...(data['cashierId'] ? { cashierId: String(data['cashierId']) } : {}),\n refundedCents: Number(data['refundedCents'] ?? 0),\n // A tender whose refund failed gave nothing back, as on a Z report.\n tenders: tenders\n .filter((tender: any) => tender?.status !== 'failed')\n .map((tender: any) => ({ method: tender.method, amountCents: Number(tender.amountCents ?? 0) })),\n }\n })\n return {\n register,\n returns,\n shiftDocs: [...openedSnapshot.docs, ...closedSnapshot.docs].slice(0, 2 * POS_DAY_REPORT_SHIFTS_CEILING),\n }\n }),\n )\n\n // Every shift in the range, once: opened or closed in it, the open one on\n // each register, and the shift each sale in the range was rung in (a shift\n // that ran across the whole range).\n const shifts = new Map<string, PosDayShift>()\n const keyOf = (registerId: string, shiftId: string) => `${registerId}/${shiftId}`\n for (const entry of perRegister) {\n for (const doc of entry.shiftDocs) {\n const shift = shiftOf(doc.id, doc.data())\n if (shift) shifts.set(keyOf(entry.register.id, doc.id), { ...shift, registerId: entry.register.id })\n }\n }\n const byId: Array<{ registerId: string; shiftId: string }> = []\n for (const register of registers) {\n const openShiftId = String(register.get('openShiftId') ?? '')\n if (openShiftId) byId.push({ registerId: register.id, shiftId: openShiftId })\n }\n for (const sale of sales) {\n if (sale.shiftId && sale.registerId) byId.push({ registerId: sale.registerId, shiftId: sale.shiftId })\n }\n const missing = [\n ...new Map(\n byId\n .filter((ref) => registerNames[ref.registerId] !== undefined && !shifts.has(keyOf(ref.registerId, ref.shiftId)))\n .map((ref) => [keyOf(ref.registerId, ref.shiftId), ref]),\n ).values(),\n ]\n if (missing.length) {\n const firestore = deps.firestore()\n const snapshots = await firestore.getAll(\n ...missing.map((ref) => hostRef.collection('registers').doc(ref.registerId).collection('shifts').doc(ref.shiftId)),\n )\n snapshots.forEach((snapshot, index) => {\n const ref = missing[index]!\n const shift = shiftOf(snapshot.id, snapshot.exists ? snapshot.data() : undefined)\n // The open shift counts only if it began before the range ended.\n if (shift && shift.openedAtMs < endMs) {\n shifts.set(keyOf(ref.registerId, ref.shiftId), { ...shift, registerId: ref.registerId })\n }\n })\n }\n let shiftList = [...shifts.values()].sort((a, b) => a.openedAtMs - b.openedAtMs || a.id.localeCompare(b.id))\n if (shiftList.length > POS_DAY_REPORT_SHIFTS_CEILING) {\n truncated = true\n shiftList = shiftList.slice(-POS_DAY_REPORT_SHIFTS_CEILING)\n }\n\n // An open shift's drawer is read live, through the X report's own reader.\n shiftList = await Promise.all(\n shiftList.map(async (shift) =>\n shift.status === 'open'\n ? {\n ...shift,\n liveReport: await readPosShiftReport(\n hostRef.collection('registers').doc(shift.registerId),\n hostRef,\n shift.id,\n shift,\n ),\n }\n : shift,\n ),\n )\n\n const memberIds = new Set<string>()\n for (const sale of sales) if (sale.cashierId) memberIds.add(String(sale.cashierId))\n for (const entry of perRegister) for (const refund of entry.returns) if (refund.cashierId) memberIds.add(refund.cashierId)\n for (const shift of shiftList) {\n if (!shift.openedByName && shift.openedBy) memberIds.add(shift.openedBy)\n if (!shift.closedByName && shift.closedBy) memberIds.add(shift.closedBy)\n }\n const memberNames: Record<string, string> = {}\n await Promise.all(\n [...memberIds].map(async (uid) => {\n memberNames[uid] = await deps.memberName(uid)\n }),\n )\n\n return {\n ok: true,\n report: computePosDayReport({\n hostId: input.hostId,\n storeName: String(hostSnapshot.get('displayName') ?? ''),\n currency,\n timeZone,\n range,\n generatedAtMs: nowMs,\n sales,\n returns: perRegister.flatMap((entry) => entry.returns),\n shifts: shiftList,\n registerNames,\n memberNames,\n truncated,\n }),\n }\n}\n\nexport async function handlePosDayReport(deps: PosOpsDeps, req: PluginApiRequest): Promise<Outcome> {\n if (req.method !== 'GET') return { status: 405, body: { error: 'Method not allowed' } }\n const query = req.query ?? {}\n const gate = await authorizePosOps(deps, req, queryValue(query['hostId']))\n if ('error' in gate) return { status: gate.status, body: { error: gate.error } }\n const format = queryValue(query['format']).toLowerCase()\n if (format && format !== 'json' && format !== 'csv') {\n return { status: 400, body: { error: 'Choose json or csv.' } }\n }\n const read = await readPosDayReport(deps, {\n hostRef: gate.staff.hostRef,\n hostId: gate.staff.hostId,\n org: gate.staff.org,\n from: queryValue(query['from']),\n to: queryValue(query['to']),\n })\n if ('error' in read) return { status: read.status, body: { error: read.error } }\n if (format === 'csv') {\n const { from, to } = read.report\n return {\n status: 200,\n csv: posDayReportCsv(read.report),\n filename: `day-totals-${from}${to === from ? '' : `-to-${to}`}.csv`,\n }\n }\n return { status: 200, body: { report: read.report } }\n}\n\nexport function createPosDayReportHandler(deps: () => PosOpsDeps = defaultPosOpsDeps): PluginApiHandler {\n return async (req, res) => {\n try {\n const outcome = await handlePosDayReport(deps(), req)\n res.setHeader('Cache-Control', 'private, no-store')\n if ('csv' in outcome) {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8')\n res.setHeader('Content-Disposition', `attachment; filename=\"${outcome.filename}\"`)\n return res.status(200).send(outcome.csv)\n }\n return res.status(outcome.status).json(outcome.body)\n } catch (error) {\n console.error('[pos-day-report] failed', error)\n return res.status(500).json({ error: 'The day totals could not be read' })\n }\n }\n}\n\nexport const posDayReportHandler = createPosDayReportHandler()\n"],"names":["resolveSiteTimeZone","computePosDayReport","posDayReportCsv","posDayReportRange","POS_DAY_REPORT_RETURNS_CEILING","POS_DAY_REPORT_SALES_CEILING","POS_DAY_REPORT_SHIFTS_CEILING","authorizePosOps","defaultPosOpsDeps","readPosShiftReport","POS_CURRENCY","REGISTERS_CEILING","queryValue","value","String","Array","isArray","trim","shiftOf","id","data","status","openedAtMs","Number","openingFloatCents","cashEvents","storeCurrency","hostRef","snapshot","collection","doc","get","catch","chosen","exists","toLowerCase","test","readPosDayReport","deps","input","hostSnapshot","register","currency","Promise","all","timeZone","org","nowMs","now","range","from","to","ok","error","startMs","endMs","registersSnapshot","limit","registers","docs","registerNames","salesSnapshot","where","orderBy","truncated","length","sales","slice","map","perRegister","returnsSnapshot","openedSnapshot","closedSnapshot","ref","returns","tenders","registerId","cashierId","refundedCents","filter","tender","method","amountCents","shiftDocs","shifts","Map","keyOf","shiftId","entry","shift","set","byId","openShiftId","push","sale","missing","undefined","has","values","firestore","snapshots","getAll","forEach","index","shiftList","sort","a","b","localeCompare","liveReport","memberIds","Set","add","refund","openedByName","openedBy","closedByName","closedBy","memberNames","uid","memberName","report","hostId","storeName","generatedAtMs","flatMap","handlePosDayReport","req","body","query","gate","format","read","staff","csv","filename","createPosDayReportHandler","res","outcome","setHeader","send","json","console","posDayReportHandler"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-day-report.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolveSiteTimeZone } from '@aglyn/aglyn/app-utils/collection-entry-date'\nimport type { PluginApiHandler, PluginApiRequest } from '@aglyn/aglyn/server'\nimport {\n computePosDayReport,\n posDayReportCsv,\n posDayReportRange,\n POS_ORDER_REFUNDS_COLLECTION,\n POS_DAY_REPORT_RETURNS_CEILING,\n POS_DAY_REPORT_SALES_CEILING,\n POS_DAY_REPORT_SHIFTS_CEILING,\n type PosDayReport,\n type PosDayReturn,\n type PosDaySale,\n type PosDayShift,\n} from '../model/commerce-pos-day-report'\nimport type { PosCashEvent, PosShift } from '../model/commerce-pos-ops'\nimport { authorizePosOps, defaultPosOpsDeps, type PosOpsDeps } from './pos-ops-gate'\nimport { readPosShiftReport } from './pos-shift'\nimport { POS_CURRENCY } from './pos-stripe'\n\n/*==========================================\n * DAY AND EVENT TOTALS (AGL-4037): `GET /api/commerce/pos-day-report`.\n *\n * ?hostId=… the site (required)\n * &from=YYYY-MM-DD the first day; today in the store's zone when absent\n * &to=YYYY-MM-DD the last day, inclusive; `from` when absent; 31 days at most\n * &format=csv the same report as a spreadsheet download\n *\n * Who may read it is who may work the register (`authorizePosOps`): a site\n * admin or editor whose Manage POS permission is on, on a plan with POS. The\n * dispatcher's lockdown gate runs before this, as for every register route.\n *\n * Every read is a query an index serves, never a loaded window filtered here:\n *\n * orders channel == 'pos', createdAtMs in range (channel ASC, createdAtMs DESC)\n * returns per register, atMs in range automatic single field\n * refunds per register, atMs in range automatic single field\n * (`orderRefunds`: a register sale refunded from the order dialog\n * or in Stripe, on the day it was given; AGL-4037)\n * shifts per register, openedAtMs in range automatic single field\n * shifts per register, closedAtMs in range automatic single field\n * shifts the open one and those a sale names by id (`getAll`)\n *\n * The figures are `computePosDayReport`, which is the shift report's own\n * calculator over the range.\n *=========================================*/\n\n/** The most registers a report walks: the console lists 25. */\nconst REGISTERS_CEILING = 50\n\ntype Outcome =\n | { status: number; body: Record<string, unknown> }\n | { status: 200; csv: string; filename: string }\n\nconst queryValue = (value: unknown): string =>\n String(Array.isArray(value) ? (value[0] ?? '') : (value ?? '')).trim()\n\nfunction shiftOf(id: string, data: Record<string, any> | undefined): PosDayShift | null {\n if (!data) return null\n return {\n ...(data as PosShift),\n id,\n status: data['status'] === 'closed' ? 'closed' : 'open',\n openedAtMs: Number(data['openedAtMs'] ?? 0),\n openingFloatCents: Number(data['openingFloatCents'] ?? 0),\n cashEvents: Array.isArray(data['cashEvents']) ? (data['cashEvents'] as PosCashEvent[]) : [],\n }\n}\n\n/** The store's currency (`settings/store.currency`), lower case; the register's when unset. */\nasync function storeCurrency(hostRef: FirebaseFirestore.DocumentReference): Promise<string> {\n const snapshot = await hostRef.collection('settings').doc('store').get().catch(() => null)\n const chosen = String(snapshot?.exists ? (snapshot.get('currency') ?? '') : '')\n .trim()\n .toLowerCase()\n return /^[a-z]{3}$/.test(chosen) ? chosen : POS_CURRENCY\n}\n\n/** Reads the range and computes the report; the route and its specs both call this. */\nexport async function readPosDayReport(\n deps: PosOpsDeps,\n input: {\n hostRef: FirebaseFirestore.DocumentReference\n hostId: string\n org: Record<string, any> | null\n from?: unknown\n to?: unknown\n },\n): Promise<{ ok: true; report: PosDayReport } | { ok: false; status: number; error: string }> {\n const { hostRef } = input\n const [hostSnapshot, currency] = await Promise.all([hostRef.get(), storeCurrency(hostRef)])\n const timeZone = resolveSiteTimeZone(\n input.org as { timeZone?: string } | null,\n (hostSnapshot.data() ?? null) as { timeZone?: string } | null,\n )\n const nowMs = deps.now()\n const range = posDayReportRange({ from: input.from, to: input.to, nowMs, timeZone })\n if ('error' in range) return { ok: false, status: 400, error: range.error }\n const { startMs, endMs } = range\n\n const registersSnapshot = await hostRef.collection('registers').limit(REGISTERS_CEILING).get()\n const registers = registersSnapshot.docs\n const registerNames: Record<string, string> = {}\n for (const register of registers) registerNames[register.id] = String(register.get('name') ?? '')\n\n const salesSnapshot = await hostRef\n .collection('orders')\n .where('channel', '==', 'pos')\n .where('createdAtMs', '>=', startMs)\n .where('createdAtMs', '<', endMs)\n .orderBy('createdAtMs', 'desc')\n .limit(POS_DAY_REPORT_SALES_CEILING + 1)\n .get()\n let truncated = salesSnapshot.docs.length > POS_DAY_REPORT_SALES_CEILING\n const sales = salesSnapshot.docs\n .slice(0, POS_DAY_REPORT_SALES_CEILING)\n .map((doc) => (doc.data() ?? {}) as PosDaySale)\n\n const perRegister = await Promise.all(\n registers.map(async (register) => {\n const [returnsSnapshot, refundsSnapshot, openedSnapshot, closedSnapshot] = await Promise.all([\n register.ref\n .collection('returns')\n .where('atMs', '>=', startMs)\n .where('atMs', '<', endMs)\n .limit(POS_DAY_REPORT_RETURNS_CEILING + 1)\n .get(),\n // Every other refund of this register's sales, given in the range:\n // from the order dialog or in Stripe (AGL-4037). Read as stored, its\n // amount and tender written when the money went back.\n register.ref\n .collection(POS_ORDER_REFUNDS_COLLECTION)\n .where('atMs', '>=', startMs)\n .where('atMs', '<', endMs)\n .limit(POS_DAY_REPORT_RETURNS_CEILING + 1)\n .get(),\n register.ref\n .collection('shifts')\n .where('openedAtMs', '>=', startMs)\n .where('openedAtMs', '<', endMs)\n .limit(POS_DAY_REPORT_SHIFTS_CEILING + 1)\n .get(),\n register.ref\n .collection('shifts')\n .where('closedAtMs', '>=', startMs)\n .where('closedAtMs', '<', endMs)\n .limit(POS_DAY_REPORT_SHIFTS_CEILING + 1)\n .get(),\n ])\n if (\n returnsSnapshot.docs.length > POS_DAY_REPORT_RETURNS_CEILING ||\n refundsSnapshot.docs.length > POS_DAY_REPORT_RETURNS_CEILING ||\n openedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING ||\n closedSnapshot.docs.length > POS_DAY_REPORT_SHIFTS_CEILING\n ) {\n truncated = true\n }\n const returns: PosDayReturn[] = returnsSnapshot.docs\n .slice(0, POS_DAY_REPORT_RETURNS_CEILING)\n .map((doc) => {\n const data = (doc.data() ?? {}) as Record<string, any>\n const tenders = Array.isArray(data['tenders']) ? data['tenders'] : []\n return {\n registerId: register.id,\n ...(data['cashierId'] ? { cashierId: String(data['cashierId']) } : {}),\n refundedCents: Number(data['refundedCents'] ?? 0),\n // A tender whose refund failed gave nothing back, as on a Z report.\n tenders: tenders\n .filter((tender: any) => tender?.status !== 'failed')\n .map((tender: any) => ({ method: tender.method, amountCents: Number(tender.amountCents ?? 0) })),\n }\n })\n for (const doc of refundsSnapshot.docs.slice(0, POS_DAY_REPORT_RETURNS_CEILING)) {\n const data = (doc.data() ?? {}) as Record<string, any>\n const tenders = Array.isArray(data['tenders']) ? data['tenders'] : []\n returns.push({\n registerId: register.id,\n // Who gave it back; a refund made in Stripe names nobody.\n ...(data['cashierId'] ? { cashierId: String(data['cashierId']) } : {}),\n refundedCents: Number(data['refundedCents'] ?? 0),\n tenders: tenders.map((tender: any) => ({\n method: tender.method,\n amountCents: Number(tender.amountCents ?? 0),\n })),\n })\n }\n return {\n register,\n returns,\n shiftDocs: [...openedSnapshot.docs, ...closedSnapshot.docs].slice(0, 2 * POS_DAY_REPORT_SHIFTS_CEILING),\n }\n }),\n )\n\n // Every shift in the range, once: opened or closed in it, the open one on\n // each register, and the shift each sale in the range was rung in (a shift\n // that ran across the whole range).\n const shifts = new Map<string, PosDayShift>()\n const keyOf = (registerId: string, shiftId: string) => `${registerId}/${shiftId}`\n for (const entry of perRegister) {\n for (const doc of entry.shiftDocs) {\n const shift = shiftOf(doc.id, doc.data())\n if (shift) shifts.set(keyOf(entry.register.id, doc.id), { ...shift, registerId: entry.register.id })\n }\n }\n const byId: Array<{ registerId: string; shiftId: string }> = []\n for (const register of registers) {\n const openShiftId = String(register.get('openShiftId') ?? '')\n if (openShiftId) byId.push({ registerId: register.id, shiftId: openShiftId })\n }\n for (const sale of sales) {\n if (sale.shiftId && sale.registerId) byId.push({ registerId: sale.registerId, shiftId: sale.shiftId })\n }\n const missing = [\n ...new Map(\n byId\n .filter((ref) => registerNames[ref.registerId] !== undefined && !shifts.has(keyOf(ref.registerId, ref.shiftId)))\n .map((ref) => [keyOf(ref.registerId, ref.shiftId), ref]),\n ).values(),\n ]\n if (missing.length) {\n const firestore = deps.firestore()\n const snapshots = await firestore.getAll(\n ...missing.map((ref) => hostRef.collection('registers').doc(ref.registerId).collection('shifts').doc(ref.shiftId)),\n )\n snapshots.forEach((snapshot, index) => {\n const ref = missing[index]!\n const shift = shiftOf(snapshot.id, snapshot.exists ? snapshot.data() : undefined)\n // The open shift counts only if it began before the range ended.\n if (shift && shift.openedAtMs < endMs) {\n shifts.set(keyOf(ref.registerId, ref.shiftId), { ...shift, registerId: ref.registerId })\n }\n })\n }\n let shiftList = [...shifts.values()].sort((a, b) => a.openedAtMs - b.openedAtMs || a.id.localeCompare(b.id))\n if (shiftList.length > POS_DAY_REPORT_SHIFTS_CEILING) {\n truncated = true\n shiftList = shiftList.slice(-POS_DAY_REPORT_SHIFTS_CEILING)\n }\n\n // An open shift's drawer is read live, through the X report's own reader.\n shiftList = await Promise.all(\n shiftList.map(async (shift) =>\n shift.status === 'open'\n ? {\n ...shift,\n liveReport: await readPosShiftReport(\n hostRef.collection('registers').doc(shift.registerId),\n hostRef,\n shift.id,\n shift,\n ),\n }\n : shift,\n ),\n )\n\n const memberIds = new Set<string>()\n for (const sale of sales) if (sale.cashierId) memberIds.add(String(sale.cashierId))\n for (const entry of perRegister) for (const refund of entry.returns) if (refund.cashierId) memberIds.add(refund.cashierId)\n for (const shift of shiftList) {\n if (!shift.openedByName && shift.openedBy) memberIds.add(shift.openedBy)\n if (!shift.closedByName && shift.closedBy) memberIds.add(shift.closedBy)\n }\n const memberNames: Record<string, string> = {}\n await Promise.all(\n [...memberIds].map(async (uid) => {\n memberNames[uid] = await deps.memberName(uid)\n }),\n )\n\n return {\n ok: true,\n report: computePosDayReport({\n hostId: input.hostId,\n storeName: String(hostSnapshot.get('displayName') ?? ''),\n currency,\n timeZone,\n range,\n generatedAtMs: nowMs,\n sales,\n returns: perRegister.flatMap((entry) => entry.returns),\n shifts: shiftList,\n registerNames,\n memberNames,\n truncated,\n }),\n }\n}\n\nexport async function handlePosDayReport(deps: PosOpsDeps, req: PluginApiRequest): Promise<Outcome> {\n if (req.method !== 'GET') return { status: 405, body: { error: 'Method not allowed' } }\n const query = req.query ?? {}\n const gate = await authorizePosOps(deps, req, queryValue(query['hostId']))\n if ('error' in gate) return { status: gate.status, body: { error: gate.error } }\n const format = queryValue(query['format']).toLowerCase()\n if (format && format !== 'json' && format !== 'csv') {\n return { status: 400, body: { error: 'Choose json or csv.' } }\n }\n const read = await readPosDayReport(deps, {\n hostRef: gate.staff.hostRef,\n hostId: gate.staff.hostId,\n org: gate.staff.org,\n from: queryValue(query['from']),\n to: queryValue(query['to']),\n })\n if ('error' in read) return { status: read.status, body: { error: read.error } }\n if (format === 'csv') {\n const { from, to } = read.report\n return {\n status: 200,\n csv: posDayReportCsv(read.report),\n filename: `day-totals-${from}${to === from ? '' : `-to-${to}`}.csv`,\n }\n }\n return { status: 200, body: { report: read.report } }\n}\n\nexport function createPosDayReportHandler(deps: () => PosOpsDeps = defaultPosOpsDeps): PluginApiHandler {\n return async (req, res) => {\n try {\n const outcome = await handlePosDayReport(deps(), req)\n res.setHeader('Cache-Control', 'private, no-store')\n if ('csv' in outcome) {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8')\n res.setHeader('Content-Disposition', `attachment; filename=\"${outcome.filename}\"`)\n return res.status(200).send(outcome.csv)\n }\n return res.status(outcome.status).json(outcome.body)\n } catch (error) {\n console.error('[pos-day-report] failed', error)\n return res.status(500).json({ error: 'The day totals could not be read' })\n }\n }\n}\n\nexport const posDayReportHandler = createPosDayReportHandler()\n"],"names":["resolveSiteTimeZone","computePosDayReport","posDayReportCsv","posDayReportRange","POS_ORDER_REFUNDS_COLLECTION","POS_DAY_REPORT_RETURNS_CEILING","POS_DAY_REPORT_SALES_CEILING","POS_DAY_REPORT_SHIFTS_CEILING","authorizePosOps","defaultPosOpsDeps","readPosShiftReport","POS_CURRENCY","REGISTERS_CEILING","queryValue","value","String","Array","isArray","trim","shiftOf","id","data","status","openedAtMs","Number","openingFloatCents","cashEvents","storeCurrency","hostRef","snapshot","collection","doc","get","catch","chosen","exists","toLowerCase","test","readPosDayReport","deps","input","hostSnapshot","register","currency","Promise","all","timeZone","org","nowMs","now","range","from","to","ok","error","startMs","endMs","registersSnapshot","limit","registers","docs","registerNames","salesSnapshot","where","orderBy","truncated","length","sales","slice","map","perRegister","returnsSnapshot","refundsSnapshot","openedSnapshot","closedSnapshot","ref","returns","tenders","registerId","cashierId","refundedCents","filter","tender","method","amountCents","push","shiftDocs","shifts","Map","keyOf","shiftId","entry","shift","set","byId","openShiftId","sale","missing","undefined","has","values","firestore","snapshots","getAll","forEach","index","shiftList","sort","a","b","localeCompare","liveReport","memberIds","Set","add","refund","openedByName","openedBy","closedByName","closedBy","memberNames","uid","memberName","report","hostId","storeName","generatedAtMs","flatMap","handlePosDayReport","req","body","query","gate","format","read","staff","csv","filename","createPosDayReportHandler","res","outcome","setHeader","send","json","console","posDayReportHandler"],"mappings":"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"}
@@ -73,6 +73,20 @@ export interface PosDeviceToken {
73
73
  }
74
74
  /** The register a live display token opens, or null. */
75
75
  export declare function resolveDisplayToken(token: string): Promise<PosDeviceToken | null>;
76
+ /**
77
+ * Core's customer display verifier (AGL-4042, `plugin-customer-display-verifier`):
78
+ * who a paired display is, for another plugin's server acting for the screen
79
+ * it put there. The display's own token is the credential, so the pairing is
80
+ * the authorization: a live CUSTOMER DISPLAY token (never a kiosk's) answers
81
+ * the store it is paired to, the workspace that owns it, the plugin screen it
82
+ * is showing now, and who put it there. Anything else answers `null`.
83
+ */
84
+ export declare function verifyPosCustomerDisplay(credential: string): Promise<{
85
+ hostId: string;
86
+ orgId: string;
87
+ screen: CommerceModel.PosDisplayScreen | null;
88
+ shownBy: string | null;
89
+ } | null>;
76
90
  /**
77
91
  * `POST /api/commerce/pos-display`.
78
92
  *
@@ -81,3 +95,5 @@ export declare function resolveDisplayToken(token: string): Promise<PosDeviceTok
81
95
  * Display (display token only): `pair`, `poll`, `respond`, `forget`.
82
96
  */
83
97
  export declare const posDisplayHandler: PluginApiHandler;
98
+ /** The page the terms of sale open at on a display, beneath `/kiosk/commerce`. */
99
+ export declare const POS_HARDWARE_TERMS_PAGE_PATH = "/hardware-terms";