City Bus Pass Renewal and Concession Management System is a full-stack web application for a fictional tier-2 city transport corporation — we call it Kaveri City Transport — built for the situation every Indian commuter knows: joining the monthly queue at the pass counter, filling the same form again after the pass expires, and hoping the conductor believes the laminated card is still valid.
The system gives citizens a portal to register once, apply for a pass in a concession category (student, senior citizen, differently-abled or general), upload the supporting document, pay the fee by recording a UPI or counter-payment reference, and download a pass carrying a QR code. Counter clerks verify documents and approve or reject applications with a reason; conductors scan the QR on boarding and the system answers instantly whether the pass is valid — with every check logged. Renewal reuses the citizen's data: three clicks and a payment reference, no re-typing. Admins manage pass categories, concession percentages, routes and reports (passes issued, revenue by category and route, expiry due-lists).
The application is built exactly on the C-20 Full-Stack pathway: React 18 with TypeScript on the front end, Spring Boot 3 with Spring Data JPA serving a REST API, MySQL 8 as the database, JWT-based authentication with BCrypt-hashed passwords, and JUnit 5 and Postman covering the tests. It demonstrates role-based access control, transactional renewal logic, QR generation and audit logging — a viva-defensible slice of real public-transport administration.
A tier-2 city transport corporation issues thousands of monthly and quarterly bus passes, yet the process is almost entirely manual: paper forms, registers, hand-written receipts and a printed card whose validity the conductor cannot verify at the door. Citizens re-apply from scratch every cycle and queue at the counter; concession eligibility is judged from photocopies with no recorded decision; expired or tampered passes ride for free; and the office learns its own revenue only at month end, counted by hand. The corporation needs a secure, role-based web system that lets citizens apply and renew online, enforces configurable concession rules with an audit trail, gives conductors instant QR-based verification, records payments transactionally, and produces revenue and expiry reports on demand — without storing government ID numbers.
Synopsis
Abstract
City bus corporations sell thousands of passes a month, and in most tier-2 cities the work is still manual: paper forms, register entries, counter queues and passes whose validity a conductor can only guess at. This project delivers a role-based web system for pass applications, concession handling, QR-verified boarding, renewals and reporting, built with React, Spring Boot and MySQL following the C-20 Full-Stack pathway.
Introduction
A city transport corporation's pass office is its busiest public counter. The queue exists because the process is re-verification from scratch: the same citizen re-fills the same details every month or quarter, the clerk re-enters them into a register, concession eligibility is judged by eye from photocopies, and revenue reporting means counting pages at month end. Karnataka's larger corporations have digital passes; a smaller city corporation needs something simpler and cheaper that still covers applications, concessions, verification and renewals properly. That is the system we built.
Existing System
Applications are paper forms; details are re-entered into a register for every renewal.
Concession eligibility is checked from photocopied documents with no recorded decision trail.
The pass is a printed card; a conductor cannot reliably tell valid from expired or tampered at the door.
Payments are receipted by hand; revenue reports are compiled manually by category and route.
Limitations: repeated queues, no audit trail, concession leakage, no near-real-time reporting, and no way to remind citizens before expiry.
Proposed System
Citizen portal: one-time registration with mobile number, document upload, application tracking through approval, and expiry reminders on the dashboard.
Concession engine: concession percentages are admin-configurable rules, not hard-coded values; the clerk's approval is logged with their user id.
QR pass: each pass carries a QR encoding the pass number; the conductor's page resolves it against the server and shows validity and category, and every scan is logged.
Payments: payment is recorded with a channel (counter or UPI reference); a pass becomes Active only on confirmed payment, recorded transactionally.
Renewal: a renewal reuses stored citizen data, requires a fresh payment reference and (for students) a current bonafide, and issues the new pass in one transaction.
Reports: passes issued, revenue by category and route, expiry due-list and concession-leakage summary, exportable as CSV.
Privacy by design: the system stores no government ID numbers — identity is a phone number and the documents the corporation actually needs.
Feasibility Study
Technical: the entire stack — React, Spring Boot, Spring Data JPA, MySQL, JUnit, Postman — is the C-20 Full-Stack pathway toolset; QR generation uses the open-source ZXing library; everything runs on one lab PC or a small cloud instance.
Economic: zero licence cost; the corporation's existing office PC and internet connection are enough, and counter staff already handle worse software.
Operational: citizens need only a phone with a browser; clerks need a half-hour orientation; the conductor flow is a single scan-and-answer screen designed for one-handed use between stops.
Objectives
01Design a normalised MySQL schema (3NF) for citizens, pass categories, applications, passes, payments, verifications and office users, with foreign keys and uniqueness rules that prevent an active duplicate pass.
02Implement JWT-based authentication with BCrypt password hashing and role-based access control for Citizen, Clerk, Conductor and Admin roles.
03Build the application workflow — Submitted → Under Review → Approved/Rejected → Active — with document upload, clerk remarks and a complete audit trail.
04Implement admin-configurable concession categories and percentages so the concession engine needs no code change to add a scheme.
05Generate a QR-coded pass per approved application and provide a conductor verification endpoint that logs every scan with time, result and pass id.
06Record payments transactionally (counter or UPI reference) and activate a pass only on confirmed payment, keeping partial refund and rejection states consistent.
07Provide one-transaction renewal that reuses citizen data, refreshes student bonafide documents and issues the new pass with new validity.
08Build role-specific dashboards and CSV reports (revenue by category and route, expiry due-list, verification statistics) and cover the service layer with JUnit 5 tests plus a Postman collection for the API.
Scope
In scope
One fictional corporation (Kaveri City Transport) with multiple routes, pass categories, counter clerks, conductors and an administrator.
Citizen registration, application, document upload, approval workflow, payment recording, QR pass issue, conductor verification, renewal and reports.
Role-based access control, audit logging of approvals and scans, CSV exports, and JUnit/Postman test evidence.
Out of scope (v1)
No online payment gateway — payments are recorded with a UPI reference or counter receipt, which keeps the demo offline-safe.
No offline conductor verification (the v1 verification endpoint requires connectivity; a cached-validation PWA is future work).
No GPS tracking, route planning or ticketing for cash passengers; no SMS/email gateway (reminders are shown on the dashboard).
No biometric authentication and no storage of government ID numbers — by design, not omission.
Methodology
The project follows an iterative (incremental) SDLC model across the 16-week slot: three increments, each ending in a demonstrable system, with reviews mapped to the C-20 schedule.
Phase
Weeks
Activities
Deliverable
Requirement analysis
1–2
Study a real counter's workflow (observation + staff interview), list functional/non-functional requirements, model categories and concession rules
Testing approach: JUnit 5 covers the service layer — concession calculation, renewal transaction consistency, payment-to-activation rule, duplicate-pass prevention. Postman exercises every REST endpoint including negative cases (expired token, wrong role, double payment). Each screen has a black-box test-case row (ID, input, expected, actual, status), and a user-acceptance round is run with classmates acting as citizens and a conductor, using the seeded demo data.
Architecture & tech stack
3 diagrams · 9 technologies · 2 min read
React 18 + TypeScript
Spring Boot 3 (Java 17)
Spring Data JPA
MySQL 8
Spring Security + JWT (industry-standard extra)
ZXing QR code generation
Maven
JUnit 5
Postman
The system is a classic three-tier full-stack application: a React single-page front end, a Spring Boot REST API, and a MySQL database, secured by a JWT-based stateless auth layer.
flowchart LR
C["Citizen / Clerk / Admin browser"] -->|"HTTPS"| R["React 18 SPA (TypeScript)"]
K["Conductor phone"] -->|"HTTPS"| R
R -->|"REST + JWT header"| A["Spring Boot REST API"]
A --> S["Spring Security filter chain"]
S --> L["Service layer: concession rules, renewal, verification"]
L --> J["Spring Data JPA"]
J --> DB[("MySQL 8")]
L --> Q["ZXing QR generator"]
L --> AU["Audit log of approvals and scans"]
DB --> RPT["CSV report export"]
Presentation tier. The React SPA renders role-specific dashboards, guards routes by role claim from the JWT, and keeps API calls in a typed client so a changed endpoint fails at compile time, not in the demo.
Application tier. The API exposes resources (citizens, applications, passes, payments, verifications, reports). The service layer owns the business rules: the concession engine reads percentages from the category table; activation and renewal run inside @Transactional methods so a payment and a pass state can never disagree; and every approval or QR scan is appended to the audit log with the acting user and timestamp.
Data tier. The schema is normalised to 3NF with the constraints that make wrong states impossible:
erDiagram
CITIZEN ||--o{ APPLICATION : submits
APPLICATION }o--|| PASS_CATEGORY : "belongs to"
APPLICATION ||--o| PASS : "issued as"
APPLICATION ||--o{ PAYMENT : "is paid by"
PASS ||--o{ VERIFICATION_LOG : "generates"
OFFICE_USER ||--o{ APPLICATION : reviews
CITIZEN {
int id PK
string mobile UK
string email
string full_name
}
PASS_CATEGORY {
int id PK
string name
int concession_percent
boolean needs_bonafide
}
APPLICATION {
int id PK
int citizen_id FK
int category_id FK
string status
datetime applied_at
}
PASS {
int id PK
int application_id FK
string pass_no UK
date valid_from
date valid_to
}
PAYMENT {
int id PK
int application_id FK
decimal amount
string channel
string reference
}
VERIFICATION_LOG {
int id PK
int pass_id FK
datetime scanned_at
string result
}
OFFICE_USER {
int id PK
string username UK
string role
}
Pass lifecycle. The state machine below is enforced in the service layer, so no pass can become Active without a confirmed payment, and a rejection always carries a reason:
flowchart TD
A["Application submitted"] --> B["Under review (clerk)" ]
B -->|"Approved"| C["Awaiting payment"]
B -->|"Rejected with reason"| X["Closed"]
C -->|"Payment recorded + confirmed"| D["Pass issued, QR generated, Active"]
D -->|"Validity ends"| E["Expired — renewal reuses citizen data"]
E -->|"Renewal approved + paid"| D
Why these choices. MySQL for relational integrity and the transactions the renewal logic depends on; Spring Boot for a testable, convention-driven API the pathway already teaches; JWT so the conductor's phone needs no server-side session; QR rather than NFC because every conductor already carries a phone camera and printed passes still work as a fallback.
Modules
6 modules
Module 01
Authentication & Role-Based Access (Member 1)
Spring Security with a JWT filter chain, BCrypt-hashed passwords, and four roles (Citizen, Clerk, Conductor, Admin). Route guards on the React side mirror server-side checks, so a citizen calling a clerk endpoint with a stolen-but-expired token gets a 401 and a citizen token gets a 403 — enforcement is never in the UI alone.
One-time citizen registration (mobile unique, email optional), application submission with category selection and document upload stored on the server, status tracking on the citizen dashboard, and the Submitted → Under Review → Approved/Rejected state machine with clerk remarks and audit entries.
Module 03
Concession Engine & Review Queue (Member 2)
Admin-configurable categories with concession percent, validity length and a needs-bonafide flag; the clerk's review queue lists pending applications with documents side by side, computes the fee (base fare stage × category concession) and records the approving user — no percentage is hard-coded anywhere.
Module 04
Payments & Pass Issue with QR (Member 2)
Payment recording with channel (counter/UPI) and reference, @Transactional activation that flips the application to Active and generates the pass number and ZXing QR image only on confirmed payment, plus rejection/refund states kept consistent in the same transaction boundary.
Module 05
Conductor Verification & Renewal (Member 3)
A scan-first verification screen for phones that resolves a QR pass number server-side, answers valid/expired/wrong-route in one call, and writes every attempt to the verification log; and the one-transaction renewal that reuses citizen data, requires a fresh payment reference and current bonafide for students, and issues the new pass.
Admin dashboards with revenue by category and route, expiry due-list and verification statistics, CSV export for office records; JUnit 5 tests for the concession, renewal and duplicate-pass rules; a Postman collection covering every endpoint including role-negative cases; and the seeded demo dataset for the viva demo.
Slides
12 slides · titles free · bullets, notes and the .pptx unlock
Slide 1
City Bus Pass Renewal & Concession Management System
Slide 2
Introduction
Slide 3
Problem Statement
Slide 4
Existing vs Proposed System
Slide 5
Objectives
Slide 6
Technology Stack
Slide 7
System Architecture
Slide 8
Database Design
Slide 9
Pass Lifecycle & Concession Engine
Slide 10
Demo
Slide 11
Testing
Slide 12
Conclusion & Future Scope
Bullets, speaker notes and the .pptx · ₹2,000
The titles above are the real outline. The rest is what you present from.
Read each answer, close it, and say it in your own words. Your viva will ask. Now you'll know.
01Concept
Why did you choose JWT authentication instead of server-side sessions?
The API is stateless and the same token has to work from a citizen's laptop and a conductor's phone browser, possibly through a proxy. A JWT carries the user id and role inside a signed token, so any API instance can authorise a request without a session store, and the conductor's verification flow stays fast. We keep the token lifetime short and store it in memory on the client, and the signature check happens in the Spring Security filter chain on every request.
02Concept
How does your design prevent a citizen from holding two active passes at once?
The database enforces it, not the UI. An application can only transition to Active inside a transaction that first checks for an existing active, unexpired pass for the same citizen and category — a query with a unique constraint backing it — and rejects with a clear error if one exists. Renewal explicitly supersedes the old pass by ending its validity, so the invariant 'at most one active pass per citizen per category' holds at the data layer.
03Concept
What is normalisation, and up to which normal form is your schema?
Normalisation removes redundancy and update anomalies: 1NF gives atomic values, 2NF removes partial dependencies, and 3NF removes transitive ones. Our schema is in 3NF — for example, concession percentage lives only in PASS_CATEGORY, never repeated on applications, and route names live in the route table rather than on passes. Derived values like computed fees are not stored; they are calculated from the category and fare-stage data at approval time.
+13 more questions, with answers
Try the free ones out loud first. Your examiner will not accept “it's in the PPT”.
Craig Walls, Spring in Action, 6th ed., Manning Publications
Roger S. Pressman and Bruce R. Maxim, Software Engineering: A Practitioner's Approach, 9th ed., McGraw-Hill
Cite this bundle
OnlyProjects. (2026). City Bus Pass Renewal and Concession Management System (React + Spring Boot + MySQL): Diploma (Polytechnic) Information Technology project bundle [Educational resource]. https://onlyprojects.online/projects/diploma-it-bus-pass-renewal-concession-system
Future scope
1 min read
Online payments through a UPI gateway with automatic reconciliation and receipts.
Offline-capable conductor verification (PWA with cached pass data and server sync) for routes with patchy connectivity.
SMS/WhatsApp expiry reminders and renewal links for citizens who do not revisit the portal.
Route-wise occupancy analytics from verification scans to help schedule extra buses on peak corridors.
Inspector mode with a fine workflow for invalid passes, closing the enforcement loop.
Multi-corporation (multi-tenant) deployment so smaller corporations can share one hosted instance.
Keep browsing
More Diploma (Polytechnic) Information Technology projects
Same degree, same syllabus slot, different idea. Pick the one your guide will actually approve.