# Task 21 — Employees

## Goal
Build the Employees module to manage employee master data used by HR, attendance, payroll, and future portal features.
This module must support bilingual employee names and essential employment information.

---

## Database

Table: `employees`

Fields:
- id
- code (string, unique)
- name (json, translatable)
- email (string, nullable)
- phone (string, nullable)
- job_title (json, nullable, translatable)
- hire_date (date, nullable)
- salary (decimal 18,2, nullable)
- branch_id (nullable, FK to branches.id)
- is_active (boolean, default true)
- created_by (nullable, FK to admins.id)
- updated_by (nullable, FK to admins.id)
- created_at
- updated_at

Indexes:
- unique code
- index email
- index phone
- index branch_id
- index is_active

---

## Relations

Employee model relations:
- branch() -> belongsTo Branch
- creator() -> belongsTo Admin
- updater() -> belongsTo Admin

Future relations:
- payrolls() -> hasMany Payroll
- attendances() -> hasMany Attendance

---

## Business Rules

1. Employee code must be unique.
2. Employee name and job title must use HasTranslations.
3. Employee can belong to a branch.
4. Employee can be active or inactive.
5. Only active employees should appear in payroll forms by default.

---

## Files

### Model
- app/Models/HR/Employee.php

### Service
- app/Services/HR/EmployeeService.php

### Controller
- app/Http/Controllers/Admin/HR/EmployeeController.php

### Requests
- app/Http/Requests/Admin/HR/StoreEmployeeRequest.php
- app/Http/Requests/Admin/HR/UpdateEmployeeRequest.php

### Views
- resources/views/dashboard/hr/employees/index.blade.php
- resources/views/dashboard/hr/employees/create.blade.php
- resources/views/dashboard/hr/employees/edit.blade.php

### Lang files
- lang/ar/hr.php
- lang/en/hr.php

---

## Permissions

- hr.employees.view
- hr.employees.create
- hr.employees.update
- hr.employees.delete

---

## Validation Rules

- code: required, unique:employees,code
- name.ar: required, string
- name.en: nullable, string
- email: nullable, email
- phone: nullable, string
- job_title.ar: nullable, string
- job_title.en: nullable, string
- hire_date: nullable, date
- salary: nullable, numeric, min:0
- branch_id: nullable, exists:branches,id
- is_active: boolean

---

## UI

Views path:
`resources/views/dashboard/hr/employees/`

Fields in form:
- code
- name_ar
- name_en
- email
- phone
- job_title_ar
- job_title_en
- hire_date
- salary
- branch
- is_active

Index columns:
- code
- name
- job_title
- branch
- status
- actions

---

## Lang Keys

Suggested keys:
- employees
- employee
- create_employee
- edit_employee
- employee_code
- employee_name
- email
- phone
- job_title
- hire_date
- salary
- branch
- is_active
- status

---

## Seeder

Update RolePermissionSeeder with:
- hr.employees.view
- hr.employees.create
- hr.employees.update
- hr.employees.delete

---

## Steps

### Step 1
Create migration for `employees` table.

### Step 2
Create `Employee` model with HasTranslations.

### Step 3
Create `EmployeeService`.

### Step 4
Create Form Requests.

### Step 5
Create `EmployeeController`.

### Step 6
Create routes.

### Step 7
Create views.

### Step 8
Create lang files.

### Step 9
Update `RolePermissionSeeder`.

---

## Notes for AI

- Follow docs/ai/AI_MASTER_PROJECT.md
- Follow docs/ai/ARCHITECTURE_RULES.md
- Follow docs/ai/DATABASE_SCHEMA.md
- Follow docs/ai/MODULE_STRUCTURE.md
- Execute one step at a time
- Do not modify unrelated files
- Do not generate tests in this task
- Wait for confirmation after each step

