BSC total score goals
Configuration document id: bsc-total-score-goals-{cycle_id} (per fiscal cycle; legacy id bsc-total-score-goals migrated to -2025).
API field: bsc_total_score_goals on GET / PATCH /v1/scorecard/configurations?cycle_id=….
See Fiscal cycles & locks for cycle selection and edit rules.
Structure (fixed)
- 3 employee levels: 1, 2, 3 (
employment_data.employee_level) - 3 tenure rows per level:
min_years1, 2, 3 (whole years employed: 1 yr+, 2 yrs+, 3 yrs+) - 3 bands per row: Standard, Expectation, Goal (each
min–max, 0–100)
Resolving the correct row
- Look up
employee_level(1–3). - From tenure tiers, use the row with the largest
min_yearswhereyears_employed >= min_years.
Example: 2.5 years → treat as 2 whole years → use the 2 yr+ row (not 3 yr+).
Classifying a total BSC score (dashboard)
After the weighted BSC total is calculated (0–100), compare it to that row’s minimum thresholds (contiguous lower-bound rules — same as the web UI and bonus qualification):
- If score ≥ Goal
min→ Goal - Else if score ≥ Expectation
min→ Expectation - Else if score ≥ Standard
min→ Standard - Else → below standard
Scores are not rounded to integers before classification (e.g. 94.69 with Goal min 95 stays Expectation, not Goal).
Helper: classify_total_score() in api/app/domains/bsc/total_score_goals.py.
Code
- Schema:
api/app/schemas/scorecard_config.py(BscTotalScoreGoals, …) - Helpers:
api/app/services/bsc_total_score_goals.py - UI tab: BSC Total Score Goals
