Punch list — Trung tâm điều hành

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).

Tổng hợp

ViệcTrạng thái
I1Tà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ựcCHỜ XÁC MINH
I2Tạ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épKHÔ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ậnCẦN SỬA
I4Thêm 2 biểu mẫu Google (Phiếu hoạt động + Khảo sát học sinh) vào tab Trợ giúpXONG (chờ deploy)
N1Ghi 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 minhGHI NHẬN

Chi tiết

I1 — Tài khoản 1 khu vực vẫn thấy khu vực không được cấp quyền CHỜ XÁC MINH SỐNG

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:

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):

  1. Xác minh sống với tài khoản test (care-only): xác nhận sidebar ẩn 4 khu vực kia, và truy cập trực tiếp /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.
  2. Vá bất kỳ lỗ hổng phát hiện (link template chưa lọc, đường dẫn thiếu trong _PATH_MODULES, hoặc middleware chưa phủ một sub-app mount).
  3. Thêm test hồi quy: nhân viên care-only → 303 trên từng khu vực không được cấp; admin → 200 trên tất cả.

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.

I2 — "Chưa cấu hình gửi email" khi tạo tài khoản KHÔNG CẦN SỬA (đúng thiết kế)

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:

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.

I3 — "Phúc lợi theo nguồn tài trợ": Quỹ Thành Nhân Tổng = 0 CẦN SỬA (lỗi trình bày)

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):

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:

  1. Trong 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.
  2. Tránh đếm trùng: tiền một nguồn đến từ hoặc dòng per-student hoặc tổng thỏa thuận, không cả hai — khớp đúng chuỗi funding_source (170-172 gộp với 107-126).
  3. Giữ mục "Tài trợ cấp trường/lứa (thỏa thuận)" như cũ, HOẶC thêm một dòng ghi chú rằng tổng của nó đã phản ánh ở bảng trên — chốt khi triển khai.
  4. Cập nhật fixture selftest (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).
  5. Đối chiếu số thật: Quỹ Thành Nhân 2025-2026 (181 mục) phải hiển thị tổng thỏa thuận, không phải 0.

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.

I4 — Thêm 2 biểu mẫu Google vào tab Trợ giúp XONG (working tree · chờ deploy)

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:

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 ý:

  1. Phiếu khảo sát hiện vẫn là placeholder (1 câu hỏi chưa đặt tên) — link mở được nhưng form rỗng cho tới khi nạp nội dung (forms_provision.py --apply, xem _system/forms/PROVISIONING.md). User chọn biết điều này.
  2. Tùy chọn: thêm HMT_SURVEY_FORM_ID vào .env để bỏ giá trị mặc định cứng trong code.
  3. Cần deploy service 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).

N1 — Ghi chú quyết định: Google Forms là cổng tải lên GHI NHẬN (không sửa code)

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):

  1. Giới hạn tổ chức ("Limit to users in Quỹ Hoa Mặt Trời") TẮT.
  2. Thu thập email BẬT.

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.

Quỹ Hoa Mặt Trời · Trung tâm điều hành · phiên rà soát 15/06/2026 · DRAFT — INTERNAL. Trang công khai: đã ẩn tên/mã học sinh, email tài khoản và token đặt mật khẩu.