A complete Restaurant ERP — POS billing, table orders, kitchen display, inventory, HR & payroll, finance, and 20+ reports — all in one responsive dashboard.
Pakhi Kitchen is a full-featured Restaurant ERP built for modern food businesses. It covers every aspect of restaurant operations — from customer-facing QR ordering to kitchen management, staff payroll, inventory tracking, and financial reporting.
Built with PHP 8.3 and PDO for secure database access, featuring a clean navy & white themed UI with Bootstrap 5, Font Awesome, and Chart.js.
Full POS with category filter, item grid, cart management, item detail modal (variations + addons), payment modal with numpad, and printable invoice.
Customer-facing PWA — scan table QR, browse menu, add to cart, choose size/addons, and place order directly from phone.
Real-time KDS showing dine-in and takeaway orders. Chefs mark orders as Preparing → Ready with one click.
Raw material stock with suppliers, purchase orders, stock movements, wastage log, and recipe mapping to menu items.
Employee master, shift scheduling, daily attendance, leave management, and monthly payroll processing.
Expense tracking, transaction ledger, Profit & Loss, Sales Report, Items Report, and Credit Balance Report with date filters.
Switch between branches from the top navbar. Each branch has its own tables, staff, orders, and inventory.
Create promotional offers with percentage or fixed discounts, set validity dates, and apply them at POS checkout.
Thermal-style printable receipt with restaurant info, item breakdown, tax, discount, total, payment type, and token number.
| Component | Minimum | Recommended |
|---|---|---|
| PHP | 7.4 | 8.2+ / 8.3 |
| MySQL | 5.7 | 8.0+ / MariaDB 10.4+ |
| Web Server | Apache 2.4 / Nginx | Apache with mod_rewrite + mod_headers |
| PHP Extensions | PDO, PDO_MySQL, mbstring, json | + openssl, gd, fileinfo, session |
| RAM | 256 MB | 512 MB+ |
| Disk Space | 50 MB | 500 MB+ (for item images & backups) |
| Browser | Chrome 80+, Firefox 75+ | Latest Chrome / Edge / Safari |
| Local Stack | XAMPP / WAMP / LAMP | WAMP 3.x / XAMPP 8.x |
Extract the project folder and copy it to your web server document root.
Open phpMyAdmin (or MySQL CLI) and create the database, then import the schema files in order.
Open admin/config/database.php and app/config/database.php — update your MySQL credentials.
The project's .htaccess uses Apache 2.4 syntax. Make sure mod_headers and mod_rewrite are enabled in WAMP.
Navigate to the admin login page and sign in with the default credentials.
seed_data.sql for demo data. Go to Settings to configure your restaurant name, currency, and tax rate.The customer-facing PWA runs from the app/ folder with its own API.
foodscan_db database. Item images are served from admin/uploads/items/. Make sure the uploads directory is writable.The login page has 4 clickable role tabs that auto-fill the correct email and password. Each role redirects to a different dashboard after login:
| # | Tab / Role | Colour | Password | Redirects To | Access | |
|---|---|---|---|---|---|---|
| 1 | Admin | Blue | admin@foodscan.com |
•••••••• | index.php (Dashboard) |
Full access — all modules, reports, settings, users |
| 2 | Branch Manager | Teal | posoperator@example.com |
•••••••• | index.php (Dashboard) |
Branch-level access — orders, staff, inventory for own branch |
| 3 | POS Operator | Purple | posoperator@example.com |
•••••••• | pos.php (POS) |
POS billing, orders, and basic reports only |
| 4 | Chef / Kitchen | Green | chef@example.com |
•••••••• | kds.php (Kitchen Display) |
KDS only — view orders and update status |
password_hash().UPDATE users SET password='$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi' WHERE email='admin@foodscan.com';
This bcrypt hash = plain text: password
Goes to index.php — full dashboard with all modules visible in sidebar.
Goes to index.php — same dashboard scoped to their assigned branch.
Goes directly to pos.php — the billing interface for quick order entry.
Goes directly to kds.php — Kitchen Display System for order status management.
The customer QR ordering PWA is sessionless — no login needed. Customers scan table QR, browse the menu, add items to cart, and place orders directly from their phone.
The branch manager has a separate scoped login. Only users with role = 'branch_manager' can access this panel.
| Password | Access | |
|---|---|---|
anwar.bm@foodscan.com | •••••••• | Branch dashboard, orders, staff, tables (scoped to branch) |
admin@foodscan.com / password. Delete the file after use.PakhiKitchen uses MySQL with PDO and prepared statements throughout. All queries are parameterized to prevent SQL injection.
| Property | Value |
|---|---|
| Database Name | foodscan_db |
| Character Set | utf8mb4 |
| Default Host | localhost |
| Default User | root |
| Default Password | blank (WAMP/XAMPP default) |
| File | Contents | Order |
|---|---|---|
admin/database/schema.sql | Core tables — users, branches, categories, items, variations, dining tables, customers, orders, transactions, offers, settings, taxes | 1st |
admin/database/schema_extended.sql | Extended tables — multi-tenancy, inventory, suppliers, purchase orders, accounting, HR/payroll, JWT tokens, audit log, RBAC | 2nd |
admin/database/seed_data.sql | Demo data — branches, suppliers, inventory items, HR employees, shifts, customers, expenses, wastage, chart of accounts | Optional |
| Table | Purpose |
|---|---|
users | Admin accounts with roles: admin, branch_manager, pos_operator, chef |
branches | Restaurant branches with name, phone, address |
categories | Menu categories with image and status |
items | Menu items — price, image, veg/non-veg, featured, description, tax |
item_variations | Size/variant options per item with additional price |
item_addons | Item-to-item addon relationships |
item_extras | Extra add-on options per item |
dining_tables | Restaurant tables with name, size, branch, status |
customers | Customer records with name, email, phone, status |
orders | Orders — type, token, discount, tax, total, status pipeline |
order_items | Line items per order with variation, price, addons JSON |
transactions | Payment records per order — method, amount, status |
offers | Promotional offers with discount type, value, validity dates |
settings | Key-value store for app config (currency, tax rate, company info) |
tenants | Multi-tenant setup — each tenant = one restaurant group |
inventory_items | Raw material/ingredient stock with supplier, quantity, min stock |
suppliers | Vendor/supplier master with contact info |
purchase_orders | PO management — draft, ordered, received, partial, cancelled |
hr_employees | Staff records — department, designation, salary, bank details |
attendance | Daily attendance — check-in, check-out, status, hours worked |
payroll | Monthly payroll — basic, overtime, bonus, deductions, net salary |
expenses | Business expenses by category, amount, date, payment method |
api_tokens | JWT refresh tokens for API auth |
login_attempts | Brute-force protection — tracks failed attempts per email |
audit_log | Action audit trail — who did what, when, old & new values |
JWT_SECRET to a long random string (64+ chars) before deploying. Never commit real credentials to version control.The login page uses a split-panel layout — form on the left, dark feature showcase on the right. The left panel has 4 role tabs that auto-fill the correct credentials and redirect to the right dashboard after login.
Email: admin@foodscan.com / Pass: password
→ Redirects to full Dashboard
Uses POS operator email / Pass: password
→ Redirects to Dashboard
Email: posoperator@example.com / Pass: password
→ Redirects directly to POS
Email: chef@example.com / Pass: password
→ Redirects directly to KDS
Left panel: role tabs + login form. Right panel: dark gradient with 8 feature cards + stats.
Locks out after 5 failed attempts for 15 minutes. Records each attempt in login_attempts table.
Eye icon shows/hides password. Tabs auto-fill email & password — just click a tab and hit Sign In.
Each role is sent to the most relevant page: Admin/Manager → Dashboard, POS → POS page, Chef → KDS.
Real-time overview of restaurant performance. All figures show current month data by default.
Total Sales (pink), Total Orders (blue), Total Customers (orange), Total Menu Items (purple) — current month figures.
30-day pink line chart showing daily revenue trend with total sales and avg sales/day summary.
Blue bar chart showing hourly order volume for today — helps identify peak hours.
4-column grid showing items marked as featured with images. Set items as featured from Items → Edit.
Top 6 items by order count with category label and price — right side of dashboard.
Top-of-page info banner for system notices. Can be customized in admin/index.php.
| Dropdown | Contents | Trigger |
|---|---|---|
| Branch Selector | Radio list of all active branches — click to switch branch context | Click branch pill (left side) |
| Language | English 🇬🇧 / Bangla 🇧🇩 / German 🇩🇪 / Arabic 🇸🇦 with flag icons | Click red language button |
| User Profile | Avatar, name, email, balance, Edit Profile / Change Password / Logout links | Click avatar + name (right side) |
The core billing interface. Full-screen split layout — item grid left, cart panel right.
| Component | Description |
|---|---|
| Search Bar | Debounced search to filter items by name in real time |
| Category Scroll | Horizontal scrollable category bar with images — click to filter items |
| Item Grid | Auto-fill grid of item cards with image, name, price, and quick Add button |
| Customer Select | Dropdown to select registered customer or Walking Customer |
| Token No | Manual token number input for kitchen reference |
| Order Type Toggle | Dine-In / Takeaway radio toggle — Dine-In shows table selector |
| Cart Items | Live cart with item name, size, qty stepper (±), price, and remove button |
| Discount Row | Percentage or Fixed discount input with Apply button |
| Cart Summary | Sub Total / Discount / Total footer |
| Cancel / Order | Cancel clears cart; Order opens Payment Modal |
Click any item card to open the full detail modal:
− / + buttons to set quantity before adding to cart. Minimum 1.
Radio-style size options (Regular, Big etc.) with additional price shown. First option pre-selected.
Horizontal scrollable addon cards with individual qty controls and price. Total auto-updates on cart button.
Free-text textarea for kitchen notes (extra mayo, no onions etc.)
Cash / Card / MFS / Other — selected method highlights with blue border.
On-screen numpad: 1–9, 00, 0, decimal, backspace, clear — for fast cash amount entry.
Creates order in DB, clears cart, opens invoice modal with receipt. Change amount auto-calculated.
Thermal-style receipt with restaurant info, items, VAT, totals, payment type, and Token #. One-click print.
| Page | URL | Description |
|---|---|---|
| POS Orders | admin/orders.php | All orders with filter by ID, status, customer, date. Status labels: Accept / Prepared / Delivered. |
| Table Orders | admin/table_orders.php | Dine-in orders filtered by order_type = dine_in. Same filter interface. |
| Order View | admin/order_view.php?id=X | Full order detail — items, payment info, delivery info, status update dropdown. |
| Status | Color | Label Shown | Meaning |
|---|---|---|---|
pending | Orange | Accept | New order — waiting for kitchen acknowledgement |
preparing | Blue | Preparing | Kitchen is preparing the order |
ready | Teal | Ready | Order is ready for pickup or serving |
served | Green | Served | Delivered to the table/customer |
completed | Green | Delivered | Fully completed and paid |
cancelled | Red | Cancelled | Order was cancelled |
| Tab | URL | Description |
|---|---|---|
| Information | item_view.php?id=X&tab=information | Name, price, category, item type (veg/non-veg), featured status, caution, description |
| Images | item_view.php?id=X&tab=images | Multiple gallery images per item. Upload new images (stored in uploads/items/) |
| Variation | item_view.php?id=X&tab=variation | Add size/variant options with additional price (e.g., Regular +$0, Large +$2) |
| Extra | item_view.php?id=X&tab=extra | Extra chargeable options (e.g., Extra Cheese +$0.50) |
| Addon | item_view.php?id=X&tab=addon | Link related items as addons shown in POS item modal |
Manage restaurant tables. Each table has a name, seating size, branch, and status. Tables are selectable in POS for dine-in orders.
dining_table_view.php?id=X, generate a QR code for each table. Customers scan the QR with their phone to open the self-ordering PWA pre-loaded with that table's context.Manage registered customer profiles. Customers can be selected at POS checkout instead of "Walking Customer" for loyalty tracking and order history.
| Name | Phone | |
|---|---|---|
| Arif Rahman | arif@example.com | +880181000001 |
| Fatema Akter | fatema@example.com | +880181000002 |
| Sajid Hasan | sajid@example.com | +880181000003 |
| Nusrat Jahan | nusrat@example.com | +880181000004 |
| Tanvir Islam | tanvir@example.com | +880181000005 |
Raw materials & ingredients with SKU, unit (kg/ltr/pcs), quantity, min stock level, and cost price. admin/inventory.php
Vendor master with company name, contact, email. Linked to inventory items. admin/suppliers.php
Create POs to suppliers — draft, ordered, received, partial, cancelled. admin/purchase_orders.php
Record ingredient wastage with reason (expired/damaged/spilled) and cost impact. admin/wastage.php
| SKU | Item | Unit | Qty | Min Stock |
|---|---|---|---|---|
| INV-001 | Chicken Breast | kg | 25.5 | 10 |
| INV-002 | Beef Mince | kg | 15.0 | 8 |
| INV-003 | Rice (Basmati) | kg | 50.0 | 20 |
| INV-013 | Coca Cola (Can) | pcs | 100 | 30 |
| INV-015 | Fish (Hilsa) | kg | 3.0 | 5 |
Staff records — department (kitchen/service/management/delivery/cleaning), designation, salary, bank details. admin/hr_employees.php
Daily check-in/check-out, status (present/absent/late/half-day/leave), hours worked. admin/attendance.php
Define Morning (6–14), Afternoon (14–22), Night (22–6), Split shifts. Assign to employees. admin/shifts.php
Leave requests by type (sick/casual/annual/unpaid/maternity) — pending/approved/rejected workflow. admin/leaves.php
Monthly payroll — basic salary, overtime, bonus, deductions, net salary. Payment via cash/bank/card. admin/payroll.php
All staff list (waiters, chefs, general employees) with basic role info. admin/employees.php
| Code | Name | Dept | Role | Salary |
|---|---|---|---|---|
| EMP-0001 | Kamal Hossain | Kitchen | Head Chef | ৳45,000/mo |
| EMP-0002 | Rafiq Ahmed | Kitchen | Sous Chef | ৳35,000/mo |
| EMP-0003 | Nasrin Akter | Service | Head Waiter | ৳25,000/mo |
| EMP-0008 | Anwar Hossain | Management | Branch Manager | ৳55,000/mo |
Business expense tracking by category (rent/utilities/salary/supplies/maintenance/marketing). admin/finance.php
All payment transactions linked to orders — cash, card, MFS, other. admin/transactions.php
P&L report comparing revenue vs expenses for the selected period. admin/profit_loss.php
15 pre-loaded accounts — Cash, Bank, AR, AP, Sales Revenue, COGS, Salary, Rent, Utilities, Marketing.
| Report | URL | Description |
|---|---|---|
| Sales Report | admin/sales_report.php | All completed orders with total earnings, discount, and payment type. Filter by payment method. |
| Items Report | admin/items_report.php | Item-wise sales breakdown — quantity sold, revenue per item. |
| Credit Balance | admin/credit_balance_report.php | Customer credit balance and outstanding amounts. |
| Profit & Loss | admin/profit_loss.php | Revenue vs Expense comparison with net profit. |
20 settings sections accessible from the left sidebar within the settings page. All settings stored in the settings table as key-value pairs.
Restaurant name, address, phone, email, GSTIN — shown on printed invoices.
Site name, currency symbol, timezone, default language.
Configure VAT/GST rate applied to all orders. Default: 0%. Shown on invoice as "VAT (X%)".
Invoice header/footer text, logo, terms, thermal or A4 print size.
Add/edit restaurant branches. Each branch gets its own tables and staff assignments.
Set primary currency symbol and decimal display format.
| Screen | URL | Purpose |
|---|---|---|
| KDS (Kitchen Display) | admin/kds.php | Shows active dine-in and takeaway orders grouped by status. Chef clicks expand → Start Preparing → Mark Ready. |
| OSS (Order Status) | admin/oss.php | Customer-facing status board. Left panel: popular menu items. Right panels: Preparing (blue) and Ready (green) orders. Staff marks Ready → Served. |
| File | Action (GET ?action=) | Method | Description |
|---|---|---|---|
items_api.php | get | GET | Single item with variations & addons — ?action=get&id=X |
items_api.php | create / update | POST | Create or update item (supports file upload for image) |
items_api.php | delete | POST | Delete item by id |
items_api.php | add_variation | POST | Add size variant with additional price to item |
items_api.php | add_addon | POST | Link another item as an addon to this item |
orders_api.php | create_order | POST | Create order + line items + transaction. Returns order_number + cartSnapshot |
orders_api.php | update_status | POST | Update order status (pending/preparing/ready/completed/cancelled) |
orders_api.php | get_order | GET | Full order with items by id |
customers_api.php | create | POST | Add customer, returns id + name |
customers_api.php | update / delete | POST | Update or delete customer |
tables_api.php | create / update / delete | POST | Dining table CRUD |
offers_api.php | create / delete | POST | Promo offer CRUD |
inventory_api.php | create / update / delete | POST | Stock item CRUD |
| Action | Method | Description | Returns |
|---|---|---|---|
get_categories | GET | All active menu categories | id, name, image |
get_items | GET | Items filtered by category_id, item_type, search | items with category_name |
get_item | GET | Single item with variations + addons — ?action=get_item&id=X | item + variations[] + addons[] |
get_tables | GET | Active dining tables for checkout table select | id, name |
place_order | POST (JSON body) | Create order from customer app — table_id, payment_method, items[] | success, order_number, order_id |
get_bill | GET | Full order receipt with items and restaurant info — ?order_number=XXX | order + items + restaurant settings |
track_order | GET | Check order status by order number | status, total, order_type |
| Problem | Likely Cause | Fix |
|---|---|---|
Internal Server Error on /pakhikitchen/ | .htaccess uses Apache 2.2 Order/Deny syntax | Updated to Apache 2.4 Require all denied — already fixed in current version |
| Login fails with correct password | Admin user not in DB or wrong hash | Run SQL: UPDATE users SET password='$2y$10$92IX...' WHERE email='admin@foodscan.com'; |
| POS item modal shows "Failed to load" | items_api.php not returning variations | Ensure item_variations table exists (schema_extended.sql). Check api/items_api.php get action. |
| Dashboard charts blank | Chart.js CDN not loading | Check internet connection. Or download Chart.js 4.4 and host locally in assets/js/. |
| PDO connection failed | Wrong DB credentials | Edit admin/config/database.php — verify DB_HOST, DB_NAME, DB_USER, DB_PASS. |
| Images not showing | uploads/ folder missing | Create admin/uploads/items/, categories/, avatars/ and ensure Apache has write permission. |
Header not found / mod_headers error | mod_headers disabled in WAMP | WAMP tray → Apache Modules → enable headers_module → Restart All. |
| Page redirects to login after switching branch | Session not persisting branch change | Branch switch is client-side only — page refresh resets to session branch. Full branch-switch requires server-side session update. |
| "No items in cart" after adding items | JavaScript error in cart state | Open browser console (F12) and check for errors. Ensure Bootstrap 5.3 and jQuery 3.7 are loading from CDN. |
| Invoice printing blank | Popup blocked by browser | Allow popups for localhost in browser settings. Print uses window.open(). |
| Version | Date | Changes |
|---|---|---|
| v4.1 | Jul 2026 | Login page role tabs (Admin/Branch Manager/POS Operator/Chef) with auto-fill credentials and role-based redirect. Updated documentation with all credentials and tab details. |
| v4.0 | Jul 2026 | Complete UI overhaul — new split login, FoodScan branding, top navbar with branch/language/user dropdowns (single open at a time), pink/blue dashboard charts, full POS rewrite with item modal + payment numpad + thermal invoice, all 40+ pages updated to new layout, 46.9 KB complete stylesheet |
| v3.x | Jun 2026 | Enterprise modules — multi-tenancy, inventory, HR/payroll, JWT auth, audit log, RBAC (schema_extended.sql) |
| v2.x | May 2026 | Extended schema — suppliers, purchase orders, HR employees, shifts, attendance, leaves, payroll, expenses |
| v1.0 | Apr 2026 | Initial release — core POS, items, orders, dining tables, customers, offers, basic reports |