# API Documentation: Backend SISADIK

Dokumentasi untuk API backend SISADIK yang mencakup CRUD Rombel, Import Siswa dengan Rombel, dan Administrasi Guru.

---

## 1. API Rombel (Rombongan Belajar)

### Base URL: `/api/rombel`

### GET - Daftar Rombel
Mengambil daftar rombel dengan filter.

**Request:**
```http
GET /api/rombel?tingkat=X&tahunPelajaran=2024/2025&isActive=true
```

**Query Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| tingkat | string | Filter berdasarkan tingkat (X, XI, XII) |
| tahunPelajaran | string | Filter berdasarkan tahun pelajaran |
| jurusanId | string | Filter berdasarkan jurusan |
| isActive | boolean | Filter berdasarkan status aktif |
| search | string | Search berdasarkan nama rombel |

**Response:**
```json
{
  "success": true,
  "data": [
    {
      "id": "cuid123",
      "namaRombel": "X RPL 1",
      "tingkat": "X",
      "tahunPelajaran": "2024/2025",
      "jurusanId": "jurusanId123",
      "isActive": true,
      "jurusan": {
        "id": "jurusanId123",
        "kodeJurusan": "RPL",
        "namaJurusan": "Rekayasa Perangkat Lunak"
      },
      "_count": {
        "siswa": 30,
        "cpFase": 5
      }
    }
  ]
}
```

### POST - Buat Rombel Baru
Membuat rombel baru (Admin only).

**Request:**
```http
POST /api/rombel
Content-Type: application/json
Authorization: Bearer <token>
```

**Body:**
```json
{
  "namaRombel": "X RPL 1",
  "tingkat": "X",
  "tahunPelajaran": "2024/2025",
  "jurusanId": "jurusanId123",
  "waliKelasId": "guruId123",
  "isActive": true
}
```

### GET - Detail Rombel
```http
GET /api/rombel/{id}
```

### PUT - Update Rombel
```http
PUT /api/rombel/{id}
```

### DELETE - Hapus Rombel
```http
DELETE /api/rombel/{id}
```

---

## 2. Import Rombel

### POST - Import dari Excel
```http
POST /api/rombel/import
Content-Type: multipart/form-data
Authorization: Bearer <token>
```

**Form Data:**
- `file`: File Excel (.xlsx/.xls)

**Template Excel Columns:**
| Column | Required | Example |
|--------|----------|---------|
| Nama Rombel | Ya | X RPL 1 |
| Tingkat | Ya | X |
| Tahun Pelajaran | Ya | 2024/2025 |
| Jurusan | Tidak | Rekayasa Perangkat Lunak |

### GET - Download Template
```http
GET /api/rombel/import
```

---

## 3. Import Siswa dengan Rombel

### POST - Import Siswa
```http
POST /api/siswa/import
Content-Type: multipart/form-data
Authorization: Bearer <token>
```

**Form Data:**
- `file`: File Excel (.xlsx/.xls)
- `tahunPelajaran`: String (wajib, e.g., "2024/2025")

**Template Excel Columns:**
| Column | Required | Example |
|--------|----------|---------|
| NISN | Ya | 0012345678 |
| NIS | Ya | 12345 |
| Nama Rombel | Ya | X RPL 1 |
| Nama | Ya | Ahmad Siswa |
| JK | Ya | L / P |
| Agama | Ya | Islam |
| Username | Ya | ahmad123 |
| Password | Ya | password123 |
| Email | Tidak | ahmad@email.com |
| No WA Siswa | Tidak | 081234567890 |
| No WA Orang Tua | Tidak | 081234567891 |

**Catatan:**
- `Nama Rombel` harus sesuai dengan rombel yang sudah ada di database untuk tahun pelajaran yang dipilih
- Siswa akan otomatis terhubung ke jurusan melalui rombel

### GET - Download Template dengan Daftar Rombel
```http
GET /api/siswa/import?withRombelList=true&tahunPelajaran=2024/2025
```

---

## 4. API Administrasi Guru

### 4.1 CP Fase (Capaian Pembelajaran Fase)

**Base URL:** `/api/administrasi-guru/cp-fase`

#### GET - Daftar CP Fase
```http
GET /api/administrasi-guru/cp-fase?tahunPelajaran=2024/2025&semester=GANJIL
```

**Query Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| tahunPelajaran | string | Filter tahun pelajaran |
| semester | GANJIL/GENAP | Filter semester |
| rombelId | string | Filter berdasarkan rombel |
| mapelId | string | Filter berdasarkan mapel |
| guruId | string | Filter berdasarkan guru (admin only) |

#### POST - Buat CP Fase
```http
POST /api/administrasi-guru/cp-fase
```

**Body:**
```json
{
  "tahunPelajaran": "2024/2025",
  "semester": "GANJIL",
  "capaianPembelajaran": "Peserta didik mampu...",
  "rombelId": "rombelId123",
  "mapelId": "mapelId123",
  "guruId": "guruId123"
}
```

#### GET - Detail CP Fase (dengan seluruh child)
```http
GET /api/administrasi-guru/cp-fase/{id}
```

#### PUT - Update CP Fase
```http
PUT /api/administrasi-guru/cp-fase/{id}
```

#### DELETE - Hapus CP Fase (cascade)
```http
DELETE /api/administrasi-guru/cp-fase/{id}
```

#### POST - Duplicate CP Fase ke Rombel Lain
```http
POST /api/administrasi-guru/cp-fase/{id}
```

**Body:**
```json
{
  "targetRombelIds": ["rombelId1", "rombelId2", "rombelId3"],
  "tahunPelajaran": "2024/2025",
  "semester": "GANJIL"
}
```

**Response:**
```json
{
  "success": true,
  "data": {
    "created": 3,
    "total": 3,
    "createdCPFases": [
      { "id": "newId1", "rombelId": "rombelId1", "rombelNama": "X RPL 1" },
      { "id": "newId2", "rombelId": "rombelId2", "rombelNama": "X RPL 2" },
      { "id": "newId3", "rombelId": "rombelId3", "rombelNama": "X TKJ 1" }
    ],
    "errors": []
  },
  "message": "Berhasil menduplikasi CP Fase ke 3 dari 3 rombel"
}
```

### 4.2 CP Element

**Base URL:** `/api/administrasi-guru/cp-element`

#### GET - Daftar CP Element
```http
GET /api/administrasi-guru/cp-element?cpFaseId={cpFaseId}
```

#### POST - Buat CP Element
```http
POST /api/administrasi-guru/cp-element
```

**Body:**
```json
{
  "elemen": "Membaca dan Memirsa",
  "capaianPembelajaran": "Peserta didik mampu membaca...",
  "cpFaseId": "cpFaseId123"
}
```

#### GET/PUT/DELETE - Detail/Update/Hapus
```http
GET /api/administrasi-guru/cp-element/{id}
PUT /api/administrasi-guru/cp-element/{id}
DELETE /api/administrasi-guru/cp-element/{id}
```

### 4.3 Tujuan Pembelajaran (TP)

**Base URL:** `/api/administrasi-guru/tp`

#### GET - Daftar TP
```http
GET /api/administrasi-guru/tp?cpElementId={cpElementId}
```

#### POST - Buat TP
```http
POST /api/administrasi-guru/tp
```

**Body:**
```json
{
  "kode": "TP-1.1",
  "kompetensi": "Mengidentifikasi ide pokok...",
  "lingkupMateri": "Teks deskripsi, prosedur...",
  "cpElementId": "cpElementId123"
}
```

#### GET/PUT/DELETE - Detail/Update/Hapus
```http
GET /api/administrasi-guru/tp/{id}
PUT /api/administrasi-guru/tp/{id}
DELETE /api/administrasi-guru/tp/{id}
```

### 4.4 Alur Tujuan Pembelajaran (ATP)

**Base URL:** `/api/administrasi-guru/atp`

#### GET - Daftar ATP
```http
GET /api/administrasi-guru/atp?tpId={tpId}
```

#### POST - Buat ATP
```http
POST /api/administrasi-guru/atp
```

**Body:**
```json
{
  "mingguKe": 1,
  "alokasiWaktuJP": 4,
  "profilPelajarPancasila": ["BERNALAR_KRITIS", "KREATIF"],
  "tpId": "tpId123"
}
```

**Nilai Profil Pelajar Pancasila (DimensiP3):**
- `BERIMAN_BERTAKWA`
- `BERKEBINEKAAN_GLOBAL`
- `BERGOTONG_ROYONG`
- `MANDIRI`
- `BERNALAR_KRITIS`
- `KREATIF`

#### GET/PUT/DELETE - Detail/Update/Hapus
```http
GET /api/administrasi-guru/atp/{id}
PUT /api/administrasi-guru/atp/{id}
DELETE /api/administrasi-guru/atp/{id}
```

---

## 5. Hierarki Data Administrasi Guru

```
CP Fase (Capaian Pembelajaran Fase)
└── CP Element (Elemen Capaian Pembelajaran)
    └── TP (Tujuan Pembelajaran)
        └── ATP (Alur Tujuan Pembelajaran)
```

**Cascade Delete:**
- Menghapus CP Fase akan menghapus semua CP Element, TP, dan ATP terkait
- Menghapus CP Element akan menghapus semua TP dan ATP terkait
- Menghapus TP akan menghapus semua ATP terkait

**Deep Copy (Duplicate):**
- Duplicate CP Fase akan menyalin seluruh struktur ke rombel tujuan:
  - Semua CP Element
  - Semua TP dari setiap CP Element
  - Semua ATP dari setiap TP

---

## 6. Authorization

**Headers yang diperlukan:**
```http
Authorization: Bearer <jwt_token>
```

**Role Access:**
| Endpoint | ADMIN | GURU | SISWA |
|----------|-------|------|-------|
| CRUD Rombel | ✅ | ❌ | ❌ |
| Import Siswa | ✅ | ✅ | ❌ |
| Read CP Fase (all) | ✅ | ❌ | ❌ |
| Read CP Fase (own) | ✅ | ✅ | ❌ |
| CRUD CP Fase (own) | ✅ | ✅ | ❌ |
| Duplicate CP Fase | ✅ | ✅ | ❌ |

---

## 7. Error Responses

**Format Error:**
```json
{
  "success": false,
  "message": "Pesan error"
}
```

**HTTP Status Codes:**
- `200` - Success
- `400` - Bad Request (validation error)
- `401` - Unauthorized (token invalid)
- `403` - Forbidden (no access)
- `404` - Not Found
- `500` - Internal Server Error
