68 lines
2.9 KiB
Markdown
68 lines
2.9 KiB
Markdown
# photofetch
|
|
|
|
Pick a Napta **Project** and see a grid of its **Members** — each shown with their
|
|
Slack **Avatar**, name, and **Role**. The shared vocabulary below is the ubiquitous
|
|
language: it must appear verbatim in conversation, code, tests, commits, and docs.
|
|
|
|
## Language
|
|
|
|
**Project**:
|
|
A Napta project that people are staffed on; the unit you select to see its team.
|
|
_Avoid_: mission, engagement.
|
|
|
|
**Person**:
|
|
An employee in Napta (a Napta `user`), carrying an email, first/last name, and Position.
|
|
_Avoid_: collaborator, resource, user (ambiguous — there are no app accounts).
|
|
|
|
**Staffing Assignment**:
|
|
A Napta `user_project` row linking one Person to one Project; may be real or `simulated`.
|
|
_Avoid_: allocation, booking.
|
|
|
|
**Member**:
|
|
A Person with a real (non-`simulated`) Staffing Assignment on the selected Project who is still an active employee — one cell in the grid.
|
|
_Avoid_: teammate, staff.
|
|
|
|
**Role**:
|
|
A Member's Napta job Position (`user_position`), shown under their name.
|
|
_Avoid_: title, grade, seniority.
|
|
|
|
**Match**:
|
|
The link from a Member to their Slack profile, made by equal email. A Member is _matched_ or _unmatched_.
|
|
_Avoid_: lookup, mapping.
|
|
|
|
**Avatar**:
|
|
A matched Member's Slack profile picture. Unmatched Members fall back to an initials Avatar.
|
|
_Avoid_: photo, picture, image.
|
|
|
|
**Selection**:
|
|
The set of one or more Projects currently chosen, whose teams are shown together.
|
|
_Avoid_: filter.
|
|
|
|
**Project Group**:
|
|
One selected Project plus its Members — a section in the grid and a folder in an Export.
|
|
_Avoid_: section, bucket.
|
|
|
|
**Export**:
|
|
A downloadable zip of Member Avatars, organized as one folder per Project Group (folder named after the Project).
|
|
_Avoid_: download, dump.
|
|
|
|
## Relationships
|
|
|
|
- A **Project** has many **Staffing Assignments**; each Assignment links one **Person**.
|
|
- A **Member** is a **Person** with a qualifying **Staffing Assignment** on a selected **Project**.
|
|
- A **Member** has exactly one **Role** and at most one **Avatar** (via an email **Match**).
|
|
- A **Selection** contains one or more **Projects**; each renders as a **Project Group**.
|
|
- A Person staffed on several selected **Projects** appears in each of those **Project Groups**.
|
|
- An **Export** writes one folder per **Project Group**, holding its Members' **Avatar** files.
|
|
|
|
## Example dialogue
|
|
|
|
> **Dev:** "When I pick a **Project**, do I show every **Person** who has a **Staffing Assignment** on it?"
|
|
> **Domain expert:** "Only real ones — drop the `simulated` assignments, and drop people who've left."
|
|
> **Dev:** "And if a **Member**'s email has no **Match** in Slack?"
|
|
> **Domain expert:** "Still show them — initials **Avatar**, real name and **Role**. A missing photo isn't a missing person."
|
|
|
|
## Flagged ambiguities
|
|
|
|
- "user" is avoided: Napta calls a Person a `user`, but photofetch has no login/accounts, so the word would mislead. A Person on the selected Project is a **Member**.
|