-
Please review your order
-
Prices shown include any applied discounts
+
+
Please review your order
+
Prices shown include any applied discounts
@@ -206,33 +223,33 @@
{{-- RECEIPT --}}
- ✓
+ ✓
-
-
- Receipt
+
+
+ Receipt
-
+
-
+
![Digital receipt QR]()
-
Scan for digital receipt
+
Scan for digital receipt
-
Email me a digital receipt
+
Email me a digital receipt
+ class="flex-1 rounded-xl border-slate-200 bg-white px-3 py-2.5 text-sm text-slate-900 shadow-sm placeholder:text-slate-400 focus:border-indigo-500 focus:ring-indigo-500">
+ class="rounded-xl bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-500">Send
-
Receipt emailed — check your inbox.
-
+
Receipt emailed — check your inbox.
+
-
+
@@ -263,7 +280,6 @@
this.pollTimer = setInterval(() => this.fetchState(), 4000);
this.$nextTick(() => this.resizeCanvas());
window.addEventListener('resize', () => this.resizeCanvas());
- // Same-browser dual window: instant cart updates without waiting for SSE.
try {
this.bc = new BroadcastChannel('pos-customer-display');
this.bc.onmessage = (e) => {
@@ -297,8 +313,13 @@
grandTotal() {
const base = Number(this.state.total_minor) || 0;
- const tip = Number(this.state.tip?.selected_minor) || 0;
- return base + tip;
+ const tipInTotal = Number(this.state.tip_minor) || 0;
+ const tipSelected = Number(this.state.tip?.selected_minor) || 0;
+ // Avoid double-counting when the server already baked tip into total_minor.
+ if (tipInTotal > 0) {
+ return base;
+ }
+ return base + tipSelected;
},
tipAmount(pct) {