Skip to content

MOP 2.3 — Committee Formation: Roles & Access Levels

Audience: society_admin Outcome: A per-event committee with a shared dashboard login, a typed member roster and bank credentials for collecting/spending event funds — without giving committee members access to the rest of the society's data.

1. Lifecycle

            ┌────────────────┐
   Event ──▶│ Create         │── Sets committee_email + committee_password
            │ Committee      │   (bcrypt-hashed, isolated to this event)
            └─┬──────────────┘
            ┌────────────────┐
            │ Add members    │── Two flows: New / Pick From Other Committee
            │ (chair, sec,…) │
            └─┬──────────────┘
            ┌────────────────┐
            │ Edit Settings  │── Update credentials, bank a/c, vendor toggle
            └────────────────┘

2. Add Committee Member modal — two tabs

2.1 New Member

Captures name (req), email, phone, role (member/coordinator/secretary/treasurer). Member email is for contact / identification only — committee LOGIN remains shared per committee.

2.2 Pick From Other Committee (NEW)

Lists members from other committees of the same society (and same phase if the admin is phase-bound). Select one → imported with their existing user_id/role.

Strict isolation guarantee: the endpoint never returns members from another society. See MOP 1.3.

Pick From Other Committee tab

3. Editing credentials & bank a/c

Edit Settings modal exposes: - Committee email (login) - Committee password (leave blank to keep, ≥ 6 chars to change) - Bank account holder, name, number, IFSC, UPI

Backend split: email + password go through PUT /api/admin/events/{event_id}/committee/credentials (super/society admin only, bcrypt). Bank goes through PUT /api/events/{event_id}/committee/bank-account.

4. APIs touched

Method Endpoint
GET /api/events/{event_id}/committee
POST /api/events/{event_id}/committee
POST /api/events/{event_id}/committee/members
PUT /api/admin/events/{event_id}/committee/credentials
PUT /api/events/{event_id}/committee/bank-account
PUT /api/admin/events/{event_id}/committee/vendor-access?enabled=true|false
GET /api/admin/events/{event_id}/committee/available-members

5. Data model

event_committees
  id, event_id, society_id, child_society_id (inherited),
  name, description,
  committee_email, password_hash,
  bank_account: { account_holder_name, bank_name, account_number, ifsc_code, upi_id },
  members: [{ user_id, name, email, phone, role, policy_accepted, … }],
  can_view_vendor_applications: bool,
  status, created_at, updated_at

6. Edge cases & FAQ

  • Forgot committee password → admin opens Edit Settings and types a new one (gets hashed). The committee dashboard at /api/committee-dashboard immediately accepts the new credentials.
  • Cross-society leak (closed) — historic bug fixed in Apr 2026: the Pick-From-Other-Committee list previously could leak across societies. Now strictly society + phase scoped.
  • MOP 2.5 — Committee Submissions Approval (Step 5 wizard)
  • MOP 3.3 — Committee Member Content Submission