345 lines
9.6 KiB
Markdown
345 lines
9.6 KiB
Markdown
# Staff Hierarchy Integration Guide
|
|
|
|
## Overview
|
|
|
|
This guide explains how to integrate staff data with management hierarchy into the PX360 system. The system supports importing staff data from CSV files, including manager relationships that create a complete organizational hierarchy.
|
|
|
|
## Key Features
|
|
|
|
### 1. Staff Model Enhancements
|
|
|
|
The Staff model has been enhanced with the following fields to support hierarchy and CSV data:
|
|
|
|
- **`name`**: Stores the original full name from CSV (preserves exact formatting)
|
|
- **`phone`**: Staff phone number (optional)
|
|
- **`location`**: Staff location/building (e.g., "Nuzha")
|
|
- **`report_to`**: Self-referential field for manager hierarchy
|
|
- **`country`**: Staff's country of origin
|
|
- **`department_name`**: Original department name from CSV
|
|
- **`section`**: Department section
|
|
- **`subsection`**: Department subsection
|
|
|
|
### 2. Manager Hierarchy
|
|
|
|
The system uses a self-referential relationship (`report_to`) to create management hierarchies:
|
|
|
|
```python
|
|
staff.report_to # Points to their manager
|
|
staff.direct_reports # Returns all staff who report to this person
|
|
```
|
|
|
|
## CSV Format
|
|
|
|
### Required Columns
|
|
|
|
The CSV file must contain the following columns (case-sensitive):
|
|
|
|
```csv
|
|
Staff ID,Name,Location,Department,Section,Subsection,AlHammadi Job Title,Country,Gender,Manager
|
|
```
|
|
|
|
### Optional Columns
|
|
|
|
- **Phone**: Staff phone number
|
|
|
|
### Example CSV Data
|
|
|
|
```csv
|
|
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
|
|
1086,QAMAR KHALIFAH,Nuzha,Corporate Administration ,Quality Management ,,Quality Management Director,Eritrea,Female,8639 - REEMA SALEH MOHAMMED AL HAMMADI
|
|
```
|
|
|
|
### Column Details
|
|
|
|
| Column | Description | Example |
|
|
|--------|-------------|---------|
|
|
| Staff ID | Unique employee identifier | 1049 |
|
|
| Name | Full name (stored as-is) | VARGHESE NINAN |
|
|
| Location | Physical location/building | Nuzha |
|
|
| Department | Department name | Human Resource |
|
|
| Section | Department section | Employee Relations |
|
|
| Subsection | Department subsection | (blank) |
|
|
| AlHammadi Job Title | Job title | Porter |
|
|
| Country | Staff's country | India |
|
|
| Gender | Male/Female/Other | Male |
|
|
| Manager | Manager ID and name (format: "ID - Name") | 1053 - MAJID SALEM SAEED ALNAHDI |
|
|
| Phone (optional) | Contact phone number | +966123456789 |
|
|
|
|
### Manager Field Format
|
|
|
|
The Manager field uses the format: **`ID - Name`**
|
|
|
|
Example: `1053 - MAJID SALEM SAEED ALNAHDI`
|
|
|
|
The system extracts:
|
|
- **ID**: `1053` (used to link to manager record)
|
|
- **Name**: `MAJID SALEM SAEED ALNAHDI` (for display/logging)
|
|
|
|
## Import Command
|
|
|
|
### Basic Usage
|
|
|
|
```bash
|
|
python manage.py import_staff_csv <csv_file> --hospital-code <hospital_code>
|
|
```
|
|
|
|
### Command Options
|
|
|
|
| Option | Description | Default |
|
|
|--------|-------------|---------|
|
|
| `csv_file` | Path to CSV file (required) | - |
|
|
| `--hospital-code` | Hospital code to assign staff to (required) | - |
|
|
| `--staff-type` | Staff type: physician/nurse/admin/other | admin |
|
|
| `--skip-existing` | Skip staff with existing employee_id | False |
|
|
| `--update-existing` | Update existing staff records | False |
|
|
| `--create-users` | Create user accounts for imported staff | False |
|
|
| `--dry-run` | Preview without making changes | False |
|
|
|
|
### Example Commands
|
|
|
|
#### 1. Import with Dry Run (Preview)
|
|
```bash
|
|
python manage.py import_staff_csv staff_data.csv \
|
|
--hospital-code ALHAMMADI \
|
|
--dry-run
|
|
```
|
|
|
|
#### 2. Import New Staff Only
|
|
```bash
|
|
python manage.py import_staff_csv staff_data.csv \
|
|
--hospital-code ALHAMMADI \
|
|
--skip-existing
|
|
```
|
|
|
|
#### 3. Update Existing Staff
|
|
```bash
|
|
python manage.py import_staff_csv staff_data.csv \
|
|
--hospital-code ALHAMMADI \
|
|
--update-existing
|
|
```
|
|
|
|
#### 4. Import with User Account Creation
|
|
```bash
|
|
python manage.py import_staff_csv staff_data.csv \
|
|
--hospital-code ALHAMMADI \
|
|
--staff-type admin \
|
|
--create-users
|
|
```
|
|
|
|
## Department Mapping
|
|
|
|
The system automatically maps CSV departments to internal department codes:
|
|
|
|
```python
|
|
DEPARTMENT_MAPPING = {
|
|
'Senior Management Offices': 'ADM-005',
|
|
'Human Resource': 'ADM-005',
|
|
'Corporate Administration': 'ADM-005',
|
|
'Emergency': 'EMR-001',
|
|
'Outpatient': 'OUT-002',
|
|
'Inpatient': 'INP-003',
|
|
'Diagnostics': 'DIA-004',
|
|
'Administration': 'ADM-005',
|
|
}
|
|
```
|
|
|
|
Unmapped departments default to **'ADM-005'** (Administration).
|
|
|
|
## Hierarchy Building Process
|
|
|
|
The import process uses a **two-pass algorithm**:
|
|
|
|
### Pass 1: Create/Update Staff Records
|
|
1. Parse each row from CSV
|
|
2. Create or update Staff record
|
|
3. Store mapping of employee_id → Staff object
|
|
|
|
### Pass 2: Link Manager Relationships
|
|
1. For each staff member with a manager_id
|
|
2. Find the manager using the mapping
|
|
3. Set `report_to` field to establish hierarchy
|
|
|
|
This ensures all records exist before linking relationships.
|
|
|
|
## Data Flow
|
|
|
|
```
|
|
CSV File → Import Command → Parse CSV → Create/Update Staff → Link Managers → Database
|
|
↓
|
|
Department Mapping
|
|
```
|
|
|
|
## Querying Hierarchy
|
|
|
|
### Get Staff's Manager
|
|
```python
|
|
staff = Staff.objects.get(employee_id='1049')
|
|
manager = staff.report_to
|
|
print(manager.name) # "MAJID SALEM SAEED ALNAHDI"
|
|
```
|
|
|
|
### Get Direct Reports
|
|
```python
|
|
manager = Staff.objects.get(employee_id='1053')
|
|
direct_reports = manager.direct_reports.all()
|
|
for report in direct_reports:
|
|
print(report.name)
|
|
```
|
|
|
|
### Get Full Hierarchy Chain
|
|
```python
|
|
def get_manager_chain(staff):
|
|
chain = []
|
|
current = staff
|
|
while current.report_to:
|
|
chain.append(current.report_to)
|
|
current = current.report_to
|
|
return chain
|
|
|
|
staff = Staff.objects.get(employee_id='1049')
|
|
chain = get_manager_chain(staff)
|
|
# Returns list of managers up the chain
|
|
```
|
|
|
|
## Admin Interface
|
|
|
|
The Django admin interface displays hierarchy information:
|
|
|
|
### Staff List View
|
|
- Shows: Name, Type, Job Title, Employee ID, Phone, Hospital, Department, Manager, Country, Status
|
|
|
|
### Staff Detail View
|
|
- **Personal Information**: Name, first/last name, location
|
|
- **Role**: Staff type, job title
|
|
- **Professional**: License, specialization, employee ID, email, phone
|
|
- **Organization**: Hospital, department, section, subsection, location
|
|
- **Hierarchy**: Manager (report_to)
|
|
- **Personal**: Country, gender
|
|
- **Account**: User account link
|
|
|
|
### Search Fields
|
|
You can search by:
|
|
- Original name (from CSV)
|
|
- First/last name
|
|
- Employee ID
|
|
- Job title
|
|
- Phone number
|
|
- Department/section
|
|
|
|
## API Endpoints
|
|
|
|
The Staff serializer includes hierarchy fields:
|
|
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"name": "VARGHESE NINAN",
|
|
"first_name": "VARGHESE",
|
|
"last_name": "NINAN",
|
|
"employee_id": "1049",
|
|
"phone": "+966123456789",
|
|
"location": "Nuzha",
|
|
"department": "Human Resource",
|
|
"report_to": {
|
|
"id": "uuid",
|
|
"name": "MAJID SALEM SAEED ALNAHDI",
|
|
"employee_id": "1053"
|
|
},
|
|
"report_to_name": "MAJID SALEM SAEED ALNAHDI",
|
|
"direct_reports_count": 2,
|
|
"has_user_account": true
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Issue: Manager Not Found
|
|
**Problem**: Manager ID in CSV doesn't match any imported staff.
|
|
|
|
**Solution**:
|
|
1. Ensure manager is also in the CSV file
|
|
2. Verify manager ID format matches (numbers only)
|
|
3. Use `--dry-run` to preview and identify issues
|
|
|
|
### Issue: Department Not Mapped
|
|
**Problem**: Department name doesn't match mapping.
|
|
|
|
**Solution**:
|
|
1. Add department to `DEPARTMENT_MAPPING` in `import_staff_csv.py`
|
|
2. Or use default mapping (ADM-005)
|
|
|
|
### Issue: Duplicate Employee IDs
|
|
**Problem**: Multiple records with same employee_id.
|
|
|
|
**Solution**:
|
|
- Use `--skip-existing` to skip duplicates
|
|
- Or use `--update-existing` to update existing records
|
|
|
|
### Issue: Name Parsing Issues
|
|
**Problem**: Name not split correctly into first/last name.
|
|
|
|
**Solution**:
|
|
- The system splits on first space: "John Doe" → First: "John", Last: "Doe"
|
|
- Original name is preserved in `name` field
|
|
- You can manually correct first/last name in admin if needed
|
|
|
|
## Best Practices
|
|
|
|
### 1. Prepare CSV File
|
|
- Remove extra spaces from headers
|
|
- Ensure consistent date/name formats
|
|
- Validate manager IDs exist in file
|
|
- Remove duplicates
|
|
|
|
### 2. Use Dry Run First
|
|
```bash
|
|
python manage.py import_staff_csv staff.csv --hospital-code ALHAMMADI --dry-run
|
|
```
|
|
|
|
### 3. Import in Stages
|
|
1. Dry run to check for issues
|
|
2. Import with `--skip-existing` to add new staff
|
|
3. Review results
|
|
4. Use `--update-existing` if updates needed
|
|
|
|
### 4. Verify Hierarchy
|
|
```python
|
|
# Check hierarchy after import
|
|
for staff in Staff.objects.all():
|
|
if staff.report_to:
|
|
print(f"{staff.name} → {staff.report_to.name}")
|
|
```
|
|
|
|
### 5. Back Up Data
|
|
Always backup before importing with `--update-existing`:
|
|
```bash
|
|
python manage.py dumpdata organizations.Staff > staff_backup.json
|
|
```
|
|
|
|
## Migration Notes
|
|
|
|
If you're migrating from an existing system:
|
|
|
|
1. **Export** existing staff data to CSV format
|
|
2. **Map** department names to internal codes
|
|
3. **Update** manager IDs to match CSV employee IDs
|
|
4. **Test** import with small sample first
|
|
5. **Validate** hierarchy relationships after import
|
|
|
|
## Support
|
|
|
|
For issues or questions:
|
|
1. Check Django logs for detailed error messages
|
|
2. Use `--dry-run` to preview imports
|
|
3. Review imported data in Django admin
|
|
4. Check CSV format matches requirements
|
|
|
|
## Related Documentation
|
|
|
|
- [Staff Model Documentation](STAFF_MODEL.md)
|
|
- [Department Structure](DEPARTMENT_STRUCTURE_UPDATE.md)
|
|
- [User Account Creation](STAFF_USER_ACCOUNT_FEATURE_COMPLETE.md)
|