> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sertifikasitrainer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Alur batch & tier

> Admin membuat batch, tier, sinkron Scalev, dan mengatur akses peserta.

Batch adalah **gelombang training** yang dijual ke publik. Tier adalah **paket harga** di dalam batch — menentukan harga, kursus yang dibuka, dan fitur AI.

## Model data

```mermaid theme={null}
erDiagram
  batch_training ||--o{ batch_tiers : has
  batch_tiers }o--o| tier_templates : from_template
  batch_tiers ||--o{ peserta_batch : enrollments
  batch_training ||--o| courses : optional_default_course

  batch_training {
    uuid id
    string slug
    string status
    int scalev_product_id
  }
  batch_tiers {
    uuid id
    int price
    json course_ids
    json ai_features
    text scalev_variant_unique_id
  }
```

## Status batch

| Status                            | Publik `/order`   | Register     |
| --------------------------------- | ----------------- | ------------ |
| `draft`                           | Tidak tampil      | Ditolak      |
| `open` / `upcoming` / `published` | Tampil di katalog | Boleh daftar |

## Field tier penting

| Field                   | Fungsi                                                                |
| ----------------------- | --------------------------------------------------------------------- |
| `price`                 | Harga rupiah (integer)                                                |
| `courseIds`             | UUID kursus yang boleh diakses; `null` atau `[]` = semua kursus aktif |
| `aiFeatures`            | `trainer`, `master`, `branding` — gate AI Hub                         |
| `benefits`              | Daftar benefit untuk UI katalog                                       |
| `scalevVariantUniqueId` | ID varian Scalev untuk checkout                                       |
| `tierTemplateId`        | Opsional — salin default dari template                                |

Default `aiFeatures` jika kosong di DB (by nama tier): lihat [Peta alur produk](/architecture/alur-produk#akses-tier-→-fitur).

## Alur admin

```mermaid theme={null}
flowchart TD
  create["Buat batch\n/admin/batches"] --> status["Set status open/published"]
  status --> tiers["Tambah tier\n/admin/tier-management"]
  tiers --> map["Set courseIds + aiFeatures + harga"]
  map --> scalev["Ensure Scalev\nPOST ensure-scalev"]
  scalev --> sync["Resync tiap tier\nPOST resync-scalev"]
  sync --> health["Cek scalev-health"]
  health --> course["Buat/kaitkan kursus\n/admin/manage-kelas"]
  course --> live["Publik: /order → register"]
```

## API admin (prefix `/api`)

| Endpoint                                                   | Fungsi                                    |
| ---------------------------------------------------------- | ----------------------------------------- |
| `GET /admin/batches/:batchId/tiers`                        | List tier batch                           |
| `POST /admin/batches/:batchId/tiers`                       | Buat tier                                 |
| `PATCH /admin/batches/:batchId/tiers/:tierId`              | Update tier                               |
| `DELETE /admin/batches/:batchId/tiers/:tierId`             | Hapus tier (jika tidak ada payment aktif) |
| `POST /admin/batches/:batchId/ensure-scalev`               | Buat/update produk Scalev batch           |
| `POST /admin/batches/:batchId/tiers/:tierId/resync-scalev` | Sinkron varian tier ke Scalev             |
| `GET /admin/batches/:batchId/scalev-health`                | Diagnosa mapping Scalev                   |
| `GET /admin/batches/:batchId/tiers/:tierId/resolved`       | Tier + template merged                    |

Kode: `apps/api/src/payment/payment.routes.ts`, `payment.service.ts`, `scalev.service.ts`

## Sinkron Scalev

Setiap batch punya **satu produk Scalev** (`scalev_product_id`). Setiap tier = **satu varian** di produk itu.

```mermaid theme={null}
sequenceDiagram
  participant Admin
  participant API as PaymentService
  participant SV as Scalev API
  participant DB

  Admin->>API: ensure-scalev(batchId)
  API->>SV: create/update product
  SV-->>API: product_unique_id
  API->>DB: batch.scalev_product_id

  Admin->>API: resync-tier(tierId)
  API->>SV: upsert variant (nama tier + harga)
  SV-->>API: variant_unique_id
  API->>DB: tier.scalev_variant_unique_id
```

Kalau checkout gagal "variant not found", jalankan **ensure-scalev** lalu **resync** tiap tier. Panduan Scalev: [Tutorial Scalev](/external/scalev).

## Tier templates

Admin bisa kelola template global di `/admin/tier-management`:

* `defaultCourseIds`, `defaultAiFeatures`, `defaultBenefits`
* Saat buat tier baru, pilih template → field terisi otomatis, bisa di-override per batch

Kode: `apps/api/src/tier-templates/tier-templates.routes.ts`

## Halaman terkait

* [Admin playbook](/guides/admin-playbook) — checklist batch baru dari nol
* [Alur pembelian](/architecture/alur-pembelian)
* [Alur pembuatan kursus](/architecture/alur-kursus)
