# JobProfile

## Description

JobProfile is the **role definition template** shared across Positions — the "Job" in Worker / Position / Job (issue #7). It captures what a role *is* (job family, grade, requirements) independently of any specific seat or person, so many Positions can reference one JobProfile (e.g. many "Store Staff" seats across sites share one profile).

JobProfile is master data referenced by `Position`. In this design phase it holds only a grade *reference* and role metadata, not pay amounts — compensation is deferred to a future payroll domain (ADR-018). Keeping JobProfile lean and stable lets it serve as a shared classification that work-rules eligibility and future reporting can key on.

## Domain Model Definitions

### Model type

Standard

### Command Definitions

Command docs are out of scope for this design phase (ADR-011). Anticipated commands:

- createJobProfile — define a new role template
- updateJobProfile — update role metadata (job family, grade reference, requirements)
- deleteJobProfile — remove a JobProfile not referenced by any Position

### Query Definitions

- getJobProfile — retrieve a JobProfile by id
- listJobProfiles — paginated list of JobProfiles
### Models

- JobProfile

### Invariants

- `code` is required and unique across JobProfiles
- A JobProfile is a period-invariant classification template; it is not effective-dated (role definitions are corrected in place, and structural change is expressed by moving Positions to a different JobProfile)
- A JobProfile may be referenced by many Positions; deletion is rejected while any Position references it
- JobProfile holds a grade *reference* and role metadata only — no pay amounts in this phase (ADR-018)

### Relationships

- **Referenced by Position**: many Positions may share one JobProfile as their role definition
- **Keyed by rules (future)**: work-rules eligibility and future reporting may segment by job family / grade referenced here
