CostDesk

We're always improving CostDesk.

Every sprint, we improve the product based on real user feedback.

v0.10

Performance, UI Overhaul & New Tabs

### New Features - **PnL Tab** — Profit & Loss report with MTD/YTD/LTD columns and month selector (mock data, backend pending) - **Transactions Tab** — Merged view of all project transactions (Revenue + PO), with type filter and search - **PO Cancelled Status** — Timeline stepper shows red branch when PO is cancelled ### Performance - **Lazy Load Tabs** — Cost and Budget tabs now load data on demand (`?include=cost`), not on every project open - **5-minute cache** — Switching between Cost/Budget tabs reuses cached data - **Removed duplicate API call** — `getProjectCost()` was called twice per project detail, now once ### UI Improvements - **Table density** — Font reduced to 14px, row height to 48px across all list screens - **Column resizer** — Hit area increased from 3px to 12px, resize mode changed to onEnd (smoother) - **Status chips** — Smaller size (12px font, 22px height) across all list screens - **Table headers** — Centered alignment globally - **PO line items** — Expand row replaces popover for viewing full details inline - **Cost tab** — Summary cards moved from global header into tab, recursive parent row totals, compact purchase popover - **Employee list** — Column "Mã" renamed, email_personal hidden by default ### Locale & Formatting - **Single source of truth** — All locale config (number format, date format, currency, phone) now reads from `countries.json` (25 countries) - **Dynamic phone format** — `formatPhone(phone, countryCode)` replaces hardcoded `formatPhoneVN` - **Swagger docs** — Added for PO cancel endpoint, project detail `include` param, fixed Controller schema error ### Bug Fixes - **Pagination** — Fixed `useStoredLimit` hook resetting page to 1 on every render (inline arrow function in useEffect dependency) - **Vercel build** — Fixed ESLint `lines-around-comment` errors, unused variable errors - **Testing** — Vitest + React Testing Library setup (local only, not in git) - **BE Testing** — PostgreSQL `testing` database setup, all 5 PHPUnit tests passing

v0.9

Project Health & Pricing page

Launched project health score with 4 statuses: Positive, At Risk, Over Budget, Negative. Added pricing page with team cost calculator.

v0.8

Revenue & Collections

Revenue module distinguishing earned revenue and collected cash. Track receivables per project.

v0.7

Auto Profit & Loss

Automatic P&L from actual costs and revenue. View by month (MTD) or full project lifetime (LTD).