Phiên rà soát hub ngày 15/06/2026 · 4 mục + 1 ghi chú quyết định · DRAFT — INTERNAL · không phân phối
1/4 xong (working tree) · I4 xong chờ deploy · I3 lỗi thật chờ sửa · I1 chờ xác minh sống · I2 không cần sửa · N1 ghi chú quyết định (không sửa code) · cập nhật 15/06/2026
Mỗi mục là một nhận xét khi xem hub sống, kèm chẩn đoán (file/dòng), cách sửa đề xuất, quyết định của người dùng và trạng thái. Tên học sinh, mã hồ sơ và email tài khoản đã được ẩn (trang này công khai).
| Mã | Việc | Trạng thái |
|---|---|---|
| I1 | Tài khoản nhân viên (1 khu vực) vẫn thấy tab/khu vực không được cấp quyền — rà soát phân quyền chéo khu vực | CHỜ XÁC MINH |
| I2 | Tạo tài khoản: "Chưa cấu hình gửi email" — đặt mật khẩu qua liên kết sao chép | KHÔNG SỬA |
| I3 | "Phúc lợi theo nguồn tài trợ": Quỹ Thành Nhân hiển thị Tổng = 0 dù có thỏa thuận | CẦN SỬA |
| I4 | Thêm 2 biểu mẫu Google (Phiếu hoạt động + Khảo sát học sinh) vào tab Trợ giúp | XONG (chờ deploy) |
| N1 | Ghi chú quyết định: Google Forms là cổng tải lên (sign-in OK) — không sửa code, có 2 thiết lập cần xác minh | GHI NHẬN |
Page: /care (Quản lý học sinh) · screenshot 2026-06-15 (tài khoản test, avatar "TT").
User comment (verbatim):
User's interface still show un-authorised tabs. Picture is a student-access only account. Double check and make sure all works consistently.
Read & root-cause:
request.state.granted_modules (app/templates/hub/base.html:33-56): một tài khoản chỉ có khu vực care sẽ không thấy link Hoạt động / Kế hoạch nội dung / Bài đợi duyệt / Tài trợ & tài chính.app/hub.py:342-358) chuyển hướng 303 → /khong-co-quyen nếu khu vực không được cấp; bản đồ đường dẫn ở _PATH_MODULES (app/hub.py:89-106).app/templates/base.html:129-134 hiển thị KHÔNG điều kiện — nhưng đây ĐÚNG: cấp quyền care = toàn bộ khu vực học sinh (xác nhận của user, xem dưới).Decision (user, 2026-06-15): Cấp quyền care = toàn bộ 4 tab khu vực học sinh (roster + phân tích + báo cáo + cảnh báo). KHÔNG ẩn các tab care. Vấn đề thực = đảm bảo các khu vực không được cấp (content / finance) không thể vào được qua URL trực tiếp và không lọt link nào.
Câu hỏi mở: ảnh chụp là phiên care-only hay phiên admin? Nếu admin thì các tab là đúng và không có lỗi. Xác minh sống sẽ chốt.
Fix đề xuất (sau xác minh):
/plan, /review, /trips, /finance đều 303 → /khong-co-quyen; /survey + /care/* đều mở được. Ghi lại link nào trong trang care trỏ chéo khu vực._PATH_MODULES, hoặc middleware chưa phủ một sub-app mount).Chặn bởi: mật khẩu tài khoản test (hoặc cho phép tôi đặt mật khẩu qua luồng liên kết) để probe URL sống.
Page: /quan-tri/nguoi-dung (Quản lý tài khoản) · screenshot 2026-06-15.
User comment (verbatim):
The email account notifications and password setup are not in place I believed. Just tried to create one.
Read & root-cause:
app/hub.py:525-576). Liên kết đặt mật khẩu được sinh, ký, có hạn (care_auth.make_setpw_token, tools/care_auth.py:167-185; xác thực read_setpw_token, 188-210).tools/mailer.py) đã xây nhưng trơ vì chưa đặt HMT_SMTP_HOST + HMT_SMTP_FROM. Khi đó make_mailer() trả None → admin sao chép liên kết và gửi tay (app/templates/hub/users_admin.html:16-24).password_hash='' = "Chờ đặt mật khẩu"; sau khi đặt → "Đang hoạt động" (tools/care_auth.py:242-253; UI users_admin.html:58).Decision (user, 2026-06-15): giữ luồng sao-chép-liên-kết (copy-link only). Không đổi code. Bật email sau này chỉ là đặt 2 secret HMT_SMTP_HOST + HMT_SMTP_FROM (+ user/pass/TLS) lên Cloud Run.
Lưu ý (flag): domain trong liên kết mời là hub-dev.hoamattroi.org — xác nhận đây là URL bạn thực sự phát cho người dùng. Nếu vẫn ở URL dev, người được mời sẽ đặt mật khẩu trên môi trường dev chứ không phải prod.
Page: báo cáo "Phúc lợi theo nguồn tài trợ" (bảng Nguồn · Số mục · Tổng VND) · screenshot 2026-06-15.
User comment (verbatim):
Why don't we have amounts for Quỹ Thành Nhân. All the agreements are in place.
Read & root-cause (đã truy nguyên):
amount_vnd=NULL (không bịa một mức chia tiền cho từng em, theo claims.md). Tiền của thỏa thuận nằm trên dòng register_entry (kind=funding), không trên từng dòng học sinh.benefit per-student (tools/benefit_report.py:170-172 → _group_by bỏ qua NULL ở 129-152). Vì vậy Quỹ Thành Nhân: Số mục = 44 / 108 / 181 (đếm dòng) nhưng Tổng = 0 (mọi amount đều NULL).tools/benefit_report.py:253-255; fetch funding 107-126).Decision (user, 2026-06-15): Gộp tổng thỏa thuận vào bảng theo nguồn — để Quỹ Thành Nhân hiển thị số tiền cam kết thật thay vì 0.
Fix:
tools/benefit_report.py, mở rộng tổng hợp "Theo nguồn tài trợ" sao cho mỗi nguồn = (tổng amount_vnd per-student) + (tổng amount_vnd các dòng register_entry funding khớp), khóa theo chuỗi funding_source.funding_source (170-172 gộp với 107-126).benefit_report.py:408-437) để khẳng định số tiền thỏa thuận xuất hiện trong bảng theo nguồn (hiện chỉ kiểm tên nguồn).Không chặn: hoàn toàn tự chứa, không cần thông tin đăng nhập — sẵn sàng làm trước.
Page: /tro-giup (Trợ giúp & công cụ).
User request (verbatim):
I also want to publish the 2 google forms to Trợ giúp tab.
Quyết định (user, 2026-06-15): hai biểu mẫu = Phiếu thông tin hoạt động (điều phối viên) + Phiếu khảo sát học sinh. (Form thứ ba — Đăng ký tài trợ — không chọn lần này.)
Đã làm:
/tro-giup (app/hub.py) dựng danh sách forms: id phiếu hoạt động đọc từ HMT_BRIEF_FORM_ID (đã có trong .env); id khảo sát đọc từ HMT_SURVEY_FORM_ID với giá trị mặc định là id đã cấp (chưa có trong .env). Cả hai render link …/viewform.app/templates/hub/tro_giup.html: thêm mục "Biểu mẫu Google" dưới "Mẫu văn bản", dùng lại lưới tpl-card + mẫu link ngoài target="_blank" rel="noopener" ↗ như tab Pháp lý.Kiểm thử: ruff sạch · 42/42 test hub pass · render sống trả 200 với cả hai link biểu mẫu.
Lưu ý:
forms_provision.py --apply, xem _system/forms/PROVISIONING.md). User chọn biết điều này.HMT_SURVEY_FORM_ID vào .env để bỏ giá trị mặc định cứng trong code.management-hub (deploy -Only management-hub, ~2 phút) để hiển thị trên hub sống — hành động ra ngoài, cần go-ahead theo từng lần (workspace-ethics.md §2).Bối cảnh: hỏi Google có cổng tải-lên an toàn cắm-sẵn không — không có (Google không có sản phẩm tải-lên có thương hiệu, không cần đăng nhập). "Hub upload (preferred)" trong care-data.md là thứ gần nhất ta sở hữu.
Quyết định (admin, 2026-06-15): chọn Google Forms làm cổng cho điều phối viên/nhà trường, chấp nhận yêu cầu đăng nhập Google. Người nộp đa số không có tài khoản tổ chức — Gmail cá nhân là được, không bắt buộc @hoamattroi.org.
Lý do giữ thiết kế tách rời (folder-link upload): ràng buộc thật của Forms file-upload là bức tường đăng nhập, không phải bất khả thi. Forms có câu hỏi tải file, nhưng (a) người trả lời phải đăng nhập, (b) SA của ta không tạo được (Forms.create() → 500; người tạo, SA --sync), (c) file rơi vào Drive của người tải, không phải care bucket. ⇒ giữ đường folder-link vì lý do tài khoản/quota/SA, không phải vì giới hạn cứng của Forms.
Hai thiết lập cần xác minh khi form lên sống (cho người nộp không tài khoản):
Thiết lập "Anyone with the link" trên form school-report (HMT_SCHOOL_REPORT_FORM_ID, khác form khảo sát ở I4) đã thỏa #1.
Cờ chuyển hội đồng quản trị: tài liệu chăm sóc đi qua một tài khoản Google ngoài Foundation trên đường nạp vào (gật đầu firewall / care-data.md §3) — cái giá của đường Forms-sign-in so với trang upload trên hub.
Không sửa code: registry, service school_report, đường upload tách rời đều không đổi. Đã lưu vào memory forms-as-upload-portal-decision.