# SaaS Cloud EPBX — সম্পূর্ণ ইমপ্লিমেন্টেশন প্ল্যান

## প্রজেক্ট পরিচিতি

**Laravel PHP + WebRTC/SIP.js** ব্যবহার করে একটি **Multi-Tenant SaaS Cloud EPBX** প্ল্যাটফর্ম তৈরি করা হবে যা cPanel Shared Hosting-এ ডেপ্লয় করা যাবে। ব্রাউজার সরাসরি SIP.js দিয়ে IPTSP-এর WSS Gateway-এ সংযুক্ত হবে — আমাদের নিজস্ব কোনো VoIP সার্ভার লাগবে না।

**প্রজেক্টের রুট ডিরেক্টরি:** `/home/grhtummomc/pbx.qolek.com`

---

## User Review Required

> [!IMPORTANT]
> **SIP Credentials ব্রাউজারে পাঠানো:** SIP পাসওয়ার্ড ডিক্রিপ্ট করে ব্রাউজারে পাঠানো হবে (SIP.js-এর প্রয়োজনে)। এটি আর্কিটেকচারাল সীমাবদ্ধতা — WebRTC-তে credentials ক্লায়েন্টে থাকতেই হয়। HTTPS + HttpOnly নয় বরং API endpoint থেকে JSON হিসেবে পাঠানো হবে, session-authenticated request-এর বিপরীতে।

> [!WARNING]
> **cPanel-এ Asterisk/FreeSWITCH চলবে না।** পুরো কলিং architecture client-side WebRTC নির্ভর। আমাদের laravel panel শুধু কনফিগ ম্যানেজমেন্ট ও কল লগিং করবে।

---

## Open Questions

> [!IMPORTANT]
> ১. **Laravel ভার্সন:** Laravel 11 (PHP 8.2+) ব্যবহার করা হবে — আপনি কি একমত?
> ২. **Authentication Starter Kit:** Laravel Breeze (simple, lightweight) ব্যবহার করব — অথবা Jetstream চান?
> ৩. **Frontend Stack:** Blade templates + Alpine.js + vanilla CSS — অথবা React/Vue চান?
> ৪. **সুপার অ্যাডমিনের ডিফল্ট ক্রেডেনশিয়াল:** প্রথম রান/সিড থেকে কোন ইমেইল ব্যবহার করব? (আপনাকে .env-এ কনফিগার করতে হবে)
> ৫. **ভাষা:** শুধু বাংলা UI, নাকি বাংলা+ইংরেজি বাইলিঙ্গুয়াল?

---

## প্রস্তাবিত পরিবর্তনসমূহ (Proposed Changes)

### Phase 1 — Laravel Foundation ও Database

---

#### [NEW] `composer.json` (Laravel 11 প্রজেক্ট বেস)
- Laravel 11, Breeze (auth scaffold), barryvdh/laravel-dompdf (PDF export)

#### [NEW] `.env.example`
- DB, APP_KEY, MAIL, STORAGE configuration template

#### [NEW] `database/migrations/` — ৯টি মাইগ্রেশন ফাইল
- `users` — role ENUM (admin/tenant), company_name, max_extensions, max_sip_trunks, storage_limit_mb, status
- `sip_trunks` — user_id FK, sip_host, sip_port, sip_username, sip_password (encrypted AES-256), status ENUM
- `extensions` — user_id FK, extension_number (UNIQUE per tenant), agent_name, secret (hashed), dnd_status, call_waiting_limit, status ENUM
- `call_logs` — user_id FK, direction ENUM, caller, callee, duration, status ENUM, start_time, end_time
- `inbound_routes` — user_id FK, sip_trunk_id FK, destination_type ENUM, destination_id, time_rules JSON
- `ivrs` — user_id FK, name, audio_file (UUID-renamed path), timeout_seconds
- `ivr_actions` — ivr_id FK, key_pressed, action_type ENUM, action_destination
- `event_logs` — user_id FK, event_type, description, ip_address
- `system_settings` — key/value store (UNIQUE key)

#### [NEW] `database/seeders/AdminSeeder.php`
- সুপার অ্যাডমিন অ্যাকাউন্ট তৈরি (password from .env, Argon2id via bcrypt)

---

### Phase 2 — Models ও Services

---

#### [NEW] `app/Models/User.php`
- `HasFactory`, `Authenticatable`, tenant isolation scope

#### [NEW] `app/Models/SipTrunk.php`
- `sip_password` cast: encrypted (Laravel Crypt facade)
- `belongsTo(User::class)` relationship

#### [NEW] `app/Models/Extension.php`
- `secret` cast: hashed (bcrypt)
- `belongsTo(User::class)`
- Unique constraint: (user_id, extension_number)

#### [NEW] `app/Models/CallLog.php`
#### [NEW] `app/Models/InboundRoute.php`
#### [NEW] `app/Models/Ivr.php` + `IvrAction.php`
#### [NEW] `app/Models/EventLog.php`
#### [NEW] `app/Models/SystemSetting.php`

#### [NEW] `app/Services/EncryptionService.php`
- `Crypt::encryptString()` / `Crypt::decryptString()` wrap
- AES-256-CBC (Laravel built-in OpenSSL)

#### [NEW] `app/Services/EventLogService.php`
- Audit trail helper: রিকোয়েস্ট IP লগ করা, sensitive ডেটা mask করা

#### [NEW] `app/Services/StorageService.php`
- UUID-rename ফাইল, MIME validation (magic bytes), web root বাইরে সেভ করা

---

### Phase 3 — Middleware ও Authorization

---

#### [NEW] `app/Http/Middleware/CheckTenantStatus.php`
- tenant `status=false` হলে 403/suspend পেজে রিডাইরেক্ট

#### [NEW] `app/Http/Middleware/CheckQuota.php`
- extension/trunk তৈরির আগে max_extensions/max_sip_trunks চেক

#### [NEW] `app/Policies/SipTrunkPolicy.php`, `ExtensionPolicy.php`, `IvrPolicy.php`
- Resource ownership validation (user_id === auth()->id())

---

### Phase 4 — Controllers (Tenant Panel)

---

#### [NEW] `app/Http/Controllers/Tenant/DashboardController.php`
- আজকের কল স্ট্যাটস (answered/missed/total), hourly chart data, active extensions count

#### [NEW] `app/Http/Controllers/Tenant/SipTrunkController.php`
- CRUD + `/test-connection` endpoint (fsockopen দিয়ে host:port reachability check)
- সব input: FormRequest validation, SIP host regex, port range check

#### [NEW] `app/Http/Controllers/Tenant/ExtensionController.php`
- CRUD, DND toggle endpoint, status update (Online/Offline/Busy)

#### [NEW] `app/Http/Controllers/Tenant/CallLogController.php`
- Paginated list, date range + type + extension filter
- Export: CSV / Excel (League\Csv) / PDF (DomPDF)

#### [NEW] `app/Http/Controllers/Tenant/InboundRouteController.php`
- CRUD for routing rules with time-based conditions

#### [NEW] `app/Http/Controllers/Tenant/IvrController.php`
- Audio file upload (MP3/WAV validation, UUID rename, outside web root)
- IVR action CRUD

#### [NEW] `app/Http/Controllers/Tenant/SipCredentialController.php`
- **Session-authenticated** endpoint: decrypt করে SIP credentials JSON return
- `Cache-Control: no-store` header অবশ্যই

#### [NEW] `app/Http/Controllers/Tenant/CallTrackingController.php`
- CDR store endpoint (JS softphone থেকে AJAX call শেষে কল লগ সেভ)

---

### Phase 5 — Controllers (Admin Panel)

---

#### [NEW] `app/Http/Controllers/Admin/TenantManagerController.php`
- Tenant CRUD, suspend/activate, quota update

#### [NEW] `app/Http/Controllers/Admin/SettingController.php`
- SystemSetting key/value CRUD (app name, logo, storage config)

#### [NEW] `app/Http/Controllers/Admin/SystemMonitorController.php`
- Total tenants, active calls count, disk usage (disk_free_space())

---

### Phase 6 — Routes ও Security Headers

---

#### [MODIFY] `routes/web.php`
- Auth routes (Breeze)
- Tenant routes (`middleware: ['auth', 'tenant']`)
- Admin routes (`middleware: ['auth', 'admin']`)
- Rate limiting: `throttle:60,1` on API endpoints

#### [NEW] `app/Http/Middleware/SecurityHeaders.php`
```
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{nonce}' https://cdn.jsdelivr.net; connect-src 'self' wss:; media-src 'self' blob:; object-src 'none'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Permissions-Policy: camera=(), geolocation=()
```
> **Note:** `microphone=()` ব্লক করা যাবে না কারণ WebRTC softphone-এ মাইক্রোফোন দরকার।

---

### Phase 7 — Blade Views ও Frontend

---

#### [NEW] `resources/views/layouts/app.blade.php`
- ডার্ক থিম, glassmorphism sidebar, Inter font (Google Fonts)

#### [NEW] `resources/views/tenant/dashboard.blade.php`
- Metrics cards, Chart.js (CDN + SRI hash) hourly/doughnut charts
- Active call widget (short-polling via setInterval 10s)

#### [NEW] `resources/views/tenant/softphone.blade.php` (component)
- SIP.js integration (self-hosted বা CDN + SRI)
- Dialpad, mute/hold, device selector (getUserMedia)
- **Security:** SIP credentials via `/api/sip-config` (session-auth only, no localStorage)

#### [NEW] `resources/views/tenant/sip_trunks/` — index, create, edit
#### [NEW] `resources/views/tenant/extensions/` — index, create, edit
#### [NEW] `resources/views/tenant/call_logs/index.blade.php`
#### [NEW] `resources/views/tenant/routes/index.blade.php`
#### [NEW] `resources/views/tenant/ivr/` — index, builder
#### [NEW] `resources/views/admin/` — dashboard, tenants, settings

---

### Phase 8 — Storage ও cPanel Deployment Config

---

#### [NEW] `public/.htaccess` (Laravel standard + security hardening)
- `RewriteEngine On` (Laravel front controller)
- Deny direct access to `.env`, `*.php` outside public

#### [NEW] `public/index.php` — cPanel deployment path fix (epbx_core reference)

#### [NEW] `storage/app/ivr_audio/` — web root বাইরে IVR অডিও স্টোরেজ

#### [NEW] `config/filesystems.php` update — `ivr_audio` disk definition

---

## Security Architecture Summary

| এলাকা | পদক্ষেপ |
|---|---|
| **SIP Password Storage** | `Crypt::encryptString()` (AES-256-CBC, Laravel APP_KEY) |
| **Extension Secret** | `bcrypt` hash (ডিক্রিপ্ট লাগবে না, SIP.js use করে না) |
| **SQL Injection** | Eloquent ORM — কোনো raw query নেই |
| **XSS** | Blade `{{ }}` auto-escape, JS-এ `textContent` ব্যবহার |
| **CSRF** | Laravel built-in CSRF token সব form ও AJAX-এ |
| **File Upload** | MIME magic-bytes validation, UUID rename, web root বাইরে |
| **Auth** | Laravel Breeze (session-cookie, HttpOnly, SameSite=Lax) |
| **Tenant Isolation** | সব query-তে `where user_id = auth()->id()` + Policy |
| **Rate Limiting** | `throttle:60,1` middleware |
| **CSP** | nonce-based inline script, CDN SRI hash |

---

## Verification Plan

### Automated Security Check
- **Security Scanner:** সব নতুন ফাইল স্ক্যান করা হবে `run-security-scanner` skill দিয়ে
- **Security Audit:** `generate-security-audit-report` দিয়ে design-level audit ও walkthrough.md-তে ডকুমেন্ট করা হবে

### Manual Verification
- Login → tenant dashboard → SIP trunk CRUD → Extension CRUD → Call Log export
- Admin panel → tenant suspend/activate → quota management
- Softphone registration status check (সরাসরি IPTSP WSS gateway-এ)
- File upload: ৬ MB ফাইল (reject হওয়া উচিত) ও ৪ MB MP3 (accept)
- CSRF token absence test

---

## ডেপ্লয়মেন্ট চেকলিস্ট (cPanel)

1. `public/` → `public_html/` আপলোড
2. `app/, config/, vendor/` etc. → `public_html/../epbx_core/` আপলোড
3. `public_html/index.php` তে path fix
4. cPanel MySQL DB তৈরি + `.env` আপডেট
5. `php artisan migrate --seed`
6. `storage/` ও `bootstrap/cache/` এ write permission (755/644)
