simone
|
63c9f750df
|
feat(04-01): multi-project schema migration — projects, settings, FK pivot
- schema.ts: add projects table, settings kv table, slug on clients;
migrate 6 FK from client_id to project_id (phases, payments, documents, notes,
time_entries, quote_items); update all relations and TypeScript types
- admin-queries.ts: fix getAllClientsWithPayments + getClientFullDetail to aggregate
through projects; add getAllProjectsWithPayments, getProjectFullDetail,
getClientWithProjects, ClientWithProjects type
- settings.ts: new file — getSetting, updateSetting, getTargetHourlyRate, SETTINGS_KEYS
- Fix all downstream files: actions.ts, quote-actions.ts, new/actions.ts,
timer-actions.ts, approve/route.ts, comment/route.ts, TimerCell.tsx,
analytics-queries.ts, client-view.ts, seed.ts
- DB migration applied to Coolify Postgres (all test data cleared, schema rebuilt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-05-21 21:58:15 +02:00 |
|
Simone Cavalli
|
14787bab10
|
feat(01-03): add ClientView type system and getClientView() query function
- 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
|
2026-05-14 20:58:30 +02:00 |
|