HH/docs/STAFF_HIERARCHY_INTEGRATION_SUMMARY.md

573 lines
14 KiB
Markdown

# Staff Hierarchy Integration - Complete Summary
## Executive Summary
The PX360 system now includes comprehensive support for importing, storing, and visualizing staff hierarchy data from CSV files. This document provides a complete overview of the integration process and available features.
## Your Data Structure
### CSV Format
```
Staff ID,Name,Location,Department,Section,Subsection,AlHammadi Job Title,Country,Gender,Manager
4,ABDULAZIZ SALEH ALHAMMADI,Nuzha,Senior Management Offices,COO Office,,Chief Operating Officer,Saudi Arabia,Male,2 - MOHAMMAD SALEH AL HAMMADI
1049,VARGHESE NINAN,Nuzha,Human Resource ,Employee Relations,,Porter,India,Male,1053 - MAJID SALEM SAEED ALNAHDI
1053,MAJID SALEM SAEED ALNAHDI,Nuzha,Human Resource ,Administration,,Human Resources Manager ,Saudi Arabia,Male,2 - MOHAMMAD SALEH AL HAMMADI
```
### Data Mapping
| CSV Field | PX360 Field | Notes |
|-----------|-------------|-------|
| Staff ID | `employee_id` | Unique identifier (required) |
| Name | `first_name`, `last_name` | Split into first/last name |
| Location | ❌ Not stored | Physical location |
| Department | `department` | Department name (lookup/create) |
| Section | ❌ Not stored | Sub-department |
| Subsection | ❌ Not stored | Further subdivision |
| AlHammadi Job Title | `job_title` | Job title |
| Country | ❌ Not stored | Country |
| Gender | ❌ Not stored | Gender |
| Manager | `report_to` | Manager ID (extracted from "ID - NAME") |
### Manager Field Parsing
**Format:** `"ID - NAME"`
**Example:** `2 - MOHAMMAD SALEH AL HAMMADI`
**System Behavior:**
1. Extracts ID: `2`
2. Looks up Staff record with `employee_id = "2"`
3. Sets `report_to` field to that Staff record
4. Creates hierarchical relationship
## Integration Architecture
### 1. Data Storage
**Model:** `apps.organizations.models.Staff`
**Key Hierarchy Fields:**
```python
employee_id = CharField(unique=True) # From CSV "Staff ID"
first_name = CharField() # From CSV "Name" (first part)
last_name = CharField() # From CSV "Name" (last part)
job_title = CharField() # From CSV "AlHammadi Job Title"
department = ForeignKey(Department) # From CSV "Department"
report_to = ForeignKey('self') # From CSV "Manager" (ID part)
```
**Relationship:** `report_to` creates self-referential foreign key for hierarchy
### 2. Data Import
**Command:** `python manage.py import_staff_csv path/to/file.csv`
**Location:** `apps/organizations/management/commands/import_staff_csv.py`
**Process:**
1. Read CSV file
2. Parse each row
3. Extract manager ID from Manager field
4. Create/update Staff records
5. Set `report_to` relationships
6. Validate data integrity
### 3. Hierarchy Visualization Options
The system provides **two** visualization approaches:
#### Option A: HTML-Based Hierarchy (Original)
**URL:** `/organizations/staff/hierarchy/`
**Characteristics:**
- Server-side rendering
- Static tree structure
- Page reloads for interactions
- Print-friendly
- Good for reports
**Technology:** Django templates + Bootstrap
**Documentation:** `docs/STAFF_HIERARCHY_VIEW.md`
#### Option B: D3.js Interactive Hierarchy ⭐ NEW
**URL:** `/organizations/staff/hierarchy/d3/`
**Characteristics:**
- Client-side rendering
- Interactive tree visualization
- Instant interactions (no reloads)
- Multiple layouts
- Zoom & pan
- Rich interactivity
**Technology:** D3.js v7.9.0 + JavaScript
**Documentation:** `docs/D3_HIERARCHY_INTEGRATION.md`
## Complete Workflow
### Step 1: Prepare Data
1. Ensure CSV has correct headers
2. Verify all Manager IDs exist in Staff ID column
3. Check department names are consistent
4. Save as UTF-8 encoded CSV
### Step 2: Import Data
```bash
# Option 1: Use import command
python manage.py import_staff_csv sample_staff_data.csv
# Option 2: Use Django Admin
# Navigate to /admin/organizations/staff/
# Use import feature
# Option 3: Manual entry
# Navigate to /organizations/staff/create/
# Enter data manually
```
### Step 3: Verify Data
```python
# Check import
from apps.organizations.models import Staff
# Count staff
print(f"Total staff: {Staff.objects.count()}")
# Check top managers
print(f"Top managers: {Staff.objects.filter(report_to__isnull=True).count()}")
# Check specific staff
staff = Staff.objects.get(employee_id="4")
print(f"{staff.first_name} reports to {staff.report_to}")
print(f"Direct reports: {staff.direct_reports.count()}")
```
### Step 4: Visualize Hierarchy
#### HTML-Based View
```
URL: /organizations/staff/hierarchy/
- See tree structure
- Click to expand/collapse (page reloads)
- Search by name or ID
- Filter by hospital/department
```
#### D3.js Interactive View
```
URL: /organizations/staff/hierarchy/d3/
- Interactive tree visualization
- Click to expand/collapse (instant)
- Three layouts: horizontal, vertical, radial
- Zoom and pan support
- Real-time search
- Node sizing options
- Tooltips with details
- Double-click to view staff details
```
## Feature Comparison
| Feature | HTML | D3.js |
|---------|------|-------|
| **Rendering** | Server-side | Client-side |
| **Interactivity** | Basic (reload) | High (instant) |
| **Layouts** | 1 fixed | 3 switchable |
| **Zoom/Pan** | ❌ | ✅ |
| **Animations** | ❌ | ✅ |
| **Tooltips** | ❌ | ✅ |
| **Search** | Server-side | Client-side |
| **Export** | ✅ Print | Limited |
| **Best For** | Reports | Exploration |
## Technical Implementation
### 1. Import Command
**File:** `apps/organizations/management/commands/import_staff_csv.py`
**Key Functions:**
- `handle()`: Main command entry point
- `parse_manager()`: Extract ID from "ID - NAME" format
- `create_or_update_staff()`: Create/update staff records
- `create_department()`: Auto-create departments
- `set_manager_relationship()`: Set `report_to` field
### 2. Hierarchy API
**File:** `apps/organizations/views.py`
**Endpoint:** `/organizations/api/staff/hierarchy/`
**Method:** GET
**Parameters:**
- `hospital` (optional): Filter by hospital
- `department` (optional): Filter by department
**Response:** JSON hierarchy tree with statistics
### 3. D3 Visualization
**File:** `templates/organizations/staff_hierarchy_d3.html`
**Key Components:**
- `fetchHierarchyData()`: Fetch data from API
- `update()`: Render/update visualization
- `diagonal()`: Create curved links
- `click()`: Toggle node expansion
- `getNodeRadius()`: Calculate node sizes
**Features:**
- Three tree layouts (horizontal, vertical, radial)
- Zoom and pan behavior
- Search with auto-navigation
- Expand/collapse animations
- Responsive sizing
## Documentation Structure
### Integration Guides
1. **STAFF_HIERARCHY_IMPORT_GUIDE.md**
- How to import CSV data
- Data mapping details
- Troubleshooting import issues
- Usage examples
2. **D3_HIERARCHY_INTEGRATION.md**
- D3.js implementation details
- Features and capabilities
- User guide
- Customization options
- Troubleshooting
3. **STAFF_HIERARCHY_VIEW.md** (existing)
- HTML-based hierarchy view
- Original implementation
### Code Documentation
- **apps/organizations/models.py** - Staff model definition
- **apps/organizations/views.py** - API endpoint
- **apps/organizations/ui_views.py** - View functions
- **apps/organizations/urls.py** - URL routing
- **templates/organizations/staff_hierarchy.html** - HTML view
- **templates/organizations/staff_hierarchy_d3.html** - D3 view
- **apps/organizations/management/commands/import_staff_csv.py** - Import command
## Quick Start
### Import Your Data
```bash
# 1. Prepare CSV file
# Ensure format matches your example
# 2. Import data
python manage.py import_staff_csv your_staff_data.csv
# 3. Verify import
python manage.py shell
>>> from apps.organizations.models import Staff
>>> Staff.objects.count()
>>> Staff.objects.filter(report_to__isnull=True).count()
```
### View Hierarchy
#### HTML-Based View
```
1. Navigate to: /organizations/staff/hierarchy/
2. See tree structure with top-level managers
3. Click to expand/collapse nodes
4. Use search to find specific staff
5. Filter by hospital/department
```
#### D3 Interactive View
```
1. Navigate to: /organizations/staff/hierarchy/d3/
2. See interactive chart
3. Click nodes to expand/collapse
4. Use mouse wheel to zoom
5. Drag to pan
6. Search for staff (auto-navigate)
7. Change layout from dropdown
8. Adjust node sizes from dropdown
9. Double-click nodes for details
```
## Example Data Flow
### CSV Import
```
CSV Row:
Staff ID: 1053
Name: MAJID SALEM SAEED ALNAHDI
Manager: 2 - MOHAMMAD SALEH AL HAMMADI
Job Title: Human Resources Manager
Department: Human Resource
↓ Import Command
Staff Record Created:
employee_id: "1053"
first_name: "MAJID SALEM SAEED"
last_name: "ALNAHDI"
job_title: "Human Resources Manager"
report_to: Staff.objects.get(employee_id="2")
↓ Hierarchy Built
Tree Structure:
Mohammad Saleh Al Hammadi (ID: 2)
└── Majid Salem Saeed Alnahdi (ID: 1053)
└── Varghese Ninan (ID: 1049)
```
### D3 Visualization
```
API Request: GET /organizations/api/staff/hierarchy/
Query Database:
- Get all staff (filtered by permissions)
- Build hierarchy tree
- Calculate team sizes
- Compute statistics
Return JSON:
{
"hierarchy": [...],
"statistics": {...}
}
D3.js Renders:
- Interactive tree chart
- With zoom, pan, search
- Multiple layout options
- Smooth animations
```
## Common Use Cases
### 1. View Entire Organization
**D3 View:** `/organizations/staff/hierarchy/d3/`
- Click "Expand All"
- See complete organization structure
- Use zoom/pan to navigate
- Good for understanding full hierarchy
### 2. Find Specific Staff Member
**D3 View:** `/organizations/staff/hierarchy/d3/`
- Type name or ID in search box
- Press Enter
- Chart auto-navigates to staff
- Node highlighted in red
- Instant feedback
### 3. Print Hierarchy Report
**HTML View:** `/organizations/staff/hierarchy/`
- Expand desired sections
- Use browser print (Ctrl/Cmd + P)
- Static layout prints well
- Good for reports
### 4. Analyze Team Structure
**D3 View:** `/organizations/staff/hierarchy/d3/`
- Set node size to "Team Size"
- Larger nodes = more direct reports
- Identify managers with large teams
- Spot potential bottlenecks
### 5. Compare Departments
**D3 View:** `/organizations/staff/hierarchy/d3/`
- Use department filter (if available)
- Switch between departments
- Compare hierarchy structures
- Identify organizational patterns
## Troubleshooting
### Import Issues
**Problem:** "Manager ID not found"
- **Solution:** Ensure manager IDs exist in Staff ID column
- **Check:** Import managers before their reports
**Problem:** "Department not found"
- **Solution:** Create departments first, or let import auto-create
- **Check:** Department name spelling
### Hierarchy Issues
**Problem:** Wrong relationships
- **Solution:** Verify `report_to` field in database
- **Check:** Manager IDs in CSV match Staff IDs
**Problem:** Staff missing from hierarchy
- **Solution:** Check staff status is "active"
- **Check:** Verify hospital/department permissions
- **Check:** RBAC settings
### D3 View Issues
**Problem:** Chart not loading
- **Solution:** Check browser console for errors
- **Check:** API endpoint is accessible
- **Check:** D3.js CDN is reachable
**Problem:** Search not working
- **Solution:** Verify staff exist in hierarchy
- **Check:** JavaScript console for errors
- **Try:** Full name instead of partial
## Best Practices
### Data Quality
1. ✅ Use consistent Staff IDs
2. ✅ Complete manager chains
3. ✅ Standardized department names
4. ✅ Valid job titles
### Hierarchy Structure
1. ✅ Clear reporting lines
2. ✅ Avoid circular references
3. ✅ Reasonable depth (5-10 levels)
4. ✅ Appropriate span of control (5-15 direct reports)
### Visualization
1. ✅ Use D3 for exploration and analysis
2. ✅ Use HTML for printing and reports
3. ✅ Filter large hierarchies
4. ✅ Choose appropriate layout for your needs
## API Reference
### Hierarchy API
**Endpoint:** `/organizations/api/staff/hierarchy/`
**Method:** GET
**Parameters:**
- `hospital` (optional): Filter by hospital ID
- `department` (optional): Filter by department ID
**Response:**
```json
{
"hierarchy": [
{
"id": "uuid",
"name": "Full Name",
"employee_id": "EMP123",
"job_title": "Job Title",
"hospital": "Hospital Name",
"department": "Department Name",
"status": "active",
"staff_type": "type",
"team_size": 5,
"children": [...]
}
],
"statistics": {
"total_staff": 100,
"top_managers": 3
}
}
```
## Future Enhancements
### Potential Additions
1. **Export Features**
- Export D3 chart as PNG/SVG
- Export as PDF
- Download hierarchy data as JSON
2. **Advanced Filtering**
- Filter by staff type
- Filter by status
- Multi-criteria filters
3. **Additional Visualizations**
- Sunburst chart
- Treemap
- Force-directed graph
4. **Analytics Dashboard**
- Hierarchy depth analysis
- Span of control metrics
- Bottleneck identification
- Organizational health metrics
5. **Collaboration Features**
- Shareable hierarchy links
- Embed in reports
- Compare hierarchies over time
## Support and Resources
### Documentation
- **Import Guide:** `docs/STAFF_HIERARCHY_IMPORT_GUIDE.md`
- **D3 Integration:** `docs/D3_HIERARCHY_INTEGRATION.md`
- **HTML View:** `docs/STAFF_HIERARCHY_VIEW.md`
### Code Files
- **Import Command:** `apps/organizations/management/commands/import_staff_csv.py`
- **API:** `apps/organizations/views.py` - `StaffViewSet.hierarchy()`
- **Views:** `apps/organizations/ui_views.py`
- **Templates:** `templates/organizations/staff_hierarchy*.html`
### External Resources
- **D3.js:** https://d3js.org/
- **D3 Tree:** https://github.com/d3/d3-hierarchy/tree
## Summary
The PX360 system now provides a complete solution for:
**Importing** staff data with hierarchy from CSV
**Storing** hierarchical relationships using `report_to` field
**Visualizing** hierarchies in two powerful ways:
- HTML-based (static, print-friendly)
- D3.js-based (interactive, feature-rich)
**Choose the right visualization for your needs:**
- **HTML View:** For reports, printing, simple viewing
- **D3 View:** For exploration, analysis, interactive use
**Access your hierarchy visualizations:**
- HTML: `/organizations/staff/hierarchy/`
- D3: `/organizations/staff/hierarchy/d3/`
**Import your data:**
```bash
python manage.py import_staff_csv your_staff_data.csv
```
The system is ready to handle your staff hierarchy data with powerful visualization capabilities!