# Hướng dẫn cài đặt - Retail Order Refactoring

## Các file đã được tạo/cập nhật

### ✅ Đã hoàn thành
1. `app/Http/Controllers/Admin/RetailOrderController.php` - Controller đã refactor
2. `app/Services/RetailOrderService.php` - Service layer mới
3. `app/Http/Requests/Admin/RetailOrderRequest.php` - Form request validation
4. `public/js/admin/retail-order-edit.js` - JavaScript riêng biệt
5. `resources/views/admin/retail_order_confirm/edit.blade.php` - View đã refactor

## Các bước kiểm tra và hoàn thiện

### 1. Kiểm tra Routes
Đảm bảo các routes sau tồn tại trong `routes/web.php`:

```php
// Route cho retail orders
Route::prefix('orders/retail')->name('orders.retail.')->group(function () {
    Route::get('/', [RetailOrderController::class, 'index'])->name('indexXMYC');
    Route::get('/{id}/edit', [RetailOrderController::class, 'edit'])->name('editXMYC');
    Route::put('/{id}', [RetailOrderController::class, 'update'])->name('updateXMYC');
});

// Route xóa product detail
Route::delete('/product-detail/{id}', [ProductDetailController::class, 'destroy'])->name('product.delete');
```

### 2. Kiểm tra API Route
Đảm bảo API endpoint tồn tại trong `routes/api.php`:

```php
Route::get('/retail-order/search', [Api\UserController::class, 'search']);
```

### 3. Kiểm tra Model Relationships

#### RetailOrder Model
Đảm bảo các relationships sau tồn tại:

```php
// app/Models/RetailOrder.php
public function orderdetails()
{
    return $this->hasMany(RetailOrderDetail::class, 'retail_order_id');
}

public function users()
{
    return $this->belongsTo(User::class, 'user_id');
}

public function customer()
{
    return $this->belongsTo(User::class, 'customer_id');
}

public function sale()
{
    return $this->belongsTo(User::class, 'sale_id');
}

public function retail_payment()
{
    return $this->hasOne(RetailOrderPayment::class, 'retail_order_id');
}
```

### 4. Kiểm tra Database Schema

Đảm bảo bảng `retail_orders` có các cột:
- customer_id
- sale_id
- code
- code_index
- order_date
- type
- notes
- order_user_name
- order_user_phone
- order_user_address
- order_user_note
- type_discount
- user_house
- user_commune
- user_district
- user_city
- discount
- vat
- status
- created_at
- updated_at

### 5. Implement method comfirmStatus

Trong `RetailOrderController.php`, cần implement logic cho method `comfirmStatus`:

```php
private function comfirmStatus(Request $request, string $id)
{
    // TODO: Thêm logic xác nhận trạng thái đơn hàng
    // Ví dụ:
    $order = RetailOrder::findOrFail($id);
    $order->update(['status' => $request->status]);
    
    // Có thể thêm logic khác như:
    // - Gửi email thông báo
    // - Cập nhật inventory
    // - Tạo log
}
```

### 6. Kiểm tra Permissions

Đảm bảo user có quyền truy cập:
- `permition` field trong bảng users
- Logic phân quyền xem đơn hàng

### 7. Test Functionality

#### Test Case 1: Load trang edit
```
URL: /orders/retail/{id}/edit
Expected: Hiển thị form edit với dữ liệu đơn hàng
```

#### Test Case 2: Tìm kiếm khách hàng
```
Action: Nhập số điện thoại và click Search
Expected: Hiển thị danh sách khách hàng phù hợp
```

#### Test Case 3: Thêm sản phẩm
```
Action: Click "Thêm sản phẩm"
Expected: Thêm dòng sản phẩm mới vào bảng
```

#### Test Case 4: Cập nhật đơn hàng
```
Action: Sửa thông tin và submit form
Expected: 
- Validation hoạt động
- Lưu database thành công
- Redirect về danh sách với thông báo success
```

#### Test Case 5: Upload ảnh thanh toán
```
Action: Nhập số tiền thanh toán và upload ảnh
Expected: 
- Nếu có số tiền nhưng không có ảnh -> Hiển thị warning
- Nếu có cả số tiền và ảnh -> Lưu thành công
```

### 8. Clear Cache

Sau khi deploy, chạy các lệnh sau:

```bash
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan optimize
```

### 9. Kiểm tra JavaScript Console

Mở Developer Tools và kiểm tra:
- Không có lỗi JavaScript
- AJAX requests hoạt động
- Select2 được khởi tạo đúng

### 10. Kiểm tra Responsive

Test trên các kích thước màn hình:
- Desktop (1920x1080)
- Tablet (768x1024)
- Mobile (375x667)

## Troubleshooting

### Lỗi: Class 'App\Services\RetailOrderService' not found
**Giải pháp:**
```bash
composer dump-autoload
```

### Lỗi: Route not found
**Giải pháp:**
```bash
php artisan route:clear
php artisan route:cache
```

### Lỗi: View not found
**Giải pháp:**
```bash
php artisan view:clear
```

### Lỗi: JavaScript không hoạt động
**Giải pháp:**
- Kiểm tra file `public/js/admin/retail-order-edit.js` tồn tại
- Kiểm tra console log có lỗi không
- Đảm bảo jQuery được load trước

### Lỗi: Select2 không hoạt động
**Giải pháp:**
- Kiểm tra Select2 library đã được load
- Kiểm tra class `.select3me` được áp dụng đúng
- Gọi `handleSelect2()` sau khi thêm element mới

## Performance Optimization

### 1. Eager Loading
Service đã sử dụng eager loading để tránh N+1 query:
```php
RetailOrder::with('orderdetails', 'users', 'customer', 'sale')
```

### 2. JavaScript Minification
Có thể minify file JS trong production:
```bash
npm install -g uglify-js
uglifyjs public/js/admin/retail-order-edit.js -o public/js/admin/retail-order-edit.min.js
```

### 3. Database Indexing
Đảm bảo có index trên các cột thường query:
```sql
ALTER TABLE retail_orders ADD INDEX idx_customer_id (customer_id);
ALTER TABLE retail_orders ADD INDEX idx_sale_id (sale_id);
ALTER TABLE retail_orders ADD INDEX idx_status (status);
ALTER TABLE retail_orders ADD INDEX idx_code (code);
ALTER TABLE retail_orders ADD INDEX idx_code_index (code_index);
```

## Security Checklist

- [x] Form Request Validation
- [x] CSRF Protection (@csrf trong form)
- [x] SQL Injection Prevention (Eloquent ORM)
- [x] XSS Prevention (Blade escaping)
- [x] File Upload Validation (cần thêm validation cho file type)
- [x] Authorization (permission check)

## Monitoring

### Log Files
Kiểm tra logs tại:
```
storage/logs/laravel.log
```

### Database Queries
Có thể enable query log để debug:
```php
DB::enableQueryLog();
// ... code
dd(DB::getQueryLog());
```

## Rollback Plan

Nếu có vấn đề, có thể rollback bằng cách:

1. Restore controller cũ từ git
2. Xóa Service và FormRequest mới
3. Restore view cũ
4. Clear cache

```bash
git checkout HEAD -- app/Http/Controllers/Admin/RetailOrderController.php
git checkout HEAD -- resources/views/admin/retail_order_confirm/edit.blade.php
rm app/Services/RetailOrderService.php
rm app/Http/Requests/Admin/RetailOrderRequest.php
rm public/js/admin/retail-order-edit.js
php artisan optimize:clear
```

## Support

Nếu gặp vấn đề, kiểm tra:
1. Laravel log: `storage/logs/laravel.log`
2. Browser console: F12 -> Console tab
3. Network tab: Kiểm tra AJAX requests
4. Database: Kiểm tra data có được lưu không

## Next Steps

Sau khi hoàn thành refactoring này, có thể tiếp tục:

1. Refactor các controller khác theo pattern tương tự
2. Viết Unit Tests cho Service layer
3. Viết Feature Tests cho toàn bộ flow
4. Implement Events & Listeners
5. Thêm Queue Jobs cho các tác vụ nặng
6. Tối ưu hóa database queries
7. Implement caching strategy

## Conclusion

Refactoring này giúp:
- ✅ Code dễ maintain hơn
- ✅ Tách biệt concerns rõ ràng
- ✅ Dễ dàng test
- ✅ Tuân thủ Laravel best practices
- ✅ Cải thiện performance
- ✅ Dễ mở rộng trong tương lai

Chúc bạn deploy thành công! 🚀
