- Departments + cross-department transfer workflow - Role-based closing (staff→resolved, manager→closed) with proof_of_resolution - Private file storage with collection system + temporary signed URLs - Dashboard: resolved tickets table, stats, handler performance bar chart - Spatie RBAC (admin/manager/staff) - Notifications: TicketTransferred, TicketClosed (database + mail) - Pest tests: 8 tests, 21 assertions - Docker production-ready (Dockerfile + compose + entrypoint)
114 lines
4.4 KiB
Markdown
114 lines
4.4 KiB
Markdown
# AfterSales CRM - Tiến độ
|
|
|
|
## Trạng thái: Hoàn thành SOP — 8 giai đoạn + bug fix + polish
|
|
|
|
Đã test: Tất cả routes HTTP 200, Pest 7/7 tests pass ✓
|
|
Tham chiếu: `SOP_des.md` — Bản đặc tả hệ thống After-Sale CRM
|
|
|
|
## Công nghệ
|
|
- Laravel 13.6.0 + Filament 5.6.1 + SQLite
|
|
- PHP 8.3
|
|
- Spatie laravel-permission (RBAC)
|
|
- Pest PHP (testing)
|
|
|
|
## Tài khoản test
|
|
| Role | Email | Password |
|
|
|------|-------|----------|
|
|
| admin | admin@minicrm.local | password |
|
|
| manager | manager@minicrm.local | password |
|
|
| staff | staff@minicrm.local | password |
|
|
|
|
---
|
|
|
|
## ĐÃ HOÀN THÀNH
|
|
|
|
### Giai đoạn 1: Mở rộng CSDL
|
|
- [x] Bảng `departments` (id, name, manager_id → users)
|
|
- [x] Bổ sung `feedback`: current_department_id, is_escalated
|
|
- [x] Bảng `ticket_transfer_logs` (feedback_id, from/to department, sender, reason)
|
|
- [x] Nâng cấp `feedback_attachments`: uuid, disk, collection
|
|
- [x] Cài Spatie laravel-permission
|
|
|
|
### Giai đoạn 2: Services & Logic
|
|
- [x] `FileService`: upload, validation (jpg/png/pdf/mp4/mov ≤20MB), collection query, temporary URL
|
|
- [x] `TransferService`: transfer department + reason required + notification
|
|
- [x] `ClosingService`: role-gated close + proof_of_resolution check
|
|
- [x] Policies cập nhật dùng Spatie `hasRole()`
|
|
- [x] Custom Rule `RequireProofOfResolution`
|
|
|
|
### Giai đoạn 3: Notifications
|
|
- [x] `TicketTransferred` (Database + Mail)
|
|
- [x] `TicketClosed` (Database + Mail)
|
|
|
|
### Giai đoạn 4: Filament UI
|
|
- [x] `TransferDepartment` Action trên Edit Feedback (modal: department + reason + attachment)
|
|
- [x] `CloseTicket` Action (visible: admin/manager, status ≠ closed, requires confirmation)
|
|
- [x] InteractionsRelationManager: role-aware status options (staff: no "closed"), department field
|
|
- [x] FeedbackForm: current_department_id, is_escalated, attachment_collection
|
|
|
|
### Giai đoạn 5: Dashboard Widgets
|
|
- [x] `ResolvedTicketsWidget`: bảng ticket resolved chờ đóng (manager lọc theo phòng quản lý)
|
|
- [x] `AvgProcessingTimeWidget`: 4 stats (resolved count, avg time, pending, escalated)
|
|
|
|
### Giai đoạn 6: Testing
|
|
- [x] Pest cài đặt + 5 test scenarios
|
|
- [x] `ClosingPermissionTest`: 3 tests (staff 403, no evidence 422, with evidence OK)
|
|
- [x] `TransferFlowTest`: 2 tests (success + missing reason)
|
|
|
|
### Giai đoạn 7: Seeder
|
|
- [x] 4 departments (CSKH, Kỹ thuật, Kế toán, Pháp lý)
|
|
- [x] 1 ticket_transfer_log mẫu
|
|
- [x] 3 feedback_attachments (2 proof_of_resolution, 1 customer_evidence)
|
|
|
|
### Giai đoạn 8: Polish
|
|
- [x] AGENTS.md cập nhật đầy đủ
|
|
|
|
### Bug Fix
|
|
- [x] Dashboard widget lọc Manager dùng `Department::where('manager_id')` thay vì `auth()->id()`
|
|
- [x] Migration default disk `private` → `local`
|
|
- [x] File upload trong Interaction/Create/Edit dùng lưu thẳng FeedbackAttachment, không tạo UploadedFile giả
|
|
|
|
### PM (Improvements)
|
|
- [x] FeedbackTable: thêm cột Department, Escalated icon, Department filter
|
|
- [x] EditFeedback: validation `proof_of_resolution` khi đổi status sang `closed` từ form
|
|
|
|
### PASS 3 — Hoàn thiện SOP
|
|
- [x] `HandlerPerformanceWidget`: biểu đồ bar chart thời gian xử lý trung bình theo từng nhân viên
|
|
- [x] Department_Head: Manager chỉ đóng được ticket phòng mình quản lý (kèm test)
|
|
- [x] Temporary URL tích hợp vào UI: nút "View Attachments" trong Interaction History với download link
|
|
- [x] Cho phép upload attachment trong status_change interaction
|
|
- [x] Docker sẵn sàng production: Dockerfile, docker-compose, entrypoint
|
|
- [x] Migration `notifications` table
|
|
|
|
---
|
|
|
|
## Database Schema (final)
|
|
```
|
|
products customers customer_product (pivot)
|
|
feedback_channels feedback feedback_interactions
|
|
feedback_attachments feedback_tags feedback_feedback_tag (pivot)
|
|
users departments ticket_transfer_logs
|
|
permissions roles model_has_roles (spatie)
|
|
notifications sessions cache
|
|
```
|
|
|
|
## Docker Deployment
|
|
```bash
|
|
cp .env.example .env
|
|
# Edit .env: set APP_URL, optional: switch to MySQL
|
|
docker compose up -d --build
|
|
# Open http://localhost:8080/admin
|
|
```
|
|
|
|
## Local Dev
|
|
```bash
|
|
cd /home/phuongtc/vibecode/minicrm
|
|
php artisan migrate:fresh --seed
|
|
php artisan serve
|
|
# Mở http://localhost:8000/admin
|
|
php artisan test # 8 tests, 21 assertions
|
|
```
|
|
|
|
## Hướng dẫn cho AI Agent khác
|
|
Xem `AGENTS.md` - chứa đầy đủ cấu trúc thư mục, schema, namespace patterns, workflow, RBAC.
|