1. Tổng quan bài toán
App ghi nhận và đối soát dòng tiền tạm ứng thu mua nông sản, từ lúc Giám đốc duyệt đến khi tiền tới tay Nhà vườn hoặc được nộp lại. Mỗi đồng tiền luôn biết đang nằm trên tay ai, có bằng chứng ảnh và xác nhận của người nhận.
Phạm vi
- Có: đề xuất và duyệt tạm ứng, chi tiền cho Nhân viên, tạm ứng cho Nhà vườn, thu hồi tiền thừa, quản lý khách hàng của Nhân viên, lịch sử đối soát.
- Không có: quỹ công ty, số dư ban đầu, nguồn tiền; cân hàng, chốt đơn, thanh toán phần còn lại. "Mua vườn / Mua trái" chỉ là nhãn phân loại.
Vai trò
| Vai trò | Nền tảng | Việc chính |
|---|---|---|
| Giám đốc / Chủ vựa | App + web | Duyệt đề xuất đơn lẻ, ký danh sách hàng loạt, xem số dư NV, yêu cầu nộp lại, quyết định xử lý đặc biệt |
| Kế toán | Web (+ app) | Lập danh sách hàng loạt, chi tiền, đối soát sai lệch, xác nhận tiền nộp lại, nhận khách hàng khi NV nghỉ việc |
| Nhân viên thu mua | App | Tạo đề xuất, xác nhận/báo sai lệch tiền nhận, tạo khách hàng, tạm ứng cho Nhà vườn, lưu nháp / hủy giao dịch, nộp lại tiền |
| Nhà vườn | App (đăng nhập SĐT + OTP qua Zalo) | Xác nhận hoặc từ chối khoản tạm ứng, xem lịch sử tiền của vườn |
Nguyên tắc cốt lõi
- Tiền chỉ được ghi nhận khi người nhận xác nhận.
- Ba điểm bắt buộc có ảnh bằng chứng: Kế toán chi cho NV, NV chi cho Nhà vườn, NV nộp lại cho Kế toán.
- Không tạm ứng cho Nhà vườn vượt số dư khả dụng (số dư trừ các giao dịch đang chờ Nhà vườn xác nhận). App cảnh báo số còn thiếu; NV lưu nháp hoặc hủy, tạo đề xuất tạm ứng thêm gửi Giám đốc, nhận được tiền thì gửi tiếp giao dịch nháp.
- Mọi thao tác tiền được lưu lịch sử, không sửa, không xóa; sai thì tạo bút toán điều chỉnh.
- Mỗi NV chỉ thấy khách hàng của mình.
- Mọi thao tác bắt buộc có mạng; app không có chế độ ngoại tuyến.
- Nhà vườn không có smartphone (hiếm, hạn chế): NV xác nhận thay bằng 1 ảnh: ảnh chuyển khoản, hoặc ảnh biên lai có chữ ký chụp cùng Nhà vườn (mục 2.3). Không có bước duyệt lại; chỉ tra soát khi có sự cố.
Số dư Nhân viên là con số tính ra từ dòng tiền, không nhập tay:
Số dư khả dụng = Số dư NV − Các giao dịch đang chờ Nhà vườn xác nhận
Các khoản đang chờ xác nhận hiển thị riêng, không làm thay đổi số dư. App dùng số dư khả dụng để kiểm tra khi NV tạo giao dịch mới.
2. Sơ đồ luồng xử lý
Toàn bộ hệ thống là 3 loại phiếu – đề xuất tạm ứng, giao dịch tạm ứng Nhà vườn, yêu cầu nộp lại – mỗi loại đi qua các trạng thái riêng. Sơ đồ đầu cho thấy tiền đi qua ai; ba sơ đồ sau là trạng thái từng loại phiếu.
2.1 Luồng tiền tổng thể
Luồng tiền tổng thể · 4 vai trò, 9 khâu
Ba ô tô đậm là ba lần người nhận xác nhận: chỉ ở ba bước này số dư NV mới thay đổi. Phần thu hồi (7–9) độc lập với luồng tạm ứng, Giám đốc khởi tạo bất cứ lúc nào.
2.2 Trạng thái đề xuất tạm ứng (khâu 1–4)
Trạng thái đề xuất tạm ứng · khâu 1–4
Cùng một luồng cho đề xuất đơn lẻ và danh sách hàng loạt; với hàng loạt, cả danh sách đi cùng một trạng thái đến khi Kế toán chi, sau đó từng NV xác nhận riêng phần của mình.
2.3 Trạng thái giao dịch tạm ứng Nhà vườn (khâu 5–6)
Trạng thái giao dịch tạm ứng Nhà vườn · khâu 5–6
Số dư khả dụng (đã trừ các giao dịch đang chờ) không đủ thì app cảnh báo số còn thiếu và giao dịch không gửi được: NV lưu nháp (hoặc hủy) và tạo đề xuất tạm ứng thêm theo mục 2.2; khi đã xác nhận nhận tiền, NV mở lại nháp và gửi tiếp. Giao dịch đã xác nhận thì không hủy được; chưa xác nhận thì tiền vẫn tính trên tay NV.
2.4 Trạng thái yêu cầu nộp lại (khâu 7–9)
Trạng thái yêu cầu nộp lại · khâu 7–9
Khi nhận thiếu, Kế toán nhập số thực nhận + lý do; phần còn lại vẫn là khoản phải nộp của yêu cầu đó cho đến khi nộp đủ.
2.5 Chuyển khách hàng khi NV nghỉ việc
- Kế toán mở quy trình "Chuyển khách hàng" cho NV nghỉ việc.
- Hệ thống liệt kê giao dịch còn chờ Nhà vườn xác nhận → NV xử lý xong (xác nhận hoặc hủy).
- Số dư NV còn lại → Giám đốc tạo yêu cầu nộp lại, đi theo khâu 7–9 đến khi về 0 (hoặc xử lý đặc biệt).
- Toàn bộ khách hàng chuyển sang Kế toán quản lý; lịch sử cũ giữ nguyên tên NV.
- Khóa tài khoản NV.
Bước 2–3 là đề xuất, chưa được chốt.
3. Các màn hình công việc
Tổng cộng khoảng 33 màn hình cho 4 vai trò, dùng chung 1 app mobile (giao diện đổi theo vai trò) và 1 web quản trị cho Kế toán, Giám đốc.
Dùng chung (mọi vai trò)
| # | Màn hình | Nội dung chính |
|---|---|---|
| C1 | Đăng nhập | SĐT + OTP qua Zalo, SMS dự phòng (Nhà vườn); SĐT + mật khẩu hoặc OTP (nội bộ) |
| C2 | Thông báo | Danh sách việc cần làm, bấm vào mở thẳng phiếu liên quan |
| C3 | Xem ảnh bằng chứng | Phóng to, xem nhiều ảnh, thời gian và người tải lên |
| C4 | Lịch sử phiếu | Dòng thời gian mọi thao tác trên 1 phiếu (ai, lúc nào, lý do) |
| C5 | Tài khoản | Thông tin cá nhân, đăng xuất |
Nhân viên thu mua (app)
| # | Màn hình | Nội dung chính |
|---|---|---|
| N1 | Trang chủ | Số dư đang giữ, số dư khả dụng, tiền chờ nhận, tiền chờ NV xác nhận, việc cần làm |
| N2 | Tạo / sửa đề xuất tạm ứng | Số tiền, hình thức, khu vực, ghi chú; sửa khi bị yêu cầu chỉnh sửa |
| N3 | Danh sách đề xuất của tôi | Lọc theo trạng thái |
| N4 | Xác nhận nhận tiền từ KT | Xem số tiền + ảnh; nút Xác nhận / Báo sai lệch |
| N5 | Danh sách khách hàng | Mã, tên, SĐT, địa chỉ, tổng đã tạm ứng, đang chờ xác nhận; tìm kiếm |
| N6 | Tạo khách hàng mới | Họ tên, SĐT (kiểm tra trùng), địa chỉ/khu vực, ghi chú; mã tự sinh |
| N7 | Chi tiết khách hàng | Dòng tiền chi / nhận, lịch sử từng giao dịch |
| N8 | Tạo giao dịch tạm ứng Nhà vườn | Chọn KH, số tiền, hình thức, chụp/chọn ảnh; số dư khả dụng không đủ thì cảnh báo số còn thiếu và không gửi được: Lưu nháp / Hủy / Tạo đề xuất tạm ứng thêm (điền sẵn số tiền còn thiếu); Nhà vườn không có smartphone: xác nhận bằng 1 ảnh (chuyển khoản hoặc biên lai ký chụp cùng Nhà vườn) |
| N9 | Giao dịch nháp & chờ xác nhận | Nháp: gửi tiếp khi đủ số dư hoặc hủy; Đang chờ: nhắc Nhà vườn, hủy (kèm lý do) |
| N10 | Yêu cầu nộp lại | Số phải nộp, đã nộp, còn thiếu; nộp kèm ảnh |
Nhà vườn (app)
| # | Màn hình | Nội dung chính |
|---|---|---|
| V1 | Trang chủ | Tổng đã nhận, khoản đang chờ xác nhận |
| V2 | Xác nhận khoản tạm ứng | Số tiền, NV, ảnh; nút Xác nhận / Từ chối |
| V3 | Lịch sử tiền của vườn | Các đợt tạm ứng, lọc theo thời gian, hình thức |
Kế toán (web, xem nhanh trên app)
| # | Màn hình | Nội dung chính |
|---|---|---|
| K1 | Bảng việc | Đề xuất chờ chi, phiếu sai lệch, tiền nộp lại chờ xác nhận |
| K2 | Lập / sửa danh sách hàng loạt | Nhiều dòng NV – số tiền – hình thức – ghi chú; nhập từ Excel |
| K3 | Chi tiền | Theo đề xuất hoặc danh sách đã ký; tải ảnh chuyển khoản/biên lai |
| K4 | Đối soát sai lệch | Phiếu NV báo sai; điều chỉnh hoặc chi bổ sung |
| K5 | Xác nhận tiền nộp lại | Nhận đủ / nhận một phần (nhập số thực nhận + lý do) / không nhận được |
| K6 | Chuyển khách hàng | NV nghỉ việc: kiểm tra giao dịch chờ, số dư, chuyển KH về KT |
| K7 | Quản lý người dùng | Tạo/khóa tài khoản NV, phân vai trò |
| K8 | Báo cáo & xuất Excel | Dòng tiền theo NV, theo Nhà vườn, theo kỳ, theo nhãn Mua vườn/Mua trái |
Giám đốc / Chủ vựa (app + web)
| # | Màn hình | Nội dung chính |
|---|---|---|
| G1 | Tổng quan | Tổng tiền đang nằm trên tay NV, chờ duyệt, chờ xác nhận |
| G2 | Duyệt đề xuất đơn lẻ | Duyệt / Từ chối / Yêu cầu chỉnh sửa (bắt buộc lý do) |
| G3 | Ký danh sách hàng loạt | Xem cả danh sách, ghi chú từng dòng, Ký / Trả về |
| G4 | Số dư Nhân viên | Danh sách NV + số dư + khoản chờ; chi tiết dòng tiền từng NV |
| G5 | Tạo yêu cầu nộp lại | Chọn NV, số tiền, lý do |
| G6 | Xử lý đặc biệt | Phiếu KT chuyển lên (không nhận được tiền); ghi quyết định |
| G7 | Báo cáo | Như K8, chỉ xem |
4. Kiến trúc & công nghệ đề xuất
Đề xuất 1 app mobile Flutter (Android + iOS) + 1 web quản trị + 1 backend có cơ sở dữ liệu PostgreSQL. Một bộ mã app chạy cả Android và iOS nên không phải làm hai app riêng.
| Thành phần | Công nghệ đề xuất | Ghi chú |
|---|---|---|
| App mobile | Flutter | 1 app, giao diện theo vai trò; chụp ảnh, nén ảnh trước khi tải; luôn cần mạng, không làm ngoại tuyến |
| Web quản trị | React / Next.js | Cho Kế toán, Giám đốc: danh sách dài, nhập/xuất Excel |
| Backend API | NestJS (Node.js) hoặc Supabase | Kiểm tra quyền, chuyển trạng thái, tính số dư |
| Cơ sở dữ liệu | PostgreSQL | Giao dịch tiền cần tính toàn vẹn (transaction) |
| Lưu ảnh | S3 / Cloudflare R2 / Supabase Storage | Ảnh nén ~200 KB/ảnh |
| Thông báo đẩy | Firebase Cloud Messaging | Miễn phí |
| OTP | Zalo ZNS qua Zalo OA; SMS dự phòng | Chỉ cho đăng nhập Nhà vườn; không nhận được qua Zalo thì tự gửi SMS |
| Máy chủ | VPS tại VN hoặc cloud (AWS Singapore) | Sao lưu dữ liệu hằng ngày |
Mô hình dữ liệu chính
| Bảng | Giữ gì |
|---|---|
users | Tài khoản nội bộ: Giám đốc, Kế toán, Nhân viên; trạng thái hoạt động / đã khóa |
customers | Nhà vườn: mã tự sinh, tên, SĐT (duy nhất), địa chỉ, NV phụ trách |
advance_requests | Đề xuất tạm ứng đơn lẻ hoặc 1 dòng của danh sách hàng loạt |
batch_lists | Danh sách hàng loạt, trạng thái ký, phiên bản |
disbursements | Khoản chi Kế toán → NV, trạng thái xác nhận / sai lệch |
farmer_advances | Giao dịch NV → Nhà vườn, gồm cả nháp; liên kết đề xuất tạm ứng thêm (nếu có) |
refund_requests | Yêu cầu nộp lại: số yêu cầu, đã nhận, còn thiếu |
refund_payments | Từng lần NV nộp, số KT thực nhận, lý do thiếu |
ledger_entries | Sổ cái: mỗi dòng tiền đã xác nhận = 1 bút toán; số dư NV tính từ đây |
attachments | Ảnh bằng chứng gắn với từng phiếu |
audit_logs | Mọi thao tác: ai, lúc nào, trạng thái cũ → mới, lý do |
customer_transfers | Lịch sử chuyển khách hàng khi NV nghỉ việc |
notifications | Thông báo gửi tới từng người |
5. Chuẩn bị triển khai
Dự kiến khoảng 5 tháng từ lúc chốt đặc tả đến khi đưa vào dùng thật (ước tính, sơ đồ các giai đoạn ở cuối mục này). Phía chủ app cần chuẩn bị các việc sau, nhiều việc làm song song ngay từ tuần đầu vì phải chờ xét duyệt.
Giấy tờ & tài khoản (bắt đầu sớm nhất)
- Tài khoản Google Play Console (doanh nghiệp): 25 USD, trả 1 lần.
- Tài khoản Apple Developer (doanh nghiệp): 99 USD/năm; cần mã D-U-N-S của công ty.
- Tạo Zalo OA doanh nghiệp (xác thực bằng giấy phép kinh doanh) và đăng ký mẫu tin ZNS gửi OTP; chọn nhà cung cấp gửi SMS dự phòng.
- Tên miền cho web quản trị và trang chính sách quyền riêng tư (store bắt buộc; dữ liệu cá nhân Nhà vườn thuộc phạm vi Nghị định 13/2023).
Dữ liệu ban đầu
- Danh sách Giám đốc, Kế toán, Nhân viên (tên, SĐT, vai trò).
- Danh sách ~5.000 Nhà vườn đang có (Excel) kèm NV phụ trách, để nhập một lần.
- Quy tắc mã khách hàng và danh mục khu vực.
- Các khoản tạm ứng đang dở dang lúc chuyển sang app: chốt số và nhập thành bút toán mở đầu.
Con người
- 1 đầu mối nghiệp vụ phía chủ (nên là Kế toán): trả lời câu hỏi, duyệt giao diện, chạy thử.
- Nhóm phát triển nhỏ 3 người: 1 lập trình app Flutter, 1 lập trình backend + web, 1 người bán thời gian kiêm thiết kế giao diện và kiểm thử; đầu mối phía chủ app theo dõi tiến độ.
- Buổi đào tạo cho Giám đốc, Kế toán, Nhân viên; NV hướng dẫn Nhà vườn cài app khi đến vườn.
Thiết bị & vận hành
- 60 điện thoại NV có camera và 4G (bắt buộc có mạng khi thao tác); Nhà vườn cần smartphone, trừ trường hợp hiếm xác nhận bằng ảnh.
- Chạy thử với 2–3 NV và vài Nhà vườn trước khi mở cho tất cả.
- Người tiếp nhận hỗ trợ sau phát hành, sao lưu dữ liệu hằng ngày.
Câu hỏi mở cần chốt
- Chỉ Android hay cả Android + iOS? (so sánh ở mục 6.4; cần biết bao nhiêu Nhà vườn dùng iPhone)
Các giai đoạn triển khai · 4 giai đoạn, 3 mốc duyệt
Thời gian là ước tính cho nhóm nhỏ 3 người (thuê công ty 4–5 người thì nhanh hơn khoảng 4 tuần); đăng ký store và Zalo OA nên làm ngay tuần 1 vì phải chờ xét duyệt.
6. Ước tính chi phí
Phương án đề xuất: thuê nhóm nhỏ 3 người và gửi OTP qua Zalo OA. Năm đầu ước ~255 triệu đồng nếu chỉ Android, ~280 triệu nếu Android + iOS; vận hành khoảng 4–5 triệu đồng/tháng. Đây là số gần đúng theo mặt bằng thị trường, chưa phải báo giá; cần lấy 2–3 báo giá thật dựa trên tài liệu này.
Quy mô: 1 Giám đốc, 1 Kế toán, 60 NV thu mua, 5.000 Nhà vườn. Số giao dịch chưa ước tính được; tạm giả định ~9.000 giao dịch/tháng, mỗi giao dịch 1 ảnh. Con số này chỉ ảnh hưởng chi phí lưu ảnh: kể cả gấp 3 lần vẫn dưới 1,5 triệu đ/tháng.
6.1 Chi phí xây dựng – nhóm nhỏ 3 người
| Vai trò (triệu đ) | PA1: Chỉ Android | PA2: Android + iOS |
|---|---|---|
| Lập trình backend + web quản trị (~18/tháng) | 5 tháng – 90 | 5 tháng – 90 |
| Lập trình app Flutter (~18/tháng) | 4,5 tháng – 81 | 5 tháng – 90 |
| Thiết kế giao diện (thuê trọn gói) | 15 | 15 |
| Kiểm thử bán thời gian (~12/tháng) | 1,5 tháng – 18 | 2 tháng – 24 |
| Tổng xây dựng | ~200 | ~220 |
| Thời gian đến khi dùng thật | ~20 tuần | ~21 tuần |
So với thuê công ty (~320 / ~350 triệu, ~15–17 tuần), nhóm nhỏ rẻ hơn khoảng 120–130 triệu nhưng chậm hơn khoảng 1 tháng và phụ thuộc vào ít người hơn.
Giữ an toàn khi thuê nhóm nhỏ
- Hợp đồng ghi phạm vi theo tài liệu này, thanh toán theo 3 mốc: duyệt giao diện, đủ chức năng, chạy thử đạt.
- Mã nguồn nằm trên kho của công ty (GitHub/GitLab) từ ngày đầu; bàn giao tài liệu cài đặt, vận hành.
- Tài khoản store, Zalo OA, máy chủ, tên miền đều đứng tên công ty.
- Cam kết bảo hành sửa lỗi 3–6 tháng sau phát hành.
6.2 OTP qua Zalo OA
Gửi OTP bằng tin ZNS của Zalo OA thay SMS giảm chi phí OTP từ ~4 xuống ~1,8 triệu đ/tháng. Nhà vườn không nhận được qua Zalo thì hệ thống tự gửi SMS dự phòng.
| Khoản | Cách tính | Triệu đ/tháng |
|---|---|---|
| Zalo OA gói Nâng cao | 99.000 đ/tháng | ~0,1 |
| Tin ZNS gửi OTP | 5.000 Nhà vườn × tối đa ~1 lần/tháng × ~300 đ/tin | ~1,5 |
| SMS dự phòng | giả định ~5% Nhà vườn không nhận được Zalo × ~800 đ/tin | ~0,2 |
| Tổng OTP | ~1,8 |
Cần có: Zalo OA doanh nghiệp đã xác thực, mẫu tin ZNS OTP được Zalo duyệt, SĐT Nhà vườn trùng SĐT dùng Zalo. Giữ phiên đăng nhập 30–90 ngày để ít phải gửi lại OTP. Giá tin ZNS tham khảo 100–500 đ/tin tuỳ mẫu tin và nhà cung cấp; cần hỏi giá chính thức khi đăng ký.
6.3 Chi phí cố định & vận hành
| Khoản cố định | Chi phí |
|---|---|
| Google Play Console | 25 USD, 1 lần (~650 nghìn đ) |
| Apple Developer (chỉ PA2) | 99 USD/năm (~2,6 triệu đ/năm) |
| Tên miền | ~300–500 nghìn đ/năm |
| Khoản vận hành | Cách tính | Triệu đ/tháng |
|---|---|---|
| Máy chủ + cơ sở dữ liệu + sao lưu | Cloud cỡ vừa cho 62 người dùng nội bộ + 5.000 Nhà vườn | 2–3 |
| Lưu ảnh | ~1,8 GB ảnh mới/tháng (~22 GB/năm), tích luỹ dần | < 0,5 |
| OTP (Zalo OA + SMS dự phòng) | Mục 6.2 | ~1,8 |
| Thông báo đẩy (Firebase) | Miễn phí | 0 |
| Tổng | ~4–5 |
Bảo trì sau phát hành: khoảng 15–20% chi phí xây dựng mỗi năm (~30–45 triệu đ/năm với nhóm nhỏ), hoặc thỏa thuận phí duy trì cố định hằng tháng.
6.4 Tổng năm đầu: chỉ Android hay Android + iOS
| Khoản (triệu đ) | PA1: Chỉ Android | PA2: Android + iOS |
|---|---|---|
| Xây dựng (nhóm nhỏ) | ~200 | ~220 |
| Vận hành 12 tháng | ~54 | ~54 |
| Tài khoản store, tên miền | ~1 | ~4 |
| Tổng năm đầu | ~255 | ~280 |
| Từ năm thứ 2 (vận hành + bảo trì) | ~85–95/năm | ~90–100/năm |
| Tham khảo: năm đầu nếu thuê công ty | ~375 | ~405 |
Cách phát hành nội bộ công ty
- Android: đưa lên Google Play (có thể hạn chế người cài) hoặc gửi file APK cho NV cài trực tiếp. Với Nhà vườn nên dùng Google Play để họ tự cập nhật và không bị điện thoại cảnh báo không an toàn.
- iOS: không cài file trực tiếp được. Cách thực tế nhất là App Store dạng "không công khai" (chỉ ai có đường link mới cài được), vẫn phải qua Apple duyệt mỗi lần cập nhật.
Rủi ro của PA1: 60 NV thì công ty quy định dùng Android được, nhưng 5.000 Nhà vườn thì không. Nhà vườn dùng iPhone sẽ phải xác nhận bằng ảnh, trái với nguyên tắc đây là trường hợp hiếm và hạn chế.
Tỷ giá tạm tính 1 USD ≈ 26.000 đ. Đơn giá nhân sự, máy chủ là ước tính từ hiểu biết chung về thị trường. Giá Zalo lấy từ kết quả tìm kiếm, chưa phải bảng giá chính thức: gói OA theo ViettelStore; ZNS OTP theo Brands Vietnam.