14787bab10
- ClientView interface enforces admin data exclusion: no quote_items, no service prices - getClientView() queries clients.token, phases, tasks, deliverables, payments, documents, notes - inArray() scoping prevents full table scan on tasks and deliverables - accepted_total: client.accepted_total ?? '0' null coalescing - Progress percentages calculated server-side (per-phase + global) - Payment amount intentionally excluded — only label and status returned to client