Sheet 7 · Business Workflows & Automation Engine
Quy trình hệ thống
Hệ thống quy trình nghiệp vụ số hoá toàn diện của CTC Smart Tech ERP — mô hình hoá theo chuẩn diagram-design kết hợp logic thật từ source code frontend-next/src/erp/** và sync-server.
Tài liệu đầy đủ: Xem bộ tài liệu quy trình chuyên sâu có bảng đặc tả chi tiết 12 pha, SLAs, định mức và phân tích ngoại lệ tại trang Workflows Brief.
Mở Workflows Brief ↗ 1. Sơ đồ tổng thể liên phòng ban — 12 pha
2. Quy trình Bán hàng & Quản lý Deal (7 giai đoạn phễu)
Project.dealStage (7 giá trị lead→contact→demo→proposal→negotiation→won/lost), phễu kéo-thả trong projects/nexa. Điểm chốt deal Bước 6 (Focal): Chuyển dealStage: won, ghi nhận dealValue và chuyển giao sang Delivery Team.3. Quy trình Kỹ thuật, Triển khai & Review
TaskStatus 4 trạng thái (todo→in_progress→review→done); tự động set/clear completedAt theo status; Review layer (comment ghim theo pin.cid, @mention qua MentionTextarea, MentionBell SSE); Focus mode đếm focusedMin.4. Quy trình Kế toán, Tài chính & Công nợ
InvoiceStatus 5 trạng thái (draft→sent→paid→overdue→cancelled); tích hợp OCR scan ảnh hoá đơn; quản trị công nợ nhà cung cấp (Vendors AP) kiểm soát cam kết vs đã trả; duyệt chi BOD cho các khoản > 5.000.000đ; tính hoa hồng & thuế TNCN 2026.5. Quy trình Tự động hoá (Workflow Engine)
status_change diff qua store subscribe, daily_scan mỗi 30 phút), chống lặp bằng run-key + tag wf:<id>:<key> + so giá trị; 5 loại action gồm 3 nội bộ (create_task/notify/set_field) và 2 relay ra ngoài (send_telegram qua /api/me/relay/telegram, send_gws qua /api/me/relay/gws — chỉ nhận domain whitelist); mỗi lần chạy ghi 1 dòng vào workflow_runs.Chi tiết cơ chế kích hoạt & Thực thi Actions của Workflow Engine
| Thành phần Engine | Loại / Phân loại | Mô tả hoạt động & Quy tắc xử lý |
|---|---|---|
Trigger: status_change | Realtime Diff | Bắt thay đổi trạng thái trong store trên 3 đối tượng (task.status, project.dealStage, invoice.status). Diff giữa snapshot trước và sau, bắt được cả thao tác tại chỗ lẫn cập nhật đến từ SSE của đồng nghiệp. |
Trigger: daily_scan | Scheduled (30 phút) | Quét tự động khi mở app và lặp lại mỗi 30 phút. Hỗ trợ 4 kiểu quét: invoice_due (quét hạn hoá đơn theo mảng offsets ngày), task_overdue (việc quá hạn), stuck_in_status (đứng yên quá N ngày), stale_stage (deal ngâm lâu). |
| Bộ lọc Điều kiện | Logic AND phẳng | Lọc theo trường dữ liệu với 3 toán tử: eq (bằng), neq (khác), has (kiểm tra phần tử trong mảng tag). |
Action: create_task | Nội bộ (Internal) | Tự động sinh Task mới; hỗ trợ biến template {name} và {entity}; tự động tính hạn dueInDays; gán assignee mặc định theo đối tượng gốc; gắn tag ẩn chống lặp wf:<id>:<key>:a<i>. |
Action: notify / set_field | Nội bộ (Internal) | notify: Bắn thông báo toast realtime và notification bell; set_field: Cập nhật giá trị trường dữ liệu (tự so sánh giá trị cũ để bỏ qua nếu đã đúng). |
Action: send_telegram / send_gws | Relay ra ngoài (External) | Chuyển tiếp qua server relay (/api/me/relay/*), thay thế placeholder {name}/{entity}, bảo mật token và kiểm tra whitelist domain nghiêm ngặt. |
| Chống lặp 3 lớp | Concurrency Guard | Lớp 1: Fired-key deduplication trong user_data · Lớp 2: Quét tag ẩn trong store trước khi tạo task · Lớp 3: State value check trước khi set. |
5b. Trợ lý ngoài gọi vào ERP — luồng duy nhất được phép (03/09/2026)
Chiều đúng là trợ lý gọi VÀO ERP, song song với giao diện web. ERP không đẻ tiến trình mô hình nào. Đây là luồng thay thế cho tính năng "Dựng bằng AI" đã gỡ.
Người dùng ──► Giao diện web ERP ──┐
├──► ERP (ứng dụng độc lập, có API + phân quyền)
Người dùng ──► Trợ lý trong │
workspace / bot ────┘
(cầm khoá API của chính người đó) Các bước
| # | Bước | Chi tiết & ràng buộc |
|---|---|---|
| 1 | Trợ lý nạp khoá | Khoá nằm trong .env của workspace người đó (ERP_API_KEY). Bẫy thực tế: mỗi lệnh shell là một tiến trình riêng — nạp khoá ở lệnh này rồi dùng biến ở lệnh sau là khoá rỗng, ERP trả "khoá dịch vụ không hợp lệ". Mọi lời gọi phải tự nạp khoá trong cùng một lệnh. |
| 2 | Xác nhận danh tính | POST /api/agent/whoami → trả về người mà khoá đại diện. Nếu không phải người đang nhắn thì phải dừng: mọi thứ tạo ra sẽ nằm trong tài khoản người kia và người đang nhắn sẽ không thấy. |
| 3 | Nạp chỉ dẫn + ngữ cảnh | POST /api/agent/context → trả system (chỉ dẫn nạp vào system prompt), context (dữ liệu đã lọc hai tầng đúng quyền người đó), actions (bảng hành động máy đọc được, để nạp làm định nghĩa tool), keySkills (kỹ năng phát hành cho chính khoá này). |
| 4 | Gọi hành động | POST /api/agent/action với action + arg. Allowlist 9 hành động, gọi tên ngoài danh sách là 400 kèm danh sách hợp lệ: viec · tim · help · them · xong · trangthai · han · tao_ky_nang · tao_quy_trinh. Không có hành động xoá nào tồn tại — người dùng nhắn "xoá hết dữ liệu" thì trợ lý muốn gọi cũng không có gì để gọi. |
| 5 | ERP ghi và trả lời | Bản ghi mới thuộc về chủ khoá, luôn ở trạng thái nháp/tắt. revisions.actor_id và revisions.source='api-key' ghi lại ai làm và qua đường nào. Nhật ký [agent] ghi tên hành động, người thực hiện và kết quả — không ghi tham số và không ghi khoá. |
Vì sao ERP không tự chạy CLI mô hình
Ngoại lệ từng tồn tại sáng 03/09 và bị gỡ cùng ngày. Tính năng "Dựng bằng AI" chạy
claude -p / agy -p bằng tài khoản thuê bao trên máy chủ. Ba lý do gỡ, mỗi lý do đủ để cấm:
- Thực thi mã tuỳ ý.
/api/ai-draftcho mọi tài khoản đăng nhập gõ 2000 ký tự tự do (30 lượt/giờ), nối thẳng vào dòng lệnh chạy dưới unix usererp— cùng máy với cơ sở dữ liệu của cả bốn khách hàng. Nhánhagybuộc phải--dangerously-skip-permissionsnên mọi công cụ mở; nhánhclaudedùng deny-list nên công cụ mới của CLI mặc định lọt. Chốt "thư mục làm việc là thư mục tạm rỗng" không phải biện pháp bảo mật: đường dẫn tuyệt đối không quan tâm tiến trình đang đứng ở đâu. - Sinh hàng loạt phiên rác. Mỗi lời gọi headless đẻ một phiên CLI có thư mục và trạng thái tích luỹ. ERP phục vụ nhiều người, nhiều tenant, chạy nền liên tục.
- Vòng lặp kiến trúc. Phiên CLI cầm khoá gọi ngược vào ERP → ERP lại gọi CLI. Hai hệ thống cùng giữ một trách nhiệm, không nơi nào là nguồn sự thật.
6. Yêu cầu Phát triển → Duyệt → Phát hành Kỹ năng & Quy trình
dev_requests, 5 trạng thái new→reviewing→approved/rejected→released; endpoint /api/requests/review ADMIN-ONLY; sửa nội dung yêu cầu chỉ được phép khi còn status='new'; timeline hiển thị trên panel trang /requests.Chi tiết Vòng đời Quản trị Kỹ năng (SOP) & Yêu cầu Phát triển
| Giai đoạn / Bước | Vai trò thực hiện | Nội dung nghiệp vụ & Ràng buộc toàn vẹn |
|---|---|---|
| 1. Đề xuất yêu cầu (Submit) | Mọi nhân sự | Gửi yêu cầu tạo mới hoặc sửa đổi qua /requests; chọn kind (workflow hoặc skill); nhập tiêu đề và mô tả có @mention; nếu là sửa đổi thì liên kết targetId. Trạng thái khởi tạo: new. |
| 2. Chỉnh sửa yêu cầu | Người gửi | Người gửi chỉ được phép sửa tiêu đề/nội dung khi yêu cầu đang ở trạng thái new. Khi đã chuyển sang reviewing, quyền sửa bị khoá. |
| 3. Đánh giá & Duyệt (Review) | Admin / BOD | Admin tiếp nhận, chuyển sang reviewing, thẩm định tính khả thi và tiêu chuẩn hoá của SOP/Workflow; quyết định approved hoặc rejected kèm reviewNote. |
| 4. Triển khai & Phát hành | Admin / Dev Lead | Sau khi cấu hình hoàn thiện Kỹ năng/Workflow, Admin chuyển trạng thái sang released, gắn số hiệu phiên bản releasedVersion (ví dụ: v1.2); hệ thống tự động lưu snapshot vào lịch sử 20 phiên bản của Skill / 10 phiên bản của Workflow. |
| 5. Phổ biến & Tái sử dụng | Toàn thể nhân sự | Kỹ năng sau khi phát hành (published=true) xuất hiện trên danh bạ Kỹ năng chung; nhân sự có thể tra cứu, nhập checklist vào công việc thực tế hoặc nhân bản (Duplicate) thành cẩm nang cá nhân. |