# Checklist Implementasi PIC Khusus Prospek Konsumen (Tipe Perusahaan)

## Tujuan
- Menambahkan **multi PIC** khusus saat input/edit prospek dengan tipe **Perusahaan (organization)**.
- Data PIC minimal: **nama** dan **kontak pribadi** (telepon), opsional email/jabatan/catatan.
- Data PIC bisa tampil di **list prospek**.

## Keputusan Teknis (Disarankan)
- Gunakan tabel baru khusus PIC prospek agar tidak bercampur dengan entitas contact existing:
  - Lebih sederhana untuk validasi.
  - Tidak tergantung flow `lead_contacts` yang sekarang lebih mirip kontak profil lengkap.
  - Mudah dipakai di modal add/edit lead dan list prospek.

## Desain Data
- Tabel: `rise_client_pics` (implementasi saat ini)
- Kolom minimal:
  - `id` (PK)
  - `lead_id` (FK ke `clients.id`)
  - `pic_name` (varchar 150)
  - `pic_phone` (varchar 30)
  - `pic_email` (varchar 150, nullable)
  - `is_primary` (tinyint, default 0)
  - `sort_order` (int, default 0)
  - `created_by`, `created_at`, `updated_at`
  - `deleted` (tinyint, default 0)
- Index:
  - `idx_lead_pics_lead_id_deleted (lead_id, deleted)`
  - Optional: `idx_lead_pics_primary (lead_id, is_primary, deleted)`

## Checklist Urutan Job

### 1) Database & Model Dasar
- [x] Siapkan tabel PIC (`rise_client_pics`) via SQL manual/migration.
  - Catatan: tabel sudah dibuat manual di DB.
- [x] Buat model `Client_pics_model`.
  - File baru: `app/Models/Client_pics_model.php`
- [x] Tambah helper method model:
  - `get_by_client_id($client_id)`
  - `replace_by_client_id($client_id, array $rows)` (soft delete lama lalu insert ulang)
  - `get_primary_or_first_by_client_ids(array $client_ids)` untuk kebutuhan list.

### 2) Integrasi Modal Add/Edit Lead
- [x] Tambah section UI `PIC Perusahaan` di form lead, hanya tampil jika `account_type=organization`.
  - File: `app/Views/leads/lead_form_fields.php`
- [x] Tambah repeater row PIC (add/remove):
  - Input array: `pic_name[]`, `pic_phone[]`, `pic_email[]`, `pic_primary_index`
  - File: `app/Views/leads/lead_form_fields.php` (HTML + JS)
- [x] Saat edit lead, preload PIC existing ke repeater.
  - Sumber data dari controller.
  - File: `app/Controllers/Leads.php` (di `make_lead_modal_form_data`)

### 3) Simpan Data PIC di Proses Save Lead
- [x] Parse payload PIC arrays di `Leads::save()`.
  - File: `app/Controllers/Leads.php`
- [x] Validasi server-side PIC:
  - minimal 1 PIC jika `type=organization`
  - `pic_name` wajib
  - `pic_phone` wajib dan format numeric-length (ikuti rule phone existing)
  - maksimal 1 `is_primary=1`
- [x] Simpan PIC dalam transaksi yang sama dengan save lead.
  - `transBegin` sudah ada, tinggal tambah save PIC sebelum commit.
  - File: `app/Controllers/Leads.php`

### 4) Tampilkan PIC di List Prospek
- [x] Tambah kolom baru di datatable list: `PIC`.
  - File: `app/Views/leads/index.php`
- [x] Tambah data PIC ke row response.
  - Opsi aman performa:
    - Prefetch PIC by current page lead IDs (hindari query per-row).
  - File: `app/Controllers/Leads.php` (`list_data`, `_make_row`)
- [ ] Jika butuh di-level SQL model:
  - Tambah subquery ringan ke `Clients_model::get_details()` untuk `primary_pic_name`/`primary_pic_phone`.
  - File: `app/Models/Clients_model.php`

### 5) Rule UI/UX
- [x] Jika `type=person`: section PIC disembunyikan + data PIC tidak diwajibkan.
- [x] Jika user ganti dari `organization -> person`:
  - Tentukan policy:
    - default: simpan data PIC existing tapi tidak ditampilkan; atau
    - bersihkan PIC setelah konfirmasi user.
  - Implementasi saat ini: data PIC dibersihkan (replace empty) saat save `person`.
- [x] Tampilkan format ringkas di list:
  - `Nama PIC Utama` + baris nomor kontak utama.

### 6) Akses & Keamanan
- [x] Ikuti akses existing `validate_lead_access` / `validate_lead_edit_access`.
  - File: `app/Controllers/Leads.php`
- [x] Sanitasi input (gunakan `clean_data`, trimming, escape output di view).

### 7) Pengujian
- [ ] Create lead organization dengan 2-3 PIC, pastikan tersimpan semua.
- [ ] Edit lead: tambah/hapus PIC, ubah primary PIC.
- [ ] Create lead person: tidak wajib PIC dan tidak error.
- [ ] List prospek menampilkan PIC sesuai data terbaru.
- [ ] Pastikan tidak ada N+1 query signifikan di `list_data`.

### 8) Bahasa/Label
- [x] Tambah key bahasa:
  - `lead_pic`, `lead_pics`, `pic_name`, `pic_phone`, `pic_email`, `add_pic`, `primary_pic`
  - File bahasa yang relevan di `app/Language/...`

## File Yang Pasti Terlibat
- `app/Controllers/Leads.php`
- `app/Views/leads/lead_form_fields.php`
- `app/Views/leads/modal_form.php` (minor jika perlu)
- `app/Views/leads/index.php`
- `app/Models/Clients_model.php`
- `app/Database/Migrations/<timestamp>_CreateLeadPicsTable.php` (baru)
- `app/Models/Client_pics_model.php` (baru)

## Acceptance Criteria
- Prospek `organization` bisa punya multi PIC dalam 1 modal add/edit.
- Data PIC tersimpan konsisten (nama + kontak pribadi) dan bisa diubah.
- List prospek menampilkan PIC utama (nama + kontak utama).
- Tidak ada regressi pada save lead existing dan performa list tetap stabil.
