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.
834 lines
17 KiB
JSON
834 lines
17 KiB
JSON
{
|
|
"version": 1,
|
|
"property": "Pavilion Accra",
|
|
"units": [
|
|
{
|
|
"apartment_code": "101E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "101E(B)",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "101W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "101W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "102E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "102W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "104E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "104W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "106E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "106W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "107E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "107W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "109E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "109W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "110E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "110W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 1
|
|
},
|
|
{
|
|
"apartment_code": "201E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "201E(B)",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "201W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "201W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "202E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "202W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "203E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "203W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "204E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "204W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "206E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "206W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "207E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "207W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "208E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "208W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "209E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "209W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "210E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "210W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 2
|
|
},
|
|
{
|
|
"apartment_code": "301E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "301W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "301W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "302E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "302W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "303E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "303W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "304E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "304W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "306E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "306W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "307E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "307W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "308E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "308W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "309E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "309W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "310W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 3
|
|
},
|
|
{
|
|
"apartment_code": "401E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "401E(B)",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "401W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "401W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "402E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "402W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "403E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "403W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "404E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "404W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "406E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "406W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "407E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "407W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "408E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "408W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "409E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "409W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "410E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "410W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 4
|
|
},
|
|
{
|
|
"apartment_code": "501E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "501E(B)",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "501W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "501W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "502E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "502W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "503E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "503W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "504E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "504W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "506E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "506W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "507E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "507W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "508E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "508W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "509E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "509W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "510E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "510W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 5
|
|
},
|
|
{
|
|
"apartment_code": "601E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "601E(B)",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "601W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "601W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "602E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "602W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "603E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "603W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "604E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "604W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "606E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "606W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "607E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "607W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "608E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "608W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "609E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "609W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "610E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "610W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 6
|
|
},
|
|
{
|
|
"apartment_code": "701E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "701E(B)",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "701W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "701W(B)",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "702E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "702W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "703E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "703W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "704E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "704W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "706E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "706W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "707E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "707W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "708E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "708W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "709E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "709W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "710E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "710W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": 7
|
|
},
|
|
{
|
|
"apartment_code": "PH1E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": null
|
|
},
|
|
{
|
|
"apartment_code": "PH1W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": null
|
|
},
|
|
{
|
|
"apartment_code": "PH2E",
|
|
"property": "East",
|
|
"building": "Pavilion East",
|
|
"floor": null
|
|
},
|
|
{
|
|
"apartment_code": "PH2W",
|
|
"property": "West",
|
|
"building": "Pavilion West",
|
|
"floor": null
|
|
}
|
|
]
|
|
} |