diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte
index 5976dd8..a4f0511 100644
--- a/frontend/src/routes/+layout.svelte
+++ b/frontend/src/routes/+layout.svelte
@@ -68,3 +68,17 @@
{/if}
{@render children?.()}
+
+
diff --git a/frontend/src/routes/account/+page.svelte b/frontend/src/routes/account/+page.svelte
index 0827b08..c57ee18 100644
--- a/frontend/src/routes/account/+page.svelte
+++ b/frontend/src/routes/account/+page.svelte
@@ -1550,6 +1550,24 @@
+ View and export all personal data we hold about you +
+ +Generating report…
+{errorMessage}
++ {gdprData.export_metadata?.exported_at + ? fmtDateTime(gdprData.export_metadata.exported_at) + : 'Generated now'} +
+{gdprData.user_profile.full_name}
+{gdprData.user_profile.email}
+{gdprData.user_profile.phone || '—'}
+{fmtDate(gdprData.user_profile.date_of_birth)}
+{gdprData.user_profile.account_role.replace(/_/g, ' ')}
+{gdprData.user_profile.account_type}
+{fmtDate(gdprData.user_profile.created_at)}
+{fmtDateTime(gdprData.user_profile.updated_at)}
++ {gdprData.user_profile.last_login_at + ? fmtDateTime(gdprData.user_profile.last_login_at) + : '—'} +
+{gdprData.user_profile.loyalty_stamps}
+{gdprData.user_profile.deposits_required}
+{gdprData.user_profile.referral_code || '—'}
++ {gdprData.user_profile.privacy_policy_and_terms_consent + ? 'Accepted' + : 'Declined'}{gdprData.user_profile.policy_consent_updated_at + ? ' — ' + fmtDateTime(gdprData.user_profile.policy_consent_updated_at) + : ''} +
++ {gdprData.user_profile.data_retention_consent ? 'Accepted' : 'Declined'}{gdprData + .user_profile.data_consent_updated_at + ? ' — ' + fmtDateTime(gdprData.user_profile.data_consent_updated_at) + : ''} +
+| Provider | Connected Since |
|---|---|
| {l.provider} | +{fmtDate(l.created_at)} | +
| Date | Amount | Status |
|---|---|---|
| {fmtDate(ap.created_at)} | +{fmt(ap.amount)} | +{ap.status} | +
| Date | Campaign | Original | Discount | Source |
|---|---|---|---|---|
| {fmtDate(d.applied_at)} | +{d.campaign_name}{d.milestone_type + ? ' (' + d.milestone_type.replace(/_/g, ' ') + ')' + : ''} | +{fmt(d.original_total)} | +-{fmt(d.discount_amount)} ({d.discount_percent}%) | +{d.discount_source} | +
| Redeemed | Stamps | Status | Booking | Expires |
|---|---|---|---|---|
| {fmtDate(lr.redeemed_at)} | +{lr.stamps_redeemed} | +{lr.status} | ++ {#if lr.booking_date} + {fmtDate(lr.booking_date)}{lr.booking_services + ? ' — ' + lr.booking_services + : ''} + {:else} + — + {/if} + | +{lr.expires_at ? fmtDate(lr.expires_at) : '—'} | +
+ {gdprData.referrals.referred_by.referrer_name} + — {fmtDate(gdprData.referrals.referred_by.referred_at)} +
+| Test | Date | Description |
|---|---|---|
| {t.name} | +{fmtDate(t.tested_at)} | +{t.description || '—'} | +
| Card | Last 4 | Expires | Default | Status | Retained Until | Added |
|---|---|---|---|---|---|---|
| {c.brand} | +•••• {c.last_4} | +{String(c.exp_month).padStart(2, '0')}/{c.exp_year} | +{c.is_default ? 'Yes' : 'No'} | +{c.deleted_at ? 'Deleted' : 'Active'} | +{c.retained_until ? fmtDate(c.retained_until) : '—'} | +{fmtDate(c.created_at)} | +
| Date | Amount | Reason | Booking | Status |
|---|---|---|---|---|
| {fmtDate(r.created_at)} | +{fmt(r.amount)} | +{r.reason} | +{r.booking_id} | +{r.status} | +
| Updated | Booking | New Time | Notes |
|---|---|---|---|
| {fmtDate(req.updated_at)} | +{req.booking_id} | +{req.new_start_time ? fmtDate(req.new_start_time) : '—'} | +{req.notes || '—'} | +
No bookings found.
+ {:else} +{fmtDate(b.start_time)}
++ {fmtDateTime(b.start_time)} · {b.booking_id} +
+{b.notes}
+No payments found.
+ {:else} +| Date | Gross | Net | {#if hasVat}VAT | {/if}Method | Type | Invoice | Status |
|---|---|---|---|---|---|---|---|
| {fmtDate(p.created_at)} | +{fmt(p.amount)} | +{fmt(p.net_amount)} | + {#if hasVat}{p.vat_amount ? fmt(p.vat_amount) : '—'} | {/if} +{p.payment_method} | +{p.payment_type} | +{p.invoice_number || '—'} | +{p.status} | +
| Purpose | Created | Used At | Expires |
|---|---|---|---|
| {vc.purpose.replace(/_/g, ' ')} | +{fmtDate(vc.created_at)} | +{vc.used_at ? fmtDate(vc.used_at) : '—'} | +{fmtDate(vc.expires_at)} | +
| Booking | Forgiven |
|---|---|
| {f.booking_id} | +{fmtDate(f.created_at)} | +
+ Format v{gdprData.export_metadata.format_version} · {fmtDateTime( + gdprData.export_metadata.exported_at + )} +
+ {/if} +