129 lines
4.8 KiB
Markdown
129 lines
4.8 KiB
Markdown
# UTO Manager — Development Status
|
|
|
|
_Last updated: 2026-08-09_
|
|
|
|
---
|
|
|
|
## Current Branch
|
|
`main` (feature/phase-2-canvas-engine merged)
|
|
|
|
## Overall Progress
|
|
|
|
| Phase | Title | Status |
|
|
|-------|-------|--------|
|
|
| 1 | Domain Foundation | ✅ Complete |
|
|
| 2 | Canvas Engine & Persistence | ✅ Complete |
|
|
| 3 | Template Library & Import/Export | 🔲 Not started |
|
|
| 4 | Reporting & Analytics | 🔲 Not started |
|
|
| 5 | Multi-user / Sync | 🔲 Not started |
|
|
|
|
---
|
|
|
|
## Phase 1 — Domain Foundation ✅
|
|
|
|
**Completed items:**
|
|
- `Echelon` entity with doctrinal hierarchy validation (`isValidParent`, `isValidChild`)
|
|
- `DoctrinalBranch` entity with display names
|
|
- `AuthorizedRank` entity with pay grade, category flags, `meetsMinimum`, `gradeLevel`
|
|
- `DutyMos` value object with MOS dictionary validation and `unvalidated` constructor
|
|
- `UnitNode` entity with `copyWith`, `isRoot`, `isValidParentNode`
|
|
- `PositionSlot` entity with `isVacant`, `isFilled`, `isKeyLeader`
|
|
- `PersonnelRecord` entity with `ReadinessState`, `copyWith`, `isUnassigned`
|
|
- `UnitRepository` abstract interface
|
|
- `PersonnelRepository` abstract interface
|
|
- `domain_entities.dart` barrel export
|
|
- Full unit test coverage for all domain entities and value objects
|
|
|
|
**Test count (Phase 1):** 60 tests
|
|
|
|
---
|
|
|
|
## Phase 2 — Canvas Engine & Persistence ✅
|
|
|
|
**Completed items:**
|
|
|
|
### Domain Services
|
|
- `UnitTreeService` — `buildTree`, `getSubtree`, `getAncestors`, `validateReparent`,
|
|
`validateAssignment`, `calculateFillRate`, `getVacantKeyLeaderSlots`, `getMosMismatches`
|
|
- `AssignmentService` — `assign`, `unassign`, `aggregateReadiness` with `ReadinessColor`
|
|
|
|
### Infrastructure — Database
|
|
- Drift schema: `Units`, `PositionSlots`, `Personnel`, `Templates` tables
|
|
- `AppDatabase` with `forTesting(NativeDatabase.memory())` constructor
|
|
- `UnitDao` — full CRUD + watch streams
|
|
- `PersonnelDao` — full CRUD + `assignToSlot` / `unassignFromSlot` + watch streams
|
|
- `PositionSlotDao` — full CRUD + `assignPersonnel` / `clearAssignment` + watch streams
|
|
- `TemplateDao` — full CRUD + `upsertTemplate`
|
|
- build_runner code generation (`.g.dart` files)
|
|
|
|
### Infrastructure — Repositories
|
|
- `DriftUnitRepository` — implements `UnitRepository` with domain↔Drift mapping
|
|
- `DriftPersonnelRepository` — implements `PersonnelRepository` with domain↔Drift mapping
|
|
- `DriftPositionSlotRepository` — concrete slot repository
|
|
|
|
### Application — BLoC
|
|
- `UnitTreeCubit` / `UnitTreeState` (sealed) — tree loading, selection, reparent, subtree delete
|
|
- `PersonnelCubit` / `PersonnelState` (sealed) — roster loading, filter, assign/unassign
|
|
- `TemplateCubit` / `TemplateState` (sealed) — template save/load/delete
|
|
|
|
### Presentation
|
|
- `HomeScreen` — three-pane adaptive layout (personnel | canvas | inspector)
|
|
- `UtoCanvasWidget` — `InteractiveViewer` pan/zoom org chart with drag-and-drop reparent
|
|
- `UnitNodeCard` — echelon-colored card with fill rate progress bar
|
|
- `PositionSlotCard` — `DragTarget` slot card with MOS badge and readiness color
|
|
- `PersonnelListTile` — `Draggable` soldier tile for assignment
|
|
- Status bar with live unit/slot fill counts
|
|
|
|
### App Wiring
|
|
- `main.dart` — `MultiBlocProvider` wiring all cubits with production database
|
|
|
|
**Test count (Phase 2):** 77 new tests (137 total)
|
|
|
|
---
|
|
|
|
## Test Summary
|
|
|
|
| File | Tests | Status |
|
|
|------|-------|--------|
|
|
| `authorized_rank_test.dart` | 16 | ✅ |
|
|
| `echelon_test.dart` | 17 | ✅ |
|
|
| `personnel_record_test.dart` | 13 | ✅ |
|
|
| `unit_node_test.dart` | 15 | ✅ |
|
|
| `duty_mos_test.dart` | 32 | ✅ |
|
|
| `assignment_service_test.dart` | 16 | ✅ |
|
|
| `unit_tree_service_test.dart` | 27 | ✅ |
|
|
| `widget_test.dart` | 1 | ✅ |
|
|
| **Total** | **137** | **✅ All pass** |
|
|
|
|
---
|
|
|
|
## Known Limitations / Next Steps (Phase 3)
|
|
|
|
- Template serialization is JSON-only; no import from external formats yet
|
|
- No PDF/Excel export of readiness reports
|
|
- No multi-user or sync capability
|
|
- Canvas layout is vertical tree only; horizontal layout not yet implemented
|
|
- No undo/redo for assignment operations
|
|
- No search/filter on the canvas itself
|
|
|
|
---
|
|
|
|
## Architecture Notes
|
|
|
|
```
|
|
lib/
|
|
├── domain/
|
|
│ ├── entities/ # Pure Dart domain models (no Flutter deps)
|
|
│ ├── value_objects/ # DutyMos
|
|
│ ├── repositories/ # Abstract interfaces
|
|
│ └── services/ # UnitTreeService, AssignmentService
|
|
├── infrastructure/
|
|
│ ├── database/ # Drift schema, DAOs, generated code
|
|
│ └── repositories/ # Drift-backed implementations
|
|
├── application/
|
|
│ └── blocs/ # flutter_bloc Cubits
|
|
└── presentation/
|
|
├── screens/ # HomeScreen
|
|
└── widgets/ # Canvas, cards, tiles
|
|
```
|