About this software
About ERP
RiyanERP is a Laravel 12 monolith serving HR, payroll, attendance, sales, purchase, inventory, invoicing, accounting and project management for Bangladeshi businesses. It enforces Bangladesh labour law (provident fund, tax slabs, festival bonus, final settlement), integrates ZKTeco biometric devices via ADMS push protocol, and offers role-based access (admin, manager, employee) with a separate employee self-service portal. The UI is Bangla/English (Bootstrap 5 + Blade views), with CSV/PDF exports, an AI assistant for natural-language queries, and automated backups. No mobile app; deployment is Docker or traditional LAMP.
Why ERP
What makes it better
than the alternatives
- 01
Bangladesh labour law built-in
- 02
ZKTeco ADMS biometric push
- 03
Employee self-service portal
- 04
AI assistant for Bangla/English queries
- 05
Single-site Laravel monolith
HR & Employees
- Employee records (code
- join date
- department
- designation
- shift
- salary
- bank
- NID
- photo upload via EmployeePhotoService)
- Departments
- designations
- shift settings (in/out times
- grace
- half-day threshold
- OT rules)
- Lifecycle events: increment
- promotion
- increment-with-promotion
- separation (final settlement calculator)
- Appraisal cycles
- goals (weighted scoring)
- reviews
strengths/improvements/comments - overall rating)
- Recruitment: job postings
- applications
- interviews (scheduled/completed
- feedback
- hire/reject)
- Training sessions (title
- trainer
- attendees
- materials upload)
- Letters (appointment
- confirmation
- increment
- warning
- termination) from templates with placeholders
- Policies (code of conduct
- leave
- attendance) with version history and employee acknowledgement tracking
- Meetings (agenda
- attendees
- minutes
- action items)
- Gate pass (out/in times
- purpose
- vehicle
- approval workflow
- overdue alerts via CheckGatePassOverdue command)
- Outside duty (movement register
- daily report by department/employee)
- Employee reports: total list
- new joins
- released
- inactive
- shift-wise
- worker register (Form XII)
- picture list
- ID cards (bulk print)
Attendance & Biometric
- Manual attendance marking
present/absent/late/half_day - check-in/out times
late/early/OTminutes calculated from shift)- ZKTeco ADMS push: /
biometric/push/{api_key} receives ATTLOG - /iclock/getrequest delivers queued commands (BiometricCommandService)
- Direct TCP pull from ZKTeco devices (ZkTecoClient
- port 4370
- GET_ATTLOG command)
- BiometricDevice model (name
- IP
- port
- serial_number
- api_key
- protocol adms/iclock
- status active/inactive)
- BiometricPunch records (device_user_id
- punch_time
- punch_type 0=check-in/1=check-out
- verify_type
- processed flag)
- Auto-attendance generation: first punch = check-in
- last = check-out
- shift-based
late/early/OTmath - deduplication (same user within 1 minute)
- Live punches view (last 100
- unprocessed count
- manual process button)
- Employee sync to device: queueActiveEmployees() queues DATA UPDATE USERINFO commands for all active employees
- Attendance reports: daily (by date
- department
- status tabs)
- monthly (employee × days grid
P/A/L/H/OT- summary
present/absent/late/half_day/OT/missing-outcounts) - continuous absent (3+ days)
- job card (single employee
- date range
- daily
in/out/hours/OT
Payroll & Compliance
- Payroll generation (month/year
- department filter
- basic + allowances
- deductions
- gross/net
- PayrollCalculationService)
- Salary components: basic
- house_rent
- medical
- conveyance
- other_allowance
- attendance_bonus (configurable per employee)
- Deductions: provident_fund (employee + employer contributions
- PfService)
- income_tax (IncomeTaxService with Bangladesh slabs)
- advance
- loan_deduction
- fine
- other_deduction
- Overtime: ot_hours from attendance
- ot_rate per employee
- ot_amount = hours × rate (Section 108: 2× basic for first 2h
- then pro-rata)
- Festival bonus generation (Eid-ul-Fitr
- Eid-ul-Adha: basic salary
- pro-rated if <1 year service
- eligibility date
- payment date)
- Payslips (PDF export per employee
- Bangla/English
- breakdown of earnings/deductions
- net pay in words via NumberHelper)
- Payroll reports: summary sheet (employee list
gross/deductions/net- bank sheet (account-wise)
- denomination sheet (note/coin breakdown)
- OT sheet
- attendance bonus sheet
- advance sheet
- deduction sheet
- addition sheet
- income tax sheet (employee-wise tax
- cumulative YTD)
- Provident Fund: employee + employer contributions (configurable %)
- PF ledger per employee (opening
- contributions
- interest
- withdrawals
- closing)
- statement export
- Income Tax: slab-based calculation (first 300k exempt
- then 5%/10%/15%/20%/25% bands)
- tax certificate generation
- YTD tracking
- Loans: principal
- interest_rate
- installments
- start_date
- monthly deduction from payroll
- repayment schedule
- balance tracking
- Fines: amount
- reason
- deducted_from_payroll flag
- linked to payroll record
Leave Management
- Leave types: casual
- sick
- annual
- maternity
- paternity
- unpaid (days_per_year
- carry_forward
- max_carry_forward
- requires_approval)
- Leave applications (employee_id
- type
- from/to dates
- days
- reason
- status
pending/approved/rejected - approver_id
- approval_date)
- Leave balance tracking (earned
- taken
- balance per type per employee
- CheckLeaveExhaustion command alerts when balance <3 days)
- Approval workflow (manager/admin approves
- rejection reason
- email notification via NotifyService)
- Leave reports: register (all leaves by employee
- type
- dates)
- entry report (applications by status/date range)
- department report (leave summary by department)
- daily leave (who's on leave today)
Sales & Inventory
- Products (name
- code
- category
- unit
- purchase_price
- sale_price
- stock_quantity
- reorder_level
- status active/inactive)
- Categories (hierarchical
- parent_id)
- Stock alerts (products below reorder_level
- dashboard widget)
- Sales orders (customer
- date
- items × quantity × unit_price
- subtotal
- discount
- tax
- total
- status
draft/confirmed/delivered/cancelled - Invoices (proforma/final
- customer
- billing/shipping address
- items
- payment terms
- due date
- status
draft/sent/paid/overdue - print layouts:
standard/proforma/internal/price-record - Purchase orders (supplier
- date
- items
- total
- status
pending/received/cancelled - Customers (name
- phone
- address
- contact_person
- credit_limit
- outstanding_balance)
- Suppliers (name
- phone
- address
- contact_person
- payment_terms)
Accounting & Finance
- Chart of accounts (name
- type
asset/liability/equity/revenue/expense - balance
- status active/inactive)
- Transactions (date
- account_id
- type debit/credit
- amount
- description
- reference
- created_by)
- Expenses (date
- category
- account_id
- amount
- description
- receipt upload
- status
pending/approved/paid - Bills (supplier
- date
- due_date
- items
- total
- status
unpaid/paid/overdue - Financial reports: trial balance (debits/credits by account)
- profit & loss (revenue - expenses
- period filter)
- balance sheet (assets = liabilities + equity
- as-of date)
- cash flow
operating/investing/financingactivities) - account ledger (transaction history per account)
- FinancialReportService: trialBalance()
- profitAndLoss()
- balanceSheet()
- cashFlow() methods
Projects & Tasks
- Projects (name
- code
- client
- start/end dates
- budget
- status
planning/active/on-hold/completed/cancelled - Tasks (project_id
- title
- description
- assigned_to
- priority
low/medium/high/urgent - status
pending/in-progress/completed/cancelled - due_date
- estimated_hours
- actual_hours)
- Task comments and attachments
- Project dashboard (task counts by status
- budget vs actual
- timeline)
Employee Self-Service Portal
- Separate login (auth:employee guard
- EspAuthService checks user.status=active AND employee.status=active
- shared throttling with staff login)
- Dashboard (attendance summary
- leave balance
- upcoming holidays
- recent payslips)
- Attendance view (monthly calendar
- daily
in/out/hours/OT - job card export)
- Leave applications (apply
- view status
- balance per type)
- Payslips (list
- view
- download PDF)
- PF statement (contributions
- interest
- balance)
- Tax summary (YTD tax
- slab breakdown
- certificate download)
- Profile (view personal details
- change password
- upload photo)
- Queries (raise
HR/payroll/ITqueries - view responses
- status pending/resolved)
Settings & Admin
- Users (name
- role
admin/manager/employee - status active/inactive
- must_change_password flag
- linked employee_id)
- Roles: admin (all access)
- manager
HR/ops/reports - no
settings/users/payroll-generate/finance/biometric-devices - employee (ESP only
- scoped to own records via User::linkedEmployeeId())
- Module toggles (CheckModuleEnabled middleware
- config keys: modules.hr
- .payroll
- .attendance
- .leave
- .sales
- .inventory
- .accounting
- .projects)
- Company settings (name
- address
- logo upload
- shared to all views via AppServiceProvider)
- Backup settings (enabled
- frequency
daily/weekly/monthly - time
- include_files
- retention_days
- retention_min_count
- BackupService: mysqldump + optional storage/app tar
- auto-cleanup via RunBackup command)
- Notifications (in-app
- email via NotifyService
- AlertNotification class
- unread count in nav)
- Chat (internal messaging
- ChatController
- real-time via Pusher/polling stub)
- Data import (CsvImportService
- XlsxReader for
employees/attendance/products - validation
- duplicate detection
- dry-run preview)
- AI assistant (AiAssistantController
- keyword-matching for Bangla/English queries: employee count
- new joins
- department breakdown
- today's attendance
- late arrivals
- pending leave
- payroll totals
- stock alerts
- sales
- festival bonus status)
- Documentation (built-in help pages: getting-started
- employees
- attendance
- leave
- payroll
- hr-requests
- accounting
- inventory-sales
- projects
- letters-policies
- chat
- settings)
- Audit log (user actions
- IP
- timestamps — stub
- no model yet)
- Language switcher (Bangla/English
- SetLocale middleware
resources/lang/bn.json+ en.json)
Reports & Exports
- ExportsReports trait (CSV: headers + data rows
- PDF: PdfExportService with TCPDF
- landscape/portrait
- company header)
- Employee reports: total list
- new joins
- released
- inactive
- shift-wise
- worker register (Form XII)
- picture list
- ID cards
- Attendance reports: daily
- monthly
- summary
- continuous absent
- job card (all with CSV/PDF export)
- Payroll reports: summary
- bank
- denomination
- OT
- attendance bonus
- advance
- deduction
- addition
- income tax (all with CSV/PDF export)
- Leave reports: register
- entry
- department
- daily (CSV/PDF)
- Financial reports: trial balance
- P&L
- balance sheet
- cash flow
- account ledger (CSV/PDF)
- Sales reports: invoice list
- customer statement (CSV/PDF)
- Inventory reports: stock summary
- low stock
- product movement (CSV/PDF)
| Language | Version | Framework | Used for | Share of code |
|---|---|---|---|---|
| PHP | — | — | Web, API | 91.2% |
| SQL | — | — | Database | 8.4% |
| CSS | — | — | Styling | 0.3% |
| JavaScript | — | — | Front-end | 0.1% |
- Primary language
- PHP 8.2+
- Framework
- Laravel 12
- Database
- MySQL 5.7+ / MariaDB 10.3+
- Authentication
- Laravel session-based (web + employee guards), role-based access (admin, manager, employee), per-device API key for biometric endpoints
- Licence
- Single-site
- Screens
- 87
- Database tables
- 69
- Supported languages
- English, Bangla (bn.json, en.json)
- Browser support
- Modern browsers (Bootstrap 5 via CDN, Tailwind CSS 3 / Alpine.js for auth screens)
| Minimum | Recommended | |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 GB RAM / 20 GB SSD | 8 GB RAM / 40 GB SSD |
| OS | Ubuntu 22.04+ / Debian 11+, PHP 8.2+, MySQL 5.7+ / MariaDB 10.3+, Composer 2.x, Node.js 18+ (for Vite build) | Ubuntu 22.04+ / Debian 11+, PHP 8.2+, MySQL 5.7+ / MariaDB 10.3+, Composer 2.x, Node.js 18+ (for Vite build) |
| Est. monthly hosting | $25 | $25 |
```bash cp .env.example .env # Edit .env: set APP_KEY (php artisan key:generate), DB_PASSWORD, MYSQL_ROOT_PASSWORD (strong random 32+ chars) docker-compose up -d docker-compose exec app php artisan migrate --seed docker-compose exec app php artisan storage:link # Note the seeded admin password printed once, or set SEED_PASSWORD in .env before seeding # Access: http://localhost (or your domain) ```
```bash
sudo apt update && sudo apt install -y php8.2 php8.2-{cli,fpm,mysql,mbstring,xml,curl,zip,gd,bcmath} mysql-server nginx composer git nodejs npm
sudo mysql_secure_installation
sudo mysql -e "CREATE DATABASE erp_system; CREATE USER 'erp_user'@'localhost' IDENTIFIED BY 'STRONG_RANDOM_PASSWORD'; GRANT ALL ON erp_system.* TO 'erp_user'@'localhost'; FLUSH PRIVILEGES;"
cd /var/www
sudo git clone <repo-url> erp
cd erp
sudo chown -R www-data:www-data .
cp .env.example .env
# Edit .env: APP_KEY (php artisan key:generate), DB_* credentials, APP_URL
composer install --no-dev --optimize-autoloader
npm install && npm run build
php artisan key:generate
php artisan migrate --seed
php artisan storage:link
php artisan config:cache && php artisan route:cache && php artisan view:cache
# Configure Nginx: see HowToSetup.md for server block (proxy /biometric/push/* to /biometric/push/{api_key}/iclock/* for legacy firmware)
sudo systemctl restart nginx php8.2-fpm
# Set up cron: * * * * * cd /var/www/erp && php artisan schedule:run >> /dev/null 2>&1
``````bash # Upload files via FTP/File Manager to public_html/erp # Create MySQL database + user in cPanel, note credentials # In File Manager or SSH: cd public_html/erp cp .env.example .env # Edit .env: APP_KEY, DB_* credentials, APP_URL (https://yourdomain.com/erp) php artisan key:generate php artisan migrate --seed php artisan storage:link php artisan config:cache && php artisan route:cache && php artisan view:cache # Point domain/subdomain document root to public_html/erp/public in cPanel # Add cron job in cPanel: * * * * * cd /home/username/public_html/erp && php artisan schedule:run ```
```bash # Prerequisites: Docker installed cp .env.example .env # Generate APP_KEY: php artisan key:generate # Set DB_PASSWORD and MYSQL_ROOT_PASSWORD in .env (strong random 32+ chars) docker-compose up -d docker-compose exec app php artisan migrate --seed docker-compose exec app php artisan storage:link # Admin login: admin@erp.com / (password printed by seeder, or set SEED_PASSWORD before seeding) # Access: http://localhost # To stop: docker-compose down ```
Quality report
Manually reviewedHow to read the quality report
What this is. Every project on Vibe96 goes through an automated audit of its source code before a reviewer in Dubai checks it by hand. The score is out of 100; 75 is the minimum to be listed, and any single failing check blocks a listing regardless of the score.
- Security
- No real credentials in the code, every data-changing route protected, admin areas role-gated, no SQL built from user input.
- Code structure
- A developer can navigate and extend it: clear module boundaries, no giant files, little copy-paste.
- Docs & completeness
- The setup guide, example config, schema and required files the builder committed to are actually in the archive.
- Dependency health
- Packages pinned, no known critical vulnerabilities, no abandoned libraries in production paths.
- Build & deploy
- A clean machine can restore, build and start it by following the shipped instructions.
Warnings are problems that didn't block the listing; they stay visible here until a later version clears them. The audit reads the code — it does not run it — so always try the live demo before you buy. Lines of code are counted from the same audited archive.
Reviewer notes (5 minor)
Moderate code duplication and some oversized controllers; business logic scattered across layers; weak default credentials in seed data and documentation; no live secrets found; build reproducible with gaps: missing .env setup, incomplete docker instructions, no npm build. None of these stop the software from working; the developer has been told and improvements come in a future update.
Versions & updates
No updates yet. New versions appear here with a changelog.
Buyers receive updates free for 1 year.
What you get
- </>Full source codeThe complete audited source, delivered as a download from your account. No obfuscation.
- ▤DocumentationSetup guide, architecture notes, CLAUDE.md and AGENTS.md.
- ↻One year of updatesEvery new version the builder publishes, free for 12 months.
- ♧30 days of supportInstallation and defect support through Vibe96 tickets.