# Staff CSV Import Guide This guide explains how to import staff data with hierarchy information from CSV files into the PX360 system. ## Overview The staff CSV import command allows you to bulk import staff records from CSV files, including: - Basic staff information (name, ID, job title) - Organizational details (department, section, subsection) - Manager-reportee relationships (hierarchy) - Personal information (country, gender) ## CSV Format ### Required Columns | Column | Description | Example | |--------|-------------|---------| | Staff ID | Unique employee ID | `4` | | Name | Full name of staff | `ABDULAZIZ SALEH ALHAMMADI` | | Location | Work location | `Nuzha` | | Department | Department name | `Human Resource` | | Section | Department section | `Employee Relations` | | Subsection | Department subsection | (can be empty) | | AlHammadi Job Title | Job title | `Chief Operating Officer` | | Country | Country | `Saudi Arabia` | | Gender | Gender (Male/Female) | `Male` | | Manager | Manager ID and name | `2 - MOHAMMAD SALEH AL HAMMADI` | ### Manager Field Format The Manager field must be in the format: `ID - Name` Example: `2 - MOHAMMAD SALEH AL HAMMADI` The system will: 1. Extract the ID from the beginning 2. Look for a staff record with that employee_id 3. Create a manager-reportee relationship ### Sample CSV File ```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 1103,EMALYN HAWARI HARADJI,Nuzha,Human Resource ,Administration,,Porter,Philippines,Female,1053 - MAJID SALEM SAEED ALNAHDI ``` ## Department Mapping The command automatically maps CSV department names to system department codes: | CSV Department Name | System Department Code | |---------------------|------------------------| | Senior Management Offices | ADM-005 | | Human Resource | ADM-005 | | Human Resource (with trailing space) | ADM-005 | | Corporate Administration | ADM-005 | | Emergency | EMR-001 | | Outpatient | OUT-002 | | Inpatient | INP-003 | | Diagnostics | DIA-004 | | Administration | ADM-005 | If a department is not found in the mapping, it defaults to `ADM-005` (Administration). ## Usage ### Basic Command ```bash python manage.py import_staff_csv --hospital-code ``` ### Command Options | Option | Required | Default | Description | |--------|----------|---------|-------------| | `csv_file` | Yes | - | Path to CSV file to import | | `--hospital-code` | Yes | - | Hospital code to assign staff to | | `--staff-type` | No | `admin` | Staff type (physician/nurse/admin/other) | | `--skip-existing` | No | False | Skip staff with existing employee_id | | `--update-existing` | No | False | Update existing staff records | | `--create-users` | No | False | Create user accounts for imported staff | | `--dry-run` | No | False | Preview without making changes | ### Examples #### 1. Import with dry-run (preview) ```bash python manage.py import_staff_csv sample_staff_data.csv --hospital-code HH --dry-run ``` #### 2. Import staff for a specific hospital ```bash python manage.py import_staff_csv staff_data.csv --hospital-code HH ``` #### 3. Import with staff type specification ```bash python manage.py import_staff_csv physicians.csv --hospital-code HH --staff-type physician ``` #### 4. Import and skip existing records ```bash python manage.py import_staff_csv staff_data.csv --hospital-code HH --skip-existing ``` #### 5. Import and update existing records ```bash python manage.py import_staff_csv staff_data.csv --hospital-code HH --update-existing ``` #### 6. Import with user account creation ```bash python manage.py import_staff_csv staff_data.csv --hospital-code HH --create-users ``` ## Import Process The import process works in two passes: ### First Pass: Create/Update Staff Records 1. Read and parse the CSV file 2. For each row: - Check if staff with employee_id already exists - Create new staff record or update existing one - Map department, set all fields - Skip manager linking (done in second pass) ### Second Pass: Link Manager Relationships 1. Iterate through all processed staff records 2. For each staff member with a manager_id: - Look up the manager by employee_id - Create the report_to relationship - Log success or warning if manager not found ## Output and Results ### Successful Import Example ``` ============================================================ Staff CSV Import Command ============================================================ ✓ Found hospital: Alhammadi Hospital (HH) ✓ Found 15 departments in hospital Configuration: CSV file: sample_staff_data.csv Hospital: Alhammadi Hospital Staff type: admin Skip existing: False Update existing: False Create user accounts: False Dry run: False Reading CSV file... ✓ Found 5 staff records in CSV [1] ✓ Created: ABDULAZIZ SALEH ALHAMMADI [2] ✓ Created: VARGHESE NINAN [3] ✓ Created: MAJID SALEM SAEED ALNAHDI [4] ✓ Created: QAMAR KHALIFAH [5] ✓ Created: EMALYN HAWARI HARADJI Linking manager relationships... [1] ⚠ Manager not found: 2 for ABDULAZIZ SALEH ALHAMMADI [2] ✓ Linked VARGHESE NINAN → MAJID SALEM SAEED ALNAHDI [3] ⚠ Manager not found: 2 for MAJID SALEM SAEED ALNAHDI [4] ⚠ Manager not found: 8639 for QAMAR KHALIFAH [5] ✓ Linked EMALYN HAWARI HARADJI → MAJID SALEM SAEED ALNAHDI ============================================================ Import Summary: Staff records created: 5 Staff records updated: 0 Staff records skipped: 0 Manager relationships linked: 2 Errors: 0 ============================================================ Import completed successfully! ``` ### Status Indicators - `✓` - Success - `⊘` - Skipped - `✗` - Error - `⚠` - Warning ## Handling Managers Not Found When a manager ID in the CSV doesn't exist in the system (either because: 1. The manager hasn't been imported yet 2. The manager works at a different location 3. The manager ID is incorrect The import will: - Still create the staff record - Log a warning about the missing manager - Continue with other records To resolve this, you can: 1. Import all staff first (including managers) 2. Re-run the import with `--update-existing` to link the relationships 3. Or manually link managers in the admin interface ## Best Practices ### 1. Use Dry-Run First Always test your CSV with dry-run mode: ```bash python manage.py import_staff_csv staff_data.csv --hospital-code HH --dry-run ``` ### 2. Import All Staff at Once To ensure manager relationships are linked correctly, import all staff records in a single CSV file. ### 3. Validate Manager IDs Ensure all manager IDs in the CSV correspond to staff IDs that exist in the same CSV file. ### 4. Check Department Mapping Verify that department names in your CSV match the expected mapping or update the `DEPARTMENT_MAPPING` in the command file if needed. ### 5. Handle Special Characters The CSV file should use UTF-8 encoding to handle Arabic names and special characters correctly. ## Troubleshooting ### Issue: "CSV file not found" **Solution:** Ensure the CSV file path is correct relative to the project root. ### Issue: "Hospital with code 'XXX' not found" **Solution:** 1. Check available hospitals: `python manage.py shell -c "from apps.organizations.models import Hospital; [print(f'{h.code} - {h.name}') for h in Hospital.objects.all()]"` 2. Use the correct hospital code ### Issue: "No valid staff data found in CSV" **Solution:** 1. Verify CSV has the correct headers 2. Check CSV encoding (should be UTF-8) 3. Ensure data is properly formatted ### Issue: Manager relationships not linking **Solution:** 1. Verify manager IDs exist in the CSV 2. Re-run import with `--update-existing` 3. Check that both manager and reportee are in the same hospital ### Issue: Department not found **Solution:** 1. Check the department mapping in the command 2. Ensure departments are seeded for the hospital: `python manage.py seed_departments` 3. Update `DEPARTMENT_MAPPING` if needed ## Viewing Imported Data ### Via Django Admin 1. Go to `/admin/organizations/staff/` 2. View all imported staff records 3. Click on a staff member to see: - Basic information - Department and hierarchy - Manager (report_to) relationship - Direct reports ### Via Shell ```python from apps.organizations.models import Staff # View all imported staff staff = Staff.objects.all() for s in staff: print(f"{s.employee_id} - {s.get_full_name()} - {s.department_name}") if s.report_to: print(f" Manager: {s.report_to.get_full_name()}") print() # View hierarchy def print_hierarchy(staff, level=0): indent = " " * level print(f"{indent}• {staff.get_full_name()} ({staff.job_title})") for report in staff.direct_reports.all(): print_hierarchy(report, level + 1) # Start with top-level staff (no manager) top_level = Staff.objects.filter(report_to__isnull=True) for staff in top_level: print_hierarchy(staff) ``` ## Related Commands - `python manage.py seed_departments` - Seed departments for hospitals - `python manage.py seed_staff` - Seed sample staff data (for testing) ## Model Fields The Staff model includes these new fields for CSV import: - `department_name` - Stores original department name from CSV - `section` - Department section - `subsection` - Department subsection - `country` - Staff country - `gender` - Staff gender - `report_to` - Foreign key to manager (self-referential) ## API Integration The imported staff data is available via the API: ```python # Get all staff GET /api/organizations/staff/ # Get staff with hierarchy GET /api/organizations/staff/?include=direct_reports # Filter by department GET /api/organizations/staff/?department_name=Human%20Resource # Filter by manager GET /api/organizations/staff/?report_to__employee_id=1053 ``` ## Notes - The import command runs within a database transaction - if any error occurs, all changes are rolled back - Duplicate employee_ids are handled based on `--skip-existing` and `--update-existing` flags - The command is idempotent - running it multiple times with the same data won't create duplicates (when using `--skip-existing`) - User account creation (`--create-users`) requires staff to have email addresses ## Support For issues or questions: 1. Check this documentation 2. Review the import command file: `apps/organizations/management/commands/import_staff_csv.py` 3. Check the Staff model: `apps/organizations/models.py`