feat(umkm): migrate KategoriProduk to KategoriProdukUmkm for UMKM isolation

- update prisma schema to use KategoriProdukUmkm for Umkm model
- add @@map to KategoriProdukUmkm for lowercase table naming
- update API endpoints and KPI dashboard to use new model
- bump version to 0.1.33
This commit is contained in:
2026-04-28 00:47:22 +08:00
parent 5ab014281a
commit a4c7a97593
13 changed files with 533 additions and 158 deletions

View File

@@ -0,0 +1,90 @@
# Plan: Migrasi KategoriProduk → KategoriProdukUmkm untuk UMKM
## Tujuan
Ganti relasi kategori di model `Umkm` dan seluruh CRUD kategori UMKM agar menggunakan model `KategoriProdukUmkm` (bukan `KategoriProduk`). Model `KategoriProduk` tetap dipertahankan untuk `PasarDesa` dan `KategoriToPasar`.
## Analisis Kondisi Saat Ini
### Schema Prisma
- `Umkm``kategori KategoriProduk @relation(...)` + `kategoriId String`
- `KategoriProdukUmkm` punya relasi `Umkm[]` tapi Umkm belum punya FK ke sana (schema tidak konsisten)
- `KategoriProduk` dipakai oleh: `Umkm[]`, `PasarDesa[]`, `KategoriToPasar[]`
### File yang Perlu Diubah
1. `prisma/schema.prisma` — ubah relasi Umkm
2. `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/kategori-produk/kategori-produk.ts` — ganti semua `prisma.kategoriProduk``prisma.kategoriProdukUmkm`
3. `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/produk/create.ts` — relasi kategori di PasarDesa tidak berubah (masih `KategoriProduk`)
4. `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/produk/findMany.ts` — include `kategoriProduk` di PasarDesa tidak berubah
5. `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/dashboard/kpi.ts` — groupBy `kategoriId` di Umkm perlu include model baru
6. `src/app/admin/(dashboard)/_state/ekonomi/umkm/umkm.ts` — state/form kategori UMKM
7. Admin pages (list, create, edit) — tidak perlu banyak perubahan (UI tetap sama)
---
## Langkah-Langkah
### Fase 1 — Schema Prisma
**File:** `prisma/schema.prisma`
1. Di model `Umkm` (line ~2435):
- Ubah `kategori KategoriProduk @relation(fields: [kategoriId], references: [id])``kategori KategoriProdukUmkm @relation(fields: [kategoriId], references: [id])`
- Field `kategoriId String` tetap sama (nama field tidak perlu berubah)
2. Di model `KategoriProduk` (line ~1453):
- Hapus baris `Umkm Umkm[]` (UMKM tidak lagi relasi ke sini)
3. Model `KategoriProdukUmkm` sudah punya `Umkm Umkm[]` — tidak perlu diubah
### Fase 2 — Database Migration
```bash
bunx prisma migrate dev --name migrate-umkm-kategori-to-kategori-produk-umkm
```
- Migration akan: ubah FK constraint di tabel `Umkm` dari `KategoriProduk``KategoriProdukUmkm`
- **Perhatian:** Data lama di `kategoriId` merujuk ke `KategoriProduk`. Perlu seed/migrasi data atau set nullable dulu.
> **Strategi migrasi data:**
> - Buat `kategoriId` di `Umkm` menjadi nullable sementara (`String?`)
> - Jalankan migration
> - Seed `KategoriProdukUmkm` dengan data yang sama seperti `KategoriProduk`
> - Update data Umkm yang ada agar `kategoriId` menunjuk ke `KategoriProdukUmkm` yang sesuai
> - Set kembali `kategoriId` menjadi required (`String`)
### Fase 3 — API Handler: CRUD Kategori Produk UMKM
**File:** `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/kategori-produk/kategori-produk.ts`
Ganti semua `prisma.kategoriProduk``prisma.kategoriProdukUmkm`:
- `/find-many-all``prisma.kategoriProdukUmkm.findMany()`
- `/find-many``prisma.kategoriProdukUmkm.findMany()`
- `/create``prisma.kategoriProdukUmkm.create()`
- `PUT /:id``prisma.kategoriProdukUmkm.update()`
- `DELETE /del/:id``prisma.kategoriProdukUmkm.update()`
### Fase 4 — API Handler: Dashboard KPI
**File:** `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/dashboard/kpi.ts`
- Bagian `groupBy kategoriId` untuk Umkm: ubah include/join agar ambil nama dari `KategoriProdukUmkm` bukan `KategoriProduk`
### Fase 5 — State Management
**File:** `src/app/admin/(dashboard)/_state/ekonomi/umkm/umkm.ts`
- Pastikan tipe data / form state kategori UMKM masih sesuai (field name tidak berubah, hanya model di backend)
### Fase 6 — Build & Verify
```bash
bun run tsc --noEmit # Type check
bun run build # Full build
```
---
## Yang TIDAK Berubah
- `KategoriProduk` model tetap ada (masih digunakan `PasarDesa` dan `KategoriToPasar`)
- Relasi `PasarDesa.kategoriProdukId → KategoriProduk` tidak berubah
- Admin UI pages (kategori-produk/page.tsx, create, edit) — logika UI tidak berubah, hanya backend model berbeda
- API route path tetap sama (`/api/ekonomi/kategoriproduk/*`)
---
## Risiko
- **Data migration:** Umkm yang ada punya `kategoriId` yang merujuk ke `KategoriProduk`. Perlu migrasi data atau data akan hilang relasi.
- **Solusi:** Buat `KategoriProdukUmkm` dengan data yang sama, lalu update `Umkm.kategoriId` via SQL migration script.

View File

@@ -0,0 +1,12 @@
# Task: Migrasi KategoriProduk → KategoriProdukUmkm
## Progress
- [x] Phase 1: Schema Update (`prisma/schema.prisma`) <!-- id: 0 -->
- [x] Phase 2: Data Migration (Manual SQL/Script) <!-- id: 1 -->
- [x] Phase 3: Update API CRUD UMKM Kategori <!-- id: 2 -->
- [x] Phase 4: Update KPI Dashboard UMKM <!-- id: 3 -->
- [x] Phase 5: Verification & Build <!-- id: 4 -->
## Notes
- `KategoriProduk` tetap dipertahankan untuk `PasarDesa`.
- `KategoriProdukUmkm` akan digunakan secara eksklusif oleh `Umkm`.

View File

@@ -0,0 +1,26 @@
# Summary: Migrasi KategoriProduk → KategoriProdukUmkm
## Perubahan yang Dilakukan
1. **Schema Prisma**:
- Memisahkan model kategori untuk `Umkm` dan `PasarDesa`.
- `Umkm` sekarang menggunakan `KategoriProdukUmkm`.
- `PasarDesa` tetap menggunakan `KategoriProduk`.
- Menghapus relasi `Umkm` dari model `KategoriProduk`.
2. **Database**:
- Menjalankan `prisma db push` untuk memperbarui tabel di PostgreSQL.
- Menyiapkan dan menguji script migrasi data (tabel saat ini kosong, namun script sudah diverifikasi).
3. **Backend API**:
- Mengubah `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/kategori-produk/kategori-produk.ts` agar menggunakan `prisma.kategoriProdukUmkm`.
- Memperbarui logic KPI dashboard di `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/dashboard/kpi.ts` untuk menggunakan model kategori yang tepat berdasarkan konteks (UMKM vs Penjualan).
4. **Validasi**:
- Berhasil menjalankan `bun run build` tanpa error TypeScript baru.
## Dampak
- Admin UMKM sekarang memiliki manajemen kategori yang terisolasi dari PasarDesa.
- Tidak ada perubahan pada UI karena path API dan struktur data tetap sama.
- Kompabilitas data tetap terjaga karena relasi menggunakan ID yang sama.
## File Terkait
- `prisma/schema.prisma`
- `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/kategori-produk/kategori-produk.ts`
- `src/app/api/[[...slugs]]/_lib/ekonomi/umkm/dashboard/kpi.ts`