T2-W01 Validation Matrix¶
| Business rule | FE validation | BE validation | DB / ORM constraint | Test case |
|---|---|---|---|---|
| Academic year requires name + dates | Academic year form required fields | academic_year_save rejects missing |
OE required Date fields | W01-AY-CREATE |
| Year end ≥ start | Client date checks (where present) | Explicit compare in academic_year_save |
— | W01-AY-INVALID-RANGE |
| Term end ≥ start; term inside year | Academic year term UI | Explicit checks in academic_year_save |
— | covered by AY create/invalid |
| Rombel requires in-scope year + course | Study group form | _require_school_unit_company + year/course company domain |
op.batch company_id |
W01-BATCH-CREATE, W01-BATCH-FOREIGN-COURSE |
| Homeroom faculty in school scope | Teacher assignment UI | _faculty_scope_domain on save |
— | W01-TEACHER-ASSIGN-* |
| Lesson hour end > start | Schedule-slots form | scola.lesson.hours overlap/range constraints |
model constraints | W01-LH-INVALID-RANGE |
| Session requires batch/subject/faculty + datetimes | Session form / generate wizard | session_save required-field checks |
OE required M2O | W01-SESSION-CREATE |
| Session end > start | Form | session_save compare |
— | validation path |
| Foreign-company relations rejected without leak | — | _session_relation_in_scope generic denial |
company domains / record rules | W01-SESSION-FOREIGN-* |
| Teacher/class overlap forbidden | Generate UI warnings | _find_conflicts + @api.constrains |
— | W01-SESSION-TEACHER-CLASS-CONFLICT |
| Failed conflict does not persist | Toast error | savepoint around create/write | transaction rollback | W01-SESSION-UPDATE-ATOMIC, conflict case |
| Concurrent overlap → one winner | — | advisory xact lock + pre-check | — | W01-SESSION-CONCURRENT |
| Double submit no duplicate | debounce (UX) | conflict engine | — | W01-SESSION-IDEMPOTENT-DUP |
| Non-admin cannot mutate timetable | Route capability | _can_manage_academic |
ACL/record rules | W01-SESSION-*-MUTATE-DENIED |
| Direct RPC cannot bypass | — | ACL + capability middleware | ir.model.access / rules | W01-SESSION-RPC-BYPASS |
lesson_hours_id accepted on Core save |
Schedule payload | allowed_fields includes lesson_hours_id |
stored on op.session |
W01-SESSION-CREATE |
FE ↔ BE authority¶
Critical rules have BE enforcement. FE validation is assistive only; direct API without FE still fail-closed.