New suite: 8/8 passed. Full suite: 110 passed, 0 failed.
Deploy note for reviewer
Roster convergence deactivates real technician accounts on the live demo DB. Nothing is deleted and ticket history stays intact, but this is a live-data change - please take the pre-flight DB backup on CT 115 (scottdenya) before deploying.
Still outstanding (client owes data, non-blocking)
Email addresses for the 5 technicians.
Sub-contractor names + emails.
Applies Wahab Abdul's 2026-09-28 directives (Denya OneCare / Pavilion Accra).
## 1. Technician roster -> exactly 5 named techs
Samuel Shang, Desmond Afful, Desmond Odekyi, Francis Norgbey, Nicholas Nartey.
- New `app/services/roster.py`: `converge_tech_roster()` runs at startup, idempotent.
- Off-roster techs are **DEACTIVATED, never deleted** - ticket history keeps a valid assignee reference.
- `seed.py` SEED_USERS_DATA updated. Emails are placeholders (`first.last@denya.com`) until the client confirms real ones.
## 2. Sub-contractors in the "Assign to" list
- New canonical role `Sub-contractor`; `ASSIGNEE_POOL_ROLES = (Tech, Sub-contractor)`.
- New `GET /api/auth/assignees` - active pool members only.
- Server-side `_validate_assignee` gate rejects off-pool/deactivated assignees (400/404).
- "Assign To" dropdown added to the new-ticket form; assigning at creation auto-advances Logged -> Assigned.
- `base.html` isTech() includes Sub-contractor (portal UX; tracked "under tech" by the FM coordinator).
## 3. Penthouse units selectable
- `apartment_mapping.json`: `PH1E-/PH1W-/PH2E-/PH2W-` -> clean codes.
- `seed_units` self-heals legacy malformed codes on existing DBs and sets floors.
- Penthouse units added to the built-in fallback seed.
## Tests
- New `tests/test_wahab_directives_20260928.py` (8 tests) - roster convergence/deactivate-not-delete, sub-contractor assignability, penthouse presence + floors + no dangling dashes.
- `tests/test_categories_and_units.py`: East count 60 -> 62 (penthouses) + penthouse presence assertions.
- New suite: 8/8 passed. Full suite: 110 passed, 0 failed.
## Deploy note for reviewer
Roster convergence **deactivates real technician accounts on the live demo DB**. Nothing is deleted and ticket history stays intact, but this is a live-data change - please take the pre-flight DB backup on CT 115 (scottdenya) before deploying.
## Still outstanding (client owes data, non-blocking)
1. Email addresses for the 5 technicians.
2. Sub-contractor names + emails.
Three client decisions for Denya OneCare / Pavilion Accra:
1. Technician roster converges to exactly 5 named techs
- Samuel Shang, Desmond Afful, Desmond Odekyi, Francis Norgbey, Nicholas Nartey
- New app/services/roster.py: converge_tech_roster() runs at startup and is
idempotent; off-roster techs are DEACTIVATED, never deleted, so ticket
history keeps a valid assignee reference
- seed.py SEED_USERS_DATA updated; placeholder emails until client confirms
2. Sub-contractors appear in the "Assign to" list alongside technicians
- New canonical role "Sub-contractor" (ASSIGNEE_POOL_ROLES = Tech + Sub-contractor)
- New GET /api/auth/assignees endpoint returns active pool members only
- Server-side _validate_assignee gate in ticket service rejects off-pool
or deactivated assignees (400/404)
- "Assign To" dropdown added to the new-ticket form; assigning at creation
auto-advances Logged -> Assigned
- base.html isTech() includes Sub-contractor (portal UX, tracked "under tech")
3. Penthouse units selectable when raising a ticket
- apartment_mapping.json: PH1E-/PH1W-/PH2E-/PH2W- -> clean codes
- seed_units self-heals legacy malformed codes on existing DBs and sets floors
- Penthouse units added to the built-in fallback seed
Tests: new tests/test_wahab_directives_20260928.py (8 tests); updated the
stale East unit count in test_categories_and_units.py (60 -> 62 with penthouses).
Full suite green.
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Applies Wahab Abdul's 2026-09-28 directives (Denya OneCare / Pavilion Accra).
1. Technician roster -> exactly 5 named techs
Samuel Shang, Desmond Afful, Desmond Odekyi, Francis Norgbey, Nicholas Nartey.
app/services/roster.py:converge_tech_roster()runs at startup, idempotent.seed.pySEED_USERS_DATA updated. Emails are placeholders (first.last@denya.com) until the client confirms real ones.2. Sub-contractors in the "Assign to" list
Sub-contractor;ASSIGNEE_POOL_ROLES = (Tech, Sub-contractor).GET /api/auth/assignees- active pool members only._validate_assigneegate rejects off-pool/deactivated assignees (400/404).base.htmlisTech() includes Sub-contractor (portal UX; tracked "under tech" by the FM coordinator).3. Penthouse units selectable
apartment_mapping.json:PH1E-/PH1W-/PH2E-/PH2W--> clean codes.seed_unitsself-heals legacy malformed codes on existing DBs and sets floors.Tests
tests/test_wahab_directives_20260928.py(8 tests) - roster convergence/deactivate-not-delete, sub-contractor assignability, penthouse presence + floors + no dangling dashes.tests/test_categories_and_units.py: East count 60 -> 62 (penthouses) + penthouse presence assertions.Deploy note for reviewer
Roster convergence deactivates real technician accounts on the live demo DB. Nothing is deleted and ticket history stays intact, but this is a live-data change - please take the pre-flight DB backup on CT 115 (scottdenya) before deploying.
Still outstanding (client owes data, non-blocking)
Three client decisions for Denya OneCare / Pavilion Accra: 1. Technician roster converges to exactly 5 named techs - Samuel Shang, Desmond Afful, Desmond Odekyi, Francis Norgbey, Nicholas Nartey - New app/services/roster.py: converge_tech_roster() runs at startup and is idempotent; off-roster techs are DEACTIVATED, never deleted, so ticket history keeps a valid assignee reference - seed.py SEED_USERS_DATA updated; placeholder emails until client confirms 2. Sub-contractors appear in the "Assign to" list alongside technicians - New canonical role "Sub-contractor" (ASSIGNEE_POOL_ROLES = Tech + Sub-contractor) - New GET /api/auth/assignees endpoint returns active pool members only - Server-side _validate_assignee gate in ticket service rejects off-pool or deactivated assignees (400/404) - "Assign To" dropdown added to the new-ticket form; assigning at creation auto-advances Logged -> Assigned - base.html isTech() includes Sub-contractor (portal UX, tracked "under tech") 3. Penthouse units selectable when raising a ticket - apartment_mapping.json: PH1E-/PH1W-/PH2E-/PH2W- -> clean codes - seed_units self-heals legacy malformed codes on existing DBs and sets floors - Penthouse units added to the built-in fallback seed Tests: new tests/test_wahab_directives_20260928.py (8 tests); updated the stale East unit count in test_categories_and_units.py (60 -> 62 with penthouses). Full suite green.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.