┌─────────────────────────┐
│ Backend API │
│ Express · Prisma · SQLite│
│ :5000 │
└────────────┬───────────────┘
┌──────────────────┼──────────────────┐
│ │ │
┌─────────▼────────┐ ┌──────▼───────┐ ┌─────────▼─────────┐
│ Admin Panel │ │ Sales System │ │ Warehouse System │
│ React · Vite │ │ Next.js 16 │ │ Next.js 16 │
│ :8080 │ │ :3000 │ │ :3001 │
└───────────────────┘ └───────────────┘ └────────────────────┘
|
Node.js + Express + Prisma + SQLite API, auth, and every database operation.
|
React + Vite + TanStack Router + shadcn/ui Products, customers, users, invoices, inventory, reports, settlements.
|
Next.js 16 (App Router) Cart building, invoice generation and printing.
|
Next.js 16 (App Router) Stock in/out with reasons, low-stock alerts.
|
| Role | Phone | Password |
|---|---|---|
| 👑 Admin | 09121112233 |
123456 |
| 🧾 Sales | Created by Admin | — |
| 📦 Warehouse | Created by Admin | — |
| 🧮 Sales Admin | Created by Admin | — |
🧮 User Management (Admin)
- Create, edit, delete users
- Assign roles:
admin,sales,warehouse,sales_admin - Enable / disable users
📦 Product & Inventory Management
- Create, edit, delete products — optional unique code, barcode support
- Units: Bottle · Carton · Liter, with configurable carton quantity
- Auto-calculated unit & carton pricing
- Stock minimums, in/out-of-stock status
- Add/subtract stock with a logged reason
- Low-stock view and negative-inventory monitoring
🧾 Invoicing (Sales)
- Customer search or instant creation
- Product addition with unit selection, order & carton calculation
- Item-level and total discounts
- Draft registration → invoice printing with product codes
- "Draft" watermark for regular sellers
- Customer's previous debt shown at point of sale
👥 Customers & Settlements
- Purchase history and statistics
- Debt calculation, partial-payment settlement
- Debtor list, payment history, debt adjustment
📊 Reports
- Sales reports — daily / weekly / monthly
- Inventory reports — stock, inbound, outbound
- Top 5 customers
- Seller commission reports (4%)
- Excel & PDF export
| Role | Access |
|---|---|
| Admin | ████████████████████ Full system access |
| Sales Admin | ██████████████░░░░░░ Invoicing + counts + no watermark + view users |
| Sales | ████████░░░░░░░░░░░░ Invoicing only, watermarked |
| Warehouse | ███████░░░░░░░░░░░░░ Inventory only |
STORED DISPLAYED PRINTED
Rial (IRR) → Toman (÷10) → Rial, labeled
Carton price = Unit price × Quantity per carton
Prerequisites: Node.js 18+, npm or pnpm
# 1. Clone
git clone https://github.com/here-is-leo/pos-system.git
cd pos-system
# 2. Backend — :5000
cd pos-backend
npm install
npx prisma generate
npx prisma migrate dev --name init
npm run dev
# 3. Admin Panel — :8080
cd ../rtl-admin-dashboard
npm install && npm run dev
# 4. Sales System — :3000
cd ../invoice-management-system
npm install && npm run dev
# 5. Warehouse System — :3001
cd ../invoice-inventory-system
npm install && npm run devBackend .env:
DATABASE_URL="file:./dev.db"
JWT_SECRET="your-secret-key"
PORT=5000Admin .env:
VITE_API_URL="http://localhost:5000"| Method | Endpoint | Description |
|---|---|---|
POST |
/api/auth/login |
User login |
GET |
/api/products |
Get products |
POST |
/api/products |
Create product |
GET |
/api/customers |
Get customers |
GET |
/api/invoices |
Get invoices |
POST |
/api/invoices |
Create invoice |
POST |
/api/invoices/:id/finalize |
Finalize invoice |
GET |
/api/inventory |
Get inventory |
POST |
/api/inventory/add |
Add stock |
POST |
/api/inventory/subtract |
Subtract stock |
GET |
/api/customers/with-debt |
Customers with debt |
POST |
/api/payments |
Record payment |
| Layer | Technology |
|---|---|
| Backend | Node.js + Express |
| Database | SQLite via Prisma ORM |
| Admin | React + Vite + TanStack Router |
| Sales / Warehouse | Next.js 16 (App Router) |
| UI | Tailwind CSS + shadcn/ui |
| Icons | Lucide React |
| Charts | Recharts |
| Export | XLSX, jsPDF |
- 🔑 JWT authentication (7-day expiry)
- 🔒 bcrypt password hashing
- 🚦 Rate limiting (brute-force protection)
- 🧩 Captcha after 3 failed attempts
- 🛡️ Role-based access control
- 🌐 CORS restricted to allowed domains
- Light mode with subtle colors
- Fully responsive — mobile & desktop
- Collapsible sidebar, smooth animations
- Vazirmatn font, complete RTL support
Port conflicts
npx kill-port 5000Prisma errors
npx prisma generate
npx prisma migrate devDependency issues
rm -rf node_modules
npm installCORS errors
- Check
VITE_API_URLin the admin.env - Ensure the backend is running
1. Fork the repository
2. git checkout -b feature/AmazingFeature
3. git commit -m 'Add AmazingFeature'
4. git push origin feature/AmazingFeature
5. Open a Pull RequestCoding standards: TypeScript · ESLint · meaningful commits · comments on complex logic · updated docs
| 👤 Developer | Ilya Farahani |
| ilyafarahanii@gmail.com | |
| 🐙 GitHub | @here-is-leo |
| 📦 Repository | pos-system |
Licensed under the MIT License — see LICENSE.
┌─────────────────────────┐
│ بکاند │
│ Express · Prisma · SQLite│
│ :5000 │
└────────────┬───────────────┘
┌──────────────────┼──────────────────┐
│ │ │
┌─────────▼────────┐ ┌──────▼───────┐ ┌─────────▼─────────┐
│ پنل ادمین │ │ سیستم فروشنده │ │ سیستم انباردار │
│ React · Vite │ │ Next.js 16 │ │ Next.js 16 │
│ :8080 │ │ :3000 │ │ :3001 │
└───────────────────┘ └───────────────┘ └────────────────────┘
|
Node.js + Express + Prisma + SQLite مدیریت API، احراز هویت و تمام عملیات دیتابیس.
|
React + Vite + TanStack Router + shadcn/ui محصولات، مشتریان، کاربران، فاکتورها، موجودی، گزارشها، تسویهحساب.
|
Next.js 16 (App Router) ساخت سبد خرید، صدور و چاپ فاکتور.
|
Next.js 16 (App Router) ورود/خروج موجودی با دلیل، هشدار کمبود موجودی.
|
| نقش | تلفن | رمز عبور |
|---|---|---|
| 👑 ادمین | 09121112233 |
123456 |
| 🧾 فروشنده | ساختهشده توسط ادمین | — |
| 📦 انباردار | ساختهشده توسط ادمین | — |
| 🧮 فروش (ادمین) | ساختهشده توسط ادمین | — |
🧮 مدیریت کاربران (ادمین)
- ایجاد، ویرایش، حذف کاربران
- تعیین نقشها:
admin,sales,warehouse,sales_admin - فعال/غیرفعال کردن کاربران
📦 مدیریت محصولات و موجودی
- ایجاد، ویرایش، حذف محصولات — کد یکتا (اختیاری)، پشتیبانی بارکد
- واحدها: بطری · کارتن · لیتر، با تعداد قابل تنظیم در کارتن
- قیمت واحد و کارتن بهصورت خودکار محاسبه میشود
- حداقل موجودی، وضعیت موجود/ناموجود
- افزودن/کسر موجودی همراه با ثبت دلیل
- نمایش کالاهای کمموجود و موجودی منفی
🧾 صدور فاکتور (فروشنده)
- جستجوی مشتری یا ایجاد فوری
- افزودن کالا با انتخاب واحد، محاسبه سفارش و کارتن
- تخفیف آیتمی و کلی
- ثبت پیشنویس ← چاپ فاکتور با کد کالا
- واترمارک «پیشنویس» برای فروشندگان عادی
- نمایش بدهی قبلی مشتری در لحظه فروش
👥 مشتریان و تسویهحساب
- تاریخچه خرید و آمار
- محاسبه بدهی، تسویه با پرداخت جزئی
- لیست بدهکاران، تاریخچه پرداخت، اصلاح بدهی
📊 گزارشها
- گزارش فروش — روزانه / هفتگی / ماهانه
- گزارش انبار — موجودی، ورود، خروج
- ۵ مشتری برتر
- گزارش کمیسیون فروشنده (۴٪)
- خروجی Excel و PDF
| نقش | دسترسی |
|---|---|
| ادمین | ████████████████████ دسترسی کامل به سیستم |
| فروش (ادمین) | ██████████████░░░░░░ فاکتور + آمار + بدون واترمارک + دیدن کاربران |
| فروشنده | ████████░░░░░░░░░░░░ فقط فاکتور، واترمارکدار |
| انباردار | ███████░░░░░░░░░░░░░ فقط موجودی |
ذخیرهشده نمایش روی صفحه فاکتور چاپی
ریال ← تومان (÷۱۰) ← ریال، با برچسب
قیمت کارتن = قیمت هر واحد × تعداد در کارتن
پیشنیازها: Node.js 18+، npm یا pnpm
# ۱. کلون کردن مخزن
git clone https://github.com/here-is-leo/pos-system.git
cd pos-system
# ۲. بکاند — :5000
cd pos-backend
npm install
npx prisma generate
npx prisma migrate dev --name init
npm run dev
# ۳. پنل ادمین — :8080
cd ../rtl-admin-dashboard
npm install && npm run dev
# ۴. سیستم فروشنده — :3000
cd ../invoice-management-system
npm install && npm run dev
# ۵. سیستم انباردار — :3001
cd ../invoice-inventory-system
npm install && npm run devبکاند .env:
DATABASE_URL="file:./dev.db"
JWT_SECRET="your-secret-key"
PORT=5000ادمین .env:
VITE_API_URL="http://localhost:5000"| متد | مسیر | توضیح |
|---|---|---|
POST |
/api/auth/login |
ورود کاربر |
GET |
/api/products |
دریافت محصولات |
POST |
/api/products |
ایجاد محصول |
GET |
/api/customers |
دریافت مشتریان |
GET |
/api/invoices |
دریافت فاکتورها |
POST |
/api/invoices |
ایجاد فاکتور |
POST |
/api/invoices/:id/finalize |
نهاییسازی فاکتور |
GET |
/api/inventory |
دریافت موجودی |
POST |
/api/inventory/add |
افزودن موجودی |
POST |
/api/inventory/subtract |
کسر موجودی |
GET |
/api/customers/with-debt |
مشتریان با بدهی |
POST |
/api/payments |
ثبت پرداخت |
| بخش | تکنولوژی |
|---|---|
| بکاند | Node.js + Express |
| دیتابیس | SQLite از طریق Prisma ORM |
| ادمین | React + Vite + TanStack Router |
| فروشنده / انباردار | Next.js 16 (App Router) |
| UI | Tailwind CSS + shadcn/ui |
| آیکونها | Lucide React |
| نمودار | Recharts |
| خروجی | XLSX, jsPDF |
- 🔑 احراز هویت JWT (انقضای ۷ روز)
- 🔒 هش کردن رمز عبور با bcrypt
- 🚦 محدودیت درخواست (محافظت در برابر Brute Force)
- 🧩 کپچا پس از ۳ تلاش ناموفق
- 🛡️ کنترل دسترسی مبتنی بر نقش
- 🌐 محدودیت CORS به دامنههای مجاز
- لایت مود با رنگهای ملایم
- کاملاً ریسپانسیو — موبایل و دسکتاپ
- سایدبار قابل جمعشدن، انیمیشنهای روان
- فونت وزیرمتن، پشتیبانی کامل از راستچینی
تداخل پورت
npx kill-port 5000خطاهای Prisma
npx prisma generate
npx prisma migrate devمشکلات وابستگیها
rm -rf node_modules
npm installخطاهای CORS
- آدرس
VITE_API_URLرا در.envپنل ادمین بررسی کنید - مطمئن شوید بکاند در حال اجراست
۱. مخزن را Fork کنید
۲. git checkout -b feature/AmazingFeature
۳. git commit -m 'Add AmazingFeature'
۴. git push origin feature/AmazingFeature
۵. یک Pull Request باز کنیداستانداردهای کدنویسی: TypeScript · رعایت ESLint · پیامهای commit معنادار · کامنت برای منطقهای پیچیده · بهروزرسانی مستندات
| 👤 توسعهدهنده | ایلیا فراهانی |
| 📧 ایمیل | ilyafarahanii@gmail.com |
| 🐙 گیتهاب | @here-is-leo |
| 📦 مخزن پروژه | pos-system |
این پروژه تحت مجوز MIT منتشر شده است — برای جزئیات به LICENSE مراجعه کنید.
ساختهشده با 🧡 توسط ایلیا فراهانی