Skip to content

Instantly share code, notes, and snippets.

@hongquan
Created June 29, 2018 15:22
Show Gist options
  • Save hongquan/da0b380b537299117ca66b3e48692212 to your computer and use it in GitHub Desktop.
Save hongquan/da0b380b537299117ca66b3e48692212 to your computer and use it in GitHub Desktop.
Ý tưởng phần mềm Ruabien, sắp lịch Tình nguyện viên bảo tồn động vật hoang dã

Mục đích

Ứng dụng giúp sắp xếp các TNV theo nhóm, mỗi nhóm sẽ làm việc 1 tuần, hoặc số ngày cố định, tùy chương trình.

Action flow

  • Admin tạo chương trình mới, đặt tên, đặt ngày tháng bắt đầu và kết thúc, đặt ngày "mở đăng ký".
  • Sinh khung thời gian làm việc (timeslot). Admin chỉ định số ngày mỗi khung sẽ kéo dài (mặc định là 7). Ứng dụng sẽ dựa vào ngày tháng của chương trình để sinh các slot.
  • Tới ngày mở đơn đăng ký, địa chỉ của đơn đăng ký sẽ có thể được truy cập (public available).
  • Khi truy cập link đăng ký, người dùng sẽ được yêu cầu đăng nhập, hoặc đăng ký nếu chưa có tài khoản.
  • Người dùng cần đăng ký tài khoản, xây dựng profile (tên, hình, email, điện thoại, ngày sinh, CMND...). Có thể đăng nhập/đăng ký bằng tài khoản mạng xã hội (Facebook, Google+).
  • Nên có bước xác thực email và số điện thoại.
  • Nếu đã đăng nhập, form đăng ký chương trình sẽ yêu cầu người dùng đánh dấu vào những slot mà họ có thể tham gia.
  • Admin vào trang tạo nhóm tự động (mỗi nhóm sẽ được gán với 1 timeslot, theo quan hệ 1-1). Trước khi sinh nhóm, admin có thể đặt ra tiêu chí, ví dụ nhóm phải có ít nhất một cựu tình nguyện viên.
  • Khi sinh nhóm tự động, ứng dụng sẽ sắp xếp TNV ngẫu nhiên, có xét đến khoảng thời gian TNV có thể tham gia, và tiêu chí xếp người của admin.
  • Ứng dụng sẽ trưng bày bản review phân nhóm trước khi admin thông qua.
  • Khi bảng phân nhóm đã được lưu, admin có thể yêu cầu sắp xếp lại.
  • Khi admin lưu bảng phân nhóm, những TNV bị thay đổi nhóm (tuần làm việc) sẽ được email thông báo tự động.
  • Khi TNV cần thay đổi tuần làm việc, có thể vào form gửi yêu cầu thay đổi. TNV được xem bảng phân nhóm và chọn thử.
  • Khi TNV gửi yêu cầu, admin được thông báo và có thể thấy một trang liệt kê danh sách các yêu cầu.
  • Admin có thể xem trang chi tiết một yêu cầu đổi tuần làm việc. Trong trang này sẽ thể hiện bảng phân nhóm review, giả định TNV đã được chuyển. Nếu việc chuyển đổi gây phá vỡ tiêu chí (như làm cho 1 nhóm không có cựu TNV) thì sẽ có dấu hiệu cảnh báo.
  • Admin bấm nút Approve, bảng phân nhóm được lưu và email gửi thông báo.
  • Admin bấm nút Reject, viết lí do từ chối. Email được tự động gửi đến TNV.
  • Admin có thể tự dời đổi TNV bất kì trong bảng phân nhóm (bằng cách kéo thả). Sau khi lưu bảng, sẽ có email thông báo đến TNV bị thay đổi.
  • Admin chọn một thành viên trong nhóm làm trưởng nhóm (captain). Thành viên này sẽ được thể hiện hơi khác trong bảng (tô màu đậm hơn chẳng hạn).

Cơ sở dữ liệu

Các model (diễn đạt theo ORM). Ở đây theo mẫu của Django, nên một số model (Group, Permission) không đề cập (dùng lại của Django).

  • Program

    • name
    • start_at (timezone-aware DateTime type)
    • end_at
    • description
    • open_for_registration (True/False)
    • close_at
    • require_experienced_member (Team must have member who used to join previous program)
  • Timeslot

    • program (ForeignKey)
    • start_at
    • end_at
  • Team

    • timeslot (on-to-one relationship)
    • name
    • program (the same as timeslot.program. Exists here just to let lookup faster).
  • User

    • email (for login)
    • password
    • full_name
    • phone_number
    • is_superuser (Can edit everything)
    • is_staff (Can edit some, depending on role)
  • Application

    • program
    • user
    • status (pending/rejected/enrolled)
    • submitted_at
    • solved_at
    • solved_by
  • WorkableTime

    • application
    • timeslot
  • TeamMember (Represent many-to-many relationship between Team and User)

    • team
    • user
    • is_captain
  • MoveRequest

    • user
    • created_at
    • original_team (ForeignKey)
    • destination_team (ForeignKey)
    • accepted_at
    • rejected_at
    • reject_reason
    • is_solved (boolean, prevent user from creating many pending requests)
    • solved_by (ForeignKey to User)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment