# ⚡ SunnahTi ERP — দ্রুত লোডিং সেটআপ গাইড

> **ফাইলগুলো:** `bzr.php` (মূল সিস্টেম) · `assets/tailwind.min.css` (ডিজাইন — বাধ্যতামূলক)
> · `htaccess-full.txt` (সার্ভার সেটিংস) · `speed-setup-guide.md` (এই ফাইল)

কোড পড়ে **মেপে** দেখা দুইটা আসল বাধা ঠিক করা হয়েছে, আর CDN সেটআপের ধাপ নিচে দেওয়া আছে।

---

## 📊 কী পাওয়া গেল (অনুমান নয় — মাপা)

| সমস্যা | আগে | এখন |
|---|---|---|
| প্রতি পেজ লোডে DDL স্টেটমেন্ট | **১২৫টি** CREATE/ALTER | **১টি** |
| Tailwind CSS | ব্রাউজারে কম্পাইল (~১২০KB JS) | রেডি CSS **১৮.৫KB** (gzip) |

---

## ১️⃣ স্কিমা গার্ড — সবচেয়ে বড় সার্ভার লাভ ✅ (কোডে করা হয়ে গেছে)

**সমস্যা ছিল:** ফাইলের শুরুতে ৮৮টা `ALTER TABLE` + ৩৭টা `CREATE TABLE` **প্রতিটি ভিজিটে**
MySQL-এ যেত। ব্যর্থ হলেও প্রতিটির জন্য রাউন্ড-ট্রিপ ও মেটাডাটা লক লাগে।

সবচেয়ে ভারী ছিল এই কয়টা লাইন:

```sql
ALTER TABLE orders CONVERT TO CHARACTER SET utf8mb4 ...
```

`CONVERT TO CHARACTER SET` অনেক MySQL ভার্সনে **পুরো টেবিল রিবিল্ড** করে। অর্ডার বাড়লে
এটা ভয়ানক ধীর হয়ে যায় — এবং এটা প্রতিটি ফেসবুক অ্যাড ক্লিকেও চলত।

**সমাধান:** পুরো ব্লক এখন স্কিমা-ভার্সন গার্ডের ভেতরে। প্রথম লোডে একবার চলে, ভার্সন সেভ
হয়, তারপর থেকে **স্কিপ**।

> 💡 ভবিষ্যতে নতুন কলাম যোগ করলে ফাইলের উপরে `SCHEMA_VERSION` এর তারিখটা বদলে দিন —
> পরের ভিজিটে অটো আপডেট হয়ে যাবে। না বদলালে নতুন কলাম তৈরি হবে না।

---

## ২️⃣ Tailwind — ব্রাউজারে কম্পাইল বন্ধ ✅ (কোডে করা হয়ে গেছে)

**সমস্যা ছিল:** সব পেজে `<script src="https://cdn.tailwindcss.com"></script>` ছিল।
এটা Tailwind-এর **Play CDN** — এটা টেস্টিংয়ের জন্য, লাইভ সাইটের জন্য নয়। এটা ~১২০KB
JavaScript নামায়, তারপর **ভিজিটরের ফোনেই CSS কম্পাইল করে**। পুরনো অ্যান্ড্রয়েড ফোনে
এতে সহজেই ১-৩ সেকেন্ড সাদা স্ক্রিন থাকে।

**সমাধান:** আপনার কোড স্ক্যান করে আগে থেকেই CSS বানিয়ে দিয়েছি — `assets/tailwind.min.css`
(gzip-এ মাত্র **১৮.৫KB**, কোনো JS নেই, কম্পাইলও নেই)।

### 📁 আপলোড (গুরুত্বপূর্ণ — এটা না করলে সাইটের ডিজাইন ভেঙে যাবে!)

```
আপনার সাইটের রুট ফোল্ডার/
├── bzr.php              ← নতুনটা দিয়ে বদলান
├── .htaccess            ← htaccess-full.txt এর লেখা এখানে বসান
└── assets/
    └── tailwind.min.css  ← নতুন ফোল্ডার বানিয়ে এই ফাইলটা রাখুন
```

⚠️ **`assets` ফোল্ডারটা অবশ্যই আগে বানাতে হবে** এবং CSS ফাইলটা ভেতরে রাখতে হবে।

### 🔍 ডায়নামিক ক্লাস নিয়ে সতর্কতা

আপনার কোডে কিছু জায়গায় ক্লাসের নাম PHP দিয়ে জোড়া লাগে, যেমন:

```php
class="bg-<?= $clr ?>-500/20"
```

এগুলো স্ক্যানার খুঁজে পায় না। তাই ১৭টা রঙের সব শেড আগে থেকেই CSS-এ ঢুকিয়ে রেখেছি
(safelist) এবং যাচাই করেছি। তবু আপলোডের পর **কুরিয়ার জোন পেজ, রিপোর্ট পেজ ও
সোশ্যাল ইনবক্স** — এই তিনটা একবার চোখে দেখে নেবেন, কোনো রঙ উধাও হয়েছে কিনা।

কিছু ভাঙলে জানাবেন, ওই ক্লাসগুলো যোগ করে CSS আবার বানিয়ে দেব।

---

## ৩️⃣ Cloudflare CDN (ফ্রি) — এটা আপনাকে করতে হবে

বাংলাদেশের ভিজিটরদের জন্য এটাই সবচেয়ে বড় বাড়তি লাভ। ছবি ও CSS ঢাকা/সিঙ্গাপুরের
এজ সার্ভার থেকে যাবে, আপনার হোস্টিং পর্যন্ত পৌঁছাবেই না।

**ধাপ:**

1. cloudflare.com এ ফ্রি একাউন্ট → **Add a site** → আপনার ডোমেইন দিন
2. Cloudflare যে **২টা নেমসার্ভার** দেবে, সেগুলো ডোমেইন কেনার জায়গায় (Namecheap/GoDaddy/
   বাংলাদেশি রেজিস্ট্রার) গিয়ে বসিয়ে দিন — পুরনোগুলো মুছে
3. ২৪ ঘণ্টার মধ্যে অ্যাক্টিভ হবে (সাধারণত ১-২ ঘণ্টা)

**অ্যাক্টিভ হওয়ার পর এই সেটিংসগুলো চালু করুন:**

| জায়গা | সেটিং | মান |
|---|---|---|
| SSL/TLS | Encryption mode | **Full** |
| Speed → Optimization | Brotli | **On** |
| Speed → Optimization | Early Hints | **On** |
| Caching | Caching Level | **Standard** |
| Caching | Browser Cache TTL | **1 year** |

⚠️ **Auto Minify চালু করবেন না** — আপনার PHP ফাইলে ইনলাইন JS আছে, minify করলে ভাঙতে পারে।

### 🔒 জরুরি — অ্যাডমিন প্যানেল ক্যাশ করা যাবে না

Cloudflare → **Rules → Page Rules** এ গিয়ে এই নিয়মটা বানান:

```
URL:  *yourdomain.com/*action=*
সেটিং: Cache Level → Bypass
```

এটা না করলে একজনের অর্ডার তালিকা আরেকজন দেখে ফেলতে পারে। **এই ধাপটা বাদ দেবেন না।**

---

## ৪️⃣ .htaccess

`htaccess-full.txt` ফাইলটার পুরো লেখা কপি করে সাইটের রুটের `.htaccess`-এ বসান।
এর ভেতরেই সব আছে — সোশ্যাল ক্রলার (403 ফিক্স), GZIP, ক্যাশিং, নিরাপত্তা।
assets ফোল্ডারের জন্য এই অংশটুকু ওখানে আগে থেকেই দেওয়া:

```apache
# assets ফোল্ডারের CSS/JS — ১ বছর ক্যাশ (নাম বদলালেই নতুনটা যাবে)
<IfModule mod_headers.c>
    <FilesMatch "\.(css|js)$">
        Header set Cache-Control "public, max-age=31536000, immutable"
    </FilesMatch>
</IfModule>
```

> 💡 CSS আপডেট করলে PHP-তে `tailwind.min.css?v=1` এর `v=1` কে `v=2` করে দেবেন —
> তাহলে ভিজিটরের ব্রাউজার নতুনটা নেবে।

---

## ✅ কাজ করছে কিনা যাচাই

আপলোডের পর সাইট খুলে **F12 → Network** ট্যাবে দেখুন:

- `cdn.tailwindcss.com` আর **আসবে না** ✓
- `tailwind.min.css` আসবে, সাইজ ~১৮KB ✓
- দ্বিতীয়বার রিফ্রেশে CSS-এর পাশে `(disk cache)` লেখা আসবে ✓

সার্ভারের দিকটা মাপতে: প্রথম লোডের পর দ্বিতীয় লোডে পেজ স্পষ্টতই দ্রুত হবে — কারণ
প্রথম লোডে স্কিমা তৈরি হয়, তারপর থেকে আর হয় না।

---

## 📌 এখনো যা করা বাকি (চাইলে পরে)

- **ছবি অপটিমাইজ** — প্রোডাক্টের ছবি WebP করলে আরও অনেক দ্রুত হবে। আপনার আপলোড
  করা ছবিগুলোর সাইজ কত সেটা দেখে বলতে পারব কতটা লাভ হবে।
- **FontAwesome** — এখনো CDN থেকে পুরো আইকন সেট (~৭০KB) নামে, যদিও আপনি অল্প কয়েকটা
  আইকনই ব্যবহার করেন। দরকার হলে শুধু ব্যবহৃত আইকনগুলো নিয়ে ছোট ফাইল বানিয়ে দিতে পারি।
