SF Position Integrity Review
Scan position management data for structural inconsistencies that cause payroll, reporting, and org-chart failures.
When to Use
- Before payroll processing to catch missing incumbents
- After a reorganisation to validate hierarchy chains
- During pre-migration data quality assessment
- When org chart visualisations show broken reporting lines
- As part of quarterly data integrity health checks
Prerequisites
- Position and employee data from SF (OData export, CSV, or API response)
- SF Position Integrity Checker tool (if available)
- Or raw Position OData entities with parentPosition, incumbent, and status fields
Evidence and Human Control
- Capture source evidence with tenant, population, effective date and extraction timestamp.
- Separate validation evidence from assumptions about payroll, workflow and integration impact.
- Treat employee identifiers and incumbent details as sensitive data; minimise and mask them in client outputs.
- Require human approval from HR data and HRIS/SF owners before any remediation or writeback.
- Re-run the integrity checks after remediation and reconcile the before/after population.
Workflow (Manual Analysis)
Step 1: Extract position data
Pull from SF OData or use existing export:
curl -u user:pass "https://apiXX.sapsf.eu/odata/v2/Position?\$select=code,parentPosition,incumbent,status,effectiveStartDate,effectiveEndDate,lastModifiedDateTime&\$top=5000"
Step 2: Validate structural integrity
Check for:
- Orphaned positions: parentPosition references a code that doesn't exist
- Broken chains: position chain longer than expected (default: 15 levels)
- Cyclical references: A → B → C → A
- No incumbent: incumbent field null for > 90 days
- Mismatched counts: active positions vs active employees mismatch
Step 3: Categorise and score
| Finding Type |
Severity |
Business Impact |
| Cyclical hierarchy |
CRITICAL |
Infinitely recursive org charts crash reporting |
| Orphaned position (no parent) |
HIGH |
Position invisible in hierarchy, excluded from approvals |
| No incumbent > 90 days |
HIGH |
Vacant positions accumulating, budget unbudgeted |
| Broken chain > 15 levels |
MEDIUM |
Slow hierarchy queries, navigation timeout |
| Inactive position with active incumbent |
CRITICAL |
Employee assigned to non-existent role |
Step 4: Produce fix recommendations
For each finding, output:
- Position code and name
- Current state (what's wrong)
- Root cause (why it happened)
- Fix action (exactly what to change)
- Rollback instructions
Edge Cases
- Matrix organisations: ignore parentPosition ambiguity; validate both reporting lines independently
- Dual-employed incumbents (global assignments): flag as expected if concurrentEmployment is active
- C-suite positions: positions reporting to board (external) have no parent in EC -- flag as expected
- MDF position types: if client uses custom position objects, adapt entity name
- Positions frozen mid-reorg: exclude positions with effectiveStatus=frozen from orphan checks
- Empty tenant / greenfield: produce a "no data" baseline report with setup recommendations
Common Pitfalls
- Counting every orphan as a defect: Some orphans are intentional (board reporting, external secondments). Always include a "likely-intentional" filter.
- Not checking effective dates: A position with no incumbent may be future-dated. Check effectiveStartDate.
- Missing the payroll impact: Always link each finding to a concrete downstream effect (payroll error, reporting gap, compliance risk).
- Over-communicating the noise: 500+ findings are overwhelming. Cluster similar issues and present top-N by business impact.
Verification Checklist
1---2name: sf-position-integrity-review3description: Use when you need to validate position management data integrity -- find orphans, broken hierarchies, cyclical chains, and missing incumbents before they cause payroll errors.4license: MIT5---67# SF Position Integrity Review89Scan position management data for structural inconsistencies that cause payroll, reporting, and org-chart failures.1011## When to Use1213- Before payroll processing to catch missing incumbents14- After a reorganisation to validate hierarchy chains15- During pre-migration data quality assessment16- When org chart visualisations show broken reporting lines17- As part of quarterly data integrity health checks1819## Prerequisites2021- Position and employee data from SF (OData export, CSV, or API response)22- SF Position Integrity Checker tool (if available)23- Or raw Position OData entities with parentPosition, incumbent, and status fields2425## Evidence and Human Control2627- Capture source evidence with tenant, population, effective date and extraction timestamp.28- Separate validation evidence from assumptions about payroll, workflow and integration impact.29- Treat employee identifiers and incumbent details as sensitive data; minimise and mask them in client outputs.30- Require human approval from HR data and HRIS/SF owners before any remediation or writeback.31- Re-run the integrity checks after remediation and reconcile the before/after population.3233## Workflow (Manual Analysis)3435### Step 1: Extract position data3637Pull from SF OData or use existing export:38```39curl -u user:pass "https://apiXX.sapsf.eu/odata/v2/Position?\$select=code,parentPosition,incumbent,status,effectiveStartDate,effectiveEndDate,lastModifiedDateTime&\$top=5000"40```4142### Step 2: Validate structural integrity4344Check for:45- **Orphaned positions**: parentPosition references a code that doesn't exist46- **Broken chains**: position chain longer than expected (default: 15 levels)47- **Cyclical references**: A → B → C → A48- **No incumbent**: incumbent field null for > 90 days49- **Mismatched counts**: active positions vs active employees mismatch5051### Step 3: Categorise and score5253| Finding Type | Severity | Business Impact |54|-------------|----------|-----------------|55| Cyclical hierarchy | CRITICAL | Infinitely recursive org charts crash reporting |56| Orphaned position (no parent) | HIGH | Position invisible in hierarchy, excluded from approvals |57| No incumbent > 90 days | HIGH | Vacant positions accumulating, budget unbudgeted |58| Broken chain > 15 levels | MEDIUM | Slow hierarchy queries, navigation timeout |59| Inactive position with active incumbent | CRITICAL | Employee assigned to non-existent role |6061### Step 4: Produce fix recommendations6263For each finding, output:64- Position code and name65- Current state (what's wrong)66- Root cause (why it happened)67- Fix action (exactly what to change)68- Rollback instructions6970## Edge Cases7172- **Matrix organisations**: ignore parentPosition ambiguity; validate both reporting lines independently73- **Dual-employed incumbents (global assignments)**: flag as expected if concurrentEmployment is active74- **C-suite positions**: positions reporting to board (external) have no parent in EC -- flag as expected75- **MDF position types**: if client uses custom position objects, adapt entity name76- **Positions frozen mid-reorg**: exclude positions with effectiveStatus=frozen from orphan checks77- **Empty tenant / greenfield**: produce a "no data" baseline report with setup recommendations7879## Common Pitfalls80811. **Counting every orphan as a defect**: Some orphans are intentional (board reporting, external secondments). Always include a "likely-intentional" filter.822. **Not checking effective dates**: A position with no incumbent may be future-dated. Check effectiveStartDate.833. **Missing the payroll impact**: Always link each finding to a concrete downstream effect (payroll error, reporting gap, compliance risk).844. **Over-communicating the noise**: 500+ findings are overwhelming. Cluster similar issues and present top-N by business impact.8586## Verification Checklist8788- [ ] All active positions processed89- [ ] Orphans categorised (intentional vs defect)90- [ ] Hierarchy cycles identified and isolated91- [ ] Payroll-impact findings flagged separately92- [ ] Fix recommendations include specific API or UI paths93- [ ] Client-safe summary produced