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

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 (581) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  39. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  40. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  41. package/src/lib/components/console/host-orders-card.component.js +84 -5
  42. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  43. package/src/lib/components/console/locations-card.component.js +164 -57
  44. package/src/lib/components/console/locations-card.component.js.map +1 -1
  45. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  46. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  47. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  48. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  49. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  50. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  51. package/src/lib/components/console/order-invoice.component.js +81 -0
  52. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  53. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  54. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  55. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  56. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  57. package/src/lib/components/console/order-returns.component.js +142 -0
  58. package/src/lib/components/console/order-returns.component.js.map +1 -0
  59. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  60. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  61. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  62. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  63. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  64. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  65. package/src/lib/components/console/order-zones.d.ts +155 -0
  66. package/src/lib/components/console/order-zones.js +40 -0
  67. package/src/lib/components/console/order-zones.js.map +1 -0
  68. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  69. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  70. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  71. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  72. package/src/lib/components/console/pos/pos-api.js +101 -0
  73. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  74. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  75. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  77. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  78. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  80. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  81. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  83. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  84. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  86. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  87. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  89. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  90. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  92. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  93. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  94. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  95. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  96. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  97. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  98. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  99. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  100. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  101. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  102. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  103. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  104. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  105. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  107. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  108. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  110. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  111. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  113. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  114. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  115. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  116. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  117. package/src/lib/components/console/pos-display-page.component.js +407 -0
  118. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  119. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  120. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  122. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  123. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  125. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  126. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  128. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  129. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  131. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  132. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  134. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  135. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  140. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  141. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  143. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  144. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  152. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  153. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  155. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  156. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  157. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  158. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  159. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  161. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  162. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  164. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  165. package/src/lib/components/console/pos-page.component.js +729 -657
  166. package/src/lib/components/console/pos-page.component.js.map +1 -1
  167. package/src/lib/components/console/product-editor-dialog.component.js +51 -7
  168. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  169. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  170. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  171. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  172. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  173. package/src/lib/components/console/product-register-fields.component.js +241 -0
  174. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  175. package/src/lib/components/console/product-zones.d.ts +44 -0
  176. package/src/lib/components/console/product-zones.js.map +1 -1
  177. package/src/lib/components/console/products-hub-card.component.js +12 -0
  178. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  179. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  180. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  181. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  182. package/src/lib/components/console/registers-card.component.js +24 -5
  183. package/src/lib/components/console/registers-card.component.js.map +1 -1
  184. package/src/lib/components/console/return-actions.d.ts +38 -0
  185. package/src/lib/components/console/return-actions.js +76 -0
  186. package/src/lib/components/console/return-actions.js.map +1 -0
  187. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  188. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  189. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  190. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  191. package/src/lib/components/console/return-settings-card.component.js +195 -0
  192. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  193. package/src/lib/components/console/return-zones.d.ts +87 -0
  194. package/src/lib/components/console/return-zones.js +31 -0
  195. package/src/lib/components/console/return-zones.js.map +1 -0
  196. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  197. package/src/lib/components/console/returns-card.component.js +159 -0
  198. package/src/lib/components/console/returns-card.component.js.map +1 -0
  199. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  200. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  201. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  202. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  203. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  204. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  205. package/src/lib/components/console/shipstation-card.component.js +345 -0
  206. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  207. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  208. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  209. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  210. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  211. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  212. package/src/lib/components/console/store-settings-card.component.js +2 -66
  213. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  214. package/src/lib/components/console/store-zones.d.ts +42 -0
  215. package/src/lib/components/console/store-zones.js +39 -0
  216. package/src/lib/components/console/store-zones.js.map +1 -0
  217. package/src/lib/components/order-status.d.ts +36 -0
  218. package/src/lib/components/order-status.js +502 -0
  219. package/src/lib/components/order-status.js.map +1 -0
  220. package/src/lib/components/product-detail.js +41 -2
  221. package/src/lib/components/product-detail.js.map +1 -1
  222. package/src/lib/components/return-request.d.ts +32 -0
  223. package/src/lib/components/return-request.js +576 -0
  224. package/src/lib/components/return-request.js.map +1 -0
  225. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  226. package/src/lib/components/storefront-payment-appearance.js +114 -0
  227. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  228. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  229. package/src/lib/components/storefront-payment-element.js +332 -33
  230. package/src/lib/components/storefront-payment-element.js.map +1 -1
  231. package/src/lib/constants/order-status.d.ts +22 -0
  232. package/src/lib/constants/order-status.js +22 -0
  233. package/src/lib/constants/order-status.js.map +1 -0
  234. package/src/lib/constants/return-request.d.ts +27 -0
  235. package/src/lib/constants/return-request.js +32 -0
  236. package/src/lib/constants/return-request.js.map +1 -0
  237. package/src/lib/constants/stock-movement-query.js +2 -1
  238. package/src/lib/constants/stock-movement-query.js.map +1 -1
  239. package/src/lib/declarations.console-server.js +9 -0
  240. package/src/lib/declarations.console-server.js.map +1 -1
  241. package/src/lib/declarations.server.d.ts +2 -1
  242. package/src/lib/declarations.server.js +47 -1
  243. package/src/lib/declarations.server.js.map +1 -1
  244. package/src/lib/model/buyer-notifications.d.ts +59 -0
  245. package/src/lib/model/buyer-notifications.js +97 -0
  246. package/src/lib/model/buyer-notifications.js.map +1 -0
  247. package/src/lib/model/commerce-orders.d.ts +127 -1
  248. package/src/lib/model/commerce-orders.js +24 -15
  249. package/src/lib/model/commerce-orders.js.map +1 -1
  250. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  251. package/src/lib/model/commerce-payment-methods.js +247 -0
  252. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  253. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  254. package/src/lib/model/commerce-pos-ops.js +721 -0
  255. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  256. package/src/lib/model/commerce-pos.d.ts +263 -0
  257. package/src/lib/model/commerce-pos.js +375 -0
  258. package/src/lib/model/commerce-pos.js.map +1 -0
  259. package/src/lib/model/commerce-printers.d.ts +211 -0
  260. package/src/lib/model/commerce-printers.js +181 -0
  261. package/src/lib/model/commerce-printers.js.map +1 -0
  262. package/src/lib/model/commerce-receipt.d.ts +97 -0
  263. package/src/lib/model/commerce-receipt.js +180 -0
  264. package/src/lib/model/commerce-receipt.js.map +1 -0
  265. package/src/lib/model/commerce-returns.d.ts +207 -0
  266. package/src/lib/model/commerce-returns.js +300 -0
  267. package/src/lib/model/commerce-returns.js.map +1 -0
  268. package/src/lib/model/commerce-shipping.d.ts +44 -1
  269. package/src/lib/model/commerce-shipping.js +53 -9
  270. package/src/lib/model/commerce-shipping.js.map +1 -1
  271. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  272. package/src/lib/model/commerce-tax-engine.js +129 -0
  273. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  274. package/src/lib/model/commerce.d.ts +88 -2
  275. package/src/lib/model/commerce.js +89 -1
  276. package/src/lib/model/commerce.js.map +1 -1
  277. package/src/lib/model/index.d.ts +15 -0
  278. package/src/lib/model/index.js +15 -0
  279. package/src/lib/model/index.js.map +1 -1
  280. package/src/lib/model/order-events.d.ts +154 -0
  281. package/src/lib/model/order-events.js +153 -0
  282. package/src/lib/model/order-events.js.map +1 -0
  283. package/src/lib/model/order-fulfillment.d.ts +117 -0
  284. package/src/lib/model/order-fulfillment.js +217 -0
  285. package/src/lib/model/order-fulfillment.js.map +1 -0
  286. package/src/lib/model/order-history.d.ts +58 -0
  287. package/src/lib/model/order-history.js +22 -0
  288. package/src/lib/model/order-history.js.map +1 -0
  289. package/src/lib/model/order-list-fields.d.ts +9 -1
  290. package/src/lib/model/order-list-fields.js +7 -1
  291. package/src/lib/model/order-list-fields.js.map +1 -1
  292. package/src/lib/model/order-shipping-export.d.ts +91 -0
  293. package/src/lib/model/order-shipping-export.js +192 -0
  294. package/src/lib/model/order-shipping-export.js.map +1 -0
  295. package/src/lib/model/order-status-view.d.ts +103 -0
  296. package/src/lib/model/order-status-view.js +156 -0
  297. package/src/lib/model/order-status-view.js.map +1 -0
  298. package/src/lib/model/order-webhooks.d.ts +142 -0
  299. package/src/lib/model/order-webhooks.js +91 -0
  300. package/src/lib/model/order-webhooks.js.map +1 -0
  301. package/src/lib/model/product-channel.d.ts +56 -0
  302. package/src/lib/model/product-channel.js +86 -0
  303. package/src/lib/model/product-channel.js.map +1 -0
  304. package/src/lib/model/product-modifiers.d.ts +80 -0
  305. package/src/lib/model/product-modifiers.js +140 -0
  306. package/src/lib/model/product-modifiers.js.map +1 -0
  307. package/src/lib/model/shippingeasy.d.ts +94 -0
  308. package/src/lib/model/shippingeasy.js +267 -0
  309. package/src/lib/model/shippingeasy.js.map +1 -0
  310. package/src/lib/model/shipstation.d.ts +125 -0
  311. package/src/lib/model/shipstation.js +399 -0
  312. package/src/lib/model/shipstation.js.map +1 -0
  313. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  314. package/src/lib/model/smart-collection-reads.js +63 -0
  315. package/src/lib/model/smart-collection-reads.js.map +1 -0
  316. package/src/lib/model/tracking-url.d.ts +74 -0
  317. package/src/lib/model/tracking-url.js +159 -0
  318. package/src/lib/model/tracking-url.js.map +1 -0
  319. package/src/lib/plugin-config.d.ts +13 -0
  320. package/src/lib/plugin-config.js +77 -5
  321. package/src/lib/plugin-config.js.map +1 -1
  322. package/src/lib/plugin.js +23 -0
  323. package/src/lib/plugin.js.map +1 -1
  324. package/src/lib/pos-ops-config.d.ts +39 -0
  325. package/src/lib/pos-ops-config.js +88 -0
  326. package/src/lib/pos-ops-config.js.map +1 -0
  327. package/src/lib/printing/print-document.d.ts +106 -0
  328. package/src/lib/printing/print-document.js +464 -0
  329. package/src/lib/printing/print-document.js.map +1 -0
  330. package/src/lib/printing/product-labels.d.ts +58 -0
  331. package/src/lib/printing/product-labels.js +116 -0
  332. package/src/lib/printing/product-labels.js.map +1 -0
  333. package/src/lib/printing/render-epson.d.ts +57 -0
  334. package/src/lib/printing/render-epson.js +135 -0
  335. package/src/lib/printing/render-epson.js.map +1 -0
  336. package/src/lib/printing/render-star.d.ts +45 -0
  337. package/src/lib/printing/render-star.js +100 -0
  338. package/src/lib/printing/render-star.js.map +1 -0
  339. package/src/lib/printing/render-text.d.ts +25 -0
  340. package/src/lib/printing/render-text.js +53 -0
  341. package/src/lib/printing/render-text.js.map +1 -0
  342. package/src/lib/server/api-v1/openapi.js +27 -4
  343. package/src/lib/server/api-v1/openapi.js.map +1 -1
  344. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  345. package/src/lib/server/api-v1/order-view.js +120 -0
  346. package/src/lib/server/api-v1/order-view.js.map +1 -0
  347. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  348. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  349. package/src/lib/server/billing-webhook.js +135 -28
  350. package/src/lib/server/billing-webhook.js.map +1 -1
  351. package/src/lib/server/cancel-order.js +29 -0
  352. package/src/lib/server/cancel-order.js.map +1 -1
  353. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  354. package/src/lib/server/carrier-rates-availability.js +76 -0
  355. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  356. package/src/lib/server/carrier-shipping.d.ts +84 -0
  357. package/src/lib/server/carrier-shipping.js +135 -0
  358. package/src/lib/server/carrier-shipping.js.map +1 -0
  359. package/src/lib/server/cart-checkout.d.ts +2 -0
  360. package/src/lib/server/cart-checkout.js +226 -22
  361. package/src/lib/server/cart-checkout.js.map +1 -1
  362. package/src/lib/server/checkout-extras.d.ts +64 -0
  363. package/src/lib/server/checkout-extras.js +157 -0
  364. package/src/lib/server/checkout-extras.js.map +1 -0
  365. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  366. package/src/lib/server/checkout-status.js +111 -0
  367. package/src/lib/server/checkout-status.js.map +1 -0
  368. package/src/lib/server/checkout.js +86 -9
  369. package/src/lib/server/checkout.js.map +1 -1
  370. package/src/lib/server/draft-order.js +34 -5
  371. package/src/lib/server/draft-order.js.map +1 -1
  372. package/src/lib/server/fulfill-order.d.ts +127 -10
  373. package/src/lib/server/fulfill-order.js +451 -49
  374. package/src/lib/server/fulfill-order.js.map +1 -1
  375. package/src/lib/server/legacy-feed.d.ts +28 -0
  376. package/src/lib/server/legacy-feed.js +52 -0
  377. package/src/lib/server/legacy-feed.js.map +1 -0
  378. package/src/lib/server/native-checkout.d.ts +34 -15
  379. package/src/lib/server/native-checkout.js +32 -17
  380. package/src/lib/server/native-checkout.js.map +1 -1
  381. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  382. package/src/lib/server/order-event-host-emit.js +30 -0
  383. package/src/lib/server/order-event-host-emit.js.map +1 -0
  384. package/src/lib/server/order-event-triggers.d.ts +37 -0
  385. package/src/lib/server/order-event-triggers.js +119 -0
  386. package/src/lib/server/order-event-triggers.js.map +1 -0
  387. package/src/lib/server/order-events.d.ts +62 -0
  388. package/src/lib/server/order-events.js +109 -0
  389. package/src/lib/server/order-events.js.map +1 -0
  390. package/src/lib/server/order-history.d.ts +23 -0
  391. package/src/lib/server/order-history.js +65 -0
  392. package/src/lib/server/order-history.js.map +1 -0
  393. package/src/lib/server/order-notifications.d.ts +185 -0
  394. package/src/lib/server/order-notifications.js +567 -0
  395. package/src/lib/server/order-notifications.js.map +1 -0
  396. package/src/lib/server/order-receipt-send.d.ts +39 -0
  397. package/src/lib/server/order-receipt-send.js +151 -0
  398. package/src/lib/server/order-receipt-send.js.map +1 -0
  399. package/src/lib/server/order-status-token.d.ts +31 -0
  400. package/src/lib/server/order-status-token.js +75 -0
  401. package/src/lib/server/order-status-token.js.map +1 -0
  402. package/src/lib/server/order-status.d.ts +58 -0
  403. package/src/lib/server/order-status.js +141 -0
  404. package/src/lib/server/order-status.js.map +1 -0
  405. package/src/lib/server/order-webhooks.d.ts +108 -0
  406. package/src/lib/server/order-webhooks.js +622 -0
  407. package/src/lib/server/order-webhooks.js.map +1 -0
  408. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  409. package/src/lib/server/orders-shipping-prepare.js +121 -0
  410. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  411. package/src/lib/server/payment-method-domains.d.ts +209 -0
  412. package/src/lib/server/payment-method-domains.js +444 -0
  413. package/src/lib/server/payment-method-domains.js.map +1 -0
  414. package/src/lib/server/payment-methods.d.ts +77 -0
  415. package/src/lib/server/payment-methods.js +284 -0
  416. package/src/lib/server/payment-methods.js.map +1 -0
  417. package/src/lib/server/pos-auth.d.ts +50 -0
  418. package/src/lib/server/pos-auth.js +121 -0
  419. package/src/lib/server/pos-auth.js.map +1 -0
  420. package/src/lib/server/pos-customer.d.ts +49 -0
  421. package/src/lib/server/pos-customer.js +257 -0
  422. package/src/lib/server/pos-customer.js.map +1 -0
  423. package/src/lib/server/pos-display.d.ts +57 -0
  424. package/src/lib/server/pos-display.js +419 -0
  425. package/src/lib/server/pos-display.js.map +1 -0
  426. package/src/lib/server/pos-fee-month.d.ts +34 -0
  427. package/src/lib/server/pos-fee-month.js +36 -0
  428. package/src/lib/server/pos-fee-month.js.map +1 -0
  429. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  430. package/src/lib/server/pos-ops-gate.js +295 -0
  431. package/src/lib/server/pos-ops-gate.js.map +1 -0
  432. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  433. package/src/lib/server/pos-ops-routes.js +36 -0
  434. package/src/lib/server/pos-ops-routes.js.map +1 -0
  435. package/src/lib/server/pos-order.d.ts +1 -18
  436. package/src/lib/server/pos-order.js +222 -42
  437. package/src/lib/server/pos-order.js.map +1 -1
  438. package/src/lib/server/pos-payment.d.ts +39 -0
  439. package/src/lib/server/pos-payment.js +922 -0
  440. package/src/lib/server/pos-payment.js.map +1 -0
  441. package/src/lib/server/pos-print.d.ts +82 -0
  442. package/src/lib/server/pos-print.js +193 -0
  443. package/src/lib/server/pos-print.js.map +1 -0
  444. package/src/lib/server/pos-readers.d.ts +27 -0
  445. package/src/lib/server/pos-readers.js +276 -0
  446. package/src/lib/server/pos-readers.js.map +1 -0
  447. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  448. package/src/lib/server/pos-refund-authority.js +72 -0
  449. package/src/lib/server/pos-refund-authority.js.map +1 -0
  450. package/src/lib/server/pos-return.d.ts +58 -0
  451. package/src/lib/server/pos-return.js +891 -0
  452. package/src/lib/server/pos-return.js.map +1 -0
  453. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  454. package/src/lib/server/pos-sale-stamp.js +84 -0
  455. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  456. package/src/lib/server/pos-sale.d.ts +170 -0
  457. package/src/lib/server/pos-sale.js +461 -0
  458. package/src/lib/server/pos-sale.js.map +1 -0
  459. package/src/lib/server/pos-shift.d.ts +45 -0
  460. package/src/lib/server/pos-shift.js +484 -0
  461. package/src/lib/server/pos-shift.js.map +1 -0
  462. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  463. package/src/lib/server/pos-staff-pin.js +339 -0
  464. package/src/lib/server/pos-staff-pin.js.map +1 -0
  465. package/src/lib/server/pos-stripe.d.ts +91 -0
  466. package/src/lib/server/pos-stripe.js +129 -0
  467. package/src/lib/server/pos-stripe.js.map +1 -0
  468. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  469. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  470. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  471. package/src/lib/server/pos-terminal.d.ts +218 -0
  472. package/src/lib/server/pos-terminal.js +1014 -0
  473. package/src/lib/server/pos-terminal.js.map +1 -0
  474. package/src/lib/server/print-queue.d.ts +124 -0
  475. package/src/lib/server/print-queue.js +301 -0
  476. package/src/lib/server/print-queue.js.map +1 -0
  477. package/src/lib/server/printer-poll.d.ts +75 -0
  478. package/src/lib/server/printer-poll.js +325 -0
  479. package/src/lib/server/printer-poll.js.map +1 -0
  480. package/src/lib/server/printer-secret.d.ts +39 -0
  481. package/src/lib/server/printer-secret.js +56 -0
  482. package/src/lib/server/printer-secret.js.map +1 -0
  483. package/src/lib/server/printers.d.ts +114 -0
  484. package/src/lib/server/printers.js +546 -0
  485. package/src/lib/server/printers.js.map +1 -0
  486. package/src/lib/server/product-catalog.d.ts +42 -0
  487. package/src/lib/server/product-catalog.js +305 -0
  488. package/src/lib/server/product-catalog.js.map +1 -0
  489. package/src/lib/server/refund.js +110 -45
  490. package/src/lib/server/refund.js.map +1 -1
  491. package/src/lib/server/reserve.js +2 -0
  492. package/src/lib/server/reserve.js.map +1 -1
  493. package/src/lib/server/return-status-action.d.ts +37 -0
  494. package/src/lib/server/return-status-action.js +57 -0
  495. package/src/lib/server/return-status-action.js.map +1 -0
  496. package/src/lib/server/returns.d.ts +119 -0
  497. package/src/lib/server/returns.js +938 -0
  498. package/src/lib/server/returns.js.map +1 -0
  499. package/src/lib/server/shipment-records.d.ts +36 -0
  500. package/src/lib/server/shipment-records.js +289 -0
  501. package/src/lib/server/shipment-records.js.map +1 -0
  502. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  503. package/src/lib/server/shipping-connector-gates.js +97 -0
  504. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  505. package/src/lib/server/shipping-connectors.d.ts +29 -0
  506. package/src/lib/server/shipping-connectors.js +236 -0
  507. package/src/lib/server/shipping-connectors.js.map +1 -0
  508. package/src/lib/server/shippingeasy.d.ts +238 -0
  509. package/src/lib/server/shippingeasy.js +787 -0
  510. package/src/lib/server/shippingeasy.js.map +1 -0
  511. package/src/lib/server/shipstation.d.ts +129 -0
  512. package/src/lib/server/shipstation.js +483 -0
  513. package/src/lib/server/shipstation.js.map +1 -0
  514. package/src/lib/server/site-page-resolver.d.ts +5 -0
  515. package/src/lib/server/site-page-resolver.js +156 -1
  516. package/src/lib/server/site-page-resolver.js.map +1 -1
  517. package/src/lib/server/stock-levels.d.ts +21 -0
  518. package/src/lib/server/stock-levels.js +263 -0
  519. package/src/lib/server/stock-levels.js.map +1 -0
  520. package/src/lib/server/stripe-refund.d.ts +47 -0
  521. package/src/lib/server/stripe-refund.js +87 -0
  522. package/src/lib/server/stripe-refund.js.map +1 -0
  523. package/src/lib/server/supplier-update.js +46 -5
  524. package/src/lib/server/supplier-update.js.map +1 -1
  525. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  526. package/src/lib/server/tax-engine-quote.js +105 -0
  527. package/src/lib/server/tax-engine-quote.js.map +1 -0
  528. package/src/lib/server.js +138 -2
  529. package/src/lib/server.js.map +1 -1
  530. package/src/lib/site.js +12 -0
  531. package/src/lib/site.js.map +1 -1
  532. package/src/lib/subprocessors.d.ts +26 -0
  533. package/src/lib/subprocessors.js +50 -0
  534. package/src/lib/subprocessors.js.map +1 -0
  535. package/src/lib/tenant-emails.js +461 -3
  536. package/src/lib/tenant-emails.js.map +1 -1
  537. package/src/lib/testing/fake-firestore.d.ts +45 -0
  538. package/src/lib/testing/fake-firestore.js +189 -0
  539. package/src/lib/testing/fake-firestore.js.map +1 -0
  540. package/src/lib/testing/memory-firestore.d.ts +123 -0
  541. package/src/lib/testing/memory-firestore.js +274 -0
  542. package/src/lib/testing/memory-firestore.js.map +1 -0
  543. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  544. package/src/lib/testing/pos-ops-harness.js +184 -0
  545. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  546. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  547. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  548. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  549. package/src/lib/transfer/records-transfer.d.ts +11 -1
  550. package/src/lib/transfer/records-transfer.js +127 -5
  551. package/src/lib/transfer/records-transfer.js.map +1 -1
  552. package/src/lib/transfer/records.server.d.ts +9 -2
  553. package/src/lib/transfer/records.server.js +58 -7
  554. package/src/lib/transfer/records.server.js.map +1 -1
  555. package/src/lib/transfer/register-transfer-resources.js +40 -1
  556. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  557. package/src/lib/transfer/register-transfer-ui.js +4 -1
  558. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  559. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  560. package/src/lib/transfer/shipping-presets.js +156 -0
  561. package/src/lib/transfer/shipping-presets.js.map +1 -0
  562. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  563. package/src/lib/transfer/tracking-transfer.js +546 -0
  564. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  565. package/src/lib/transfer/tracking.server.d.ts +37 -0
  566. package/src/lib/transfer/tracking.server.js +393 -0
  567. package/src/lib/transfer/tracking.server.js.map +1 -0
  568. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  569. package/src/lib/transfer/transfer-keys.js +6 -2
  570. package/src/lib/transfer/transfer-keys.js.map +1 -1
  571. package/src/lib/utils/code128.d.ts +37 -0
  572. package/src/lib/utils/code128.js +199 -0
  573. package/src/lib/utils/code128.js.map +1 -0
  574. package/src/lib/utils/order-invoice.d.ts +55 -0
  575. package/src/lib/utils/order-invoice.js +127 -0
  576. package/src/lib/utils/order-invoice.js.map +1 -0
  577. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  578. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  579. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  580. package/src/lib/server/feed.js +0 -69
  581. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,922 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { consumeRateLimit, firebaseAdmin, getPluginConfig } from "@aglyn/tenant-data-admin";
18
+ import { buildRoute, Route } from "@aglyn/aglyn/server";
19
+ import recordCapturedContact from "@aglyn/aglyn/plugin-manager/record-captured-contact";
20
+ import { pluginSmsAvailable } from "@aglyn/aglyn/plugin-manager/plugin-sms-messaging";
21
+ import { finishPosDisplayReceipt } from "./pos-display.js";
22
+ import * as CommerceModel from "../model/index.js";
23
+ import { posRegisterSettings } from "../plugin-config.js";
24
+ import { authorizePosStaff, posIdempotencyKey, posQueryBody, posRequestBody } from "./pos-auth.js";
25
+ import { applyPosPayment, deliverChosenPosReceipt, posPaymentId, posSaleSummary, readPosSale, releasePosSaleDiscount } from "./pos-sale.js";
26
+ import { posPaymentCashierId } from "./pos-sale-stamp.js";
27
+ import { printPosSaleReceipt } from "./pos-print.js";
28
+ import { POS_CURRENCY, posStripe, posStripeErrorMessage, posStripeTestMode, posTerminalAvailable } from "./pos-stripe.js";
29
+ import { cancelPosCardPayment, createCardPresentIntent, refreshPosCardPayment, retryCardPresentPayment, simulatePosReaderTap, startCardKeyedPayment, startCardLinkPayment, startCardPresentPayment } from "./pos-terminal.js";
30
+ /**
31
+ * `POST /api/commerce/pos-payment` (AGL-3607): every tender against an OPEN
32
+ * register sale, one `action` per request.
33
+ *
34
+ * The sale was priced by `pos-order.ts` (`payment: 'open'`); nothing here
35
+ * re-prices it or lets the register name a total. Each payment-starting action
36
+ * needs the register's `Idempotency-Key`, from which the payment's id is
37
+ * derived: pressing a tender twice, or retrying after a lost response, finds
38
+ * the payment the first press started instead of taking the money twice.
39
+ */ export const posPaymentHandler = async (req, res)=>{
40
+ var _body_hostId, _body_action, _body_orderId;
41
+ // `sale` is a read and may be a GET, so a register re-reading its sale does
42
+ // not spend the console's write budget; everything else moves money.
43
+ const body = req.method === 'GET' ? posQueryBody(req) : posRequestBody(req);
44
+ if (!(req.method === 'POST' || req.method === 'GET' && (body['action'] === 'sale' || body['action'] === 'context'))) {
45
+ return res.status(405).json({
46
+ error: 'Method not allowed'
47
+ });
48
+ }
49
+ const hostId = String((_body_hostId = body['hostId']) != null ? _body_hostId : '');
50
+ const gate = await authorizePosStaff(req, hostId);
51
+ if ('error' in gate) return res.status(gate.status).json({
52
+ error: gate.error
53
+ });
54
+ let staff = gate.staff;
55
+ const action = String((_body_action = body['action']) != null ? _body_action : '');
56
+ const orderId = String((_body_orderId = body['orderId']) != null ? _body_orderId : '');
57
+ try {
58
+ var _body_paymentId, _body_amountCents, _body_tipCents;
59
+ if (action === 'gift-card-balance') {
60
+ return await giftCardBalance(staff, body, res);
61
+ }
62
+ if (action === 'context') {
63
+ var _process_env_NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY;
64
+ // What the register needs to draw its tenders: the site's tip and
65
+ // receipt settings, whether card readers are offered at all, and the
66
+ // key the typed-card form loads Stripe with.
67
+ const readers = posTerminalAvailable() ? (await firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('terminalReaders').limit(50).get()).docs.map((doc)=>{
68
+ var _doc_get, _doc_get1, _doc_get2;
69
+ return {
70
+ id: doc.id,
71
+ label: String((_doc_get = doc.get('label')) != null ? _doc_get : 'Card reader'),
72
+ registerId: (_doc_get1 = doc.get('registerId')) != null ? _doc_get1 : null,
73
+ status: String((_doc_get2 = doc.get('status')) != null ? _doc_get2 : 'offline'),
74
+ livemode: Boolean(doc.get('livemode'))
75
+ };
76
+ }) : [];
77
+ return res.status(200).json({
78
+ settings: posRegisterSettings(await getPluginConfig(staff.orgId || undefined, 'commerce', {
79
+ hostId
80
+ })),
81
+ terminal: {
82
+ available: posTerminalAvailable(),
83
+ testMode: posStripeTestMode()
84
+ },
85
+ readers,
86
+ publishableKey: String((_process_env_NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY) != null ? _process_env_NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY : ''),
87
+ // A text receipt is offered only when an SMS provider is on (AGL-3610).
88
+ smsReceipts: pluginSmsAvailable()
89
+ });
90
+ }
91
+ if (!orderId) return res.status(400).json({
92
+ error: 'Missing orderId'
93
+ });
94
+ const startsPayment = [
95
+ 'card-present-sdk',
96
+ 'cash',
97
+ 'gift-card',
98
+ 'folio',
99
+ 'card-present',
100
+ 'card-keyed',
101
+ 'card-link'
102
+ ].includes(action);
103
+ const attemptKey = posIdempotencyKey(req);
104
+ if (startsPayment && !attemptKey) {
105
+ return res.status(400).json({
106
+ error: 'Missing Idempotency-Key'
107
+ });
108
+ }
109
+ const paymentId = startsPayment ? posPaymentId(orderId, attemptKey) : String((_body_paymentId = body['paymentId']) != null ? _body_paymentId : '');
110
+ // The cashier a PIN switched in takes the payment (AGL-3609).
111
+ if (startsPayment && body['cashierAssertion']) {
112
+ staff = _extends({}, staff, {
113
+ uid: await posPaymentCashierId({
114
+ hostId,
115
+ orderId,
116
+ signedInUid: staff.uid,
117
+ assertion: body['cashierAssertion']
118
+ })
119
+ });
120
+ }
121
+ const amountCents = Math.round(Number((_body_amountCents = body['amountCents']) != null ? _body_amountCents : 0));
122
+ const tipCents = Math.round(Number((_body_tipCents = body['tipCents']) != null ? _body_tipCents : 0)) || 0;
123
+ const settings = posRegisterSettings(await getPluginConfig(staff.orgId || undefined, 'commerce', {
124
+ hostId
125
+ }));
126
+ let outcome = null;
127
+ switch(action){
128
+ case 'sale':
129
+ {
130
+ const order = await readPosSale(hostId, orderId);
131
+ if (!order) return res.status(404).json({
132
+ error: 'Unknown sale'
133
+ });
134
+ outcome = {
135
+ ok: true,
136
+ order,
137
+ payment: null,
138
+ completed: false,
139
+ changed: false
140
+ };
141
+ break;
142
+ }
143
+ case 'cash':
144
+ outcome = await takeCash(staff, orderId, paymentId, body, tipCents);
145
+ break;
146
+ case 'gift-card':
147
+ outcome = await takeGiftCard(staff, orderId, paymentId, body);
148
+ break;
149
+ case 'folio':
150
+ outcome = await takeFolio(staff, orderId, paymentId, body);
151
+ break;
152
+ case 'card-present':
153
+ var _body_readerId;
154
+ outcome = await startCardPresentPayment({
155
+ hostId,
156
+ orderId,
157
+ paymentId,
158
+ amountCents,
159
+ tipCents,
160
+ cashierId: staff.uid,
161
+ org: staff.org,
162
+ readerId: String((_body_readerId = body['readerId']) != null ? _body_readerId : ''),
163
+ settings
164
+ });
165
+ break;
166
+ case 'card-present-sdk':
167
+ // Collected by a native app's Stripe Terminal SDK (Tap to Pay or a
168
+ // Bluetooth reader, AGL-3618) against this server-made intent; it
169
+ // settles exactly like a smart-reader payment.
170
+ outcome = await createCardPresentIntent({
171
+ hostId,
172
+ orderId,
173
+ paymentId,
174
+ amountCents,
175
+ tipCents,
176
+ cashierId: staff.uid,
177
+ org: staff.org
178
+ });
179
+ break;
180
+ case 'card-keyed':
181
+ outcome = await startCardKeyedPayment({
182
+ hostId,
183
+ orderId,
184
+ paymentId,
185
+ amountCents,
186
+ tipCents,
187
+ cashierId: staff.uid,
188
+ org: staff.org
189
+ });
190
+ break;
191
+ case 'card-link':
192
+ outcome = await startCardLinkPayment({
193
+ hostId,
194
+ orderId,
195
+ paymentId,
196
+ amountCents,
197
+ tipCents,
198
+ cashierId: staff.uid,
199
+ org: staff.org,
200
+ returnUrl: await registerReturnUrl(req.headers.host, hostId, staff)
201
+ });
202
+ break;
203
+ case 'status':
204
+ outcome = await refreshPosCardPayment({
205
+ hostId,
206
+ orderId,
207
+ paymentId
208
+ });
209
+ break;
210
+ case 'cancel':
211
+ outcome = await cancelPosCardPayment({
212
+ hostId,
213
+ orderId,
214
+ paymentId
215
+ });
216
+ break;
217
+ case 'retry':
218
+ outcome = await retryCardPresentPayment({
219
+ hostId,
220
+ orderId,
221
+ paymentId,
222
+ settings
223
+ });
224
+ break;
225
+ case 'simulate':
226
+ var _body_cardNumber;
227
+ outcome = await simulatePosReaderTap({
228
+ hostId,
229
+ orderId,
230
+ paymentId,
231
+ cardNumber: String((_body_cardNumber = body['cardNumber']) != null ? _body_cardNumber : '')
232
+ });
233
+ break;
234
+ case 'void':
235
+ outcome = await voidPosSale(staff, orderId);
236
+ break;
237
+ case 'receipt':
238
+ outcome = await recordReceiptChoice(staff, orderId, body);
239
+ break;
240
+ default:
241
+ return res.status(400).json({
242
+ error: 'Unknown action'
243
+ });
244
+ }
245
+ if ('error' in outcome) return res.status(outcome.status).json({
246
+ error: outcome.error
247
+ });
248
+ return res.status(200).json(_extends({
249
+ sale: posSaleSummary(outcome.order)
250
+ }, outcome.payment ? {
251
+ paymentId: outcome.payment.id
252
+ } : {}, {
253
+ completed: outcome.order.status === 'paid'
254
+ }, outcome.clientSecret ? {
255
+ clientSecret: outcome.clientSecret
256
+ } : {}, outcome.paymentIntentId ? {
257
+ paymentIntentId: outcome.paymentIntentId
258
+ } : {}));
259
+ } catch (error) {
260
+ console.error('[pos-payment]', action, error);
261
+ return res.status(500).json({
262
+ error: 'Payment failed — check the sale before trying again'
263
+ });
264
+ }
265
+ };
266
+ /** Where a QR payment page sends the customer back to: the register. */ async function registerReturnUrl(requestHost, hostId, staff) {
267
+ var _staff_org;
268
+ const origin = `https://${String(requestHost != null ? requestHost : '')}`;
269
+ const subdomain = (await firebaseAdmin.app().firestore().collection('hostIndex').doc(hostId).get()).get('subdomain');
270
+ const orgSlug = (_staff_org = staff.org) == null ? void 0 : _staff_org['slug'];
271
+ return orgSlug && subdomain ? `${origin}${buildRoute(Route.HOST_PLUGIN, {
272
+ orgSlug,
273
+ host: subdomain,
274
+ pluginSlug: 'pos'
275
+ })}` : origin;
276
+ }
277
+ /** The balance a new tender may take, or a refusal. */ function tenderable(order, payments) {
278
+ var _ref;
279
+ var _order_totals;
280
+ return CommerceModel.posTenderableCents(Number((_ref = (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref : 0), payments);
281
+ }
282
+ const NOT_OPEN = {
283
+ kind: 'refuse',
284
+ status: 409,
285
+ error: 'This sale is no longer open'
286
+ };
287
+ /**
288
+ * Cash: the amount defaults to whatever is left, the change is what the
289
+ * customer handed over beyond it (and beyond any tip they chose).
290
+ */ async function takeCash(staff, orderId, paymentId, body, tipCents) {
291
+ var _body_tenderedCents, _body_amountCents;
292
+ const tenderedCents = Math.round(Number((_body_tenderedCents = body['tenderedCents']) != null ? _body_tenderedCents : 0));
293
+ const askedCents = Math.round(Number((_body_amountCents = body['amountCents']) != null ? _body_amountCents : 0));
294
+ return await applyPosPayment({
295
+ hostId: staff.hostId,
296
+ orderId,
297
+ paymentId,
298
+ decide: ({ order, payments, existing })=>{
299
+ var _ref, _order_posTakeFeeCents;
300
+ var _order_totals;
301
+ if (existing) return {
302
+ kind: 'keep'
303
+ };
304
+ if (order.status !== 'pending') return NOT_OPEN;
305
+ if (!Number.isFinite(tenderedCents) || tenderedCents <= 0) {
306
+ return {
307
+ kind: 'refuse',
308
+ status: 400,
309
+ error: 'Enter the cash received.'
310
+ };
311
+ }
312
+ const open = tenderable(order, payments);
313
+ if (open <= 0) return {
314
+ kind: 'refuse',
315
+ status: 409,
316
+ error: 'Nothing is left to pay on this sale.'
317
+ };
318
+ const amountCents = askedCents > 0 ? Math.min(askedCents, open) : Math.min(open, Math.max(0, tenderedCents - tipCents));
319
+ if (!(amountCents > 0)) {
320
+ return {
321
+ kind: 'refuse',
322
+ status: 400,
323
+ error: 'The cash received does not cover the tip.'
324
+ };
325
+ }
326
+ const tipProblem = CommerceModel.posTipProblem(tipCents, amountCents);
327
+ if (tipProblem) return {
328
+ kind: 'refuse',
329
+ status: 400,
330
+ error: tipProblem
331
+ };
332
+ if (tenderedCents < amountCents + tipCents) {
333
+ return {
334
+ kind: 'refuse',
335
+ status: 400,
336
+ error: 'Cash received is short'
337
+ };
338
+ }
339
+ const total = Number((_ref = (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref : 0);
340
+ const now = Date.now();
341
+ return {
342
+ kind: 'put',
343
+ payment: _extends({
344
+ id: paymentId,
345
+ method: 'cash',
346
+ amountCents
347
+ }, tipCents > 0 ? {
348
+ tipCents
349
+ } : {}, {
350
+ status: 'succeeded',
351
+ atMs: now,
352
+ settledAtMs: now,
353
+ cashTenderedCents: tenderedCents,
354
+ changeCents: tenderedCents - amountCents - tipCents,
355
+ takeFeeCents: CommerceModel.posTakeShareCents({
356
+ takeFeeCents: Number((_order_posTakeFeeCents = order.posTakeFeeCents) != null ? _order_posTakeFeeCents : 0),
357
+ totalCents: total,
358
+ amountCents
359
+ }),
360
+ feeCents: 0,
361
+ cashierId: staff.uid
362
+ })
363
+ };
364
+ }
365
+ });
366
+ }
367
+ function giftCardRef(hostId, code) {
368
+ return firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('giftCards').doc(code);
369
+ }
370
+ /** A gift card's spendable balance, for the cashier to read to the customer. */ async function giftCardBalance(staff, body, res) {
371
+ const code = CommerceModel.giftCardCodeOf(body['code']);
372
+ const rate = await consumeRateLimit(`pos-gift-balance:${staff.uid}`, {
373
+ limit: 30,
374
+ windowMs: 60000
375
+ });
376
+ if (!rate.allowed) {
377
+ return res.status(429).json({
378
+ error: 'Too many balance checks. Wait a minute and try again.'
379
+ });
380
+ }
381
+ if (CommerceModel.giftCardCodeProblem(code)) {
382
+ return res.status(404).json({
383
+ error: 'No gift card has that code.'
384
+ });
385
+ }
386
+ const snapshot = await giftCardRef(staff.hostId, code).get();
387
+ if (!snapshot.exists) return res.status(404).json({
388
+ error: 'No gift card has that code.'
389
+ });
390
+ const card = snapshot.data();
391
+ return res.status(200).json({
392
+ availableCents: CommerceModel.giftCardAvailableCents(card, Date.now()),
393
+ frozen: CommerceModel.isGiftCardFrozen(card),
394
+ voided: Number(card.voidedAtMs) > 0,
395
+ last4: code.slice(-4)
396
+ });
397
+ }
398
+ /**
399
+ * A gift card: takes the smaller of what the card can give and what is left
400
+ * to pay, in ONE transaction with the sale. The card's spendable balance
401
+ * honours every live hold an online checkout placed on it (AGL-2449), and a
402
+ * frozen card gives nothing (AGL-3363), so the till and the website can
403
+ * never spend the same dollars.
404
+ */ async function takeGiftCard(staff, orderId, paymentId, body) {
405
+ var _body_amountCents;
406
+ const code = CommerceModel.giftCardCodeOf(body['code']);
407
+ if (CommerceModel.giftCardCodeProblem(code)) {
408
+ return {
409
+ ok: false,
410
+ status: 404,
411
+ error: 'No gift card has that code.'
412
+ };
413
+ }
414
+ const askedCents = Math.round(Number((_body_amountCents = body['amountCents']) != null ? _body_amountCents : 0));
415
+ const cardRef = giftCardRef(staff.hostId, code);
416
+ return await applyPosPayment({
417
+ hostId: staff.hostId,
418
+ orderId,
419
+ paymentId,
420
+ prepare: async (transaction)=>{
421
+ const snapshot = await transaction.get(cardRef);
422
+ return snapshot.exists ? snapshot.data() : null;
423
+ },
424
+ decide: ({ order, payments, existing, context: card })=>{
425
+ var _order_posTakeFeeCents, _ref;
426
+ var _order_totals;
427
+ if (existing) return {
428
+ kind: 'keep'
429
+ };
430
+ if (order.status !== 'pending') return NOT_OPEN;
431
+ if (!card) return {
432
+ kind: 'refuse',
433
+ status: 404,
434
+ error: 'No gift card has that code.'
435
+ };
436
+ const available = CommerceModel.giftCardAvailableCents(card, Date.now());
437
+ if (available <= 0) {
438
+ return {
439
+ kind: 'refuse',
440
+ status: 409,
441
+ error: CommerceModel.isGiftCardFrozen(card) ? 'This gift card is on hold and cannot be used right now.' : 'This gift card has no balance left.'
442
+ };
443
+ }
444
+ const open = tenderable(order, payments);
445
+ const amountCents = Math.min(available, open, askedCents > 0 ? askedCents : open);
446
+ if (!(amountCents > 0)) {
447
+ return {
448
+ kind: 'refuse',
449
+ status: 409,
450
+ error: 'Nothing is left to pay on this sale.'
451
+ };
452
+ }
453
+ const now = Date.now();
454
+ return {
455
+ kind: 'put',
456
+ payment: {
457
+ id: paymentId,
458
+ method: 'gift_card',
459
+ amountCents,
460
+ status: 'succeeded',
461
+ atMs: now,
462
+ settledAtMs: now,
463
+ giftCardId: code,
464
+ last4: code.slice(-4),
465
+ takeFeeCents: CommerceModel.posTakeShareCents({
466
+ takeFeeCents: Number((_order_posTakeFeeCents = order.posTakeFeeCents) != null ? _order_posTakeFeeCents : 0),
467
+ totalCents: Number((_ref = (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref : 0),
468
+ amountCents
469
+ }),
470
+ feeCents: 0,
471
+ cashierId: staff.uid
472
+ }
473
+ };
474
+ },
475
+ write: (transaction, card, payment)=>{
476
+ var _ref;
477
+ transaction.set(cardRef, {
478
+ balanceCents: Math.max(0, Number((_ref = card == null ? void 0 : card.balanceCents) != null ? _ref : 0) - payment.amountCents),
479
+ lastUsedAtMs: Date.now()
480
+ }, {
481
+ merge: true
482
+ });
483
+ }
484
+ });
485
+ }
486
+ function reservationRef(hostId, reservationId) {
487
+ return firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('reservations').doc(reservationId);
488
+ }
489
+ /** Charged to a checked-in stay's folio, in the same commit as the payment. */ async function takeFolio(staff, orderId, paymentId, body) {
490
+ var _body_reservationId, _body_amountCents;
491
+ const reservationId = String((_body_reservationId = body['reservationId']) != null ? _body_reservationId : '');
492
+ if (!/^[A-Za-z0-9_-]{1,128}$/.test(reservationId)) {
493
+ return {
494
+ ok: false,
495
+ status: 400,
496
+ error: 'Pick a reservation'
497
+ };
498
+ }
499
+ const askedCents = Math.round(Number((_body_amountCents = body['amountCents']) != null ? _body_amountCents : 0));
500
+ const stayRef = reservationRef(staff.hostId, reservationId);
501
+ return await applyPosPayment({
502
+ hostId: staff.hostId,
503
+ orderId,
504
+ paymentId,
505
+ prepare: async (transaction)=>(await transaction.get(stayRef)).exists,
506
+ decide: ({ order, payments, existing, context: stayExists })=>{
507
+ var _order_posTakeFeeCents, _ref;
508
+ var _order_totals;
509
+ if (existing) return {
510
+ kind: 'keep'
511
+ };
512
+ if (order.status !== 'pending') return NOT_OPEN;
513
+ if (!stayExists) return {
514
+ kind: 'refuse',
515
+ status: 404,
516
+ error: 'Unknown reservation'
517
+ };
518
+ const open = tenderable(order, payments);
519
+ const amountCents = Math.min(open, askedCents > 0 ? askedCents : open);
520
+ if (!(amountCents > 0)) {
521
+ return {
522
+ kind: 'refuse',
523
+ status: 409,
524
+ error: 'Nothing is left to pay on this sale.'
525
+ };
526
+ }
527
+ const now = Date.now();
528
+ return {
529
+ kind: 'put',
530
+ payment: {
531
+ id: paymentId,
532
+ method: 'folio',
533
+ amountCents,
534
+ status: 'succeeded',
535
+ atMs: now,
536
+ settledAtMs: now,
537
+ reservationId,
538
+ folioAtMs: now,
539
+ takeFeeCents: CommerceModel.posTakeShareCents({
540
+ takeFeeCents: Number((_order_posTakeFeeCents = order.posTakeFeeCents) != null ? _order_posTakeFeeCents : 0),
541
+ totalCents: Number((_ref = (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref : 0),
542
+ amountCents
543
+ }),
544
+ feeCents: 0,
545
+ cashierId: staff.uid
546
+ },
547
+ event: {
548
+ event: 'folio',
549
+ detail: `Charged to reservation ${reservationId}`
550
+ }
551
+ };
552
+ },
553
+ write: (transaction, _stay, payment)=>{
554
+ var _payment_folioAtMs;
555
+ // `update`, never a merge-set: a missing stay must not be minted as a
556
+ // stub holding one folio line (AGL-1760). It exists — read above.
557
+ transaction.update(stayRef, {
558
+ folio: firebaseAdmin.firestore.FieldValue.arrayUnion({
559
+ orderId,
560
+ paymentId: payment.id,
561
+ amountCents: payment.amountCents,
562
+ note: 'Register sale',
563
+ atMs: (_payment_folioAtMs = payment.folioAtMs) != null ? _payment_folioAtMs : Date.now()
564
+ })
565
+ });
566
+ }
567
+ });
568
+ }
569
+ /**
570
+ * Abandons an open sale: everything it took is handed back first — cards
571
+ * refunded in full (tip included, fee and transfer reversed), gift cards
572
+ * re-credited, the room charge taken off the folio, cash marked as returned —
573
+ * and only then is the order cancelled. A refund Stripe refuses stops the void
574
+ * with the sale still open and its payment still recorded, never cancelled
575
+ * over money that did not come back.
576
+ */ export async function voidPosSale(staff, orderId) {
577
+ const hostId = staff.hostId;
578
+ const order = await readPosSale(hostId, orderId);
579
+ if (!order) return {
580
+ ok: false,
581
+ status: 404,
582
+ error: 'Unknown sale'
583
+ };
584
+ if (order.status === 'cancelled') return {
585
+ ok: true,
586
+ order,
587
+ payment: null,
588
+ completed: false,
589
+ changed: false
590
+ };
591
+ if (order.status !== 'pending' || !Array.isArray(order.payments)) {
592
+ return {
593
+ ok: false,
594
+ status: 409,
595
+ error: 'This sale is already paid. Refund it from the order instead.'
596
+ };
597
+ }
598
+ for (const payment of CommerceModel.orderPayments(order)){
599
+ if (payment.status === 'pending' && CommerceModel.isCardPaymentMethod(payment.method)) {
600
+ const cancelled = await cancelPosCardPayment({
601
+ hostId,
602
+ orderId,
603
+ paymentId: payment.id
604
+ });
605
+ if (!cancelled.ok) return cancelled;
606
+ }
607
+ }
608
+ // Re-read after the cancels: one may have completed the sale in the gap.
609
+ const current = await readPosSale(hostId, orderId);
610
+ if (!current) return {
611
+ ok: false,
612
+ status: 404,
613
+ error: 'Unknown sale'
614
+ };
615
+ if (current.status !== 'pending') {
616
+ return {
617
+ ok: false,
618
+ status: 409,
619
+ error: 'The last card payment went through and the sale is paid. Refund it from the order instead.'
620
+ };
621
+ }
622
+ for (const payment of CommerceModel.orderPayments(current)){
623
+ if (payment.status !== 'succeeded') continue;
624
+ const reversed = await reversePayment(staff, current, payment);
625
+ if (!reversed.ok) return reversed;
626
+ }
627
+ const firestore = firebaseAdmin.app().firestore();
628
+ const orderRef = firestore.collection('hosts').doc(hostId).collection('orders').doc(orderId);
629
+ const cancelled = await firestore.runTransaction(async (transaction)=>{
630
+ var _data;
631
+ const fresh = _extends({}, CommerceModel.liftLegacyOrder((_data = (await transaction.get(orderRef)).data()) != null ? _data : {}), {
632
+ $id: orderId
633
+ });
634
+ if (fresh.status !== 'pending') return null;
635
+ const open = CommerceModel.orderPayments(fresh).some((payment)=>payment.status === 'pending' || payment.status === 'succeeded');
636
+ if (open) return null;
637
+ const next = _extends({}, fresh, {
638
+ status: 'cancelled',
639
+ timeline: CommerceModel.appendOrderEvent(fresh, 'pos-sale-voided', 'Voided at the register')
640
+ });
641
+ transaction.set(orderRef, _extends({
642
+ status: 'cancelled',
643
+ cancelledAtMs: Date.now(),
644
+ timeline: next.timeline
645
+ }, CommerceModel.orderListFields(next, orderId)), {
646
+ merge: true
647
+ });
648
+ return next;
649
+ });
650
+ if (!cancelled) {
651
+ return {
652
+ ok: false,
653
+ status: 409,
654
+ error: 'A payment on this sale changed. Check it and try again.'
655
+ };
656
+ }
657
+ await releasePosSaleDiscount(hostId, current);
658
+ return {
659
+ ok: true,
660
+ order: cancelled,
661
+ payment: null,
662
+ completed: false,
663
+ changed: true
664
+ };
665
+ }
666
+ /** Hands one settled payment back, recording `reversed` in the same commit. */ async function reversePayment(staff, order, payment) {
667
+ const hostId = staff.hostId;
668
+ if (CommerceModel.isCardPaymentMethod(payment.method)) {
669
+ if (!payment.paymentIntentId) {
670
+ return {
671
+ ok: false,
672
+ status: 409,
673
+ error: 'A card payment on this sale has no charge to refund.'
674
+ };
675
+ }
676
+ const refund = await posStripe('POST', 'refunds', {
677
+ idempotencyKey: `pos-void:${payment.id}`,
678
+ params: {
679
+ payment_intent: payment.paymentIntentId,
680
+ reverse_transfer: true,
681
+ refund_application_fee: true,
682
+ 'metadata[kind]': 'pos-void',
683
+ 'metadata[orderId]': order.$id
684
+ }
685
+ });
686
+ if (!refund.ok) {
687
+ return {
688
+ ok: false,
689
+ status: 502,
690
+ error: posStripeErrorMessage(refund.body, 'The card refund failed. The sale is still open.')
691
+ };
692
+ }
693
+ }
694
+ const cardRef = payment.giftCardId ? giftCardRef(hostId, payment.giftCardId) : null;
695
+ const stayRef = payment.reservationId ? reservationRef(hostId, payment.reservationId) : null;
696
+ return await applyPosPayment({
697
+ hostId,
698
+ orderId: order.$id,
699
+ paymentId: payment.id,
700
+ prepare: async (transaction)=>{
701
+ if (payment.method === 'gift_card' && cardRef) {
702
+ const snapshot = await transaction.get(cardRef);
703
+ return {
704
+ card: snapshot.exists ? snapshot.data() : null,
705
+ folio: null
706
+ };
707
+ }
708
+ if (payment.method === 'folio' && stayRef) {
709
+ var _snapshot_get;
710
+ const snapshot = await transaction.get(stayRef);
711
+ return {
712
+ card: null,
713
+ folio: snapshot.exists ? (_snapshot_get = snapshot.get('folio')) != null ? _snapshot_get : [] : null
714
+ };
715
+ }
716
+ return {
717
+ card: null,
718
+ folio: null
719
+ };
720
+ },
721
+ decide: ({ existing })=>{
722
+ if (!existing) return {
723
+ kind: 'refuse',
724
+ status: 404,
725
+ error: 'Unknown payment'
726
+ };
727
+ if (existing.status !== 'succeeded') return {
728
+ kind: 'keep'
729
+ };
730
+ return {
731
+ kind: 'put',
732
+ payment: _extends({}, existing, {
733
+ status: 'reversed'
734
+ }),
735
+ event: {
736
+ event: 'pos-payment-reversed',
737
+ detail: existing.method === 'cash' ? `${CommerceModel.describeOrderPayment(existing)} handed back in cash` : `${CommerceModel.describeOrderPayment(existing)} returned`
738
+ }
739
+ };
740
+ },
741
+ write: (transaction, context, reversed)=>{
742
+ if (reversed.method === 'gift_card' && cardRef && context.card) {
743
+ var _context_card_balanceCents;
744
+ transaction.set(cardRef, {
745
+ balanceCents: Number((_context_card_balanceCents = context.card.balanceCents) != null ? _context_card_balanceCents : 0) + reversed.amountCents
746
+ }, {
747
+ merge: true
748
+ });
749
+ }
750
+ if (reversed.method === 'folio' && stayRef && context.folio) {
751
+ transaction.update(stayRef, {
752
+ folio: context.folio.filter((entry)=>(entry == null ? void 0 : entry.paymentId) !== reversed.id)
753
+ });
754
+ }
755
+ }
756
+ });
757
+ }
758
+ /** A repeat of the same receipt choice inside this window sends nothing more. */ const RECEIPT_REPEAT_WINDOW_MS = 2 * 60 * 1000;
759
+ /**
760
+ * How the customer wants their receipt, from the cashier or the customer
761
+ * display. Kept on the order; an email chosen after the sale is paid is sent
762
+ * at once, and one chosen before is sent when it completes.
763
+ */ async function recordReceiptChoice(staff, orderId, body) {
764
+ var _body_channel;
765
+ const channel = String((_body_channel = body['channel']) != null ? _body_channel : '');
766
+ if (![
767
+ 'email',
768
+ 'sms',
769
+ 'print',
770
+ 'none'
771
+ ].includes(channel)) {
772
+ return {
773
+ ok: false,
774
+ status: 400,
775
+ error: 'Choose email, text, print or no receipt.'
776
+ };
777
+ }
778
+ const to = channel === 'email' ? CommerceModel.posDisplayEmail(body['to']) : channel === 'sms' ? CommerceModel.posDisplayPhone(body['to']) : '';
779
+ if ((channel === 'email' || channel === 'sms') && !to) {
780
+ return {
781
+ ok: false,
782
+ status: 400,
783
+ error: channel === 'email' ? 'Enter a valid email address.' : 'Enter a valid phone number.'
784
+ };
785
+ }
786
+ if (channel === 'sms' && !pluginSmsAvailable()) {
787
+ return {
788
+ ok: false,
789
+ status: 409,
790
+ error: 'Text receipts are not set up for this store.'
791
+ };
792
+ }
793
+ const marketingOptIn = channel === 'email' && body['marketingOptIn'] === true;
794
+ const firestore = firebaseAdmin.app().firestore();
795
+ const orderRef = firestore.collection('hosts').doc(staff.hostId).collection('orders').doc(orderId);
796
+ const order = await firestore.runTransaction(async (transaction)=>{
797
+ var _snapshot_data, _previous_to, _previous_atMs;
798
+ const snapshot = await transaction.get(orderRef);
799
+ if (!snapshot.exists) return null;
800
+ const fresh = _extends({}, CommerceModel.liftLegacyOrder((_snapshot_data = snapshot.data()) != null ? _snapshot_data : {}), {
801
+ $id: orderId
802
+ });
803
+ if (fresh.channel !== 'pos') return null;
804
+ // The same choice twice in a row (a double tap, or the display and the
805
+ // cashier answering together) is one receipt, not two.
806
+ const previous = fresh.receiptRequest;
807
+ if (fresh.status === 'paid' && previous && previous.channel === channel && String((_previous_to = previous.to) != null ? _previous_to : '') === to && Date.now() - Number((_previous_atMs = previous.atMs) != null ? _previous_atMs : 0) < RECEIPT_REPEAT_WINDOW_MS) {
808
+ return _extends({}, fresh, {
809
+ repeated: true
810
+ });
811
+ }
812
+ const receiptRequest = _extends({
813
+ channel
814
+ }, to ? {
815
+ to
816
+ } : {}, marketingOptIn ? {
817
+ marketingOptIn: true
818
+ } : {}, {
819
+ atMs: Date.now()
820
+ });
821
+ transaction.set(orderRef, _extends({
822
+ receiptRequest
823
+ }, channel === 'email' && !fresh.customerEmail ? _extends({
824
+ customerEmail: to
825
+ }, CommerceModel.orderListFields(_extends({}, fresh, {
826
+ customerEmail: to
827
+ }), orderId)) : {}, channel === 'sms' ? {
828
+ customerPhone: to
829
+ } : {}), {
830
+ merge: true
831
+ });
832
+ return _extends({}, fresh, {
833
+ receiptRequest
834
+ });
835
+ });
836
+ if (!order) return {
837
+ ok: false,
838
+ status: 404,
839
+ error: 'Unknown sale'
840
+ };
841
+ if (order.repeated) return {
842
+ ok: true,
843
+ order,
844
+ payment: null,
845
+ completed: false,
846
+ changed: false
847
+ };
848
+ if (order.status === 'paid' && channel === 'print') {
849
+ // Chosen after the sale completed: printed now on the register's receipt
850
+ // printer, under the sale's own key so it never prints twice (AGL-3609).
851
+ await printPosSaleReceipt(staff.hostId, orderId);
852
+ }
853
+ if (order.status === 'paid' && order.registerId) {
854
+ // The customer has answered (or the cashier for them): the display says
855
+ // thank you and drops the address they typed (AGL-3608).
856
+ await finishPosDisplayReceipt(staff.hostId, order.registerId).catch((error)=>console.error('[pos-payment] display finish failed', error));
857
+ }
858
+ if (order.status === 'paid' && (channel === 'email' || channel === 'sms')) {
859
+ var _order_customerEmail;
860
+ // Chosen after the sale completed: sent now, to where they said.
861
+ const sent = await deliverChosenPosReceipt({
862
+ hostId: staff.hostId,
863
+ orderId
864
+ }, {
865
+ channel,
866
+ to,
867
+ orderEmail: String((_order_customerEmail = order.customerEmail) != null ? _order_customerEmail : '')
868
+ });
869
+ if (channel === 'email') {
870
+ var _ref;
871
+ var _order_totals;
872
+ await recordCapturedContact(_extends({
873
+ orgId: '',
874
+ hostId: staff.hostId,
875
+ identity: {
876
+ email: to
877
+ },
878
+ surface: 'relationship',
879
+ lifecycleFloor: 'customer'
880
+ }, marketingOptIn ? {
881
+ marketingConsent: true
882
+ } : {}, {
883
+ interaction: {
884
+ source: 'order',
885
+ refId: orderId,
886
+ summary: `In-store purchase (${CommerceModel.formatReceiptMoney(Number((_ref = (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref : 0), POS_CURRENCY)})`
887
+ }
888
+ })).catch((error)=>console.error('[pos-payment] contact capture failed', error));
889
+ }
890
+ if (sent !== 'sent') {
891
+ // A failed send is not a repeat: the cashier's retry goes out.
892
+ await orderRef.set({
893
+ receiptRequest: {
894
+ atMs: 0
895
+ }
896
+ }, {
897
+ merge: true
898
+ }).catch((error)=>console.error('[pos-payment] receipt retry reset failed', error));
899
+ }
900
+ if (sent === 'not_configured') {
901
+ return {
902
+ ok: false,
903
+ status: 409,
904
+ error: channel === 'sms' ? 'Text receipts are not set up for this store.' : 'Email is not set up.'
905
+ };
906
+ }
907
+ if (sent !== 'sent') return {
908
+ ok: false,
909
+ status: 502,
910
+ error: 'The receipt could not be sent.'
911
+ };
912
+ }
913
+ return {
914
+ ok: true,
915
+ order,
916
+ payment: null,
917
+ completed: false,
918
+ changed: true
919
+ };
920
+ }
921
+
922
+ //# sourceMappingURL=pos-payment.js.map