﻿# 🔍 Perbandingan Struktur Tabel GLIMS: Lama vs Baru

> Dokumen ini membandingkan struktur tabel di **persadal_lims.sql** (lama/existing)
> dengan desain di **BLUEPRINT_MASTER_DATA.md** (baru).

---

## Ringkasan

| Aspek | Lama (`persadal_lims`) | Baru (Blueprint) |
|---|---|---|
| Jumlah tabel | **13 tabel** | **10 tabel** |
| Naming convention | `m_xxx` (tanpa prefix app) | `glims_m_xxx` / `glims_p_xxx` |
| UUID | ❌ Tidak ada | ✅ Ada di semua tabel |
| Deactivated tracking | ❌ Tidak ada | ✅ `deactivated_at`, `deactivated_by` |
| `updated_ip` | ✅ Ada | ❌ Tidak ada |

---

## 1. TABEL YANG ADA DI KEDUANYA (Perlu Diputuskan)

---

### 1.1 Sample Types

| Kolom | Lama (`m_sample_type`) | Baru (`glims_m_sample_types`) | Rekomendasi |
|---|---|---|---|
| `id` | ✅ bigint PK | ✅ bigIncrements PK | ✅ Pakai baru |
| `uuid` | ❌ | ✅ | ✅ **Tambahkan** (standar API) |
| `code` | ✅ varchar(50) unique | ✅ varchar(50) unique | ✅ Sama |
| `name` | ✅ varchar(255) | ✅ varchar(255) | ✅ Sama |
| `category_id` | ✅ FK → `m_sample_type_category` | ❌ (pakai `category` varchar) | ⚠️ **PAKAI LAMA** — lihat §2.1 |
| `category` | ❌ | ✅ varchar(100) | ❌ Ganti FK lebih baik |
| `description` | ✅ text | ✅ text | ✅ Sama |
| `storage_requirement` | ✅ text | ❌ | ✅ **PERTAHANKAN** — penting untuk SOP lab |
| `handling_instruction` | ✅ text | ❌ | ✅ **PERTAHANKAN** — penting untuk SOP lab |
| `handling_time` | ✅ int (menit) | ❌ | ✅ **PERTAHANKAN** — pakai untuk kalkulasi deadline |
| `lhu_format_id` | ✅ FK | ❌ | ⚠️ **PERTAHANKAN** — nanti link ke format LHU |
| `has_dynamic_fields` | ✅ tinyint(1) | ❌ | ✅ **PERTAHANKAN** — mendukung `m_sample_type_field` |
| `is_active` | ✅ | ✅ | ✅ Sama |
| `deactivated_at/by` | ❌ | ✅ | ✅ **Tambahkan** |
| `updated_ip` | ✅ | ❌ | ⚠️ Opsional — bisa dihandle middleware |
| `created_by/updated_by/deleted_by` | ✅ | ✅ | ✅ Sama |
| `timestamps + soft delete` | ✅ | ✅ | ✅ Sama |

> **📌 Verdict:** Pakai struktur LAMA + tambah `uuid` & `deactivated_at/by` dari baru.
> Kolom `storage_requirement`, `handling_instruction`, `handling_time`, `lhu_format_id`, `has_dynamic_fields` **sangat penting** untuk operasional lab dan **harus dipertahankan**.

---

### 1.2 Regulations

| Kolom | Lama (`m_regulation`) | Baru (`glims_m_regulations`) | Rekomendasi |
|---|---|---|---|
| `id` | ✅ | ✅ | ✅ Sama |
| `uuid` | ❌ | ✅ | ✅ **Tambahkan** |
| `code` | ✅ varchar(50) unique | ✅ varchar(50) unique | ✅ Sama |
| `name` | ✅ varchar(255) | ✅ varchar(255) | ✅ Sama |
| `short_name` | ❌ | ✅ varchar(100) | ✅ **Tambahkan** — berguna untuk UI dropdown |
| `regulation_type` | ❌ | ✅ varchar(50) | ✅ **Tambahkan** — PP, PerMen, SNI, dll |
| `regulation_number` | ❌ | ✅ varchar(100) | ✅ **Tambahkan** — nomor resmi peraturan |
| `issued_by` | ❌ | ✅ varchar(255) | ✅ **Tambahkan** — siapa yang menerbitkan |
| `issued_date` | ❌ | ✅ date | ✅ **Tambahkan** |
| `effective_date` | ✅ date NOT NULL | ✅ date nullable | ✅ Pakai baru (nullable lebih fleksibel) |
| `expiry_date` / `expired_date` | ✅ `expiry_date` | ✅ `expired_date` | ✅ Sama konsep, pilih salah satu |
| `replaces_regulation_id` | ❌ | ✅ FK self-reference | ✅ **Tambahkan** — tracking pergantian regulasi |
| `status` | ✅ varchar(50) | ❌ | ⚠️ **PERTAHANKAN** — bisa BERLAKU/DICABUT/DRAFT |
| `description` | ✅ text | ✅ text | ✅ Sama |
| `is_active` | ✅ | ✅ | ✅ Sama |
| `deactivated_at/by` | ❌ | ✅ | ✅ **Tambahkan** |
| `updated_ip` | ✅ | ❌ | ⚠️ Opsional |

> **📌 Verdict:** Pakai struktur BARU + pertahankan `status` dari lama. Baru jauh lebih lengkap.

---

### 1.3 Parameters

| Kolom | Lama (`m_parameter`) | Baru (`glims_m_parameters`) | Rekomendasi |
|---|---|---|---|
| `id` | ✅ | ✅ | ✅ Sama |
| `uuid` | ❌ | ✅ | ✅ **Tambahkan** |
| `code` | ✅ varchar(50) unique | ✅ varchar(50) unique | ✅ Sama |
| `name` | ✅ varchar(255) | ✅ varchar(255) | ✅ Sama |
| `symbol` | ❌ | ✅ varchar(50) | ✅ **Tambahkan** — pH, BOD₅, COD |
| `category_id` | ✅ FK → `m_parameter_category` | ❌ (pakai `category` varchar) | ⚠️ **PAKAI LAMA** — lihat §2.2 |
| `category` | ❌ | ✅ varchar(100) | ❌ Ganti FK ke tabel kategori |
| `default_unit` | ❌ | ✅ varchar(50) | ✅ **Tambahkan** — mg/L, ppm, °C |
| `handling_time` | ✅ int | ❌ | ✅ **PERTAHANKAN** — waktu penanganan sampel |
| `description` | ✅ text | ✅ text | ✅ Sama |
| `is_active` | ✅ | ✅ | ✅ Sama |
| `deactivated_at/by` | ❌ | ✅ | ✅ **Tambahkan** |
| `updated_ip` | ✅ | ❌ | ⚠️ Opsional |

> **📌 Verdict:** Gabungkan — pakai `category_id` FK dari lama + `symbol`, `default_unit` dari baru + pertahankan `handling_time`.

---

### 1.4 Methods

| Kolom | Lama (`m_method`) | Baru (`glims_m_methods`) | Rekomendasi |
|---|---|---|---|
| `id` | ✅ | ✅ | ✅ Sama |
| `uuid` | ❌ | ✅ | ✅ **Tambahkan** |
| `code` | ✅ varchar(50) unique | ✅ varchar(50) unique | ✅ Sama |
| `name` | ✅ varchar(255) | ✅ varchar(255) | ✅ Sama |
| `reference` | ✅ varchar(255) | ❌ (diganti `standard_ref`) | ✅ Nama baru lebih jelas |
| `standard_ref` | ❌ | ✅ varchar(255) | ✅ **Pakai ini** |
| `version` | ✅ varchar(50) | ❌ | ✅ **PERTAHANKAN** — versi metode (2019, 2021) |
| `category` | ✅ enum(KIMIA/FISIKA/MIKRO/BIO) | ❌ | ✅ **PERTAHANKAN** — klasifikasi metode |
| `method_type` | ❌ | ✅ varchar(50) | ✅ **Tambahkan** — SNI/APHA/EPA/ISO/In-House |
| `description` | ✅ text | ✅ text | ✅ Sama |
| `procedure_summary` | ✅ text | ❌ | ✅ **PERTAHANKAN** — ringkasan prosedur |
| `detection_limit` | ✅ decimal(20,6) | ❌ | ✅ **PERTAHANKAN** — batas deteksi alat |
| `measurement_unit` | ✅ varchar(50) | ❌ | ✅ **PERTAHANKAN** — satuan ukur |
| `is_accredited` | ✅ tinyint(1) | ✅ boolean | ✅ Sama |
| `accreditation_scope` | ✅ varchar(255) | ❌ | ✅ **PERTAHANKAN** — lingkup akreditasi |
| `equipment_required` | ✅ JSON | ❌ | ✅ **PERTAHANKAN** — daftar alat |
| `reagent_required` | ✅ JSON | ❌ | ✅ **PERTAHANKAN** — daftar reagen |
| `estimated_duration_hours` | ✅ decimal(5,2) | ❌ | ✅ **PERTAHANKAN** — estimasi durasi uji |
| `is_active` | ✅ | ✅ | ✅ Sama |
| `deactivated_at/by` | ❌ | ✅ | ✅ **Tambahkan** |

> **📌 Verdict:** Pakai struktur LAMA (lebih kaya) + tambah `uuid`, `method_type`, `deactivated_at/by` dari baru.
> Kolom `version`, `procedure_summary`, `detection_limit`, `measurement_unit`, `equipment_required`, `reagent_required`, `estimated_duration_hours` **sangat penting** untuk lab dan **jangan dihilangkan**.

---

### 1.5 Parameter ↔ Method Pivot

| Kolom | Lama (`m_parameter_method`) | Baru (`glims_p_method_parameter`) | Rekomendasi |
|---|---|---|---|
| `id` | ✅ | ✅ | ✅ Sama |
| `parameter_id` | ✅ FK | ✅ FK | ✅ Sama |
| `method_id` | ✅ FK | ✅ FK | ✅ Sama |
| `is_default` | ✅ tinyint(1) | ✅ `is_primary` boolean | ✅ Sama konsep, pakai `is_primary` |
| `is_active` | ✅ | ❌ | ✅ **PERTAHANKAN** — bisa nonaktifkan mapping |
| `created_by/updated_by` | ❌ | ✅ | ✅ **Tambahkan** |
| Unique constraint | ✅ `(parameter_id, method_id)` | ✅ `(method_id, parameter_id)` | ✅ Sama |

> **📌 Verdict:** Gabungkan — pakai baru + pertahankan `is_active`.

---

### 1.6 Regulation Attachments vs Regulation Appendices

| Aspek | Lama (`m_regulation_attachment`) | Baru (`glims_m_regulation_appendices`) |
|---|---|---|
| **Konsep** | **File attachment** (PDF, dokumen fisik) | **Lampiran logis** (struktur sub-regulasi) |
| **Fungsi** | Upload & simpan file regulasi | Struktur hierarki regulasi |
| Kolom file | `file_name`, `file_path`, `file_type`, `file_size` | ❌ Tidak ada |
| Kolom logis | `class_name`, `category` | `appendix_number`, `appendix_type`, `sort_order` |
| `sample_type_id` | ✅ nullable | ❌ |

> **📌 Verdict:** **Keduanya diperlukan!** Ini BUKAN pengganti satu sama lain.
> - `glims_m_regulation_appendices` → untuk **struktur logis** regulasi (Lampiran I, II, III)
> - `glims_r_regulation_attachments` → untuk **file fisik** yang di-upload (PDF, scan dokumen)
>
> **Rekomendasi: Pertahankan keduanya** — rename tabel file lama ke `glims_r_regulation_attachments` (tipe `r_` = reference/relasi).

---

## 2. TABEL LAMA YANG TIDAK ADA DI BLUEPRINT (Perlu Dipertahankan?)

---

### 2.1 `m_sample_type_category` — ✅ PERTAHANKAN

Tabel kategori jenis sampel (AIR, UDARA, TANAH, BIOTA, LIMBAH, PANGAN).

| Kolom | Tipe | Keterangan |
|---|---|---|
| `id`, `code`, `name`, `description` | Standar | Identitas kategori |
| `icon` | varchar(50) | Emoji/ikon (💧, 🌬️, 🏔️) |
| `display_order` | int | Urutan tampil |

**Alasan pertahankan:**
- Sudah punya 6 data seed (AIR, UDARA, TANAH, BIOTA, LIMBAH, PANGAN)
- Dipakai sebagai FK di `m_sample_type.category_id`
- Lebih bagus dari hardcode varchar — user bisa tambah kategori baru
- **Rename ke `glims_m_sample_type_categories`**

---

### 2.2 `m_parameter_category` — ✅ PERTAHANKAN

Tabel kategori parameter (FISIKA, KIMIA, MIKROBIOLOGI, BIOLOGI, ORGANOLEPTIK, RADIOAKTIF).

| Kolom | Tipe | Keterangan |
|---|---|---|
| `id`, `code`, `name`, `description` | Standar | Identitas kategori |
| `icon` | varchar(50) | Ikon |
| `display_order` | int | Urutan tampil |

**Alasan pertahankan:**
- Sudah punya 6 data seed
- Dipakai sebagai FK di `m_parameter.category_id`
- Lebih baik sebagai FK daripada VARCHAR yang rawan typo
- **Rename ke `glims_m_parameter_categories`**

---

### 2.3 `m_parameter_accreditation` — ✅ PERTAHANKAN

Tracking status akreditasi **per parameter per jenis sampel**.

| Kolom | Tipe | Keterangan |
|---|---|---|
| `parameter_id` + `sample_type_id` | Unique composite | Akreditasi spesifik per kombinasi |
| `accreditation_status` | enum | ACCREDITED / NOT_ACCREDITED / IN_PROCESS |
| `certificate_no` | varchar(100) | Nomor sertifikat KAN |
| `valid_from`, `valid_until` | date | Masa berlaku |

**Alasan pertahankan:**
- **Kritis untuk laboratorium terakreditasi KAN/ISO 17025**
- Customer sering minta status akreditasi di LHU
- Bisa expired → perlu tracking masa berlaku
- **Rename ke `glims_m_parameter_accreditations`**

---

### 2.4 `m_parameter_alias` — ⚠️ OPSIONAL (Pertahankan jika perlu)

Nama alias parameter dari berbagai standar (SNI, APHA, Internal SOP).

**Alasan pertahankan:** Berguna ketika satu parameter punya banyak nama berbeda di regulasi yang berbeda.
**Alasan skip:** Cukup simpan `symbol` di tabel parameter utama.

> **Rekomendasi:** Pertahankan, rename ke `glims_m_parameter_aliases`. Relatif kecil dan berguna untuk search/filter.

---

### 2.5 `m_sample_type_field` — ✅ PERTAHANKAN

Custom/dynamic fields per jenis sampel.

| Kolom | Tipe | Keterangan |
|---|---|---|
| `field_name`, `field_key` | varchar | Label & key field |
| `field_type` | enum | TEXT / NUMBER / DATE / SELECT / TEXTAREA |
| `field_options` | JSON | Opsi untuk SELECT type |
| `is_required`, `display_order` | | Validasi & urutan |

**Alasan pertahankan:**
- Mendukung `has_dynamic_fields` di `m_sample_type`
- Setiap jenis sampel bisa punya field tambahan kustom
- Sangat fleksibel untuk kebutuhan operasional yang bervariasi
- **Rename ke `glims_m_sample_type_fields`**

---

### 2.6 `m_sample_type_parameter` — ✅ PERTAHANKAN (Krusial!)

Mapping **jenis sampel ↔ parameter** dengan data operasional lengkap.

| Kolom | Tipe | Keterangan |
|---|---|---|
| `sample_type_id` + `parameter_id` | Unique composite | Mapping |
| `unit` | varchar(50) | Satuan spesifik per sampel-parameter |
| `method_reference` | varchar(255) | Referensi metode |
| `turnaround_time` | int (hari) | Waktu pengerjaan |
| `method_id` | FK | Metode default |
| `subcontract_lab_id` | FK | Lab subkontrak jika outsource |
| `analyst_user_id` | FK | Analis default |
| `fmmt_template_id` | FK | Template form kerja |
| `test_type` | enum | INTERNAL / SUBCONTRACT |
| `sampling_type` | enum | FIELD / LAB / BOTH |
| `handling_time` | int (menit) | Waktu handling |
| `is_accredited` | tinyint | Terakreditasi? |
| `accreditation_scope` | varchar | Lingkup akreditasi |
| `accreditation_valid_until` | date | Masa berlaku |
| `is_required` | tinyint | Wajib diuji? |
| `display_order` | int | Urutan tampil |

**Alasan pertahankan:**
- **Ini adalah tabel PALING PENTING** untuk operasional lab
- Menentukan: parameter apa, unit apa, metode apa, siapa yang uji, berapa lama
- Tidak bisa digantikan oleh `glims_p_group_sample_type` (yang hanya untuk paket/grouping)
- **Rename ke `glims_p_sample_type_parameters`**

---

### 2.7 `m_sample_type_regulation` — ⚠️ BISA DIGANTIKAN

Mapping jenis sampel ↔ regulasi.

**Di blueprint baru:** Relasi ini sudah tercakup di `glims_m_quality_standards` (yang menyimpan `sample_type_id` + `regulation_id` + `regulation_appendix_id`).

> **Rekomendasi:** Skip tabel ini, pakai `glims_m_quality_standards` sebagai pengganti.

---

## 3. TABEL BARU DI BLUEPRINT (Tidak Ada di Lama)

---

### 3.1 `glims_m_regulation_appendices` — ✅ TAMBAHKAN

Struktur logis lampiran regulasi. Belum ada di lama.

**Alasan:** Regulasi Indonesia biasanya punya banyak lampiran (PP No. 22/2021 punya puluhan lampiran). Perlu tabel terpisah untuk tracking.

---

### 3.2 `glims_m_sample_type_groups` + `glims_p_group_sample_type` — ✅ TAMBAHKAN

Paket/grouping pengujian untuk mempercepat input SO.

**Alasan:** Sangat berguna di lapangan — pilih "Paket Air Limbah Tekstil" dan otomatis terisi semua parameter + metode.

---

### 3.3 `glims_m_quality_standards` + `glims_m_quality_standard_params` — ✅ TAMBAHKAN

Baku mutu = nilai batas parameter per jenis sampel per regulasi per lampiran.

**Alasan:** Ini **fitur inti** GLIMS — membandingkan hasil uji vs baku mutu untuk menentukan MEMENUHI/TIDAK MEMENUHI.

---

## 4. REKOMENDASI FINAL — Daftar Tabel Definitif

| # | Nama Tabel (Baru) | Asal | Status |
|---|---|---|---|
| 1 | `glims_m_sample_types` | LAMA + BARU | 🔀 Gabungkan (pakai kolom lama + uuid/deactivated dari baru) |
| 2 | `glims_m_sample_type_categories` | LAMA | ✅ Pertahankan (rename dari `m_sample_type_category`) |
| 3 | `glims_m_sample_type_fields` | LAMA | ✅ Pertahankan (rename dari `m_sample_type_field`) |
| 4 | `glims_m_regulations` | BARU + LAMA | 🔀 Gabungkan (pakai baru + `status` dari lama) |
| 5 | `glims_m_regulation_appendices` | BARU | ✅ Tambahkan |
| 6 | `glims_r_regulation_attachments` | LAMA | ✅ Pertahankan (rename dari `m_regulation_attachment`) |
| 7 | `glims_m_parameters` | LAMA + BARU | 🔀 Gabungkan (category_id FK + symbol/default_unit baru) |
| 8 | `glims_m_parameter_categories` | LAMA | ✅ Pertahankan (rename dari `m_parameter_category`) |
| 9 | `glims_m_parameter_accreditations` | LAMA | ✅ Pertahankan (kritis untuk ISO 17025) |
| 10 | `glims_m_parameter_aliases` | LAMA | ⚠️ Pertahankan (berguna untuk search) |
| 11 | `glims_m_methods` | LAMA + BARU | 🔀 Gabungkan (lama lebih kaya + method_type dari baru) |
| 12 | `glims_p_method_parameter` | LAMA + BARU | 🔀 Gabungkan (rename, tambah audit columns) |
| 13 | `glims_p_sample_type_parameters` | LAMA | ✅ Pertahankan (rename dari `m_sample_type_parameter`) |
| 14 | `glims_m_sample_type_groups` | BARU | ✅ Tambahkan |
| 15 | `glims_p_group_sample_type` | BARU | ✅ Tambahkan |
| 16 | `glims_m_quality_standards` | BARU | ✅ Tambahkan |
| 17 | `glims_m_quality_standard_params` | BARU | ✅ Tambahkan |

**Total: 17 tabel** (dari 13 lama + 10 baru, digabungkan jadi 17)

---

## 5. KOLOM YANG HARUS DITAMBAHKAN KE SEMUA TABEL

Sesuai ARCHITECTURE_GUIDE.md, setiap tabel harus punya:

```
✅ uuid              — Sudah di blueprint, belum di lama
✅ is_active          — Sudah di keduanya
✅ deactivated_at     — Baru, tambahkan ke semua
✅ deactivated_by     — Baru, tambahkan ke semua
✅ created_by         — Sudah di keduanya
✅ updated_by         — Sudah di keduanya
✅ deleted_by         — Sudah di keduanya
✅ created_at         — Sudah di keduanya
✅ updated_at         — Sudah di keduanya
✅ deleted_at         — Sudah di keduanya (soft delete)
```

**Kolom `updated_ip`** dari lama → **OPSIONAL**. Bisa di-handle via middleware/audit log daripada di setiap tabel.

---

## 6. KESIMPULAN

### Yang Lama Punya dan HARUS Dipertahankan:
1. ✅ **Tabel kategori** (`sample_type_category`, `parameter_category`) — lebih baik dari varchar
2. ✅ **Parameter accreditation** — kritis untuk lab terakreditasi
3. ✅ **Sample type field** — dynamic fields sangat fleksibel
4. ✅ **Sample type parameter** — tabel operasional paling kaya dan penting
5. ✅ **Regulation attachment** (file fisik) — tetap diperlukan selain appendices
6. ✅ **Kolom detail di methods** — detection_limit, equipment_required, reagent_required, dll.
7. ✅ **Kolom detail di sample_type** — storage_requirement, handling_instruction, handling_time

### Yang Baru Punya dan HARUS Ditambahkan:
1. ✅ **UUID** di semua tabel
2. ✅ **Regulation appendices** — struktur logis lampiran
3. ✅ **Quality standards + params** — baku mutu (fitur inti GLIMS)
4. ✅ **Sample type groups + pivot** — paket pengujian
5. ✅ **Deactivated tracking** — audit trail nonaktifkan
6. ✅ **Kolom enrichment** — symbol, default_unit, method_type, regulation_type, dll.

### Yang Bisa Diskip:
1. ❌ `m_sample_type_regulation` — sudah tercakup di `quality_standards`
2. ⚠️ `updated_ip` — handle via middleware, tidak perlu di setiap tabel
