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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/catalog-organization-card.component.js +1 -0
  39. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  40. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  41. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  42. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  43. package/src/lib/components/console/host-orders-card.component.js +88 -6
  44. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  45. package/src/lib/components/console/locations-card.component.js +164 -57
  46. package/src/lib/components/console/locations-card.component.js.map +1 -1
  47. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  48. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  49. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  50. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  51. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  52. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  53. package/src/lib/components/console/order-invoice.component.js +81 -0
  54. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  55. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  56. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  57. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  58. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  59. package/src/lib/components/console/order-returns.component.js +142 -0
  60. package/src/lib/components/console/order-returns.component.js.map +1 -0
  61. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  62. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  63. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  64. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  65. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  66. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  67. package/src/lib/components/console/order-zones.d.ts +155 -0
  68. package/src/lib/components/console/order-zones.js +40 -0
  69. package/src/lib/components/console/order-zones.js.map +1 -0
  70. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  71. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  72. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  73. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  74. package/src/lib/components/console/pos/pos-api.js +101 -0
  75. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  77. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  78. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  80. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  81. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  83. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  84. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  86. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  87. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  89. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  90. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  92. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  93. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  94. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  95. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  96. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  97. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  98. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  99. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  100. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  101. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  102. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  103. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  104. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  105. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  107. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  108. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  110. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  111. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  113. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  114. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  115. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  116. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  117. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  118. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  119. package/src/lib/components/console/pos-display-page.component.js +407 -0
  120. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  122. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  123. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  125. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  126. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  128. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  129. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  131. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  132. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  134. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  135. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  140. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  141. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  143. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  144. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  152. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  153. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  155. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  156. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  157. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  158. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  159. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  161. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  162. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  164. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  165. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  166. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  167. package/src/lib/components/console/pos-page.component.js +756 -654
  168. package/src/lib/components/console/pos-page.component.js.map +1 -1
  169. package/src/lib/components/console/pos-zones.d.ts +23 -0
  170. package/src/lib/components/console/pos-zones.js +31 -0
  171. package/src/lib/components/console/pos-zones.js.map +1 -0
  172. package/src/lib/components/console/product-editor-dialog.component.js +61 -71
  173. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  174. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  175. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  176. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  177. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  178. package/src/lib/components/console/product-register-fields.component.js +241 -0
  179. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  180. package/src/lib/components/console/product-zones.d.ts +44 -0
  181. package/src/lib/components/console/product-zones.js.map +1 -1
  182. package/src/lib/components/console/products-hub-card.component.js +23 -20
  183. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  184. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  185. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  186. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  187. package/src/lib/components/console/registers-card.component.js +24 -5
  188. package/src/lib/components/console/registers-card.component.js.map +1 -1
  189. package/src/lib/components/console/return-actions.d.ts +38 -0
  190. package/src/lib/components/console/return-actions.js +76 -0
  191. package/src/lib/components/console/return-actions.js.map +1 -0
  192. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  193. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  194. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  195. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  196. package/src/lib/components/console/return-settings-card.component.js +195 -0
  197. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  198. package/src/lib/components/console/return-zones.d.ts +87 -0
  199. package/src/lib/components/console/return-zones.js +31 -0
  200. package/src/lib/components/console/return-zones.js.map +1 -0
  201. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  202. package/src/lib/components/console/returns-card.component.js +159 -0
  203. package/src/lib/components/console/returns-card.component.js.map +1 -0
  204. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  205. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  206. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  207. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  208. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  209. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  210. package/src/lib/components/console/shipstation-card.component.js +345 -0
  211. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  212. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  213. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  214. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  215. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  216. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  217. package/src/lib/components/console/store-settings-card.component.js +2 -66
  218. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  219. package/src/lib/components/console/store-zones.d.ts +42 -0
  220. package/src/lib/components/console/store-zones.js +39 -0
  221. package/src/lib/components/console/store-zones.js.map +1 -0
  222. package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
  223. package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
  224. package/src/lib/components/order-status.d.ts +36 -0
  225. package/src/lib/components/order-status.js +502 -0
  226. package/src/lib/components/order-status.js.map +1 -0
  227. package/src/lib/components/product-detail.js +41 -2
  228. package/src/lib/components/product-detail.js.map +1 -1
  229. package/src/lib/components/return-request.d.ts +32 -0
  230. package/src/lib/components/return-request.js +576 -0
  231. package/src/lib/components/return-request.js.map +1 -0
  232. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  233. package/src/lib/components/storefront-payment-appearance.js +114 -0
  234. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  235. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  236. package/src/lib/components/storefront-payment-element.js +332 -33
  237. package/src/lib/components/storefront-payment-element.js.map +1 -1
  238. package/src/lib/constants/order-status.d.ts +22 -0
  239. package/src/lib/constants/order-status.js +22 -0
  240. package/src/lib/constants/order-status.js.map +1 -0
  241. package/src/lib/constants/return-request.d.ts +27 -0
  242. package/src/lib/constants/return-request.js +32 -0
  243. package/src/lib/constants/return-request.js.map +1 -0
  244. package/src/lib/constants/stock-movement-query.js +2 -1
  245. package/src/lib/constants/stock-movement-query.js.map +1 -1
  246. package/src/lib/declarations.console-server.js +9 -0
  247. package/src/lib/declarations.console-server.js.map +1 -1
  248. package/src/lib/declarations.server.d.ts +2 -1
  249. package/src/lib/declarations.server.js +68 -1
  250. package/src/lib/declarations.server.js.map +1 -1
  251. package/src/lib/model/buyer-notifications.d.ts +59 -0
  252. package/src/lib/model/buyer-notifications.js +97 -0
  253. package/src/lib/model/buyer-notifications.js.map +1 -0
  254. package/src/lib/model/commerce-orders.d.ts +171 -2
  255. package/src/lib/model/commerce-orders.js +26 -16
  256. package/src/lib/model/commerce-orders.js.map +1 -1
  257. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  258. package/src/lib/model/commerce-payment-methods.js +247 -0
  259. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  260. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  261. package/src/lib/model/commerce-pos-ops.js +721 -0
  262. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  263. package/src/lib/model/commerce-pos.d.ts +263 -0
  264. package/src/lib/model/commerce-pos.js +375 -0
  265. package/src/lib/model/commerce-pos.js.map +1 -0
  266. package/src/lib/model/commerce-printers.d.ts +211 -0
  267. package/src/lib/model/commerce-printers.js +181 -0
  268. package/src/lib/model/commerce-printers.js.map +1 -0
  269. package/src/lib/model/commerce-receipt.d.ts +97 -0
  270. package/src/lib/model/commerce-receipt.js +180 -0
  271. package/src/lib/model/commerce-receipt.js.map +1 -0
  272. package/src/lib/model/commerce-returns.d.ts +207 -0
  273. package/src/lib/model/commerce-returns.js +300 -0
  274. package/src/lib/model/commerce-returns.js.map +1 -0
  275. package/src/lib/model/commerce-shipping.d.ts +44 -1
  276. package/src/lib/model/commerce-shipping.js +53 -9
  277. package/src/lib/model/commerce-shipping.js.map +1 -1
  278. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  279. package/src/lib/model/commerce-tax-engine.js +129 -0
  280. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  281. package/src/lib/model/commerce.d.ts +91 -2
  282. package/src/lib/model/commerce.js +89 -1
  283. package/src/lib/model/commerce.js.map +1 -1
  284. package/src/lib/model/index.d.ts +16 -0
  285. package/src/lib/model/index.js +16 -0
  286. package/src/lib/model/index.js.map +1 -1
  287. package/src/lib/model/order-events.d.ts +154 -0
  288. package/src/lib/model/order-events.js +153 -0
  289. package/src/lib/model/order-events.js.map +1 -0
  290. package/src/lib/model/order-fulfillment.d.ts +117 -0
  291. package/src/lib/model/order-fulfillment.js +217 -0
  292. package/src/lib/model/order-fulfillment.js.map +1 -0
  293. package/src/lib/model/order-history.d.ts +58 -0
  294. package/src/lib/model/order-history.js +22 -0
  295. package/src/lib/model/order-history.js.map +1 -0
  296. package/src/lib/model/order-list-fields.d.ts +9 -1
  297. package/src/lib/model/order-list-fields.js +7 -1
  298. package/src/lib/model/order-list-fields.js.map +1 -1
  299. package/src/lib/model/order-shipping-export.d.ts +91 -0
  300. package/src/lib/model/order-shipping-export.js +192 -0
  301. package/src/lib/model/order-shipping-export.js.map +1 -0
  302. package/src/lib/model/order-status-view.d.ts +103 -0
  303. package/src/lib/model/order-status-view.js +156 -0
  304. package/src/lib/model/order-status-view.js.map +1 -0
  305. package/src/lib/model/order-webhooks.d.ts +142 -0
  306. package/src/lib/model/order-webhooks.js +91 -0
  307. package/src/lib/model/order-webhooks.js.map +1 -0
  308. package/src/lib/model/product-channel.d.ts +56 -0
  309. package/src/lib/model/product-channel.js +86 -0
  310. package/src/lib/model/product-channel.js.map +1 -0
  311. package/src/lib/model/product-modifiers.d.ts +80 -0
  312. package/src/lib/model/product-modifiers.js +140 -0
  313. package/src/lib/model/product-modifiers.js.map +1 -0
  314. package/src/lib/model/product-write.d.ts +186 -0
  315. package/src/lib/model/product-write.js +116 -0
  316. package/src/lib/model/product-write.js.map +1 -0
  317. package/src/lib/model/shippingeasy.d.ts +94 -0
  318. package/src/lib/model/shippingeasy.js +267 -0
  319. package/src/lib/model/shippingeasy.js.map +1 -0
  320. package/src/lib/model/shipstation.d.ts +125 -0
  321. package/src/lib/model/shipstation.js +399 -0
  322. package/src/lib/model/shipstation.js.map +1 -0
  323. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  324. package/src/lib/model/smart-collection-reads.js +63 -0
  325. package/src/lib/model/smart-collection-reads.js.map +1 -0
  326. package/src/lib/model/tracking-url.d.ts +74 -0
  327. package/src/lib/model/tracking-url.js +159 -0
  328. package/src/lib/model/tracking-url.js.map +1 -0
  329. package/src/lib/plugin-config.d.ts +13 -0
  330. package/src/lib/plugin-config.js +77 -5
  331. package/src/lib/plugin-config.js.map +1 -1
  332. package/src/lib/plugin.js +26 -0
  333. package/src/lib/plugin.js.map +1 -1
  334. package/src/lib/pos-ops-config.d.ts +39 -0
  335. package/src/lib/pos-ops-config.js +88 -0
  336. package/src/lib/pos-ops-config.js.map +1 -0
  337. package/src/lib/printing/print-document.d.ts +106 -0
  338. package/src/lib/printing/print-document.js +464 -0
  339. package/src/lib/printing/print-document.js.map +1 -0
  340. package/src/lib/printing/product-labels.d.ts +58 -0
  341. package/src/lib/printing/product-labels.js +116 -0
  342. package/src/lib/printing/product-labels.js.map +1 -0
  343. package/src/lib/printing/render-epson.d.ts +57 -0
  344. package/src/lib/printing/render-epson.js +135 -0
  345. package/src/lib/printing/render-epson.js.map +1 -0
  346. package/src/lib/printing/render-star.d.ts +45 -0
  347. package/src/lib/printing/render-star.js +100 -0
  348. package/src/lib/printing/render-star.js.map +1 -0
  349. package/src/lib/printing/render-text.d.ts +25 -0
  350. package/src/lib/printing/render-text.js +53 -0
  351. package/src/lib/printing/render-text.js.map +1 -0
  352. package/src/lib/server/api-v1/openapi.js +27 -4
  353. package/src/lib/server/api-v1/openapi.js.map +1 -1
  354. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  355. package/src/lib/server/api-v1/order-view.js +120 -0
  356. package/src/lib/server/api-v1/order-view.js.map +1 -0
  357. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  358. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  359. package/src/lib/server/billing-webhook.js +135 -28
  360. package/src/lib/server/billing-webhook.js.map +1 -1
  361. package/src/lib/server/cancel-order.js +29 -0
  362. package/src/lib/server/cancel-order.js.map +1 -1
  363. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  364. package/src/lib/server/carrier-rates-availability.js +76 -0
  365. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  366. package/src/lib/server/carrier-shipping.d.ts +84 -0
  367. package/src/lib/server/carrier-shipping.js +135 -0
  368. package/src/lib/server/carrier-shipping.js.map +1 -0
  369. package/src/lib/server/cart-checkout.d.ts +2 -0
  370. package/src/lib/server/cart-checkout.js +226 -22
  371. package/src/lib/server/cart-checkout.js.map +1 -1
  372. package/src/lib/server/channel-order-updates.d.ts +50 -0
  373. package/src/lib/server/channel-order-updates.js +290 -0
  374. package/src/lib/server/channel-order-updates.js.map +1 -0
  375. package/src/lib/server/channel-orders.d.ts +85 -0
  376. package/src/lib/server/channel-orders.js +543 -0
  377. package/src/lib/server/channel-orders.js.map +1 -0
  378. package/src/lib/server/checkout-extras.d.ts +64 -0
  379. package/src/lib/server/checkout-extras.js +157 -0
  380. package/src/lib/server/checkout-extras.js.map +1 -0
  381. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  382. package/src/lib/server/checkout-status.js +111 -0
  383. package/src/lib/server/checkout-status.js.map +1 -0
  384. package/src/lib/server/checkout.js +86 -9
  385. package/src/lib/server/checkout.js.map +1 -1
  386. package/src/lib/server/draft-order.js +34 -5
  387. package/src/lib/server/draft-order.js.map +1 -1
  388. package/src/lib/server/fulfill-order.d.ts +127 -10
  389. package/src/lib/server/fulfill-order.js +451 -49
  390. package/src/lib/server/fulfill-order.js.map +1 -1
  391. package/src/lib/server/legacy-feed.d.ts +28 -0
  392. package/src/lib/server/legacy-feed.js +52 -0
  393. package/src/lib/server/legacy-feed.js.map +1 -0
  394. package/src/lib/server/native-checkout.d.ts +34 -15
  395. package/src/lib/server/native-checkout.js +32 -17
  396. package/src/lib/server/native-checkout.js.map +1 -1
  397. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  398. package/src/lib/server/order-event-host-emit.js +30 -0
  399. package/src/lib/server/order-event-host-emit.js.map +1 -0
  400. package/src/lib/server/order-event-triggers.d.ts +37 -0
  401. package/src/lib/server/order-event-triggers.js +119 -0
  402. package/src/lib/server/order-event-triggers.js.map +1 -0
  403. package/src/lib/server/order-events.d.ts +62 -0
  404. package/src/lib/server/order-events.js +109 -0
  405. package/src/lib/server/order-events.js.map +1 -0
  406. package/src/lib/server/order-history.d.ts +23 -0
  407. package/src/lib/server/order-history.js +65 -0
  408. package/src/lib/server/order-history.js.map +1 -0
  409. package/src/lib/server/order-notifications.d.ts +185 -0
  410. package/src/lib/server/order-notifications.js +567 -0
  411. package/src/lib/server/order-notifications.js.map +1 -0
  412. package/src/lib/server/order-receipt-send.d.ts +39 -0
  413. package/src/lib/server/order-receipt-send.js +151 -0
  414. package/src/lib/server/order-receipt-send.js.map +1 -0
  415. package/src/lib/server/order-status-token.d.ts +31 -0
  416. package/src/lib/server/order-status-token.js +75 -0
  417. package/src/lib/server/order-status-token.js.map +1 -0
  418. package/src/lib/server/order-status.d.ts +58 -0
  419. package/src/lib/server/order-status.js +141 -0
  420. package/src/lib/server/order-status.js.map +1 -0
  421. package/src/lib/server/order-webhooks.d.ts +108 -0
  422. package/src/lib/server/order-webhooks.js +622 -0
  423. package/src/lib/server/order-webhooks.js.map +1 -0
  424. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  425. package/src/lib/server/orders-shipping-prepare.js +121 -0
  426. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  427. package/src/lib/server/payment-method-domains.d.ts +209 -0
  428. package/src/lib/server/payment-method-domains.js +444 -0
  429. package/src/lib/server/payment-method-domains.js.map +1 -0
  430. package/src/lib/server/payment-methods.d.ts +77 -0
  431. package/src/lib/server/payment-methods.js +284 -0
  432. package/src/lib/server/payment-methods.js.map +1 -0
  433. package/src/lib/server/pos-auth.d.ts +50 -0
  434. package/src/lib/server/pos-auth.js +121 -0
  435. package/src/lib/server/pos-auth.js.map +1 -0
  436. package/src/lib/server/pos-customer.d.ts +49 -0
  437. package/src/lib/server/pos-customer.js +257 -0
  438. package/src/lib/server/pos-customer.js.map +1 -0
  439. package/src/lib/server/pos-display.d.ts +57 -0
  440. package/src/lib/server/pos-display.js +419 -0
  441. package/src/lib/server/pos-display.js.map +1 -0
  442. package/src/lib/server/pos-fee-month.d.ts +34 -0
  443. package/src/lib/server/pos-fee-month.js +36 -0
  444. package/src/lib/server/pos-fee-month.js.map +1 -0
  445. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  446. package/src/lib/server/pos-ops-gate.js +295 -0
  447. package/src/lib/server/pos-ops-gate.js.map +1 -0
  448. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  449. package/src/lib/server/pos-ops-routes.js +36 -0
  450. package/src/lib/server/pos-ops-routes.js.map +1 -0
  451. package/src/lib/server/pos-order.d.ts +1 -18
  452. package/src/lib/server/pos-order.js +222 -42
  453. package/src/lib/server/pos-order.js.map +1 -1
  454. package/src/lib/server/pos-payment.d.ts +39 -0
  455. package/src/lib/server/pos-payment.js +922 -0
  456. package/src/lib/server/pos-payment.js.map +1 -0
  457. package/src/lib/server/pos-print.d.ts +82 -0
  458. package/src/lib/server/pos-print.js +193 -0
  459. package/src/lib/server/pos-print.js.map +1 -0
  460. package/src/lib/server/pos-readers.d.ts +27 -0
  461. package/src/lib/server/pos-readers.js +276 -0
  462. package/src/lib/server/pos-readers.js.map +1 -0
  463. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  464. package/src/lib/server/pos-refund-authority.js +72 -0
  465. package/src/lib/server/pos-refund-authority.js.map +1 -0
  466. package/src/lib/server/pos-return.d.ts +58 -0
  467. package/src/lib/server/pos-return.js +891 -0
  468. package/src/lib/server/pos-return.js.map +1 -0
  469. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  470. package/src/lib/server/pos-sale-stamp.js +84 -0
  471. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  472. package/src/lib/server/pos-sale.d.ts +170 -0
  473. package/src/lib/server/pos-sale.js +461 -0
  474. package/src/lib/server/pos-sale.js.map +1 -0
  475. package/src/lib/server/pos-shift.d.ts +45 -0
  476. package/src/lib/server/pos-shift.js +484 -0
  477. package/src/lib/server/pos-shift.js.map +1 -0
  478. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  479. package/src/lib/server/pos-staff-pin.js +339 -0
  480. package/src/lib/server/pos-staff-pin.js.map +1 -0
  481. package/src/lib/server/pos-stripe.d.ts +91 -0
  482. package/src/lib/server/pos-stripe.js +129 -0
  483. package/src/lib/server/pos-stripe.js.map +1 -0
  484. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  485. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  486. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  487. package/src/lib/server/pos-terminal.d.ts +218 -0
  488. package/src/lib/server/pos-terminal.js +1014 -0
  489. package/src/lib/server/pos-terminal.js.map +1 -0
  490. package/src/lib/server/print-queue.d.ts +124 -0
  491. package/src/lib/server/print-queue.js +301 -0
  492. package/src/lib/server/print-queue.js.map +1 -0
  493. package/src/lib/server/printer-poll.d.ts +75 -0
  494. package/src/lib/server/printer-poll.js +325 -0
  495. package/src/lib/server/printer-poll.js.map +1 -0
  496. package/src/lib/server/printer-secret.d.ts +39 -0
  497. package/src/lib/server/printer-secret.js +56 -0
  498. package/src/lib/server/printer-secret.js.map +1 -0
  499. package/src/lib/server/printers.d.ts +114 -0
  500. package/src/lib/server/printers.js +546 -0
  501. package/src/lib/server/printers.js.map +1 -0
  502. package/src/lib/server/product-catalog.d.ts +42 -0
  503. package/src/lib/server/product-catalog.js +309 -0
  504. package/src/lib/server/product-catalog.js.map +1 -0
  505. package/src/lib/server/product-drafts.d.ts +5 -1
  506. package/src/lib/server/product-drafts.js +3 -3
  507. package/src/lib/server/product-drafts.js.map +1 -1
  508. package/src/lib/server/product-writer.d.ts +19 -0
  509. package/src/lib/server/product-writer.js +261 -0
  510. package/src/lib/server/product-writer.js.map +1 -0
  511. package/src/lib/server/products-write.d.ts +61 -0
  512. package/src/lib/server/products-write.js +375 -0
  513. package/src/lib/server/products-write.js.map +1 -0
  514. package/src/lib/server/refund.js +110 -45
  515. package/src/lib/server/refund.js.map +1 -1
  516. package/src/lib/server/reserve.js +2 -0
  517. package/src/lib/server/reserve.js.map +1 -1
  518. package/src/lib/server/return-status-action.d.ts +37 -0
  519. package/src/lib/server/return-status-action.js +57 -0
  520. package/src/lib/server/return-status-action.js.map +1 -0
  521. package/src/lib/server/returns.d.ts +119 -0
  522. package/src/lib/server/returns.js +938 -0
  523. package/src/lib/server/returns.js.map +1 -0
  524. package/src/lib/server/shipment-records.d.ts +36 -0
  525. package/src/lib/server/shipment-records.js +289 -0
  526. package/src/lib/server/shipment-records.js.map +1 -0
  527. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  528. package/src/lib/server/shipping-connector-gates.js +97 -0
  529. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  530. package/src/lib/server/shipping-connectors.d.ts +29 -0
  531. package/src/lib/server/shipping-connectors.js +236 -0
  532. package/src/lib/server/shipping-connectors.js.map +1 -0
  533. package/src/lib/server/shippingeasy.d.ts +238 -0
  534. package/src/lib/server/shippingeasy.js +787 -0
  535. package/src/lib/server/shippingeasy.js.map +1 -0
  536. package/src/lib/server/shipstation.d.ts +129 -0
  537. package/src/lib/server/shipstation.js +483 -0
  538. package/src/lib/server/shipstation.js.map +1 -0
  539. package/src/lib/server/site-page-resolver.d.ts +5 -0
  540. package/src/lib/server/site-page-resolver.js +156 -1
  541. package/src/lib/server/site-page-resolver.js.map +1 -1
  542. package/src/lib/server/stock-levels.d.ts +21 -0
  543. package/src/lib/server/stock-levels.js +263 -0
  544. package/src/lib/server/stock-levels.js.map +1 -0
  545. package/src/lib/server/stripe-refund.d.ts +47 -0
  546. package/src/lib/server/stripe-refund.js +87 -0
  547. package/src/lib/server/stripe-refund.js.map +1 -0
  548. package/src/lib/server/supplier-update.js +46 -5
  549. package/src/lib/server/supplier-update.js.map +1 -1
  550. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  551. package/src/lib/server/tax-engine-quote.js +105 -0
  552. package/src/lib/server/tax-engine-quote.js.map +1 -0
  553. package/src/lib/server.js +143 -2
  554. package/src/lib/server.js.map +1 -1
  555. package/src/lib/site.js +12 -0
  556. package/src/lib/site.js.map +1 -1
  557. package/src/lib/subprocessors.d.ts +26 -0
  558. package/src/lib/subprocessors.js +50 -0
  559. package/src/lib/subprocessors.js.map +1 -0
  560. package/src/lib/tenant-emails.js +461 -3
  561. package/src/lib/tenant-emails.js.map +1 -1
  562. package/src/lib/testing/fake-firestore.d.ts +45 -0
  563. package/src/lib/testing/fake-firestore.js +189 -0
  564. package/src/lib/testing/fake-firestore.js.map +1 -0
  565. package/src/lib/testing/memory-firestore.d.ts +136 -0
  566. package/src/lib/testing/memory-firestore.js +282 -0
  567. package/src/lib/testing/memory-firestore.js.map +1 -0
  568. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  569. package/src/lib/testing/pos-ops-harness.js +184 -0
  570. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  571. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  572. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  573. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  574. package/src/lib/transfer/products.server.d.ts +5 -0
  575. package/src/lib/transfer/products.server.js +2 -2
  576. package/src/lib/transfer/products.server.js.map +1 -1
  577. package/src/lib/transfer/records-transfer.d.ts +11 -1
  578. package/src/lib/transfer/records-transfer.js +127 -5
  579. package/src/lib/transfer/records-transfer.js.map +1 -1
  580. package/src/lib/transfer/records.server.d.ts +9 -2
  581. package/src/lib/transfer/records.server.js +58 -7
  582. package/src/lib/transfer/records.server.js.map +1 -1
  583. package/src/lib/transfer/register-transfer-resources.js +40 -1
  584. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  585. package/src/lib/transfer/register-transfer-ui.js +4 -1
  586. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  587. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  588. package/src/lib/transfer/shipping-presets.js +156 -0
  589. package/src/lib/transfer/shipping-presets.js.map +1 -0
  590. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  591. package/src/lib/transfer/tracking-transfer.js +546 -0
  592. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  593. package/src/lib/transfer/tracking.server.d.ts +37 -0
  594. package/src/lib/transfer/tracking.server.js +393 -0
  595. package/src/lib/transfer/tracking.server.js.map +1 -0
  596. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  597. package/src/lib/transfer/transfer-keys.js +6 -2
  598. package/src/lib/transfer/transfer-keys.js.map +1 -1
  599. package/src/lib/utils/code128.d.ts +37 -0
  600. package/src/lib/utils/code128.js +199 -0
  601. package/src/lib/utils/code128.js.map +1 -0
  602. package/src/lib/utils/order-invoice.d.ts +55 -0
  603. package/src/lib/utils/order-invoice.js +127 -0
  604. package/src/lib/utils/order-invoice.js.map +1 -0
  605. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  606. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  607. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  608. package/src/lib/server/feed.js +0 -69
  609. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,375 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /*==========================================
17
+ * THE POS TENDER LEDGER (AGL-3607).
18
+ *
19
+ * A register sale used to be settled by exactly one tender and recorded none:
20
+ * whether a POS order was paid in cash, by the QR link or to a room was
21
+ * inferred afterwards from which other fields happened to be set. A sale now
22
+ * carries `payments[]`, one entry per tender, and takes payments until the
23
+ * balance due is zero. Only then is it `paid`.
24
+ *
25
+ * Every figure here is integer cents. `amountCents` is what a payment put
26
+ * toward the SALE; a tip rides beside it in `tipCents` and never counts toward
27
+ * the balance, the platform's take or the store's revenue. Tips belong to the
28
+ * merchant and their staff.
29
+ *
30
+ * Pure and framework-free, so the register, the customer display and the
31
+ * server read one answer.
32
+ *=========================================*/ /** How one payment toward a register sale was taken. */ import { _ as _extends } from "@swc/helpers/_/_extends";
33
+ import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
34
+ export const ORDER_PAYMENT_METHODS = [
35
+ 'cash',
36
+ 'card_present',
37
+ 'card_keyed',
38
+ 'card_link',
39
+ 'gift_card',
40
+ 'folio'
41
+ ];
42
+ /** The tenders whose money moves through Stripe. */ export const POS_CARD_METHODS = new Set([
43
+ 'card_present',
44
+ 'card_keyed',
45
+ 'card_link'
46
+ ]);
47
+ export function isCardPaymentMethod(method) {
48
+ return POS_CARD_METHODS.has(method);
49
+ }
50
+ /** Whole non-negative cents from an untrusted value. */ function wholeCents(value) {
51
+ const number = Math.round(Number(value));
52
+ return Number.isFinite(number) && number > 0 ? number : 0;
53
+ }
54
+ /**
55
+ * The order's payments, read through one door.
56
+ *
57
+ * Orders written before the ledger existed carry no `payments`, so one is
58
+ * INFERRED from the fields the single-tender register wrote: a folio sale has
59
+ * `reservationId`, a QR sale has `checkoutSessionId`, and anything else on the
60
+ * POS channel was cash. A pending legacy sale is the QR link still waiting.
61
+ * Online orders paid through Stripe Checkout read as one `card_link` payment.
62
+ * Nothing is written back: this is a reader, never a migration.
63
+ */ export function orderPayments(order) {
64
+ var _ref;
65
+ var _order_totals;
66
+ if (Array.isArray(order == null ? void 0 : order.payments)) {
67
+ return order.payments.filter((payment)=>Boolean(payment) && typeof payment === 'object' && Boolean(payment.id));
68
+ }
69
+ const totalCents = wholeCents((_ref = order == null ? void 0 : (_order_totals = order.totals) == null ? void 0 : _order_totals.totalCents) != null ? _ref : order == null ? void 0 : order.amountCents);
70
+ if (!(totalCents > 0)) return [];
71
+ const settled = (order == null ? void 0 : order.status) !== 'pending' && (order == null ? void 0 : order.status) !== 'cancelled';
72
+ const atMs = Number(order == null ? void 0 : order.createdAtMs) || 0;
73
+ const method = (order == null ? void 0 : order.reservationId) ? 'folio' : (order == null ? void 0 : order.checkoutSessionId) || (order == null ? void 0 : order.paymentIntentId) || (order == null ? void 0 : order.channel) !== 'pos' ? 'card_link' : 'cash';
74
+ return [
75
+ _extends({
76
+ id: 'legacy',
77
+ method,
78
+ amountCents: totalCents,
79
+ status: settled ? 'succeeded' : (order == null ? void 0 : order.status) === 'cancelled' ? 'canceled' : 'pending',
80
+ atMs
81
+ }, (order == null ? void 0 : order.paymentIntentId) ? {
82
+ paymentIntentId: order.paymentIntentId
83
+ } : {}, (order == null ? void 0 : order.checkoutSessionId) ? {
84
+ checkoutSessionId: order.checkoutSessionId
85
+ } : {}, (order == null ? void 0 : order.reservationId) ? {
86
+ reservationId: order.reservationId
87
+ } : {})
88
+ ];
89
+ }
90
+ /** Cents put toward the sale by payments that succeeded. */ export function posSettledCents(payments) {
91
+ return payments.filter((payment)=>payment.status === 'succeeded').reduce((sum, payment)=>sum + wholeCents(payment.amountCents), 0);
92
+ }
93
+ /**
94
+ * Cents spoken for: succeeded payments plus the ones still in flight. A
95
+ * reader waiting for a tap has claimed its share of the balance, so a second
96
+ * tender cannot be started for the same money.
97
+ */ export function posReservedCents(payments) {
98
+ return payments.filter((payment)=>payment.status === 'succeeded' || payment.status === 'pending').reduce((sum, payment)=>sum + wholeCents(payment.amountCents), 0);
99
+ }
100
+ /** What the customer still owes, by settled payments. */ export function posBalanceDueCents(totalCents, payments) {
101
+ return Math.max(0, wholeCents(totalCents) - posSettledCents(payments));
102
+ }
103
+ /** What a NEW payment may still take: the balance less what is in flight. */ export function posTenderableCents(totalCents, payments) {
104
+ return Math.max(0, wholeCents(totalCents) - posReservedCents(payments));
105
+ }
106
+ /** Tips taken across the sale's settled payments. */ export function posTipCents(payments) {
107
+ return payments.filter((payment)=>payment.status === 'succeeded').reduce((sum, payment)=>sum + wholeCents(payment.tipCents), 0);
108
+ }
109
+ /**
110
+ * The share of the sale's take a payment of `amountCents` carries.
111
+ *
112
+ * Proportional to the part of the SALE it pays, never to the tip. Card
113
+ * payments carry their share in `application_fee_amount`; whatever the card
114
+ * shares leave is accrued to the invoice at completion
115
+ * ({@link posInvoiceTakeCents}), so the take is exact however the sale was
116
+ * split and however each share rounded.
117
+ */ export function posTakeShareCents(input) {
118
+ const take = wholeCents(input.takeFeeCents);
119
+ const total = wholeCents(input.totalCents);
120
+ const amount = Math.min(wholeCents(input.amountCents), total);
121
+ if (!(take > 0) || !(total > 0) || !(amount > 0)) return 0;
122
+ return Math.min(take, Math.round(take * amount / total));
123
+ }
124
+ /**
125
+ * What of the sale's take was NOT netted from a card payout, and therefore
126
+ * goes on the merchant's invoice: the whole take less every succeeded card
127
+ * payment's share. Never negative.
128
+ */ export function posInvoiceTakeCents(input) {
129
+ const netted = input.payments.filter((payment)=>payment.status === 'succeeded' && isCardPaymentMethod(payment.method)).reduce((sum, payment)=>sum + wholeCents(payment.takeFeeCents), 0);
130
+ return Math.max(0, wholeCents(input.takeFeeCents) - netted);
131
+ }
132
+ /** How the sale's fee reaches the platform, from what actually paid it. */ export function posFeeCollection(payments) {
133
+ const settled = payments.filter((payment)=>payment.status === 'succeeded');
134
+ const card = settled.some((payment)=>isCardPaymentMethod(payment.method));
135
+ const other = settled.some((payment)=>!isCardPaymentMethod(payment.method));
136
+ if (card && other) return 'split';
137
+ return card ? 'payout' : 'invoice';
138
+ }
139
+ /** A one-line description of a payment for the register, receipt and timeline. */ export function describeOrderPayment(payment) {
140
+ var _ORDER_PAYMENT_METHOD_LABELS_payment_method;
141
+ const dollars = (cents)=>`$${(cents / 100).toFixed(2)}`;
142
+ const label = (_ORDER_PAYMENT_METHOD_LABELS_payment_method = ORDER_PAYMENT_METHOD_LABELS[payment.method]) != null ? _ORDER_PAYMENT_METHOD_LABELS_payment_method : 'Payment';
143
+ const card = payment.cardBrand || payment.last4 ? ` (${[
144
+ payment.cardBrand,
145
+ payment.last4 ? `•••• ${payment.last4}` : ''
146
+ ].filter(Boolean).join(' ')})` : '';
147
+ const tip = wholeCents(payment.tipCents) ? ` + ${dollars(wholeCents(payment.tipCents))} tip` : '';
148
+ return `${label}${card} ${dollars(wholeCents(payment.amountCents))}${tip}`;
149
+ }
150
+ export const ORDER_PAYMENT_METHOD_LABELS = {
151
+ cash: 'Cash',
152
+ card_present: 'Card reader',
153
+ card_keyed: 'Typed card',
154
+ card_link: 'Card (QR)',
155
+ gift_card: 'Gift card',
156
+ folio: 'Charged to room'
157
+ };
158
+ /*==========================================
159
+ * TIPS (AGL-3607).
160
+ *=========================================*/ /** The presets a merchant starts with. */ export const POS_TIP_PERCENTAGES_DEFAULT = [
161
+ 15,
162
+ 18,
163
+ 20,
164
+ 25
165
+ ];
166
+ /**
167
+ * The merchant's tip presets from the plugin setting, a comma list such as
168
+ * `15, 18, 20, 25`. Whole percentages from 1 to 100, at most four, in the order
169
+ * given; anything unreadable falls back to the defaults rather than showing
170
+ * the customer an empty choice.
171
+ */ export function posTipPercentages(raw) {
172
+ const parsed = String(raw != null ? raw : '').split(/[,\s]+/).map((part)=>Math.round(Number(part))).filter((value)=>Number.isFinite(value) && value >= 1 && value <= 100);
173
+ const unique = [
174
+ ...new Set(parsed)
175
+ ].slice(0, 4);
176
+ return unique.length ? unique : [
177
+ ...POS_TIP_PERCENTAGES_DEFAULT
178
+ ];
179
+ }
180
+ /** A percentage tip on `baseCents`, rounded to the cent. */ export function posTipFromPercent(baseCents, percent) {
181
+ const base = wholeCents(baseCents);
182
+ const pct = Number(percent);
183
+ if (!(base > 0) || !Number.isFinite(pct) || pct <= 0) return 0;
184
+ return Math.round(base * pct / 100);
185
+ }
186
+ /** The largest tip the register accepts on one payment: the payment itself. */ export function posTipProblem(tipCents, amountCents) {
187
+ if (!Number.isInteger(tipCents) || tipCents < 0) return 'Enter a tip of $0 or more.';
188
+ if (tipCents > wholeCents(amountCents)) {
189
+ return 'A tip can be at most the amount being paid. Check the amount and try again.';
190
+ }
191
+ return null;
192
+ }
193
+ /** Most lines a display state carries; a longer basket shows its newest. */ export const POS_DISPLAY_MAX_LINES = 60;
194
+ /** A pairing code lives this long before the register must show a new one. */ export const POS_DISPLAY_PAIRING_TTL_MS = 10 * 60 * 1000;
195
+ /** A thank-you screen returns to idle on the display after this long. */ export const POS_DISPLAY_THANKS_MS = 8000;
196
+ const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
197
+ /** An email address as the display may store it, or '' when it is not one. */ export function posDisplayEmail(value) {
198
+ const email = String(value != null ? value : '').trim().toLowerCase().slice(0, 254);
199
+ return EMAIL_PATTERN.test(email) ? email : '';
200
+ }
201
+ /** A phone number as digits with an optional leading +, or '' when too short. */ export function posDisplayPhone(value) {
202
+ const raw = String(value != null ? value : '').trim();
203
+ const digits = raw.replace(/[^0-9]/g, '');
204
+ if (digits.length < 7 || digits.length > 15) return '';
205
+ return `${raw.startsWith('+') ? '+' : ''}${digits}`;
206
+ }
207
+ /**
208
+ * The display state as the REGISTER may send it: clamped, typed and stripped
209
+ * of anything the customer screen has no business holding. The register is
210
+ * staff and trusted for intent, not for shape.
211
+ */ export function sanitizePosDisplayState(raw, nowMs) {
212
+ var _input_promptId;
213
+ const input = raw && typeof raw === 'object' ? raw : {};
214
+ const modes = [
215
+ 'idle',
216
+ 'cart',
217
+ 'tip',
218
+ 'receipt',
219
+ 'processing',
220
+ 'thanks'
221
+ ];
222
+ const mode = modes.includes(input['mode']) ? input['mode'] : 'idle';
223
+ const state = {
224
+ mode,
225
+ updatedAtMs: nowMs
226
+ };
227
+ const promptId = String((_input_promptId = input['promptId']) != null ? _input_promptId : '').slice(0, 64);
228
+ if (promptId) state.promptId = promptId;
229
+ const cart = input['cart'];
230
+ if (cart && typeof cart === 'object' && mode !== 'idle') {
231
+ const lines = (Array.isArray(cart.lines) ? cart.lines : []).slice(-POS_DISPLAY_MAX_LINES).map((line)=>{
232
+ var _ref;
233
+ return _extends({
234
+ name: String((_ref = line == null ? void 0 : line.name) != null ? _ref : '').slice(0, 120)
235
+ }, (line == null ? void 0 : line.variantLabel) ? {
236
+ variantLabel: String(line.variantLabel).slice(0, 80)
237
+ } : {}, {
238
+ quantity: Math.max(1, Math.min(999, Math.round(Number(line == null ? void 0 : line.quantity) || 1))),
239
+ amountCents: wholeCents(line == null ? void 0 : line.amountCents)
240
+ });
241
+ });
242
+ state.cart = _extends({
243
+ lines,
244
+ itemsCents: wholeCents(cart.itemsCents),
245
+ discountCents: wholeCents(cart.discountCents),
246
+ taxCents: wholeCents(cart.taxCents),
247
+ totalCents: wholeCents(cart.totalCents)
248
+ }, cart.paidCents != null ? {
249
+ paidCents: wholeCents(cart.paidCents)
250
+ } : {}, cart.dueCents != null ? {
251
+ dueCents: wholeCents(cart.dueCents)
252
+ } : {}, cart.tipCents != null ? {
253
+ tipCents: wholeCents(cart.tipCents)
254
+ } : {});
255
+ }
256
+ if (mode === 'tip') {
257
+ var _input_tip;
258
+ const tip = (_input_tip = input['tip']) != null ? _input_tip : {};
259
+ state.tip = {
260
+ baseCents: wholeCents(tip.baseCents),
261
+ percentages: posTipPercentages(Array.isArray(tip.percentages) ? tip.percentages.join(',') : tip.percentages),
262
+ allowCustom: tip.allowCustom !== false
263
+ };
264
+ }
265
+ if (mode === 'receipt') {
266
+ var _input_receipt;
267
+ const receipt = (_input_receipt = input['receipt']) != null ? _input_receipt : {};
268
+ const allowed = [
269
+ 'email',
270
+ 'sms',
271
+ 'print',
272
+ 'none'
273
+ ];
274
+ const channels = (Array.isArray(receipt.channels) ? receipt.channels : []).filter((channel)=>allowed.includes(channel));
275
+ state.receipt = {
276
+ channels: channels.length ? [
277
+ ...new Set(channels)
278
+ ] : [
279
+ 'print',
280
+ 'none'
281
+ ],
282
+ offerMarketing: receipt.offerMarketing === true
283
+ };
284
+ }
285
+ if (mode === 'processing') {
286
+ var _ref;
287
+ var _input_processing;
288
+ state.processing = {
289
+ message: String((_ref = (_input_processing = input['processing']) == null ? void 0 : _input_processing.message) != null ? _ref : '').slice(0, 160) || 'Tap, insert or swipe your card on the reader.'
290
+ };
291
+ }
292
+ return state;
293
+ }
294
+ /**
295
+ * The customer's answer as the DISPLAY may send it, checked against the
296
+ * prompt it claims to answer. Returns null when it answers nothing the
297
+ * register asked: a stale screen, a replay, or a mode that takes no answer.
298
+ */ export function sanitizePosDisplayResponse(state, raw, nowMs) {
299
+ var _input_promptId;
300
+ if (!state || !state.promptId) return null;
301
+ const input = raw && typeof raw === 'object' ? raw : {};
302
+ if (String((_input_promptId = input['promptId']) != null ? _input_promptId : '') !== state.promptId) return null;
303
+ const response = {
304
+ promptId: state.promptId,
305
+ atMs: nowMs
306
+ };
307
+ if (state.mode === 'tip' && state.tip) {
308
+ const choice = input['tipChoice'];
309
+ if (choice === 'none') {
310
+ response.tipChoice = 'none';
311
+ response.tipCents = 0;
312
+ } else if (choice === 'percent') {
313
+ const percent = Math.round(Number(input['tipPercent']));
314
+ if (!state.tip.percentages.includes(percent)) return null;
315
+ response.tipChoice = 'percent';
316
+ response.tipPercent = percent;
317
+ response.tipCents = posTipFromPercent(state.tip.baseCents, percent);
318
+ } else if (choice === 'custom' && state.tip.allowCustom) {
319
+ const tipCents = Math.round(Number(input['tipCents']));
320
+ if (posTipProblem(tipCents, state.tip.baseCents)) return null;
321
+ response.tipChoice = 'custom';
322
+ response.tipCents = tipCents;
323
+ } else {
324
+ return null;
325
+ }
326
+ return response;
327
+ }
328
+ if (state.mode === 'receipt' && state.receipt) {
329
+ const channel = input['receiptChannel'];
330
+ if (!state.receipt.channels.includes(channel)) return null;
331
+ response.receiptChannel = channel;
332
+ if (channel === 'email') {
333
+ const email = posDisplayEmail(input['email']);
334
+ if (!email) return null;
335
+ response.email = email;
336
+ if (state.receipt.offerMarketing && input['marketingOptIn'] === true) {
337
+ response.marketingOptIn = true;
338
+ }
339
+ }
340
+ if (channel === 'sms') {
341
+ const phone = posDisplayPhone(input['phone']);
342
+ if (!phone) return null;
343
+ response.phone = phone;
344
+ }
345
+ return response;
346
+ }
347
+ return null;
348
+ }
349
+ /**
350
+ * The state as the DISPLAY reads it. The customer's own typed address is
351
+ * never echoed back to the screen: once answered, the prompt is done and the
352
+ * screen shows what comes next, so nothing a later customer could read off
353
+ * an unattended tablet is ever sent to it.
354
+ */ export function posDisplayPublicState(state, nowMs) {
355
+ if (!state) return {
356
+ mode: 'idle',
357
+ updatedAtMs: nowMs,
358
+ answered: false
359
+ };
360
+ const { response } = state, rest = _object_without_properties_loose(state, [
361
+ "response"
362
+ ]);
363
+ if (rest.mode === 'thanks' && nowMs - rest.updatedAtMs > POS_DISPLAY_THANKS_MS) {
364
+ return {
365
+ mode: 'idle',
366
+ updatedAtMs: rest.updatedAtMs,
367
+ answered: false
368
+ };
369
+ }
370
+ return _extends({}, rest, {
371
+ answered: Boolean(response && response.promptId === rest.promptId)
372
+ });
373
+ }
374
+
375
+ //# sourceMappingURL=commerce-pos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/model/commerce-pos.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\n/*==========================================\n * THE POS TENDER LEDGER (AGL-3607).\n *\n * A register sale used to be settled by exactly one tender and recorded none:\n * whether a POS order was paid in cash, by the QR link or to a room was\n * inferred afterwards from which other fields happened to be set. A sale now\n * carries `payments[]`, one entry per tender, and takes payments until the\n * balance due is zero. Only then is it `paid`.\n *\n * Every figure here is integer cents. `amountCents` is what a payment put\n * toward the SALE; a tip rides beside it in `tipCents` and never counts toward\n * the balance, the platform's take or the store's revenue. Tips belong to the\n * merchant and their staff.\n *\n * Pure and framework-free, so the register, the customer display and the\n * server read one answer.\n *=========================================*/\n\n/** How one payment toward a register sale was taken. */\nexport type OrderPaymentMethod =\n | 'cash'\n /** A Stripe Terminal smart reader (tap, insert or swipe). */\n | 'card_present'\n /** A card typed into the console by staff (card not present). */\n | 'card_keyed'\n /** The Stripe payment page the customer opens from a QR code. */\n | 'card_link'\n | 'gift_card'\n /** Charged to a checked-in reservation's folio. */\n | 'folio'\n\nexport type OrderPaymentStatus =\n /** Started and not finished: reserves its amount against the balance. */\n | 'pending'\n | 'succeeded'\n /** Declined or errored; may be retried, reserves nothing. */\n | 'failed'\n | 'canceled'\n /** Taken and then handed back when the open sale was voided. */\n | 'reversed'\n\nexport const ORDER_PAYMENT_METHODS: readonly OrderPaymentMethod[] = [\n 'cash',\n 'card_present',\n 'card_keyed',\n 'card_link',\n 'gift_card',\n 'folio',\n]\n\n/** One payment toward a register sale, on `HostOrder.payments`. */\nexport interface OrderPayment {\n /** Stable id, derived from the register's attempt key so a retry finds it. */\n id: string\n method: OrderPaymentMethod\n /** Cents put toward the sale. Never includes the tip. */\n amountCents: number\n /** Gratuity on top of `amountCents`, the merchant's and not revenue. */\n tipCents?: number\n status: OrderPaymentStatus\n /** When the payment was started. */\n atMs: number\n /** When it reached `succeeded`. */\n settledAtMs?: number\n /** Stripe PaymentIntent for `card_present` / `card_keyed` / a paid link. */\n paymentIntentId?: string\n /** Stripe Checkout Session for `card_link`. */\n checkoutSessionId?: string\n /** The payment page a `card_link` payment shows as a QR. */\n checkoutUrl?: string\n /** The Terminal reader a `card_present` payment runs on. */\n readerId?: string\n /** The gift card's code (its document id) for `gift_card`. */\n giftCardId?: string\n cardBrand?: string\n last4?: string\n /** Cash handed over for a `cash` payment, and the change given back. */\n cashTenderedCents?: number\n changeCents?: number\n /** The stay a `folio` payment was charged to. */\n reservationId?: string\n /** The folio entry's `atMs`, so a void can remove exactly that entry. */\n folioAtMs?: number\n /**\n * The platform's take attributed to this payment (excludes the tip). For a\n * card payment it is netted from the payout with Stripe's processing cost\n * added, and recorded in `feeCents`; otherwise it accrues to the invoice.\n */\n takeFeeCents?: number\n /** The `application_fee_amount` a card payment carried, or 0. */\n feeCents?: number\n /** Why a `failed` payment failed, in words the cashier can read out. */\n failureMessage?: string\n /** Whether Stripe moved real money; absent for tenders Stripe never saw. */\n livemode?: boolean\n /** The console user who took the payment. */\n cashierId?: string\n}\n\n/** The tenders whose money moves through Stripe. */\nexport const POS_CARD_METHODS: ReadonlySet<OrderPaymentMethod> = new Set([\n 'card_present',\n 'card_keyed',\n 'card_link',\n])\n\nexport function isCardPaymentMethod(method: OrderPaymentMethod): boolean {\n return POS_CARD_METHODS.has(method)\n}\n\n/** Whole non-negative cents from an untrusted value. */\nfunction wholeCents(value: unknown): number {\n const number = Math.round(Number(value))\n return Number.isFinite(number) && number > 0 ? number : 0\n}\n\n/**\n * The order's payments, read through one door.\n *\n * Orders written before the ledger existed carry no `payments`, so one is\n * INFERRED from the fields the single-tender register wrote: a folio sale has\n * `reservationId`, a QR sale has `checkoutSessionId`, and anything else on the\n * POS channel was cash. A pending legacy sale is the QR link still waiting.\n * Online orders paid through Stripe Checkout read as one `card_link` payment.\n * Nothing is written back: this is a reader, never a migration.\n */\nexport function orderPayments(order: {\n payments?: OrderPayment[] | null\n channel?: string\n status?: string\n totals?: { totalCents?: number; tipCents?: number } | null\n amountCents?: number\n reservationId?: string\n checkoutSessionId?: string\n paymentIntentId?: string\n createdAtMs?: number\n}): OrderPayment[] {\n if (Array.isArray(order?.payments)) {\n return order.payments.filter(\n (payment): payment is OrderPayment =>\n Boolean(payment) && typeof payment === 'object' && Boolean(payment.id),\n )\n }\n const totalCents = wholeCents(order?.totals?.totalCents ?? order?.amountCents)\n if (!(totalCents > 0)) return []\n const settled = order?.status !== 'pending' && order?.status !== 'cancelled'\n const atMs = Number(order?.createdAtMs) || 0\n const method: OrderPaymentMethod = order?.reservationId\n ? 'folio'\n : order?.checkoutSessionId || order?.paymentIntentId || order?.channel !== 'pos'\n ? 'card_link'\n : 'cash'\n return [\n {\n id: 'legacy',\n method,\n amountCents: totalCents,\n status: settled ? 'succeeded' : order?.status === 'cancelled' ? 'canceled' : 'pending',\n atMs,\n ...(order?.paymentIntentId ? { paymentIntentId: order.paymentIntentId } : {}),\n ...(order?.checkoutSessionId ? { checkoutSessionId: order.checkoutSessionId } : {}),\n ...(order?.reservationId ? { reservationId: order.reservationId } : {}),\n },\n ]\n}\n\n/** Cents put toward the sale by payments that succeeded. */\nexport function posSettledCents(payments: readonly OrderPayment[]): number {\n return payments\n .filter((payment) => payment.status === 'succeeded')\n .reduce((sum, payment) => sum + wholeCents(payment.amountCents), 0)\n}\n\n/**\n * Cents spoken for: succeeded payments plus the ones still in flight. A\n * reader waiting for a tap has claimed its share of the balance, so a second\n * tender cannot be started for the same money.\n */\nexport function posReservedCents(payments: readonly OrderPayment[]): number {\n return payments\n .filter((payment) => payment.status === 'succeeded' || payment.status === 'pending')\n .reduce((sum, payment) => sum + wholeCents(payment.amountCents), 0)\n}\n\n/** What the customer still owes, by settled payments. */\nexport function posBalanceDueCents(\n totalCents: number,\n payments: readonly OrderPayment[],\n): number {\n return Math.max(0, wholeCents(totalCents) - posSettledCents(payments))\n}\n\n/** What a NEW payment may still take: the balance less what is in flight. */\nexport function posTenderableCents(\n totalCents: number,\n payments: readonly OrderPayment[],\n): number {\n return Math.max(0, wholeCents(totalCents) - posReservedCents(payments))\n}\n\n/** Tips taken across the sale's settled payments. */\nexport function posTipCents(payments: readonly OrderPayment[]): number {\n return payments\n .filter((payment) => payment.status === 'succeeded')\n .reduce((sum, payment) => sum + wholeCents(payment.tipCents), 0)\n}\n\n/**\n * The share of the sale's take a payment of `amountCents` carries.\n *\n * Proportional to the part of the SALE it pays, never to the tip. Card\n * payments carry their share in `application_fee_amount`; whatever the card\n * shares leave is accrued to the invoice at completion\n * ({@link posInvoiceTakeCents}), so the take is exact however the sale was\n * split and however each share rounded.\n */\nexport function posTakeShareCents(input: {\n takeFeeCents: number\n totalCents: number\n amountCents: number\n}): number {\n const take = wholeCents(input.takeFeeCents)\n const total = wholeCents(input.totalCents)\n const amount = Math.min(wholeCents(input.amountCents), total)\n if (!(take > 0) || !(total > 0) || !(amount > 0)) return 0\n return Math.min(take, Math.round((take * amount) / total))\n}\n\n/**\n * What of the sale's take was NOT netted from a card payout, and therefore\n * goes on the merchant's invoice: the whole take less every succeeded card\n * payment's share. Never negative.\n */\nexport function posInvoiceTakeCents(input: {\n takeFeeCents: number\n payments: readonly OrderPayment[]\n}): number {\n const netted = input.payments\n .filter(\n (payment) =>\n payment.status === 'succeeded' && isCardPaymentMethod(payment.method),\n )\n .reduce((sum, payment) => sum + wholeCents(payment.takeFeeCents), 0)\n return Math.max(0, wholeCents(input.takeFeeCents) - netted)\n}\n\n/** How the sale's fee reaches the platform, from what actually paid it. */\nexport function posFeeCollection(\n payments: readonly OrderPayment[],\n): 'payout' | 'invoice' | 'split' {\n const settled = payments.filter((payment) => payment.status === 'succeeded')\n const card = settled.some((payment) => isCardPaymentMethod(payment.method))\n const other = settled.some((payment) => !isCardPaymentMethod(payment.method))\n if (card && other) return 'split'\n return card ? 'payout' : 'invoice'\n}\n\n/** A one-line description of a payment for the register, receipt and timeline. */\nexport function describeOrderPayment(payment: OrderPayment): string {\n const dollars = (cents: number) => `$${(cents / 100).toFixed(2)}`\n const label = ORDER_PAYMENT_METHOD_LABELS[payment.method] ?? 'Payment'\n const card =\n payment.cardBrand || payment.last4\n ? ` (${[payment.cardBrand, payment.last4 ? `•••• ${payment.last4}` : '']\n .filter(Boolean)\n .join(' ')})`\n : ''\n const tip = wholeCents(payment.tipCents)\n ? ` + ${dollars(wholeCents(payment.tipCents))} tip`\n : ''\n return `${label}${card} ${dollars(wholeCents(payment.amountCents))}${tip}`\n}\n\nexport const ORDER_PAYMENT_METHOD_LABELS: Record<OrderPaymentMethod, string> = {\n cash: 'Cash',\n card_present: 'Card reader',\n card_keyed: 'Typed card',\n card_link: 'Card (QR)',\n gift_card: 'Gift card',\n folio: 'Charged to room',\n}\n\n/*==========================================\n * TIPS (AGL-3607).\n *=========================================*/\n\n/** The presets a merchant starts with. */\nexport const POS_TIP_PERCENTAGES_DEFAULT: readonly number[] = [15, 18, 20, 25]\n\n/**\n * The merchant's tip presets from the plugin setting, a comma list such as\n * `15, 18, 20, 25`. Whole percentages from 1 to 100, at most four, in the order\n * given; anything unreadable falls back to the defaults rather than showing\n * the customer an empty choice.\n */\nexport function posTipPercentages(raw: unknown): number[] {\n const parsed = String(raw ?? '')\n .split(/[,\\s]+/)\n .map((part) => Math.round(Number(part)))\n .filter((value) => Number.isFinite(value) && value >= 1 && value <= 100)\n const unique = [...new Set(parsed)].slice(0, 4)\n return unique.length ? unique : [...POS_TIP_PERCENTAGES_DEFAULT]\n}\n\n/** A percentage tip on `baseCents`, rounded to the cent. */\nexport function posTipFromPercent(baseCents: number, percent: number): number {\n const base = wholeCents(baseCents)\n const pct = Number(percent)\n if (!(base > 0) || !Number.isFinite(pct) || pct <= 0) return 0\n return Math.round((base * pct) / 100)\n}\n\n/** The largest tip the register accepts on one payment: the payment itself. */\nexport function posTipProblem(tipCents: number, amountCents: number): string | null {\n if (!Number.isInteger(tipCents) || tipCents < 0) return 'Enter a tip of $0 or more.'\n if (tipCents > wholeCents(amountCents)) {\n return 'A tip can be at most the amount being paid. Check the amount and try again.'\n }\n return null\n}\n\n/*==========================================\n * THE CUSTOMER DISPLAY (AGL-3608).\n *\n * A paired screen facing the customer reads one document per register,\n * `hosts/{hostId}/registers/{registerId}/display/state`, through the\n * `commerce/pos-display` route and its display token. The register writes\n * the prompt; the customer's answer comes back in `response`.\n *=========================================*/\n\nexport type PosDisplayMode =\n | 'idle'\n /** The live basket, mirrored as the cashier builds it. */\n | 'cart'\n /** The customer picks a tip. */\n | 'tip'\n /** The customer picks how they want their receipt. */\n | 'receipt'\n /** A card payment is waiting on the reader. */\n | 'processing'\n | 'thanks'\n\nexport type PosReceiptChannel = 'email' | 'sms' | 'print' | 'none'\n\nexport interface PosDisplayLine {\n name: string\n variantLabel?: string\n quantity: number\n amountCents: number\n}\n\nexport interface PosDisplayCart {\n lines: PosDisplayLine[]\n itemsCents: number\n discountCents: number\n taxCents: number\n totalCents: number\n /** Taken so far, and what is still due, once payments start. */\n paidCents?: number\n dueCents?: number\n tipCents?: number\n}\n\n/** The customer's answer to the current prompt. */\nexport interface PosDisplayResponse {\n /** The prompt this answers; a stale answer is refused. */\n promptId: string\n tipCents?: number\n tipPercent?: number\n /** `none` when the customer chose no tip. */\n tipChoice?: 'percent' | 'custom' | 'none'\n receiptChannel?: PosReceiptChannel\n email?: string\n phone?: string\n marketingOptIn?: boolean\n atMs: number\n}\n\nexport interface PosDisplayState {\n mode: PosDisplayMode\n updatedAtMs: number\n /**\n * The ISO currency every amount on the screen is in (`usd`). Stamped by\n * the server from the store's own currency, never taken from the register.\n */\n currency?: string\n /** Changes every time the register asks something new. */\n promptId?: string\n cart?: PosDisplayCart\n tip?: {\n /** What a percentage is taken of: the amount being paid now. */\n baseCents: number\n percentages: number[]\n allowCustom: boolean\n }\n receipt?: {\n channels: PosReceiptChannel[]\n /** Whether to offer the store's marketing opt-in under the email field. */\n offerMarketing: boolean\n }\n processing?: { message: string }\n response?: PosDisplayResponse\n}\n\n/** Most lines a display state carries; a longer basket shows its newest. */\nexport const POS_DISPLAY_MAX_LINES = 60\n\n/** A pairing code lives this long before the register must show a new one. */\nexport const POS_DISPLAY_PAIRING_TTL_MS = 10 * 60 * 1000\n\n/** A thank-you screen returns to idle on the display after this long. */\nexport const POS_DISPLAY_THANKS_MS = 8_000\n\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\n/** An email address as the display may store it, or '' when it is not one. */\nexport function posDisplayEmail(value: unknown): string {\n const email = String(value ?? '').trim().toLowerCase().slice(0, 254)\n return EMAIL_PATTERN.test(email) ? email : ''\n}\n\n/** A phone number as digits with an optional leading +, or '' when too short. */\nexport function posDisplayPhone(value: unknown): string {\n const raw = String(value ?? '').trim()\n const digits = raw.replace(/[^0-9]/g, '')\n if (digits.length < 7 || digits.length > 15) return ''\n return `${raw.startsWith('+') ? '+' : ''}${digits}`\n}\n\n/**\n * The display state as the REGISTER may send it: clamped, typed and stripped\n * of anything the customer screen has no business holding. The register is\n * staff and trusted for intent, not for shape.\n */\nexport function sanitizePosDisplayState(\n raw: unknown,\n nowMs: number,\n): PosDisplayState {\n const input = (raw && typeof raw === 'object' ? raw : {}) as Record<string, any>\n const modes: PosDisplayMode[] = ['idle', 'cart', 'tip', 'receipt', 'processing', 'thanks']\n const mode = modes.includes(input['mode']) ? (input['mode'] as PosDisplayMode) : 'idle'\n const state: PosDisplayState = { mode, updatedAtMs: nowMs }\n const promptId = String(input['promptId'] ?? '').slice(0, 64)\n if (promptId) state.promptId = promptId\n const cart = input['cart']\n if (cart && typeof cart === 'object' && mode !== 'idle') {\n const lines = (Array.isArray(cart.lines) ? cart.lines : [])\n .slice(-POS_DISPLAY_MAX_LINES)\n .map((line: any) => ({\n name: String(line?.name ?? '').slice(0, 120),\n ...(line?.variantLabel\n ? { variantLabel: String(line.variantLabel).slice(0, 80) }\n : {}),\n quantity: Math.max(1, Math.min(999, Math.round(Number(line?.quantity) || 1))),\n amountCents: wholeCents(line?.amountCents),\n }))\n state.cart = {\n lines,\n itemsCents: wholeCents(cart.itemsCents),\n discountCents: wholeCents(cart.discountCents),\n taxCents: wholeCents(cart.taxCents),\n totalCents: wholeCents(cart.totalCents),\n ...(cart.paidCents != null ? { paidCents: wholeCents(cart.paidCents) } : {}),\n ...(cart.dueCents != null ? { dueCents: wholeCents(cart.dueCents) } : {}),\n ...(cart.tipCents != null ? { tipCents: wholeCents(cart.tipCents) } : {}),\n }\n }\n if (mode === 'tip') {\n const tip = input['tip'] ?? {}\n state.tip = {\n baseCents: wholeCents(tip.baseCents),\n percentages: posTipPercentages(\n Array.isArray(tip.percentages) ? tip.percentages.join(',') : tip.percentages,\n ),\n allowCustom: tip.allowCustom !== false,\n }\n }\n if (mode === 'receipt') {\n const receipt = input['receipt'] ?? {}\n const allowed: PosReceiptChannel[] = ['email', 'sms', 'print', 'none']\n const channels = (Array.isArray(receipt.channels) ? receipt.channels : [])\n .filter((channel: unknown): channel is PosReceiptChannel =>\n allowed.includes(channel as PosReceiptChannel),\n )\n state.receipt = {\n channels: channels.length ? [...new Set<PosReceiptChannel>(channels)] : ['print', 'none'],\n offerMarketing: receipt.offerMarketing === true,\n }\n }\n if (mode === 'processing') {\n state.processing = {\n message:\n String(input['processing']?.message ?? '').slice(0, 160) ||\n 'Tap, insert or swipe your card on the reader.',\n }\n }\n return state\n}\n\n/**\n * The customer's answer as the DISPLAY may send it, checked against the\n * prompt it claims to answer. Returns null when it answers nothing the\n * register asked: a stale screen, a replay, or a mode that takes no answer.\n */\nexport function sanitizePosDisplayResponse(\n state: PosDisplayState | null | undefined,\n raw: unknown,\n nowMs: number,\n): PosDisplayResponse | null {\n if (!state || !state.promptId) return null\n const input = (raw && typeof raw === 'object' ? raw : {}) as Record<string, any>\n if (String(input['promptId'] ?? '') !== state.promptId) return null\n const response: PosDisplayResponse = { promptId: state.promptId, atMs: nowMs }\n if (state.mode === 'tip' && state.tip) {\n const choice = input['tipChoice']\n if (choice === 'none') {\n response.tipChoice = 'none'\n response.tipCents = 0\n } else if (choice === 'percent') {\n const percent = Math.round(Number(input['tipPercent']))\n if (!state.tip.percentages.includes(percent)) return null\n response.tipChoice = 'percent'\n response.tipPercent = percent\n response.tipCents = posTipFromPercent(state.tip.baseCents, percent)\n } else if (choice === 'custom' && state.tip.allowCustom) {\n const tipCents = Math.round(Number(input['tipCents']))\n if (posTipProblem(tipCents, state.tip.baseCents)) return null\n response.tipChoice = 'custom'\n response.tipCents = tipCents\n } else {\n return null\n }\n return response\n }\n if (state.mode === 'receipt' && state.receipt) {\n const channel = input['receiptChannel'] as PosReceiptChannel\n if (!state.receipt.channels.includes(channel)) return null\n response.receiptChannel = channel\n if (channel === 'email') {\n const email = posDisplayEmail(input['email'])\n if (!email) return null\n response.email = email\n if (state.receipt.offerMarketing && input['marketingOptIn'] === true) {\n response.marketingOptIn = true\n }\n }\n if (channel === 'sms') {\n const phone = posDisplayPhone(input['phone'])\n if (!phone) return null\n response.phone = phone\n }\n return response\n }\n return null\n}\n\n/**\n * The state as the DISPLAY reads it. The customer's own typed address is\n * never echoed back to the screen: once answered, the prompt is done and the\n * screen shows what comes next, so nothing a later customer could read off\n * an unattended tablet is ever sent to it.\n */\nexport function posDisplayPublicState(\n state: PosDisplayState | null | undefined,\n nowMs: number,\n): Omit<PosDisplayState, 'response'> & { answered: boolean } {\n if (!state) return { mode: 'idle', updatedAtMs: nowMs, answered: false }\n const { response, ...rest } = state\n if (rest.mode === 'thanks' && nowMs - rest.updatedAtMs > POS_DISPLAY_THANKS_MS) {\n return { mode: 'idle', updatedAtMs: rest.updatedAtMs, answered: false }\n }\n return {\n ...rest,\n answered: Boolean(response && response.promptId === rest.promptId),\n }\n}\n"],"names":["ORDER_PAYMENT_METHODS","POS_CARD_METHODS","Set","isCardPaymentMethod","method","has","wholeCents","value","number","Math","round","Number","isFinite","orderPayments","order","Array","isArray","payments","filter","payment","Boolean","id","totalCents","totals","amountCents","settled","status","atMs","createdAtMs","reservationId","checkoutSessionId","paymentIntentId","channel","posSettledCents","reduce","sum","posReservedCents","posBalanceDueCents","max","posTenderableCents","posTipCents","tipCents","posTakeShareCents","input","take","takeFeeCents","total","amount","min","posInvoiceTakeCents","netted","posFeeCollection","card","some","other","describeOrderPayment","ORDER_PAYMENT_METHOD_LABELS","dollars","cents","toFixed","label","cardBrand","last4","join","tip","cash","card_present","card_keyed","card_link","gift_card","folio","POS_TIP_PERCENTAGES_DEFAULT","posTipPercentages","raw","parsed","String","split","map","part","unique","slice","length","posTipFromPercent","baseCents","percent","base","pct","posTipProblem","isInteger","POS_DISPLAY_MAX_LINES","POS_DISPLAY_PAIRING_TTL_MS","POS_DISPLAY_THANKS_MS","EMAIL_PATTERN","posDisplayEmail","email","trim","toLowerCase","test","posDisplayPhone","digits","replace","startsWith","sanitizePosDisplayState","nowMs","modes","mode","includes","state","updatedAtMs","promptId","cart","lines","line","name","variantLabel","quantity","itemsCents","discountCents","taxCents","paidCents","dueCents","percentages","allowCustom","receipt","allowed","channels","offerMarketing","processing","message","sanitizePosDisplayResponse","response","choice","tipChoice","tipPercent","receiptChannel","marketingOptIn","phone","posDisplayPublicState","answered","rest"],"mappings":"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"}