# Migration Guide: Employee to User Merge

## Overview
Dokumentasi ini menjelaskan perubahan besar-besaran untuk menggabungkan tabel `employees` ke dalam tabel `users` dengan role-based approach.

## Konsep
- **Admin**: User dengan `id_role = 1`
- **Staff**: User dengan `id_role = 2`
- **Employee/User**: User dengan `id_role = 3` (memiliki semua field employee)

## Changes Made

### 1. Database Migrations

#### Migration 1: Add Employee Fields to Users Table
**File**: `database/migrations/2025_11_11_134655_add_employee_fields_to_users_table.php`

Menambahkan field-field dari tabel employees ke tabel users:
- `id_company`
- `id_department`
- `phone_number`
- `profile_picture`
- `is_attendances`
- `total_attendances`
- `address`
- `fingerprint_data`
- `fingerprint_registered`
- `fingerprint_updated_at`

#### Migration 2: Migrate Data from Employees to Users
**File**: `database/migrations/2025_11_11_135010_migrate_employees_data_to_users.php`

Memindahkan semua data dari tabel `employees` ke tabel `users` dengan:
- Set `id_role = 3` untuk semua employee
- Password default: `password` (harus diubah oleh user)
- Mempertahankan timestamps original

#### Migration 3: Update Foreign Keys
**File**: `database/migrations/2025_11_11_135038_update_foreign_keys_from_employee_to_user.php`

Mengubah semua foreign key dari `id_employee` menjadi `id_user` di tabel:
- `attendances`: `id_employee` → `id_user`
- `work_schedules`: `id_employee` → `id_user`
- `leaves`: `id_employee` → `id_user`
- `attendance_bypasses`: `id_employee` → `id_user`

### 2. Model Updates

#### User Model
**File**: `app/Models/User.php`

**Changes**:
- Added employee-related fields to `$fillable`
- Added relationships: `department()`, `company()`, `attendances()`, `workSchedules()`, `leaves()`, `bypasses()`
- Added casts for employee fields
- Hidden `fingerprint_data` field

#### Attendance, WorkSchedule, Leaves, AttendanceBypass Models
**Changes**:
- Updated `$fillable`: `id_employee` → `id_user`
- Updated relationship method: `employee()` → `user()`
- Added `employee()` alias method untuk backward compatibility

### 3. Controller Updates

#### EmployeeController
**File**: `app/Http/Controllers/EmployeeController.php`

**Changes**:
- Changed from `Employee` model to `User` model
- All queries filtered with `where('id_role', 3)`
- Added password handling in `store()` and `update()` methods
- Updated validation rules to use `users` table

### 4. Service Updates

#### FingerprintService
**File**: `app/Services/FingerprintService.php`

**Changes**:
- Changed type hints from `Employee` to `User`
- Updated `findEmployeeByEmail()` to query users with `id_role = 3`
- All methods now work with User model

## How to Run Migration

**IMPORTANT**: Backup database terlebih dahulu!

```bash
# 1. Backup database
php artisan db:backup  # atau manual backup

# 2. Run migrations
php artisan migrate

# 3. Verify data
php artisan tinker
>>> User::where('id_role', 3)->count()
>>> Attendance::first()
```

## Post-Migration Tasks

### 1. Test Endpoints
Test semua endpoint yang berhubungan dengan employees:
- GET `/api/employees` - List employees
- GET `/api/employees/{id}` - Show employee
- POST `/api/employees` - Create employee
- PUT `/api/employees/{id}` - Update employee
- DELETE `/api/employees/{id}` - Delete employee

### 2. Update Frontend/Mobile App
Jika ada perubahan response format, update frontend/mobile app untuk handle:
- Employee sekarang adalah User dengan `id_role = 3`
- Password field required saat create employee (optional dengan default 'password')

### 3. Inform Users
Semua employee yang di-migrate akan memiliki password default: `password`
- Kirim notifikasi ke semua employee untuk change password
- Atau implement force password change on first login

## Rollback Plan

Jika ada masalah, rollback dengan:

```bash
php artisan migrate:rollback --step=3
```

Ini akan rollback 3 migrations terakhir yang berhubungan dengan merge ini.

## Backward Compatibility

Untuk mempermudah transisi, semua model masih support method `employee()` sebagai alias untuk `user()`:

```php
// Both work:
$attendance->user()->name
$attendance->employee()->name  // Alias, same as user()
```

## Breaking Changes

1. **API Response**: Employee sekarang memiliki field `id_role`, `password` (hidden), dll
2. **Query**: Harus filter `where('id_role', 3)` untuk mendapatkan employee saja
3. **Foreign Keys**: Semua foreign key di database sekarang `id_user` bukan `id_employee`
4. **Validation**: Email uniqueness check sekarang di tabel `users` bukan `employees`

## Benefits

1. **Single Source of Truth**: Semua user data di satu tabel
2. **Simplified Authentication**: Employee bisa login dengan email & password
3. **Role-Based Access**: Mudah manage permissions by role
4. **Reduced Redundancy**: Tidak ada duplikasi data (name, email)
5. **Easier Queries**: Query user berdasarkan role

## Next Steps

1. ✅ Run migrations
2. ✅ Test all endpoints
3. ✅ Update frontend/mobile if needed
4. ✅ Notify employees about default password
5. ✅ Monitor for issues
6. 🔄 Optional: Drop `employees` table setelah confirm everything works

## Support

Jika ada issues:
1. Check logs: `storage/logs/laravel.log`
2. Verify migrations: `php artisan migrate:status`
3. Check data integrity in database
4. Rollback jika diperlukan
