# CreateJobProfile

## Permission Scope

`position`

## Overview

CreateJobProfile defines a new role template (job profile) — job family, grade reference, and requirements — that Positions can share as their role definition.

## Business Rules

- `code` is required and unique across JobProfiles
- JobProfile is a period-invariant classification template; it is not effective-dated
- JobProfile holds a grade *reference* and role metadata only — no pay amounts in this phase (ADR-018)

## Process Flow

```mermaid
flowchart TD
    A[Create JobProfile: code, job family, grade reference, requirements] --> B{Code unique?}
    B -- No --> X[Reject: DUPLICATE_JOB_PROFILE_CODE]
    B -- Yes --> C[Create JobProfile record]
    C --> D[Available for Positions to reference]
```

## External Dependencies

- [workforce::Position](../model/Position.md) model — Positions that will reference this JobProfile

## Error Scenarios

- **DUPLICATE_JOB_PROFILE_CODE**: code already exists on another JobProfile
- **INVALID_GRADE_REFERENCE**: the referenced grade does not exist or is invalid

## Test Cases

- creating a JobProfile with a unique code succeeds
- creating a JobProfile with a code already in use is rejected

