# Task K.2 Pipeline Reports

## Delivered

- Added production CRM report APIs for:
  - `GET /api/crm/reports/pipeline`
  - `GET /api/crm/reports/lead-aging`
  - `GET /api/crm/reports/enquiry-aging`
  - `GET /api/crm/reports/export`
- Added production CRM report pages:
  - `/dashboard/crm/reports/pipeline`
  - `/dashboard/crm/reports/lead-aging`
  - `/dashboard/crm/reports/enquiry-aging`
- Added shared dataset layer at `src/features/crm/reports/server/datasets/pipeline-report.dataset.ts`
- Extended report query contracts, React Query keys, and API client services for the new report suite
- Added report export support for CSV and Excel with scoped security enforcement
- Added audit logging for:
  - `view_pipeline_report`
  - `export_pipeline_report_csv`
  - `export_pipeline_report_excel`
- Extended CRM report definitions seed with:
  - `lead_pipeline`
  - `lead_aging`
  - `enquiry_pipeline`
  - `enquiry_aging`
  - `pipeline_funnel`
  - `lead_conversion`
  - `enquiry_conversion`
- Added report navigation entries under CRM side menu and report catalog deep links

## Security and Scope

- Report data is filtered by:
  - organization
  - branch scope
  - product scope
  - own-record scope for `ownershipScope = own`
- Revenue-like funnel values are hidden when the user does not have quotation pricing visibility
- Export uses the same filter contract and resolved access context as on-screen reports

## Report Coverage

- Pipeline suite page includes:
  - Lead Pipeline
  - Enquiry Pipeline
  - Lead to Enquiry Conversion
  - Enquiry to Quotation Conversion
  - Pipeline Funnel
- Lead Aging page includes bucket summary and drill-down rows
- Enquiry Aging page includes bucket summary and drill-down rows with last follow-up visibility

## Verification

- `npx tsc --noEmit`
  - passed
- `npx oxlint src/features/crm/reports src/app/api/crm/reports src/app/dashboard/crm/reports src/config/nav-config.ts`
  - passed
- `npm run lint`
  - still fails because of pre-existing repository-wide lint issues outside Task K.2 scope

## Notes

- Lead reporting is derived from the frozen lifecycle stored on `crm_enquiries`
- Lead conversion is treated as progression beyond `lead` stage or assignment into active sales handling
- Enquiry to quotation conversion is derived from `crm_quotations.enquiry_id`
