Complete overhaul of the valueset system to use human-readable names
instead of numeric IDs for improved maintainability and API consistency.
- PatientController: Renamed 'Gender' field to 'Sex' in validation rules
- ValuesetController: Changed API endpoints from ID-based (/:num) to name-based (/:any)
- TestsController: Refactored to use ValueSet library instead of direct valueset queries
- Added ValueSet library (app/Libraries/ValueSet.php) with static lookup methods:
- getOptions() - returns dropdown format [{value, label}]
- getLabel(, ) - returns label for a value
- transformLabels(, ) - batch transform records
- get() and getRaw() for Lookups compatibility
- Added ValueSetApiController for public valueset API endpoints
- Added ValueSet refresh endpoint (POST /api/valueset/refresh)
- Added DemoOrderController for testing order creation without auth
- 2026-01-12-000001: Convert valueset references from VID to VValue
- 2026-01-12-000002: Rename patient.Gender column to Sex
- OrderTestController: Now uses OrderTestModel with proper model pattern
- TestsController: Uses ValueSet library for all lookup operations
- ValueSetController: Simplified to use name-based lookups
- Updated all organization (account/site/workstation) dialogs and index views
- Updated specimen container dialogs and index views
- Updated tests_index.php with ValueSet integration
- Updated patient dialog form and index views
- Removed .factory/config.json and CLAUDE.md (replaced by AGENTS.md)
- Consolidated lookups in Lookups.php (removed inline valueset constants)
- Updated all test files to match new field names
- 32 modified files, 17 new files, 2 deleted files
- Net: +661 insertions, -1443 deletions (significant cleanup)
8.3 KiB
8.3 KiB
CLQMS MVP Todo List
Clinical Laboratory Quality Management System - Minimum Viable Product
Quick Start: Create Order with Minimal Master Data
You don't need all master data finished to create an order. Here's what's actually required:
Minimum Required (4 Tables)
-- 1. Patient (already exists in codebase)
-- Just need at least 1 patient
-- 2. Order Status Values (VSetID=11)
INSERT INTO valueset (VID, VSetID, VValue, VDesc, VOrder) VALUES
(1, 11, 'ORD', 'Ordered', 1),
(2, 11, 'SCH', 'Scheduled', 2),
(3, 11, 'ANA', 'Analysis', 3),
(4, 11, 'VER', 'Verified', 4),
(5, 11, 'REV', 'Reviewed', 5),
(6, 11, 'REP', 'Reported', 6);
-- 3. Priority Values (VSetID=10)
INSERT INTO valueset (VID, VSetID, VValue, VDesc, VOrder) VALUES
(1, 10, 'S', 'Stat', 1),
(2, 10, 'R', 'Routine', 2),
(3, 10, 'A', 'ASAP', 3);
-- 4. Counter for Order ID
INSERT INTO counter (CounterName, CounterValue) VALUES ('ORDER', 1);
-- Run seeder: php spark db:seed MinimalMasterDataSeeder
API Endpoints (No Auth Required for Testing)
# Create demo order (auto-creates patient if needed)
POST /api/demo/order
{
"PatientID": "PT001",
"NameFirst": "John",
"NameLast": "Doe",
"Gender": "1",
"Birthdate": "1990-05-15",
"Priority": "R",
"OrderingProvider": "Dr. Smith"
}
# List orders
GET /api/demo/orders
# Create order (requires auth)
POST /api/ordertest
{
"InternalPID": 1,
"Priority": "R",
"OrderingProvider": "Dr. Smith"
}
# Update order status
POST /api/ordertest/status
{
"OrderID": "00250112000001",
"OrderStatus": "SCH"
}
Core Workflow
Order → Collection → Reception → Preparation → Analysis → Verification → Review → Reporting
Phase 1: Core Lab Workflow (Must Have)
1.1 Order Management
- Complete
OrderTestControllercreate/update/delete - Implement order ID generation (LLYYMMDDXXXXX format)
- Implement order attachment handling (ordercom, orderatt tables)
- Add order status tracking (ORD→SCH→ANA→VER→REV→REP)
- Create order test mapping (testmap table)
- Add calculated test parameter auto-selection
1.2 Specimen Management
- Complete
SpecimenControllerAPI - Implement specimen ID generation (OrderID + SSS + C)
- Build specimen collection API (Collection status)
- Build specimen transport API (In-transport status)
- Build specimen reception API (Received/Rejected status)
- Build specimen preparation API (Centrifuge, Aliquot, Pre-treatment)
- Build specimen storage API (Stored status)
- Build specimen dispatching API (Dispatch status)
- Implement specimen condition tracking (HEM, ITC, LIP flags)
1.3 Result Management
- Complete
ResultControllerwith full CRUD - Implement result entry API (numeric, text, valueset, range)
- Implement result verification workflow (Technical + Clinical)
- Add reference range validation (numeric, threshold, text, valueset)
- Implement critical value flagging (threshold-based)
- Implement result rerun with AspCnt tracking
- Add result report generation API
1.4 Patient Visit
- Complete
PatVisitControllercreate/read - Implement patient visit to order linking
- Add admission/discharge/transfer (ADT) tracking
- Add diagnosis linking (patdiag table)
Phase 2: Instrument Integration (Must Have)
2.1 Edge API
- Complete
EdgeControllerresults endpoint - Implement edgeres table data handling
- Implement edgestatus tracking
- Implement edgeack acknowledgment
- Build instrument orders endpoint (/api/edge/orders)
- Build order acknowledgment endpoint (/api/edge/orders/:id/ack)
- Build status logging endpoint (/api/edge/status)
2.2 Test Mapping
- Implement test mapping CRUD (TestMapModel)
- Build instrument code to LQMS test mapping
- Add many-to-one mapping support (e.g., glucose variations)
Phase 3: Quality Management (Should Have)
3.1 Quality Control
- Build QC result entry API
- Implement QC result storage (calres table)
- Add Levey-Jennings data preparation endpoints
- Implement QC validation (2SD auto-validation)
- Add Sigma score calculation endpoint
3.2 Calibration
- Build calibration result entry API
- Implement calibration factor tracking
- Add calibration history endpoint
- Implement calibration validation
3.3 Audit Trail
- Add audit logging middleware
- Implement data change tracking (what/who/when/how/where)
- Build audit query endpoint
- Add security log endpoints
Phase 4: Master Data (Already Have - Need Completion)
4.1 Test Definitions ✅ Existing
- Test definitions (testdefsite)
- Technical specs (testdeftech)
- Calculated tests (testdefcal)
- Group tests (testdefgrp)
- Test parameters
4.2 Reference Ranges ✅ Existing
- Numeric ranges (refnum)
- Threshold ranges (refthold)
- Text ranges (reftxt)
- Value set ranges (refvset)
4.3 Organizations ✅ Existing
- Sites (SiteController)
- Departments (DepartmentController)
- Workstations (WorkstationController)
- Disciplines (DisciplineController)
4.4 Value Sets ✅ Existing
- Value set definitions (ValueSetDefController)
- Value set values (ValueSetController)
Phase 5: Inventory & Billing (Nice to Have)
5.1 Inventory
- Build counter management API
- Implement product catalog endpoints
- Add reagent tracking
- Implement consumables usage logging
5.2 Billing
- Add billing account linking
- Implement tariff selection by service class
- Build billing export endpoint
Priority Matrix
| Priority | Feature | Controller/Model | Status |
|---|---|---|---|
| P0 | Order CRUD | OrderTestController + OrderTestModel | ✅ Done |
| P0 | Specimen Status | SpecimenController | ⚠️ Needs API |
| P0 | Result Entry | ResultController | ❌ Empty |
| P0 | Result Verification | ResultController | ❌ Empty |
| P1 | Visit Management | PatVisitController | ⚠️ Partial |
| P1 | Instrument Integration | EdgeController | ⚠️ Partial |
| P1 | Reference Range Validation | RefNumModel + API | ⚠️ Need API |
| P2 | QC Results | New Controller | ❌ Not exist |
| P2 | Audit Trail | New Model | ❌ Not exist |
| P3 | Inventory | CounterController | ⚠️ Partial |
| P3 | Billing | New Controller | ❌ Not exist |
Quick Test: Does Order Creation Work?
# Test 1: Create demo order (no auth required)
curl -X POST http://localhost:8080/api/demo/order \
-H "Content-Type: application/json" \
-d '{"NameFirst": "Test", "NameLast": "Patient"}'
# Expected Response:
{
"status": "success",
"message": "Demo order created successfully",
"data": {
"PatientID": "DEMO1736689600",
"InternalPID": 1,
"OrderID": "00250112000001",
"OrderStatus": "ORD"
}
}
# Test 2: Update order status
curl -X POST http://localhost:8080/api/ordertest/status \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"OrderID": "00250112000001", "OrderStatus": "SCH"}'
Success Criteria
Functional
- Patient registration works ✅
- Test ordering generates valid OrderID and SID
- Specimens track through collection → transport → reception → preparation → analysis
- Results can be entered with reference range validation
- Results verified through VER → REV → REP workflow
- Instruments can send results via Edge API
Non-Functional
- JWT authentication required for all endpoints
- Soft delete (DelDate) on all transactions
- UTC timezone for all datetime fields
- Audit logging for data changes
- < 2s response time for standard queries
Current Codebase Status
Controllers (Need Work)
- ❌ OrderTestController - placeholder code, incomplete
- ❌ ResultController - only validates JWT
- ✅ PatientController - complete
- ✅ TestsController - complete
- ✅ PatVisitController - partial
Models (Good)
- ✅ PatientModel - complete
- ✅ TestDef* models - complete
- ✅ Ref* models - complete
- ✅ ValueSet* models - complete
- ✅ SpecimenModel - exists, needs API
Missing Controllers
- ❌ SpecimenController - need full implementation
- ❌ ResultController - need full implementation
- ❌ QualityControlController - not exist
- ❌ CalibrationController - not exist
- ❌ AuditController - not exist
- ❌ BillingController - not exist