2.3 KiB
2.3 KiB
Task D.7.4 CSV Preview Validation Engine
Date: 2026-07-02 Status: implemented
Scope Delivered
- Added reusable preview-only CSV engine:
src/features/setup/server/csv-preview.service.tssrc/features/setup/server/csv/parser.tssrc/features/setup/server/csv/template-registry.tssrc/features/setup/server/csv/header-validator.tssrc/features/setup/server/csv/value-validator.tssrc/features/setup/server/csv/dependency-resolver.tssrc/features/setup/server/csv/validator.tssrc/features/setup/server/csv/preview-builder.tssrc/features/setup/server/csv/types.ts
- Added protected preview route:
POST /api/setup/import/preview
Behavior
- Accepts one or more CSV files through
multipart/form-data. - Detects templates by filename from
setup/templates/templates.json. - Treats
templates.jsonplus checked-in CSV headers as runtime template truth. - Rejects unknown and unsupported templates with structured row/file errors.
- Validates exact header names, order, duplicate columns, missing columns, and extra columns.
- Parses UTF-8 comma-delimited CSV with quoted cell support.
- Reports invalid encoding, empty rows, duplicate rows, inconsistent column counts, required fields, emails, booleans, integers, decimals, dates, enums, JSON metadata, format rules, and amount/line-total warnings.
- Resolves dependencies from both uploaded batch files and existing database rows without writing.
- Detects duplicate business keys inside each uploaded file.
- Classifies rows as
create,update, orerror. - Returns structured file/row report with
PASS,WARNING,FAILstatus andpreviewHashfor D.7.5.
Safety Notes
- No database insert/update/delete logic added.
- No seed execution added.
- No reset/reseed behavior added.
- No document number generation, approval triggering, PDF generation, or storage writes added.
- Relationship checks use read-only Drizzle selects.
quotation-topic-items.csvresolvestopic_keyfrom the uploaded batch becausetopic_keyis an import-only alias and is not persisted incrm_quotation_topics.
Verification
npm run typecheck: passed.npx oxlint src/features/setup/server/csv src/features/setup/server/csv-preview.service.ts src/app/api/setup/import/preview: passed.