# Model Restructuring Complete ✅

## Summary

Purano structure theke notun structure e migrate kora hoyeche:

### Old Structure ❌
```
master_employers (owners)
├── companies (company data)
└── user_member_mappings

members (team members)
```

### New Structure ✅
```
companies (Primary Tenant Entity)
└── users (All users: owners + members)
    ├── is_owner = true  (company owner)
    └── is_owner = false (team members)
```

---

## Model Files

### 1. Company Model (`app/Models/Company.php`)
**Collection:** `companies`

**Key Fields:**
- `id` - Auto-increment integer (PK)
- `name` - Company name
- `email` - Company email
- `logo`, `profile_image` - Image paths
- `country_id`, `city_id` - Location
- `recruiter_name`, `recruiter_email`, etc. - Contact info
- `status`, `is_verified` - Status fields
- `how_did_you_hear_about_us` - Marketing

**Key Methods:**
- `owner()` - Get owner user
- `users()` - Get all users (owner + members)
- `members()` - Get only members
- `isActive()`, `isVerified()`
- `markAsVerified()`
- `generateVerificationToken()`
- `getFullData()` - With country/city details
- `Company::createCompany($data)` - Static method

---

### 2. User Model (`app/Models/User.php`)
**Collection:** `users`

**Key Fields:**
- `id` - Auto-increment integer (PK)
- `company_id` - FK to companies (REQUIRED)
- `is_owner` - true/false
- `user_type` - "employer" | "member"
- `email`, `password` - Auth
- `name`, `phone`, `designation` - Profile
- **For Members:**
  - `employee_code`, `gender`, `date_of_birth`
  - `permanent_address`, `current_address`
  - `marital_status`, `nationality`, etc.
- `status` - 0=inactive, 1=active, 2=suspended
- `is_email_verified`, `verify_email`
- `permissions` - Array (for members)

**Key Methods:**
- `company()` - Belongs to company
- `isOwner()`, `isMember()`
- `isActive()`, `isEmailVerified()`
- `markEmailAsVerified()`
- `generateVerificationToken()`
- `hasPermission($slug)` - Check permission
- `getFullProfile()` - Full data with company
- `toResponseArray()` - For API
- **Static Methods:**
  - `User::createOwnerWithCompany($data)`
  - `User::createMember($data, $companyId, $creatorUserId)`

---

## Usage Examples

### Registration (Owner + Company)

```php
// Step 1: Create company & owner together
$user = User::createOwnerWithCompany([
    'company_name' => 'Tech Corp',
    'email' => 'owner@techcorp.com',
    'password' => 'secret123',
    'contact_no' => '1234567890',
    'phone_code' => '+1',
    'how_did_you_hear_about_us' => 'Google'
]);

// Access company
$company = $user->company;

// Step 2: Update company profile
$company->update([
    'name' => 'Tech Corp Ltd',
    'founded_year' => 2020,
    'industry' => 'Technology',
    'location' => 1, // country_id
    'city' => 10, // city_id
    'about' => 'We build software...',
]);
```

### Create Member

```php
// Get owner
$owner = User::where('email', 'owner@techcorp.com')->first();

// Create member
$member = User::createMember([
    'email' => 'member@techcorp.com',
    'name' => 'John Doe',
    'designation' => 'Developer',
    'employee_code' => 'EMP001',
    'contact_number' => '9876543210',
    'gender' => 'male',
    'date_of_birth' => '1990-01-01',
], $owner->company_id, $owner->id);
```

### Query Examples

```php
// Get company with owner
$company = Company::find(1);
$owner = $company->owner; // Single owner user

// Get all company members
$members = $company->members; // Only members (is_owner=false)

// Get all active users of company
$allUsers = $company->activeUsers;

// Find user and get company
$user = User::find(123);
$companyData = $user->company->getFullData(); // With country/city details

// Check permissions
if ($user->hasPermission('create_job')) {
    // Allow action
}

// Get by company
$companyUsers = User::byCompany(1)->active()->get();
```

### Login Response

```php
$user = User::where('email', $email)->first();

// Check password, generate token, etc.

return response()->json([
    'user' => $user->toResponseArray(),
    'company' => $user->company->getFullData(),
    'is_owner' => $user->isOwner(),
    'permissions' => $user->isMember() ? $user->memberPermissions : 'all'
]);
```

---

## Migration Notes

### Backward Compatibility

Both models support old field names:
- `user_id` (companies) - deprecated but still works
- `contact_no` / `mobile_number` / `phone` - all mapped to `phone`
- `location` / `country_id` - both work
- `city` / `city_id` - both work
- `verify_email` / `is_verified` / `is_email_verified` - all work

### Data Migration Strategy

**Option 1: Gradual Migration**
Keep both old and new models running side by side. New registrations use new structure.

**Option 2: Full Migration**
1. Create migration script to copy data
2. Update all controllers at once
3. Remove old models

---

## Next Steps

1. ✅ Models restructured - **DONE**
2. ⏳ Update `AuthController` to use new models
3. ⏳ Update other controllers (Jobs, Members, etc.)
4. ⏳ Update middleware (JwtMiddleware)
5. ⏳ Test registration flow
6. ⏳ Test member creation flow
7. ⏳ Update API documentation

---

## Files Modified

- ✅ `app/Models/Company.php` - Completely restructured
- ✅ `app/Models/User.php` - Completely restructured
- 📦 `app/Models/Company.php.old` - Backup
- 📦 `app/Models/MasterEmployer.php.old` - Backup
- 📦 `app/Models/Member.php.old` - Backup

---

## Key Benefits

✅ **Unified User Management** - One table for all users  
✅ **Clear Relationships** - Company → Users (owner + members)  
✅ **Simplified Queries** - No need for user_member_mappings  
✅ **Better Permissions** - Built into User model  
✅ **Backward Compatible** - Old field names still work  
✅ **Flexible** - Easy to add new features  

---

## Important Notes

⚠️ **Before using in production:**
1. Test registration flow thoroughly
2. Test member creation
3. Update all controllers
4. Update JWT middleware
5. Update API responses
6. Create data migration script if needed
7. Update tests

📝 **Collection Names:**
- `companies` (employer_db)
- `users` (employer_db)

🔑 **Primary Keys:**
- Both use `id` (integer, auto-increment)
- Both have `_id` (MongoDB ObjectId)
