feat(frontend): add VAT breakdown, print receipt, and VAT indicators

Add print receipt feature to UserBookingModal with full VAT breakdown. Fix VAT rate display (remove double *100). Show VAT breakdown (net + VAT) on booking confirmed page. Add VAT info to EditBookingModal. Show incl. VAT label on BookingFlow total, schedule, and today dashboard. Add VAT note to prices page. Show booking total amount on account page. Improve VAT enable toast in BusinessSettings.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-06-22 17:06:38 +01:00
co-authored by Sisyphus
parent 194aacf68c
commit d71373c7f2
10 changed files with 199 additions and 26 deletions
@@ -19,8 +19,10 @@
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
import { authStore } from '$lib/stores/auth.svelte';
import { ensureBusinessInfo, getBusinessInfo } from '$lib/stores/businessInfo.svelte';
import { toast } from 'svelte-sonner';
import { SvelteDate } from 'svelte/reactivity';
import { browser } from '$app/environment';
// Components
import BookingActions from '$lib/components/booking/BookingActions.svelte';
@@ -94,6 +96,9 @@
newCardCVC.length >= 3)
);
// VAT registration status from public business info (via shared store)
let vatRegistered = $derived(getBusinessInfo()?.is_vat_registered ?? false);
// Email existence check (guest flow only)
let emailChecking = $state(false);
let emailSuggestion = $state<string | null>(null);
@@ -584,6 +589,7 @@
$effect(() => {
fetchServices();
ensureBusinessInfo();
});
// Track which months are currently being fetched (prevents duplicate requests)
@@ -1630,7 +1636,7 @@
</div>
<div class="flex justify-between text-sm font-semibold">
<span>Total Cost:</span>
<span>£{getTotalPrice()}</span>
<span>£{getTotalPrice()}{#if vatRegistered} <span class="text-xs font-normal text-gray-400">incl. VAT</span>{/if}</span>
</div>
</div>
</div>
@@ -2131,7 +2137,7 @@
{:else}
<div class="flex justify-between font-semibold">
<span>Total (estimated)</span>
<span>£{getTotalPrice()}</span>
<span>£{getTotalPrice()}{#if vatRegistered} <span class="text-xs font-normal text-gray-400">incl. VAT</span>{/if}</span>
</div>
{/if}
</div>