170 lines
6.5 KiB
Markdown
170 lines
6.5 KiB
Markdown
# Tasks: VCL Multi-Vertical Upload
|
|
|
|
## Phase 1: Database & Backend Foundation
|
|
|
|
- [x] 1. Create migration script `backend/migrations/add_vcl_multi_vertical.js`
|
|
- Add `vertical` column to `compliance_items` (TEXT, nullable, indexed)
|
|
- Add `vertical` column to `compliance_uploads` (TEXT, nullable)
|
|
- Create `vcl_multi_vertical_summary` table
|
|
- Create indexes for vertical-based queries
|
|
|
|
- [x] 2. Add `parseVerticalFilename()` helper to `backend/helpers/vclHelpers.js`
|
|
- Extract vertical code and report date from filename pattern
|
|
- Handle edge cases (no match, single-word verticals like "SR")
|
|
- Export for testing
|
|
|
|
- [x] 3. Implement vertical-scoped `persistMultiVerticalUpload()` in compliance route
|
|
- Accept items + vertical + summary + metadata
|
|
- Query active items filtered by `WHERE vertical = $1`
|
|
- Upsert new/recurring items with vertical tag
|
|
- Resolve only items within the same vertical
|
|
- Create/update compliance_snapshots for the vertical
|
|
- Store summary entries in `vcl_multi_vertical_summary`
|
|
|
|
- [x] 4. Implement `POST /api/compliance/vcl-multi/preview` endpoint
|
|
- Accept multiple files via multer `.array('files', 14)`
|
|
- Parse each file with existing Python parser
|
|
- Extract vertical from filename for each
|
|
- Compute per-vertical scoped diff
|
|
- Store parsed data in temp files
|
|
- Return batch preview response
|
|
|
|
- [x] 5. Implement `POST /api/compliance/vcl-multi/commit` endpoint
|
|
- Read temp files for each file in batch
|
|
- Commit all in a single transaction using `persistMultiVerticalUpload()`
|
|
- Rollback entire batch on any failure
|
|
- Clean up temp files
|
|
- Audit log the batch commit
|
|
|
|
## Phase 2: Reporting Endpoints
|
|
|
|
- [x] 6. Implement `GET /api/compliance/vcl-multi/stats` endpoint
|
|
- Aggregate across all verticals where `vertical IS NOT NULL`
|
|
- Compute total/compliant/non-compliant/compliance_pct
|
|
- Compute donut (blocked vs in-progress)
|
|
- Compute per-vertical breakdown with burndown
|
|
- Return structured response
|
|
|
|
- [x] 7. Implement `GET /api/compliance/vcl-multi/trend` endpoint
|
|
- Query compliance_snapshots for multi-vertical data
|
|
- Aggregate monthly compliance % across verticals
|
|
- Compute linear regression forecast (3+ months)
|
|
- Return monthly data points
|
|
|
|
- [x] 8. Implement `GET /api/compliance/vcl-multi/vertical/:code/metrics` endpoint
|
|
- Query `vcl_multi_vertical_summary` for latest upload of that vertical
|
|
- Group by category
|
|
- Return per-metric breakdown
|
|
|
|
- [x] 9. Implement `GET /api/compliance/vcl-multi/vertical/:code/metric/:metricId/devices` endpoint
|
|
- Query `compliance_items` filtered by vertical + metric_id + status = 'active'
|
|
- Include resolution_date, remediation_plan, seen_count, first/last seen
|
|
- Return device list
|
|
|
|
- [x] 10. Implement `GET /api/compliance/vcl-multi/vertical/:code/burndown` endpoint
|
|
- Query non-compliant items for vertical
|
|
- Compute monthly forecast from resolution_date values
|
|
- Return burndown data with blocker count
|
|
|
|
## Phase 3: Frontend — Upload Modal
|
|
|
|
- [x] 11. Create `MultiVerticalUploadModal.js` component
|
|
- Multi-file drag-drop zone (accept .xlsx, max 14 files)
|
|
- Filename parsing with vertical/date extraction on selection
|
|
- Display file list with detected vertical, date, status
|
|
- Allow removing individual files from batch
|
|
- Handle unrecognized filenames (manual vertical assignment)
|
|
|
|
- [x] 12. Implement preview phase in upload modal
|
|
- Call POST /preview with all files
|
|
- Display batch preview table: filename, vertical, items, diff
|
|
- Show totals row (total new, total recurring, total resolved)
|
|
- Error display for files that failed parsing
|
|
|
|
- [x] 13. Implement commit phase in upload modal
|
|
- Confirm button triggers POST /commit
|
|
- Loading state during commit
|
|
- Success state with summary of what was committed
|
|
- Error state with rollback messaging
|
|
|
|
## Phase 4: Frontend — Report Page
|
|
|
|
- [x] 14. Create `VCLMultiVerticalPage.js` page component (named CCPMetricsPage.js)
|
|
- Add to NavDrawer with appropriate icon
|
|
- Page layout: stats bar, charts row, vertical table
|
|
- Fetch data from /vcl-multi/stats on mount
|
|
- Loading and empty states
|
|
|
|
- [x] 15. Implement `VCLMultiStatsBar` component
|
|
- Total Devices, Compliant, Non-Compliant, Current %, Target %
|
|
- Match existing VCL stats bar styling
|
|
|
|
- [x] 16. Implement `VCLMultiVerticalTable` component
|
|
- One row per vertical: name, compliance %, non-compliant, total, last upload date
|
|
- Sortable columns
|
|
- Click row to drill down
|
|
- Burndown forecast columns (monthly)
|
|
- Blockers column
|
|
|
|
- [x] 17. Implement `VCLMultiTrendChart` component (recharts)
|
|
- Monthly bars for compliant count
|
|
- Solid line for actual compliance %
|
|
- Dashed line for forecast %
|
|
- Reference line for target %
|
|
- Match existing chart styling
|
|
|
|
- [x] 18. Implement `VCLMultiDonutChart` component (recharts)
|
|
- Blocked vs In-Progress segments
|
|
- Center label with total non-compliant
|
|
- Match existing donut styling
|
|
|
|
## Phase 5: Frontend — Drill-Down Views
|
|
|
|
- [x] 19. Implement `VerticalDetailView` component
|
|
- Triggered when a vertical row is clicked
|
|
- Fetch /vertical/:code/metrics
|
|
- Display per-metric table grouped by category
|
|
- Click metric to drill further
|
|
- Back button to return to overview
|
|
|
|
- [x] 20. Implement `MetricDeviceList` component
|
|
- Triggered when a metric row is clicked
|
|
- Fetch /vertical/:code/metric/:metricId/devices
|
|
- Display device table: hostname, IP, type, team, seen_count, dates
|
|
- Resolution date inline editing
|
|
- Back button to return to metric view
|
|
|
|
- [x] 21. Implement `VerticalBurndownChart` component
|
|
- Displayed in VerticalDetailView
|
|
- Fetch /vertical/:code/burndown
|
|
- Bar chart: monthly remediation projections
|
|
- Annotation for blockers count
|
|
- Projected clear date label
|
|
|
|
## Phase 6: Testing & Documentation
|
|
|
|
- [ ] 22. Write property-based tests for new helpers
|
|
- `parseVerticalFilename` — pattern matching correctness
|
|
- Vertical-scoped resolution isolation
|
|
- Aggregated stats consistency
|
|
- Burndown forecast conservation
|
|
|
|
- [ ] 23. Write unit tests for new endpoints
|
|
- Preview with valid/invalid files
|
|
- Commit with scoped resolution verification
|
|
- Stats aggregation with multiple verticals
|
|
- Drill-down queries
|
|
|
|
- [ ] 24. Update README.md
|
|
- Add VCL Multi-Vertical section to Features
|
|
- Add new migration to Migrations list
|
|
- Add new endpoints to API Reference
|
|
- Add new env vars if any
|
|
|
|
- [x] 25. Create meeting-ready design brief document
|
|
- Architectural choices and rationale
|
|
- Drill-down hierarchy diagram
|
|
- Burndown forecast explanation
|
|
- Open questions for stakeholders
|
|
- Timeline estimate
|