164 lines
7.4 KiB
Markdown
164 lines
7.4 KiB
Markdown
# AfterSales CRM - Tiến độ
|
|
|
|
## Trạng thái: Hoàn thành SOP + 6/7 AI Instructions (85%)
|
|
|
|
Đã test: Tất cả routes HTTP 200, Pest 8/8 tests (21 assertions) pass ✓
|
|
Tham chiếu: `SOP_des.md` — Bản đặc tả hệ thống After-Sale CRM
|
|
**Data import:** `php artisan app:import-cskh ai_instructions/CSKH.xlsx` — 3658 rows imported successfully
|
|
|
|
## 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 + 6 test scenarios
|
|
- [x] `ClosingPermissionTest`: 4 tests (staff 403, no evidence 422, with evidence OK, cross-department 403)
|
|
- [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
|
|
|
|
### AI Instructions — Phase A: Module Hợp đồng (Contract)
|
|
- [x] Migration `contracts`: product_id, customer_id, type (sale/lease/bcc), dates, status, signed_status
|
|
- [x] Enum `ContractType` (SALE/LEASE/BCC) + `ContractStatus` (ACTIVE/EXPIRED/LIQUIDATED)
|
|
- [x] Model `Contract`: relationships product(), customer(), feedbacks()
|
|
- [x] Filament Resource `Contracts` (CRUD) + `ContractPolicy`
|
|
- [x] RelationManager `ContractsRelationManager` trên ProductResource
|
|
- [x] Model `Product` thêm `contracts()` HasMany
|
|
- [x] Seeder: 5 contracts mẫu
|
|
|
|
### AI Instructions — Phase B: Snapshot Hợp đồng
|
|
- [x] Migration thêm `contract_id` FK nullable vào `feedback`
|
|
- [x] Model `Feedback`: thêm `contract_id` fillable + `contract()` BelongsTo
|
|
- [x] FeedbackForm: auto-select active contract khi chọn sản phẩm, cho phép chọn lại thủ công
|
|
- [x] FeedbackTable: cột "Contract" hiển thị loại HĐ dạng badge
|
|
- [x] Seeder: gán contract_id cho 5 feedback mẫu
|
|
|
|
### AI Instructions — Phase C: Module Bàn giao (Handover)
|
|
- [x] Migration `handovers`: product_id, customer_id, handover_date, status, remark
|
|
- [x] Enum `HandoverStatus` (NOT_READY/READY/SCHEDULED/HANDED_OVER)
|
|
- [x] Model `Handover`: relationships product(), customer()
|
|
- [x] RelationManager `HandoversRelationManager` trên ProductResource
|
|
- [x] Model `Product` thêm `handovers()` HasMany
|
|
- [x] Seeder: 5 handovers mẫu
|
|
|
|
### AI Instructions — Phase D: Module Dịch vụ (ProductService)
|
|
- [x] Migration `product_services`: product_id, service_type, status, actual_collection_date, remark
|
|
- [x] Enum `ServiceType` (MANAGEMENT_FEE/GRATITUDE/SELF_BUSINESS)
|
|
- [x] Model `ProductService`: relationship product()
|
|
- [x] RelationManager `ProductServicesRelationManager` trên ProductResource
|
|
- [x] Model `Product` thêm `productServices()` HasMany
|
|
- [x] Seeder: 5 services mẫu
|
|
|
|
### AI Instructions — Phase E: Enhancement ProductResource
|
|
- [x] ProductResource có 3 tabs: Contracts + Handovers + Services
|
|
|
|
### AI Instructions — Phase G: Data Import Pipeline
|
|
- [x] Cài `spatie/simple-excel` (Lazy Collection, chống OOM)
|
|
- [x] Command `app:import-cskh {file_path} --dry-run` với ProgressBar
|
|
- [x] Pipeline: Product/Customer firstOrCreate → customer_product pivot → Contract → Handover → Service → Feedback + Interactions
|
|
- [x] Xử lý DateTimeImmutable object từ Excel, skip meta rows
|
|
- [x] Đã test thành công với CSKH.xlsx: 3658 rows → 3299 products, 2089 customers, 2637 contracts, 2077 handovers, 159 services, 71 feedbacks, 226 interactions
|
|
|
|
### Còn lại (Optional)
|
|
- [ ] Auto-suggest chuyển phòng ban dựa trên loại hợp đồng (Ticket BCC → gợi ý Pháp lý)
|
|
|
|
---
|
|
|
|
## Database Schema (final — 23 migrations)
|
|
```
|
|
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
|
|
contracts handovers product_services
|
|
```
|
|
|
|
## Data Import
|
|
```bash
|
|
# Dry-run (phân tích trước, an toàn)
|
|
php artisan app:import-cskh ai_instructions/CSKH.xlsx --dry-run
|
|
|
|
# Import thật
|
|
php artisan app:import-cskh ai_instructions/CSKH.xlsx
|
|
```
|
|
|
|
## 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
|
|
- `CODEBASE_SNAPSHOT.md` — Toàn bộ cấu trúc codebase (đọc thay vì scan code)
|
|
- `TASKS_ROADMAP.md` — Roadmap: đã làm, đang làm, sẽ làm
|
|
- `AGENTS.md` — Hướng dẫn chạy, workflow, RBAC, gotchas
|