# Hướng Dẫn Thiết Lập Bảng Đơn Vị (Don Vi)

## Tổng Quan

Bảng `don_vi` đã được tạo với cấu trúc phân cấp:
- **Phòng Ban** (PHONG_BAN) - Cấp cao nhất
- **Đội** (DOI) - Cấp trung gian
- **Tổ** (TO) - Cấp thấp nhất

## Cấu Trúc Bảng

```sql
don_vi (
    id,
    ten_don_vi,
    loai_don_vi ENUM('PHONG_BAN', 'DOI', 'TO'),
    don_vi_cha_id,
    so_thu_tu,
    ngay_tao,
    ngay_cap_nhat
)
```

## Dữ Liệu Mẫu

### Phòng Ban
1. Phòng Quản Lý Kỹ Thuật
2. Phòng Lao Động
3. Phòng Kế Hoạch

### Đội (thuộc Phòng Quản Lý Kỹ Thuật)
1. Đội An Lộc
2. Đội Cẩm Mỹ

### Tổ (thuộc Đội An Lộc)
1. Tổ 1
2. Tổ 2

## Các Bước Thiết Lập

### 1. Xóa Database Cũ và Tạo Lại (Nếu Cần)

```bash
# Xóa tất cả bảng và tạo lại
php artisan migrate:fresh

# Hoặc rollback và migrate lại
php artisan migrate:rollback
php artisan migrate
```

### 2. Chạy Migration và Seeder

```bash
# Chạy migration và seeder cùng lúc
php artisan migrate:fresh --seed

# Hoặc chạy riêng lẻ
php artisan migrate
php artisan db:seed --class=DonViSeeder
php artisan db:seed --class=NguoiDungSeeder
```

### 3. Kiểm Tra Dữ Liệu

```bash
# Vào MySQL/MariaDB
mysql -u root -p

# Chọn database
USE be_san_luong;

# Xem dữ liệu đơn vị
SELECT * FROM don_vi ORDER BY loai_don_vi, so_thu_tu;

# Xem cấu trúc phân cấp
SELECT 
    dv.id,
    dv.ten_don_vi,
    dv.loai_don_vi,
    cha.ten_don_vi as don_vi_cha
FROM don_vi dv
LEFT JOIN don_vi cha ON dv.don_vi_cha_id = cha.id
ORDER BY dv.loai_don_vi, dv.so_thu_tu;
```

## Thứ Tự Migration

**QUAN TRỌNG**: Bảng `don_vi` phải được tạo TRƯỚC bảng `nguoi_dung` vì có foreign key constraint.

Thứ tự migration hiện tại:
1. `2026_02_07_130000_create_don_vi_table.php` ✓
2. `2026_02_07_131108_create_nguoi_dung_table.php` ✓

## Sử Dụng Trong Code

### Lấy Đơn Vị của User

```php
$user = User::find(1);
$donVi = $user->donVi; // Lấy thông tin đơn vị
echo $donVi->ten_don_vi; // "Phòng Quản Lý Kỹ Thuật"
```

### Lấy Đơn Vị Cha

```php
$doi = DonVi::where('ten_don_vi', 'Đội An Lộc')->first();
$phongBan = $doi->donViCha; // Lấy phòng ban cha
echo $phongBan->ten_don_vi; // "Phòng Quản Lý Kỹ Thuật"
```

### Lấy Các Đơn Vị Con

```php
$phong = DonVi::where('ten_don_vi', 'Phòng Quản Lý Kỹ Thuật')->first();
$cacDoi = $phong->donViCon; // Lấy tất cả các đội thuộc phòng

foreach ($cacDoi as $doi) {
    echo $doi->ten_don_vi; // "Đội An Lộc", "Đội Cẩm Mỹ"
}
```

### Lấy Tất Cả Users Trong Đơn Vị

```php
$donVi = DonVi::find(1);
$users = $donVi->nguoiDung; // Lấy tất cả users thuộc đơn vị này
```

## Lỗi Thường Gặp

### 1. Foreign Key Constraint Error

**Lỗi**: `SQLSTATE[23000]: Integrity constraint violation`

**Nguyên nhân**: Bảng `nguoi_dung` được tạo trước bảng `don_vi`

**Giải pháp**: 
```bash
php artisan migrate:fresh --seed
```

### 2. Seeder Chạy Sai Thứ Tự

**Lỗi**: `don_vi_id` không tồn tại khi tạo user

**Nguyên nhân**: `NguoiDungSeeder` chạy trước `DonViSeeder`

**Giải pháp**: Đã cập nhật `DatabaseSeeder.php` để chạy đúng thứ tự

## Kiểm Tra Hoàn Tất

Sau khi chạy migration và seeder, bạn nên có:
- ✓ 3 Phòng Ban
- ✓ 2 Đội
- ✓ 2 Tổ
- ✓ 3 Users với don_vi_id hợp lệ


