# Staff Contact Information Population Guide

## Overview

This guide explains how to populate existing staff records with random email addresses and phone numbers using the `populate_staff_contact` management command.

## Command Overview

The `populate_staff_contact` command fills in missing contact information for staff records that don't have email addresses or phone numbers.

## Usage

### Basic Syntax

```bash
python manage.py populate_staff_contact [options]
```

## Command Options

| Option | Description | Default |
|--------|-------------|---------|
| `--hospital-code` | Target specific hospital code | All hospitals |
| `--email-only` | Only populate email addresses | Both email and phone |
| `--phone-only` | Only populate phone numbers | Both email and phone |
| `--overwrite` | Overwrite existing email/phone | Fill missing only |
| `--dry-run` | Preview changes without updating database | False |

## Examples

### 1. Preview Changes (Dry Run)

See what will be updated without making changes:

```bash
python manage.py populate_staff_contact --dry-run
```

Output:
```
============================================================
Staff Contact Information Populator
============================================================

Target: All hospitals
Found 15 staff to update
  Email only: False
  Phone only: False
  Overwrite existing: False
  Dry run: True

  Would update: ABDULAZIZ SALEH ALHAMMADI
    - email: None → abdulaziz.alhammadi@alhammadi.sa
    - phone: None → +966 54 123 456
  Would update: VARGHESE NINAN
    - email: None → varghese.ninan@alhammadi.sa
    - phone: None → +966 57 789 012
  ...

============================================================
Summary:
  Total staff processed: 15
  Emails populated: 15
  Phone numbers populated: 15
  Skipped: 0
============================================================

DRY RUN: No changes were made
```

### 2. Populate All Missing Contact Info

Fill in missing emails and phone numbers for all staff:

```bash
python manage.py populate_staff_contact
```

### 3. Populate for Specific Hospital

Only update staff at a specific hospital:

```bash
python manage.py populate_staff_contact --hospital-code ALHAMMADI
```

### 4. Only Populate Emails

Add email addresses without touching phone numbers:

```bash
python manage.py populate_staff_contact --email-only
```

### 5. Only Populate Phone Numbers

Add phone numbers without touching emails:

```bash
python manage.py populate_staff_contact --phone-only
```

### 6. Overwrite Existing Contact Info

Replace existing email and phone numbers with new random values:

```bash
python manage.py populate_staff_contact --overwrite
```

## Generated Data Formats

### Email Addresses

**Format:** `{firstname}.{lastname}@{hospital}.sa`

**Examples:**
- `mohammed.alotaibi@alhammadi.sa`
- `fatimah.aldosari@alhammadi.sa`
- `varghese.ninan12@alhammadi.sa` (with random suffix for duplicates)

**Domain:** Uses the hospital code (lowercased) as the domain

**Uniqueness:** Adds random number suffix (1-999) if email already exists

### Phone Numbers

**Format:** `+966 5X XXX XXXX` (Saudi mobile format)

**Examples:**
- `+966 50 123 456`
- `+966 57 789 012`
- `+966 55 345 678`

**Structure:**
- Country code: +966 (Saudi Arabia)
- Mobile prefix: 5X (X = random digit 0-9)
- Number groups: XXX XXX (random 3-digit groups)

## How It Works

### 1. Query Staff

The command queries staff records based on options:

- **Without `--overwrite`**: Only finds staff with missing email/phone
- **With `--overwrite`**: Finds all staff in target scope
- **With `--hospital-code`**: Filters by specific hospital

### 2. Generate Contact Info

For each staff member:

1. **Email Generation:**
   - Uses `staff.name` if available (original CSV name)
   - Falls back to `first_name` + `last_name`
   - Generates email in format: `{firstname}.{lastname}@{hospital}.sa`
   - Checks for duplicates and adds random suffix if needed
   - Skips staff without name fields

2. **Phone Generation:**
   - Generates random Saudi mobile number
   - Format: `+966 5X XXX XXXX`
   - No uniqueness check (phone numbers can be duplicated)

### 3. Update Records

- Uses database transaction for data integrity
- Shows progress for each updated staff
- Displays summary statistics at the end

## Best Practices

### 1. Always Use Dry Run First

Preview changes before applying:

```bash
python manage.py populate_staff_contact --dry-run
```

### 2. Back Up Before Overwriting

If using `--overwrite`, backup first:

```bash
python manage.py dumpdata organizations.Staff > staff_backup.json
```

### 3. Update in Stages

For large datasets, consider updating in stages:

```bash
# Stage 1: Emails only
python manage.py populate_staff_contact --email-only

# Stage 2: Phone numbers only
python manage.py populate_staff_contact --phone-only
```

### 4. Target Specific Hospitals

For multi-tenant systems, update one hospital at a time:

```bash
python manage.py populate_staff_contact --hospital-code HOSPITAL1 --dry-run
python manage.py populate_staff_contact --hospital-code HOSPITAL1
```

## Troubleshooting

### Issue: "All staff already have contact information"

**Problem:** No staff have missing email/phone fields.

**Solution:**
- Use `--overwrite` to replace existing values
- Or use `--email-only` or `--phone-only` for specific fields

### Issue: "Skipping staff: Missing first/last name"

**Problem:** Staff record doesn't have first_name and last_name fields populated.

**Solution:**
- Ensure staff have names before running
- Or populate names manually first
- Check if `staff.name` field has data (used as fallback)

### Issue: Duplicate Emails

**Problem:** Email generation not adding suffix for duplicates.

**Solution:**
- The command automatically handles duplicates
- Adds random number (1-999) if email exists
- If you see duplicates, staff may have been added after generation

### Issue: Wrong Hospital Domain

**Problem:** Emails using wrong hospital code in domain.

**Solution:**
- Verify hospital code in staff.hospital field
- Use `--hospital-code` to target specific hospital
- Or manually update hospital assignments first

## Output Interpretation

### Success Indicators

```
✓ Updated: ABDULAZIZ SALEH ALHAMMADI
    Email: abdulaziz.alhammadi@alhammadi.sa
    Phone: +966 54 123 456
```

### Warning Indicators

```
⚠ Skipping staff 123: Missing first/last name
```

This means the staff record doesn't have name fields required for email generation.

### Summary Statistics

```
Summary:
  Total staff processed: 15
  Emails populated: 15
  Phone numbers populated: 15
  Skipped: 0
```

- **Total staff processed:** Number of staff matching query
- **Emails populated:** Count of emails generated
- **Phone numbers populated:** Count of phone numbers generated
- **Skipped:** Staff that couldn't be updated (missing names, etc.)

## Integration with Other Commands

### After CSV Import

Import staff from CSV, then populate contact info:

```bash
# Import staff from CSV
python manage.py import_staff_csv staff_data.csv --hospital-code ALHAMMADI

# Populate contact info for imported staff
python manage.py populate_staff_contact --hospital-code ALHAMMADI
```

### Before User Account Creation

Ensure staff have emails before creating user accounts:

```bash
# Populate emails first
python manage.py populate_staff_contact --email-only

# Then create user accounts
python manage.py create_staff_users --hospital-code ALHAMMADI
```

## Related Documentation

- [Staff Hierarchy Integration](STAFF_HIERARCHY_INTEGRATION.md)
- [Staff Seeding](STAFF_SEED_COMMAND_UPDATE.md)
- [User Account Creation](STAFF_USER_ACCOUNT_FEATURE_COMPLETE.md)
- [CSV Import Guide](STAFF_CSV_IMPORT_GUIDE.md)

## Support

For issues or questions:
1. Use `--dry-run` to preview changes
2. Check staff records have required name fields
3. Verify hospital codes are correct
4. Review Django logs for detailed errors
