# Dokumentasi Lengkap WhatsApp Bot API — LMS Pak Andi

Dokumentasi ini menjelaskan integrasi WhatsApp Bot (Meta WhatsApp Cloud API / Webhook Gateway) dengan LMS Pak Andi. Integrasi ini memungkinkan:
1. **Verifikasi Nomor WhatsApp:** User memverifikasi nomor WhatsApp miliknya dengan mengirimkan kode verifikasi ke nomor bot **`+62 853-3709-2290`**. Meta webhook / bot gateway kemudian mengirimkan HTTP POST ke LMS untuk menautkan akun.
2. **Akses Data & Interaksi LMS:** Bot WhatsApp dapat mengambil profil user, daftar kursus, silabus, isi materi yang sudah diformat khusus untuk WhatsApp, kuis, tugas, agenda belajar, sertifikat, serta pencarian materi pembelajaran.
3. **Template Pesan WhatsApp Lengkap:** Template teks balasan chat WhatsApp untuk seluruh menu dan interaksi pengguna.

---

## 1. Konfigurasi Lingkungan (`.env`)

Konfigurasi berikut disimpan di file `.env` Laravel:

```dotenv
# API Key untuk mengamankan endpoint bot WA
WA_BOT_API_KEY=e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33

# Nomor resmi Bot WhatsApp LMS (format angka internasional)
WA_BOT_PHONE_NUMBER=6285337092290

# Token verifikasi untuk webhook Meta Cloud API (default sama dengan WA_BOT_API_KEY)
WA_WEBHOOK_VERIFY_TOKEN=e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33
```

---

## 2. Autentikasi & Pengenalan Pengguna

### Metode Autentikasi
Setiap permintaan ke API `/api/wa/*` harus menyertakan API Key yang valid dengan salah satu cara berikut:
1. **Header HTTP (Direkomendasikan):**
   ```http
   X-API-KEY: e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33
   ```
2. **Authorization Bearer:**
   ```http
   Authorization: Bearer e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33
   ```
3. **Query Parameter:**
   ```http
   ?api_key=e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33
   ```

### Normalisasi Nomor WhatsApp
API secara otomatis menormalisasi semua format nomor telepon Indonesia:
- `+62 853-3709-2290` $\rightarrow$ `6285337092290`
- `085337092290` $\rightarrow$ `6285337092290`
- `6285337092290@s.whatsapp.net` $\rightarrow$ `6285337092290`

Parameter nomor pengirim pada query atau body dapat menggunakan key: `phone`, `jid`, `sender`, `from`, atau `wa_id`.

---

## 3. Bagian 1: Verifikasi WhatsApp & Webhook Meta

### Alur Verifikasi
```
[User di Web LMS] 
       │
       ▼ Generate Kode 6 Digit (Berlaku 10 Menit)
       │
       ▼ Klik "Kirim via WhatsApp (+62 853-3709-2290)"
       │
[Aplikasi WhatsApp User]
       │
       ▼ Kirim pesan: "VERIFIKASI 882319" ke +62 853-3709-2290
       │
[Meta Cloud API / Webhook Server]
       │
       ▼ HTTP POST /api/wa/verify atau /api/wa/webhook
       │
[LMS Backend Pak Andi]
       │
       ▼ Validasi kode -> Tautkan nomor WA ke akun user -> Simpan status
```

---

### Endpoint Verifikasi Langsung
#### `POST /api/wa/verify`

Digunakan oleh bot server atau webhook gateway ketika menerima pesan verifikasi dari user.

**Header:**
```http
Content-Type: application/json
X-API-KEY: e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33
```

**Request Body (Format Standar):**
```json
{
  "phone": "+62 853-3709-2290",
  "code": "882319"
}
```

**Request Body (Format Pesan Bebas):**
Sistem otomatis mengekstrak 6 digit angka dari string pesan:
```json
{
  "from": "6285337092290",
  "message": "Halo bot, tolong aktivasi VERIFIKASI 882319"
}
```

**Response Sukses (`200 OK`):**
```json
{
  "ok": true,
  "message": "Verifikasi berhasil! Halo Budi Santoso, akun WhatsApp kamu sudah terhubung ke LMS.",
  "name": "Budi Santoso",
  "user": {
    "id": 5,
    "name": "Budi Santoso",
    "email": "budi@example.com",
    "phone": "6285337092290"
  }
}
```

**Response Gagal (`422 Unprocessable Entity`):**
```json
{
  "ok": false,
  "message": "Kode verifikasi salah atau sudah kedaluwarsa."
}
```

---

### Endpoint Webhook Meta WhatsApp Cloud API
#### `GET|POST /api/wa/webhook`

Endpoint ini kompatibel langsung dengan **Meta Developer Portal (WhatsApp Cloud API)**.

#### 1. Verifikasi Webhook Meta (`GET`)
Ketika Anda mendaftarkan Webhook URL di Meta App Dashboard:
- **Callback URL:** `https://your-lms-domain.com/api/wa/webhook`
- **Verify Token:** Isi dengan nilai `WA_WEBHOOK_VERIFY_TOKEN` dari `.env`.
- **Response:** LMS secara otomatis merespons balik nilai `hub.challenge` dalam format plain text dengan status `200 OK`.

#### 2. Penerimaan Pesan Masuk (`POST`)
Menerima payload JSON resmi dari Meta Cloud API:
```json
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "6285337092290",
              "phone_number_id": "PHONE_NUMBER_ID"
            },
            "contacts": [
              {
                "profile": { "name": "Budi" },
                "wa_id": "6285337092290"
              }
            ],
            "messages": [
              {
                "from": "6285337092290",
                "id": "wamid.HBgLM...",
                "timestamp": "1726315200",
                "text": { "body": "882319" },
                "type": "text"
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}
```
*Jika teks pesan mengandung kode 6 digit yang valid, LMS otomatis memverifikasi dan menghubungkan nomor WhatsApp pengirim ke akun user pemilik kode tersebut.*

---

## 4. Bagian 2: Endpoint Data LMS untuk Interaksi via WhatsApp

Semua endpoint berikut membutuhkan parameter identitas nomor WhatsApp (`phone` atau `jid`).

### 1. Profil & Statistik User
#### `GET /api/wa/user`
Mengambil data profil dan statistik pembelajaran user.

**Query Parameter:**
- `phone` (string, wajib): Nomor WhatsApp user (misal `6285337092290`).

**Response (`200 OK`):**
```json
{
  "ok": true,
  "user": {
    "id": 5,
    "name": "Budi Santoso",
    "email": "budi@example.com",
    "phone": "6285337092290",
    "role": "student",
    "points": 240,
    "ui_theme": "umum",
    "avatar": null,
    "stats": {
      "active_courses": 2,
      "completed_courses": 1,
      "certificates": 1,
      "pending_tasks": 3
    }
  }
}
```

---

### 2. Ringkasan Menyeluruh (AI Context / Dashboard Summary)
#### `GET /api/wa/summary`
Menyajikan seluruh konteks pembelajaran penting dalam **1 kali panggilan**. Sangat berguna untuk chatbot AI atau pesan selamat datang/menu utama.

**Query Parameter:**
- `phone`: Nomor WhatsApp user.

**Response (`200 OK`):**
```json
{
  "ok": true,
  "user": {
    "id": 5,
    "name": "Budi Santoso",
    "points": 240
  },
  "active_courses": [
    {
      "enrollment_id": 12,
      "course_id": 3,
      "title": "Mastering Laravel & Inertia React",
      "slug": "mastering-laravel-inertia-react",
      "progress_percent": 65,
      "completed_lessons": 13,
      "total_lessons": 20,
      "next_lesson": {
        "id": 45,
        "title": "Implementasi Autentikasi dengan Fortify",
        "url": "https://lms.test/courses/mastering-laravel-inertia-react/learn/45"
      },
      "url": "https://lms.test/courses/mastering-laravel-inertia-react"
    }
  ],
  "pending_tasks": [
    {
      "id": 8,
      "title": "Kerjakan Kuis Middleware",
      "type": "quiz",
      "scheduled_date": "2026-09-14",
      "is_priority": false
    }
  ],
  "latest_certificate": {
    "id": 2,
    "certificate_number": "CERT-XY89AB-2026",
    "course_title": "Dasar Pemrograman Web",
    "issued_at": "2026-08-30"
  }
}
```

---

### 3. Daftar Kursus yang Diikuti
#### `GET /api/wa/courses`
Menampilkan daftar kursus yang diambil user beserta progres belajarnya.

**Query Parameters:**
- `phone`: Nomor WhatsApp user.
- `status` (opsional): `active` | `completed` | `all` (default: `all`).

**Response (`200 OK`):**
```json
{
  "ok": true,
  "name": "Budi Santoso",
  "courses": [
    {
      "enrollment_id": 12,
      "course_id": 3,
      "title": "Mastering Laravel & Inertia React",
      "slug": "mastering-laravel-inertia-react",
      "description": "Panduan lengkap membangun aplikasi modern.",
      "level": "intermediate",
      "status": "active",
      "duration_minutes": 180,
      "progress_percent": 65,
      "completed_lessons": 13,
      "total_lessons": 20,
      "url": "https://lms.test/courses/mastering-laravel-inertia-react"
    }
  ]
}
```

---

### 4. Silabus & Outline Kursus
#### `GET /api/wa/courses/{course}/outline`
Mengambil susunan bab, materi (lesson), kuis, dan tugas di dalam kursus.
Parameter `{course}` menerima: **Course ID**, **Course Slug**, atau **Enrollment ID**.

**Query Parameter:**
- `phone`: Nomor WhatsApp user.

**Response (`200 OK`):**
```json
{
  "ok": true,
  "course": {
    "id": 3,
    "title": "Mastering Laravel & Inertia React",
    "slug": "mastering-laravel-inertia-react"
  },
  "chapters": [
    {
      "id": 7,
      "title": "Bab 1: Persiapan Environment",
      "order": 1,
      "lessons": [
        {
          "id": 40,
          "title": "Instalasi Herd & Composer",
          "type": "video",
          "duration_minutes": 10,
          "is_completed": true
        },
        {
          "id": 41,
          "title": "Struktur Direktori Laravel",
          "type": "text",
          "duration_minutes": 15,
          "is_completed": false
        }
      ],
      "quizzes": [
        {
          "id": 4,
          "title": "Kuis Pemahaman Bab 1",
          "question_count": 5,
          "passing_score": 80,
          "is_completed": false
        }
      ],
      "assignments": [
        {
          "id": 2,
          "title": "Tugas Mandiri 1",
          "deadline": 7,
          "is_submitted": false
        }
      ]
    }
  ]
}
```

---

### 5. Isi Materi Pelajaran (Lesson Detail)
#### `GET /api/wa/lesson/{lesson}`
Mengambil isi materi pelajaran. Endpoint ini menyediakan field **`text_content`** yang sudah dibersihkan dari HTML dan diformat khusus menggunakan markdown WhatsApp (*tebal*, _miring_, ```kode```, bullet points).

**Query Parameter:**
- `phone`: Nomor WhatsApp user.

**Response (`200 OK`):**
```json
{
  "ok": true,
  "lesson": {
    "id": 41,
    "title": "Struktur Direktori Laravel",
    "type": "text",
    "duration_minutes": 15,
    "is_completed": false,
    "video_url": null,
    "file_url": null,
    "text_content": "*Pengenalan Direktori*\n\nLaravel memiliki struktur folder yang sangat rapi:\n• *app*: Tempat logika aplikasi, controller, dan model\n• *routes*: Definisi endpoint web dan API\n• *resources*: Berisi komponen React Inertia\n\nUntuk membuat controller baru, gunakan command:\n```php artisan make:controller UserController```",
    "raw_content": "<h2>Pengenalan Direktori</h2><p>Laravel memiliki struktur folder...</p>",
    "chapter_title": "Bab 1: Persiapan Environment",
    "course_title": "Mastering Laravel & Inertia React",
    "url": "https://lms.test/courses/mastering-laravel-inertia-react/learn/41",
    "prev_lesson": { "id": 40, "title": "Instalasi Herd & Composer" },
    "next_lesson": { "id": 42, "title": "Konfigurasi Database" }
  }
}
```

---

### 6. Tandai Materi Selesai
#### `POST /api/wa/lesson/{lesson}/complete`
Menandai bahwa user telah menyelesaikan materi tersebut via WhatsApp.
- Otomatis mencatat progres (`LessonProgress`).
- Memberikan poin gamifikasi (**+10 poin**).
- Jika materi ini merupakan materi terakhir di kursus: otomatis mengubah status kursus menjadi **completed**, menerbitkan sertifikat, dan memberikan bonus kelulusan (**+50 poin**).

**Request Body:**
```json
{
  "phone": "6285337092290"
}
```

**Response (`200 OK`):**
```json
{
  "ok": true,
  "message": "Materi berhasil ditandai selesai! +10 poin.",
  "points_awarded": 10,
  "course_completed": true,
  "certificate_url": "https://lms.test/certificates"
}
```

---

### 7. Detail Kuis
#### `GET /api/wa/quiz/{quiz}`
Mengambil informasi kuis, jumlah soal, skor kelulusan, dan riwayat pengerjaan user.

**Query Parameter:**
- `phone`: Nomor WhatsApp user.

**Response (`200 OK`):**
```json
{
  "ok": true,
  "quiz": {
    "id": 4,
    "title": "Kuis Pemahaman Bab 1",
    "description": "Kuis pilihan ganda 5 soal.",
    "passing_score": 80,
    "max_attempts": 3,
    "time_limit": 15,
    "question_count": 5,
    "attempts_used": 1,
    "highest_score": 85,
    "is_passed": true,
    "url": "https://lms.test/courses/mastering-laravel-inertia-react/quiz/4"
  }
}
```

---

### 8. Daftar Tugas (Assignments)
#### `GET /api/wa/assignments`
Mengambil daftar tugas dari seluruh kelas aktif yang diikuti user.

**Query Parameter:**
- `phone`: Nomor WhatsApp user.

**Response (`200 OK`):**
```json
{
  "ok": true,
  "assignments": [
    {
      "id": 2,
      "title": "Tugas Membuat API Sederhana",
      "course_title": "Mastering Laravel & Inertia React",
      "deadline": 7,
      "submission_type": "file",
      "is_submitted": true,
      "status": "graded",
      "score": 95,
      "url": "https://lms.test/courses/mastering-laravel-inertia-react/assignment/2"
    }
  ]
}
```

---

### 9. Agenda Belajar (Planner Tasks)
#### `GET /api/wa/tasks`
Mengambil jadwal agenda belajar user.

**Query Parameters:**
- `phone`: Nomor WhatsApp user.
- `filter` (opsional): `pending` | `today` | `all` (default: `pending`).

**Response (`200 OK`):**
```json
{
  "ok": true,
  "tasks": [
    {
      "id": 14,
      "title": "Pelajari Instalasi Herd & Composer",
      "type": "lesson",
      "scheduled_date": "2026-09-14",
      "status": "pending",
      "is_priority": true
    }
  ]
}
```

#### `POST /api/wa/tasks/{task}/toggle`
Mengubah status tugas antara `pending` $\leftrightarrow$ `completed`.

**Request Body:**
```json
{
  "phone": "6285337092290"
}
```

**Response (`200 OK`):**
```json
{
  "ok": true,
  "task": {
    "id": 14,
    "title": "Pelajari Instalasi Herd & Composer",
    "status": "completed"
  }
}
```

---

### 10. Daftar Sertifikat
#### `GET /api/wa/certificates`
Mengambil daftar sertifikat yang diperoleh user, lengkap dengan URL verifikasi dan unduhan PDF.

**Query Parameter:**
- `phone`: Nomor WhatsApp user.

**Response (`200 OK`):**
```json
{
  "ok": true,
  "certificates": [
    {
      "id": 2,
      "certificate_number": "CERT-XY89AB-2026",
      "course_title": "Dasar Pemrograman Web",
      "issued_at": "2026-08-30",
      "view_url": "https://lms.test/certificates",
      "download_url": "https://lms.test/certificates/2/download"
    }
  ]
}
```

---

### 11. Pencarian Materi Pelajaran
#### `GET /api/wa/search?q={kata_kunci}`
Mencari materi dari seluruh kelas yang diikuti user berdasarkan kata kunci.

**Query Parameters:**
- `phone`: Nomor WhatsApp user.
- `q`: Kata kunci pencarian (misal: `database`, `looping`, `controller`).

**Response (`200 OK`):**
```json
{
  "ok": true,
  "query": "database",
  "results": [
    {
      "lesson_id": 42,
      "title": "Konfigurasi Database & Migrasi",
      "course_title": "Mastering Laravel & Inertia React",
      "snippet": "Dalam bab ini kita akan menghubungkan Laravel dengan MySQL menggunakan database Herd...",
      "url": "https://lms.test/courses/mastering-laravel-inertia-react/learn/42"
    }
  ]
}
```

---

## 5. Contoh Implementasi Client Bot (Node.js / Express / Baileys / Meta Cloud API)

```javascript
import axios from 'axios';

const LMS_API_BASE = 'https://lms-domain.com/api/wa';
const LMS_API_KEY = 'e01c7d50ce2fcd0477438918936d5cfc6561a64428230cd3d687908d767f1a33';

const lmsClient = axios.create({
  baseURL: LMS_API_BASE,
  headers: {
    'X-API-KEY': LMS_API_KEY,
    'Content-Type': 'application/json'
  }
});

// 1. Verifikasi nomor WA dari pesan chat
async function verifyUserCode(senderPhone, messageText) {
  try {
    const res = await lmsClient.post('/verify', {
      phone: senderPhone,
      message: messageText
    });
    return res.data.message;
  } catch (err) {
    return err.response?.data?.message || 'Verifikasi gagal. Pastikan kode benar.';
  }
}

// 2. Ambil ringkasan materi saat user mengetik "menu" atau "kelas"
async function getUserSummary(senderPhone) {
  try {
    const res = await lmsClient.get('/summary', { params: { phone: senderPhone } });
    const { user, active_courses, pending_tasks } = res.data;

    let text = `Halo *${user.name}*! Poin belajar kamu: *${user.points}* ⭐\n\n`;
    text += `📚 *Kelas Aktif:*\n`;
    active_courses.forEach((c, idx) => {
      text += `${idx + 1}. *${c.title}* (${c.progress_percent}%)\n`;
      if (c.next_lesson) {
        text += `   ➡️ Lanjut: ${c.next_lesson.title}\n`;
      }
    });

    if (pending_tasks.length > 0) {
      text += `\n📝 *Agenda Pending:*\n`;
      pending_tasks.forEach(t => {
        text += `• ${t.title} (${t.scheduled_date})\n`;
      });
    }

    return text;
  } catch (err) {
    if (err.response?.status === 404) {
      return 'Nomor kamu belum terhubung ke LMS. Silakan buat kode verifikasi di profil akun LMS kamu.';
    }
    return 'Terjadi kendala saat mengambil data kelas.';
  }
}
```

---

## 6. Template Balasan WhatsApp Lengkap (Chat Format)

Berikut adalah daftar **seluruh template balasan WhatsApp** yang dikirimkan oleh sistem ke layar HP pengguna untuk setiap skenario interaksi:

### Template 1: Verifikasi Akun Berhasil
```text
✅ *Verifikasi Berhasil!*

Halo *Budi Santoso*, nomor WhatsApp kamu telah resmi terhubung ke akun LMS Pak Andi.

Kamu sekarang dapat:
• Mengetik *kelas* untuk melihat daftar kursus
• Mengetik *agenda* untuk melihat jadwal belajar
• Mengetik *menu* untuk melihat seluruh perintah

Selamat belajar! 🚀
```

---

### Template 2: Verifikasi Gagal / Kedaluwarsa
```text
⚠️ *Verifikasi Gagal*

Kode verifikasi yang kamu kirimkan salah atau sudah kedaluwarsa (masa berlaku 10 menit).

Silakan buka kembali menu *Profil Akun LMS* untuk men-generate kode baru, lalu kirimkan kodenya ke sini.
```

---

### Template 3: Nomor Belum Terhubung (Belum Terdaftar)
```text
⚠️ *Nomor Belum Terhubung*

Nomor WhatsApp kamu (*+62 812-3456-7890*) belum terdaftar atau belum ditautkan ke akun LMS Pak Andi.

*Cara Menghubungkan:*
1. Login ke website LMS Pak Andi
2. Buka menu *Pengaturan > Profil*
3. Pada bagian *Bot WhatsApp LMS*, klik tombol *Generate kode verifikasi*
4. Kirimkan 6 digit kode tersebut ke nomor WhatsApp ini (*+62 853-3709-2290*).
```

---

### Template 4: Menu Utama Bantuan (`menu` / `bantuan`)
```text
🤖 *Menu Layanan WhatsApp LMS Pak Andi:*

Ketik perintah berikut untuk berinteraksi:
• *kelas* : Lihat daftar kelas yang sedang kamu ikuti
• *silabus [id_kelas]* : Lihat bab & daftar materi kelas
• *materi [id_materi]* : Baca materi pelajaran langsung di WhatsApp
• *selesai [id_materi]* : Tandai materi selesai & dapatkan poin
• *kuis [id_kuis]* : Info syarat & link pengerjaan kuis
• *tugas* : Lihat daftar tugas & tenggat waktu aktif
• *agenda* : Lihat agenda belajar / planner tugas hari ini
• *sertifikat* : Lihat sertifikat kelulusan & download PDF
• *cari [topik]* : Cari materi di kelas kamu (contoh: *cari database*)
• *info* : Ringkasan progres belajar & total poin kamu
```

---

### Template 5: Ringkasan Progres Belajar (`info` / `summary`)
```text
Halo *Budi Santoso*! 👋
Poin belajar kamu saat ini: *240* ⭐

📚 *Kelas Aktif:*
1. *Mastering Laravel & Inertia React* (65%)
   ➡️ Lanjut: Implementasi Autentikasi dengan Fortify (Ketik: *materi 45*)
2. *Dasar Pemrograman Web* (100% - Selesai)

📝 *Agenda Tugas Pending:*
• Kuis Pemahaman Middleware (Jadwal: 2026-09-14) ⚡ (Prioritas)
• Tugas Mandiri API Controller (Jadwal: 2026-09-16)

Ketik *kelas* untuk melihat semua materi atau *menu* untuk opsi lainnya.
```

---

### Template 6: Daftar Kelas (`kelas` / `kursus`)
```text
📚 *Daftar Kelas Kamu (Budi Santoso):*

1. *Mastering Laravel & Inertia React*
   Progres: 65% (13/20 materi)
   Level: Intermediate
   Silabus: Ketik *silabus 3*
   Link Web: https://lms.test/courses/mastering-laravel-inertia-react

2. *Dasar Pemrograman Web*
   Progres: 100% (10/10 materi)
   Status: ✅ Selesai
   Sertifikat: Ketik *sertifikat*
   Link Web: https://lms.test/courses/dasar-pemrograman-web

💡 *Tips:* Ketik *silabus [ID_KELAS]* untuk melihat daftar bab dan materi.
```

---

### Template 7: Silabus Kursus (`silabus [id]` / `outline [id]`)
```text
📑 *Silabus: Mastering Laravel & Inertia React*

📂 *Bab 1: Pengenalan & Environment*
  ✅ [ID: 40] Instalasi Herd & Composer (10m)
  ✅ [ID: 41] Struktur Direktori Laravel (15m)
  🎯 [KUIS ID: 4] Kuis Pemahaman Bab 1 (5 soal)

📂 *Bab 2: Routing & Controller*
  ✅ [ID: 42] Dasar Routing & Route Parameters (12m)
  ⚪ [ID: 43] Controller Resource & Request Lifecycle (20m)
  📝 [TUGAS ID: 2] Tugas Mandiri API Controller (Deadline: 7 hari)

📂 *Bab 3: Frontend Inertia React*
  ⚪ [ID: 44] Setup Inertia React & Wayfinder (25m)
  ⚪ [ID: 45] Implementasi Autentikasi dengan Fortify (30m)

💡 *Petunjuk:* Ketik *materi [ID]* untuk membaca materi (contoh: *materi 43*).
```

---

### Template 8: Baca Materi Pelajaran (`materi [id]`)
```text
📖 *Struktur Direktori Laravel* ⏳ (Belum Selesai)
📁 Kelas: *Mastering Laravel & Inertia React* (Bab 1: Pengenalan & Environment)
⏱️ Durasi: 15 menit

*Pengenalan Direktori Laravel*

Laravel memiliki arsitektur MVC yang sangat terstruktur:
• *app/*: Berisi model, controller, middleware, dan service provider
• *bootstrap/*: Berisi file konfigurasi booting framework
• *config/*: Seluruh konfigurasi aplikasi (app, database, services, auth)
• *database/*: Migrasi database, factories, dan seeders
• *resources/*: File view Blade atau komponen SPA React Inertia
• *routes/*: Definisi rute web.php, api.php, dan console.php

Untuk membuat controller baru secara otomatis:
```php artisan make:controller Api/UserController```

🎥 *Video Pembahasan:*
https://youtube.com/watch?v=sample-video-id

💡 *Aksi Belajar:*
• Ketik *selesai 41* untuk menandai materi ini selesai & klaim poin
• Ketik *materi 42* untuk lanjut ke materi berikutnya: _Dasar Routing & Route Parameters_
```

---

### Template 9: Konfirmasi Materi Selesai (`selesai [id]`)
```text
🎉 *Selamat! Materi Berhasil Diselesaikan.*

Materi: *Struktur Direktori Laravel*
⭐ Kamu mendapatkan *+10 poin* belajar!
Total Poin Kamu: *250 poin* ⭐

➡️ Materi Berikutnya: *Dasar Routing & Route Parameters*
Ketik *materi 42* untuk langsung mulai belajar!
```

---

### Template 10: Kursus Selesai & Terbit Sertifikat
```text
🎉 *Luar Biasa! Kursus Berhasil Diselesaikan!* 🎓

Selamat *Budi Santoso*, kamu telah berhasil menyelesaikan seluruh materi, tugas, dan kuis pada kelas:
*Mastering Laravel & Inertia React*

⭐ Bonus Kelulusan: *+50 poin*!
📜 Sertifikat kelulusan resmi kamu telah diterbitkan.
Nomor Sertifikat: `CERT-AB9218-2026`

Unduh sertifikat PDF kamu di:
https://lms.test/certificates/2/download

Ketik *sertifikat* untuk melihat seluruh sertifikat yang kamu miliki.
```

---

### Template 11: Detail Kuis (`kuis [id]`)
```text
📝 *Kuis Pemahaman Bab 1*

• Status: *✅ Lulus*
• Nilai Tertinggi Kamu: *85*
• Nilai Kelulusan: *80*
• Jumlah Soal: *5 soal*
• Percobaan Digunakan: *1 / 3 percobaan*
• Waktu Pengerjaan: *15 menit*

🔗 *Kerjakan / Review Kuis di Web:*
https://lms.test/courses/mastering-laravel-inertia-react/quiz/4
_(Pengerjaan kuis dilakukan di website agar penilaian dan timer akurat)_
```

---

### Template 12: Daftar Tugas (`tugas`)
```text
📝 *Daftar Tugas Belajar Aktif:*

1. *Tugas Mandiri API Controller*
   Kelas: Mastering Laravel & Inertia React
   Status: ⏳ Menunggu Penilaian (Sudah Dikumpulkan)
   Batas Waktu: 7 hari
   Link Unggah: https://lms.test/courses/mastering-laravel-inertia-react/assignment/2

2. *Tugas Desain UI React*
   Kelas: Frontend Modern
   Status: ⚪ Belum Dikumpulkan
   Batas Waktu: 3 hari
   Link Unggah: https://lms.test/courses/frontend-modern/assignment/5
```

---

### Template 13: Agenda Belajar / Planner (`agenda` / `tasks`)
```text
📅 *Agenda Belajar Hari Ini (14 September 2026):*

1. ⚪ *Kuis Pemahaman Middleware* ⚡ (Prioritas)
   Tipe: Kuis
   Batas Waktu: Hari ini

2. ⚪ *Materi Setup Inertia React*
   Tipe: Pelajaran
   Ketik: *materi 44*

🎉 Selesaikan tugasmu hari ini untuk menjaga streak belajar tetap aktif!
```

---

### Template 14: Daftar Sertifikat Kelulusan (`sertifikat`)
```text
🎓 *Sertifikat Kelulusan Kamu (Budi Santoso):*

1. *Mastering Laravel & Inertia React*
   Nomor: `CERT-AB9218-2026`
   Tanggal Terbit: 14 September 2026
   📄 Unduh PDF: https://lms.test/certificates/2/download
   🌐 Verifikasi: https://lms.test/certificates

2. *Dasar Pemrograman Web*
   Nomor: `CERT-XY89AB-2026`
   Tanggal Terbit: 30 Agustus 2026
   📄 Unduh PDF: https://lms.test/certificates/1/download
   🌐 Verifikasi: https://lms.test/certificates
```

---

### Template 15: Hasil Pencarian Materi (`cari [topik]`)
```text
🔍 *Hasil Pencarian: "database"*

Ditemukan 2 materi relevan di kelas kamu:

1. *Konfigurasi Database & Migrasi* (Kelas: Mastering Laravel)
   Ketik: *materi 42*
   _Dalam bab ini kita akan menghubungkan Laravel dengan MySQL dan menjalankan migrasi skema tabel..._

2. *Eloquent ORM & Query Builder* (Kelas: Mastering Laravel)
   Ketik: *materi 43*
   _Pelajari cara query data relasi one-to-many dan many-to-many secara efisien..._
```

---

## 7. Format Template Resmi Meta WhatsApp Cloud API (HSM Template)

Jika Anda ingin mengirimkan pesan verifikasi atau notifikasi menggunakan **Template Resmi Meta (Pre-approved HSM Template)** dari Meta Business Manager:

### 1. Template Verifikasi / OTP (`auth_verification_code`)
* **Kategori:** `AUTHENTICATION`
* **Nama Template:** `lms_verifikasi_akun`
* **Bahasa:** `id` (Indonesian)
* **Body:**
  ```text
  {{1}} adalah kode verifikasi akun LMS Pak Andi Anda. Kode ini berlaku selama 10 menit. Jangan bagikan kode ini kepada siapa pun.
  ```
* **Tombol Cepat (Quick Reply / URL Button):**
  - Tipe: `COPY_CODE`
  - Teks Tombol: `Salin Kode`

### 2. Template Notifikasi Kursus Selesai (`course_completion_notification`)
* **Kategori:** `UTILITY`
* **Nama Template:** `lms_kursus_selesai`
* **Bahasa:** `id`
* **Header:** `Selamat {{1}}, Anda Lulus!`
* **Body:**
  ```text
  Selamat! Anda telah menyelesaikan seluruh materi pada kelas {{2}}. Sertifikat kelulusan Anda dengan nomor {{3}} telah diterbitkan.
  ```
* **Tombol URL:**
  - Tipe: `URL`
  - Teks: `Unduh Sertifikat`
  - URL: `https://lms.test/certificates`

