#117

feat: add member-facing self sign-in page

Openjasonappahwants to merge intofrom

Description

Members can sign themselves in with a Net ID instead of requiring an officer to swipe their card. The page records self sign-ins and shows relevant dues and Discord-linking prompts.

  • Prefills the Net ID from an active session, or from browser storage after a successful sign-in. Signing out clears the stored value.
  • Confirms an unknown Net ID before starting the existing email registration flow, which returns to the event after registration when a new link is issued.
  • Records attendance for unpaid members and links to the latest-ending active term's dues. Dues enforcement based on a configurable deadline is not implemented.
  • Backs up the attendance table, removes duplicate event/user rows while retaining the earliest record, and adds a database uniqueness constraint. Rows with no user remain untouched. The backup is a data snapshot and is retained on migration rollback.

Verified with migration, concurrency, membership overlap, and sign-in tests, the full project test suite, and the project's formatting and type checks.

Pre-Merge Checklist

  • I've tested my code and solemnly swear that it works flawlessly
  • For features, new functionality, or major refactors: My changes are gated behind feature flag(s).
    • SELF_CHECK_IN, default off. Disabled, the page 404s and records no attendance. Web registration is separately gated by WEB_ACCOUNT_REGISTRATION.