A comprehensive web-based application for managing student transcripts, marksheets, and academic records with multi-role authentication (Admin, Teacher, Student).
- Overview
- Features
- Tech Stack
- Installation
- Configuration
- Usage
- Database Schema
- API Documentation
- Testing
- Deployment
- Security
- Troubleshooting
- Contributing
- License
This Laravel-based Transcript Management System streamlines academic record management, enabling:
- Automated mark entry and CGPA calculation
- PDF marksheet generation
- Online transcript requests with payment processing
- Multi-role access control (Student, Teacher, Admin)
Live Demo: [Coming Soon]
- β Secure registration and authentication
- β View enrolled courses and marks
- β Request official transcripts
- β Integrated payment gateway (SSLCommerz)
- β Track request status in real-time
- β Download PDF marksheets
- β Comprehensive mark entry system (Theory/Lab/Special courses)
- β Student search and enrollment verification
- β Automated marksheet generation with CGPA
- β View student academic history
- β Bulk mark entry support
- β User management (Students, Teachers, Admins)
- β Academic year and term configuration
- β Course catalog management
- β Transcript request processing
- β Payment verification and tracking
- β System reports and analytics
- β Document upload and management
- Multi-guard authentication system
- Role-based access control (RBAC)
- CSRF protection
- XSS prevention
- SQL injection protection
- Secure payment processing
| Category | Technology |
|---|---|
| Backend | Laravel 12.x, PHP 8.2+ |
| Database | SQLite (dev), MySQL/PostgreSQL (prod) |
| Frontend | Blade Templates, Bootstrap 5 |
| Authentication | Laravel Breeze (Multi-Guard) |
| Payment | SSLCommerz (Bangladesh) |
| PDF Generation | DomPDF / Laravel PDF |
| Version Control | Git, GitHub |
| Server | Apache/Nginx |
Ensure you have the following installed:
- PHP >= 8.2 (Download)
- Composer (Download)
- Node.js & NPM (Download)
- Git (Download)
- Database: SQLite (dev) or MySQL/PostgreSQL (production)
git clone https://github.com/SImunna00/transcript-management.git
cd transcript-management# Install PHP dependencies
composer install
# Install JavaScript dependencies
npm install
# Build assets
npm run build# Copy environment file
cp .env.example .env
# Generate application key
php artisan key:generateEdit .env with your settings:
APP_NAME="Transcript Management System"
APP_ENV=local
APP_KEY=base64:generated_key_here
APP_DEBUG=true
APP_URL=http://localhost:8000
# Database Configuration (SQLite for development)
DB_CONNECTION=sqlite
# DB_DATABASE=/absolute/path/to/database.sqlite
# For MySQL/PostgreSQL in production
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=transcript_db
# DB_USERNAME=root
# DB_PASSWORD=your_password
# SSLCommerz Payment Configuration (Sandbox)
SSLCOMMERZ_STORE_ID=your_store_id
SSLCOMMERZ_STORE_PASSWORD=your_store_password
SSLCOMMERZ_SANDBOX=true
# For Production
# SSLCOMMERZ_SANDBOX=false
# Mail Configuration (for notifications)
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@transcript.edu
MAIL_FROM_NAME="${APP_NAME}"
# Session & Cache
SESSION_DRIVER=file
CACHE_DRIVER=file
QUEUE_CONNECTION=sync# Create SQLite database (if using SQLite)
touch database/database.sqlite
# Run migrations
php artisan migrate
# Seed database with sample data
php artisan db:seed
# Or run specific seeders
php artisan db:seed --class=AcademicYearSeeder
php artisan db:seed --class=TermSeeder
php artisan db:seed --class=TeacherCourseSeeder# Create symbolic link for storage
php artisan storage:link
# Set permissions (Linux/Mac)
chmod -R 775 storage bootstrap/cache
# On Windows (run as Administrator in CMD)
# icacls storage /grant Users:F /T
# icacls bootstrap/cache /grant Users:F /T# Start Laravel development server
php artisan serve
# In another terminal, watch for asset changes
npm run devVisit: http://localhost:8000
-
Register for SSLCommerz Sandbox Account
- Visit: https://developer.sslcommerz.com/registration/
- Create a sandbox account (free)
-
Get Credentials
- Login to SSLCommerz Sandbox Dashboard
- Navigate to: Settings β API Credentials
- Copy Store ID and Store Password
-
Add to
.env:SSLCOMMERZ_STORE_ID=test123456 # Your sandbox store ID SSLCOMMERZ_STORE_PASSWORD=test123456@ssl # Your sandbox password SSLCOMMERZ_SANDBOX=true
-
Test Credentials (Sandbox):
# Default SSLCommerz sandbox credentials for testing SSLCOMMERZ_STORE_ID=testbox SSLCOMMERZ_STORE_PASSWORD=qwerty SSLCOMMERZ_SANDBOX=true
-
Get Live Account
- Contact SSLCommerz: https://sslcommerz.com/
- Complete merchant verification
- Get production credentials
-
Update
.env:SSLCOMMERZ_STORE_ID=your_live_store_id SSLCOMMERZ_STORE_PASSWORD=your_live_password SSLCOMMERZ_SANDBOX=false # Important: Set to false for production
-
Configure IPN URL (Instant Payment Notification):
- In SSLCommerz dashboard, set IPN URL to:
https://yourdomain.com/payment/ipn
For sandbox testing, use these test cards:
| Card Type | Card Number | CVV | Expiry | Status |
|---|---|---|---|---|
| Visa | 4242424242424242 | 123 | Any future date | Success |
| MasterCard | 5555555555554444 | 123 | Any future date | Success |
| Amex | 378282246310005 | 1234 | Any future date | Success |
| Decline | 4000000000000002 | 123 | Any future date | Declined |
Mobile Banking (Sandbox):
- bKash: Use any 11-digit number starting with 01
- Rocket: Use any 11-digit number starting with 01
- Nagad: Use any 11-digit number starting with 01
For development, use Mailtrap:
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_mailtrap_username
MAIL_PASSWORD=your_mailtrap_passwordFor production, use services like:
- Gmail SMTP
- SendGrid
- Amazon SES
- Mailgun
# Configure Git to auto-convert line endings
git config core.autocrlf true| Role | Password | |
|---|---|---|
| Admin | admin@example.com | password |
| Teacher | teacher@example.com | password |
| Student | student@example.com | password |
| Role | Login URL | Register URL | Dashboard URL |
|---|---|---|---|
| Student | /login |
/register |
/dashboard |
| Teacher | /teacher/login |
/teacher/register |
/teacher/dashboard |
| Admin | /admin/login |
/admin/register |
/admin/dashboard |
- Register/Login β Student portal
- View Courses β See enrolled courses
- Request Transcript:
- Fill request form
- Make payment via SSLCommerz (supports bKash, Rocket, Nagad, Credit/Debit cards)
- Track request status
- Download Marksheet β PDF generation
- Login β Teacher portal
- Select Academic Period β Choose year and term
- Search Student β Find by ID/name
- Enter Marks:
- Theory marks (CA, Semester, Total)
- Lab marks
- Special course marks
- Generate Marksheet β Auto-calculate CGPA and create PDF
- View Reports β Student performance analytics
- Login β Admin panel
- Manage Users β Add/edit students, teachers
- Configure Academic Year β Set terms and dates
- Manage Courses β Add/edit course catalog
- Process Requests:
- Review transcript requests
- Verify payments
- Approve/reject requests
- Generate Reports β Analytics dashboard
Student β Request Transcript β SSLCommerz Payment Page
β
Choose Payment Method (Card/bKash/Rocket/Nagad)
β
Complete Payment β SSLCommerz validates
β
Success β IPN callback β Update request status
β
Admin reviews β Approve/Process transcript
users (Students)
βββ id
βββ name
βββ email
βββ student_id (unique)
βββ academic_year_id
βββ term_id
βββ timestamps
teachers
βββ id
βββ name
βββ email
βββ department
βββ timestamps
admins
βββ id
βββ name
βββ email
βββ timestamps
academic_years
βββ id
βββ year (e.g., "2024-2025")
βββ start_date
βββ end_date
terms
βββ id
βββ academic_year_id
βββ name (e.g., "1st Term")
βββ timestamps
courses
βββ id
βββ code (unique)
βββ name
βββ type (theory/lab/special)
βββ credit_hours
βββ timestamps
enrollments
βββ id
βββ user_id
βββ course_id
βββ academic_year_id
βββ term_id
βββ timestamps
theory_marks
βββ id
βββ user_id
βββ course_id
βββ academic_year_id
βββ term_id
βββ ca_marks
βββ semester_marks
βββ total_marks
βββ timestamps
lab_marks
βββ id
βββ user_id
βββ course_id
βββ marks
βββ timestamps
special_marks
βββ id
βββ user_id
βββ course_id
βββ marks
βββ timestamps
marksheets
βββ id
βββ user_id
βββ academic_year_id
βββ term_id
βββ cgpa
βββ file_path
βββ timestamps
transcript_requests
βββ id
βββ user_id
βββ request_date
βββ status (pending/approved/rejected)
βββ payment_status (pending/paid/failed)
βββ payment_id (SSLCommerz transaction ID)
βββ payment_method (card/bkash/rocket/nagad)
βββ session (academic year)
βββ amount
βββ timestamps
UserhasManyEnrollments,Marks,TranscriptRequestsCoursehasManyEnrollments,MarksAcademicYearhasManyTerms,Users,EnrollmentsTermbelongsToAcademicYear
GET /api/courses
GET /api/academic-years# Student
GET /api/student/marks
GET /api/student/transcripts
POST /api/student/transcript-request
# Teacher
POST /api/teacher/marks
GET /api/teacher/students/{id}
# Admin
GET /api/admin/users
POST /api/admin/courses
PUT /api/admin/requests/{id}/approve# Initialize payment
POST /payment/checkout
{
"request_id": 1,
"amount": 500,
"currency": "BDT"
}
# Payment success callback
POST /payment/success
# Payment failure callback
POST /payment/fail
# Payment cancel callback
POST /payment/cancel
# IPN (Instant Payment Notification)
POST /payment/ipncurl -X POST http://localhost:8000/api/teacher/marks \
-H "Authorization: Bearer your_token_here" \
-H "Content-Type: application/json" \
-d '{
"user_id": 1,
"course_id": 5,
"ca_marks": 30,
"semester_marks": 70
}'# Run all tests
php artisan test
# Run specific test file
php artisan test tests/Feature/MarkEntryTest.php
# Run with coverage
php artisan test --coverage
# Run specific test method
php artisan test --filter=test_teacher_can_enter_marksTests are located in tests/Feature and tests/Unit.
Example test:
public function test_student_can_request_transcript()
{
$student = User::factory()->create();
$response = $this->actingAs($student)
->post('/transcript-request', [
'session' => '2024-2025',
'payment_method' => 'sslcommerz'
]);
$response->assertStatus(200);
$this->assertDatabaseHas('transcript_requests', [
'user_id' => $student->id
]);
}- Upload files via FTP/File Manager
- Move
publicfolder contents topublic_html - Update
.env:APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com # SSLCommerz Production SSLCOMMERZ_SANDBOX=false SSLCOMMERZ_STORE_ID=your_live_store_id SSLCOMMERZ_STORE_PASSWORD=your_live_password
- Run migrations via SSH or cPanel Terminal:
php artisan migrate --force
- Set folder permissions:
chmod -R 755 storage bootstrap/cache
# Install dependencies
sudo apt update
sudo apt install php8.2 php8.2-fpm php8.2-mysql nginx composer
# Clone repository
cd /var/www
git clone https://github.com/SImunna00/transcript-management.git
cd transcript-management
# Install dependencies
composer install --optimize-autoloader --no-dev
npm install && npm run build
# Set permissions
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
# Configure Nginx (create /etc/nginx/sites-available/transcript)
server {
listen 80;
server_name yourdomain.com;
root /var/www/transcript-management/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
# Enable site
sudo ln -s /etc/nginx/sites-available/transcript /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
# Set up SSL with Let's Encrypt
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com# Install Heroku CLI
# Login to Heroku
heroku login
# Create app
heroku create transcript-management-app
# Add PostgreSQL
heroku addons:create heroku-postgresql:hobby-dev
# Set environment variables
heroku config:set APP_KEY=$(php artisan key:generate --show)
heroku config:set APP_ENV=production
heroku config:set APP_DEBUG=false
heroku config:set SSLCOMMERZ_STORE_ID=your_store_id
heroku config:set SSLCOMMERZ_STORE_PASSWORD=your_password
heroku config:set SSLCOMMERZ_SANDBOX=false
# Deploy
git push heroku main
# Run migrations
heroku run php artisan migrate --force-
Remove development files:
rm public/file-explorer.php rm public/quick-access.html rm create-shortcut.bat rm navigate.bat
-
Update
.env:APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com SSLCOMMERZ_SANDBOX=false
-
Change default passwords
-
Enable HTTPS (SSL certificate)
-
Configure firewall
-
Set up database backups
-
Enable error logging (not displaying)
-
Restrict file permissions:
chmod -R 755 storage bootstrap/cache chmod 644 .env
-
Configure CORS if using API
-
Enable rate limiting
-
Set up monitoring (logs, uptime)
-
Whitelist SSLCommerz IPs for IPN callbacks
// Already implemented in the project:
- CSRF protection on all forms
- SQL injection prevention (Eloquent ORM)
- XSS protection (Blade escaping)
- Password hashing (bcrypt)
- Secure session management
- Input validation and sanitization
- Payment verification with SSLCommerz hash validation1. CRLF/LF Line Ending Warnings
# Solution: Configure Git
git config core.autocrlf true2. Permission Denied Errors
# Linux/Mac
chmod -R 775 storage bootstrap/cache
# Windows (as Administrator)
icacls storage /grant Users:F /T3. Class Not Found Errors
# Clear and rebuild autoload
composer dump-autoload
php artisan clear-compiled
php artisan config:clear
php artisan cache:clear4. Database Connection Failed
# Check .env database settings
# For SQLite, ensure database file exists
touch database/database.sqlite
# For MySQL, verify credentials
php artisan config:clear5. SSLCommerz Payment Errors
Error: "Store ID or Password incorrect"
# Verify credentials in .env
# For sandbox, use test credentials:
SSLCOMMERZ_STORE_ID=testbox
SSLCOMMERZ_STORE_PASSWORD=qwerty
SSLCOMMERZ_SANDBOX=true
# Clear config cache
php artisan config:clearError: "Payment gateway not responding"
# Check sandbox mode
SSLCOMMERZ_SANDBOX=true # For testing
# Verify network connectivity
curl https://sandbox.sslcommerz.com/gwprocess/v4/api.phpError: "IPN validation failed"
# Ensure IPN URL is publicly accessible
# Check logs: storage/logs/laravel.log
# Verify hash validation in PaymentController6. 500 Internal Server Error
# Check logs
tail -f storage/logs/laravel.log
# Check file permissions
# Enable debug mode temporarily (local only!)
APP_DEBUG=true7. Route Not Found
# Clear route cache
php artisan route:clear
php artisan route:cache8. Assets Not Loading
# Rebuild assets
npm run build
# Create storage link
php artisan storage:link# Show all routes
php artisan route:list
# Check database connection
php artisan db:show
# View configuration
php artisan config:show database
# Clear all caches
php artisan optimize:clear
# Run queue workers (if using queues)
php artisan queue:work
# Test SSLCommerz connection
php artisan tinker
>>> app('sslcommerz')->makePayment([...]);- Always use sandbox mode for development
- Test all payment methods: Card, bKash, Rocket, Nagad
- Test failure scenarios: Use decline test card
- Verify IPN callbacks: Check logs for webhook hits
- Test amount validation: Ensure minimum 10 BDT
Contributions are welcome! Please follow these steps:
-
Fork the repository
# Click "Fork" on GitHub -
Create a feature branch
git checkout -b feature/AmazingFeature
-
Make your changes
- Follow PSR-12 coding standards
- Write tests for new features
- Update documentation
-
Commit your changes
git commit -m 'Add some AmazingFeature' -
Push to the branch
git push origin feature/AmazingFeature
-
Open a Pull Request
- Describe your changes
- Reference related issues
This project follows PSR-12 coding standards.
# Check code style
./vendor/bin/phpcs
# Auto-fix code style
./vendor/bin/phpcbffeat: Add new feature
fix: Fix bug
docs: Update documentation
style: Code style changes
refactor: Code refactoring
test: Add tests
chore: Maintenance tasks
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2025 SImunna00
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SImunna00
- GitHub: @SImunna00
- Repository: transcript-management
- Email: support@example.com
- Laravel Framework - The PHP framework
- SSLCommerz - Payment gateway for Bangladesh
- Bootstrap - UI framework
- DomPDF - PDF generation
- All contributors and open-source community
Need help? Here's how to get support:
- π Documentation
- π Report a Bug
- π‘ Request a Feature
- π§ Email: support@example.com
- π¬ Discussions: GitHub Discussions
- Documentation: https://developer.sslcommerz.com/
- Support Email: support@sslcommerz.com
- Sandbox Dashboard: https://sandbox.sslcommerz.com/
Made with β€οΈ by SImunna00
Last Updated: November 2025 | Version: 1.0.0
β If you find this project helpful, please give it a star on GitHub!