# MIGRATION MAP - Zia Aesthetic (CI3 → CI4)

## Project Info
- **Source (A)**: `C:\xampp\htdocs\zia_aesthetic` — CodeIgniter 3 + HMVC (wiredesignz)
- **Template (B)**: `C:\xampp\htdocs\lynd.asteramedika.id` — CodeIgniter 4 + HMVC modular
- **Target**: `C:\xampp\htdocs\ziaaesthetic` — CodeIgniter 4.7.3
- **Database**: `fastmedi_ziaaesthetic` (MySQL/MariaDB)
- **Session Key**: `sp` (object: login_name, name, id_role, id_dokter)

---

## 1. Controller Lama (Project A)

### auth/controllers/Auth.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| login | GET auth/login | Tampilkan form login |
| do_login | POST auth/do_login | Proses login (MD5, tabel mst_nav_user) |
| logout | GET auth/logout | Destroy session, redirect |
| check_session | - | Helper cek session 'sp' |

### home/controllers/Home.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET home | Dashboard utama |
| data_poli_umum | POST home/data_poli_umum | AJAX: data kunjungan 7 hari |
| data_penjualan_obat | POST home/data_penjualan_obat | AJAX: total penjualan obat hari ini |
| graphmanajemen_3 | POST home/graphmanajemen_3 | AJAX: grafik kunjungan per bulan |
| graphmanajemen_4 | POST home/graphmanajemen_4 | AJAX: grafik penjualan per bulan |

### soap/controllers/Soap.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET soap | List pasien SOAP (filter tanggal, keyword) |
| rm | GET soap/rm/{id_reg} | Form SOAP/CPPT per registrasi |
| msttindakan_cppt | GET soap/msttindakan_cppt?term= | AJAX autocomplete tindakan |
| get_list_cppt | POST soap/get_list_cppt | AJAX: riwayat CPPT pasien |
| get_detail_cppt | POST soap/get_detail_cppt | AJAX: detail 1 CPPT |
| act_cppt | POST soap/act_cppt/{id_reg}/{id_pasien} | Simpan/update CPPT + tindakan |
| act_cppt_update | POST soap/act_cppt_update/{id_reg}/{id_pasien} | Update CPPT alternatif |
| upload_processing | POST soap/upload_processing | Upload foto before/after |
| list_photo_after | POST soap/list_photo_after | AJAX: list foto after |
| list_photo_before | POST soap/list_photo_before | AJAX: list foto before |
| deleteimage | POST soap/deleteimage | AJAX: hapus foto |

### soap/controllers/Nurse.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET soap/nurse | List pasien untuk perawat |
| listpasien | POST soap/nurse/listpasien | AJAX: cari pasien |
| searchlastttv | POST soap/nurse/searchlastttv | AJAX: TTV terakhir |
| searchlastsoap | POST soap/nurse/searchlastsoap | AJAX: SOAP terakhir |
| savettv | POST soap/nurse/savettv | Simpan TTV |
| riwayatmedis | POST soap/nurse/riwayatmedis | AJAX: riwayat medis |

### trx_reg/controllers/Trx_reg.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET trx_reg | List registrasi hari ini |
| tab_reg | GET trx_reg/tab_reg | Tab registrasi (pasien lama/baru) |
| inner_pasien_lama_list | POST trx_reg/inner_pasien_lama_list | AJAX: cari pasien lama |
| inner_pasien_lama_reg | GET trx_reg/inner_pasien_lama_reg/{id} | Form reg pasien lama |
| inner_pasien_aps_reg | GET trx_reg/inner_pasien_aps_reg/{id} | Form reg pasien APS (baru) |
| create_action | POST trx_reg/create_action | Insert trx_reg + paket medis |
| create_action_aps | POST trx_reg/create_action_aps | Insert pasien baru + registrasi |
| update | GET trx_reg/update/{id_reg} | Form edit registrasi |
| update_action | POST trx_reg/update_action | Update trx_reg |
| delete | GET trx_reg/delete/{id_reg} | Hapus registrasi |
| inner_get_data_autocomplete_id_asuransi | GET trx_reg/inner_get_data_autocomplete_id_asuransi?term= | AJAX autocomplete asuransi |
| ajax_dokter | GET trx_reg/ajax_dokter | AJAX: list dokter |
| kunjungan | GET trx_reg/kunjungan/{id_reg} | List kunjungan paket |
| kunjungan_update | POST trx_reg/kunjungan_update | Update kunjungan paket |
| load_paket_medis | GET trx_reg/load_paket_medis/{id_reg} | AJAX: paket medis aktif |
| load_paket_det | GET trx_reg/load_paket_det/{id_paket} | AJAX: detail paket |
| add_paket_to_reg | POST trx_reg/add_paket_to_reg | Tambah paket ke registrasi |

### pembayaran/controllers/Pembayaran.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET pembayaran | List pasien siap bayar |
| trx_open | GET pembayaran/trx_open/{id_reg} | Buka transaksi pembayaran |
| inner_load_pre_trx_open | GET pembayaran/inner_load_pre_trx_open/{id_reg} | AJAX: load data pre-invoice |
| inner_get_data_autocomplete_tindakan | GET pembayaran/inner_get_data_autocomplete_tindakan?term= | AJAX autocomplete tindakan |
| add_tindakan_act | POST pembayaran/add_tindakan_act/{id_reg}/{id_act} | Tambah tindakan ke invoice |
| delete_trx_reg_act | GET pembayaran/delete_trx_reg_act/{id_reg}/{id} | Hapus item tindakan |
| inner_get_data_autocomplete_bank | GET pembayaran/inner_get_data_autocomplete_bank?term= | AJAX autocomplete bank |
| buat_invoice | POST pembayaran/buat_invoice | Proses pembayaran final |
| cetak_invoice | GET pembayaran/cetak_invoice/{id_reg} | Cetak invoice A4 |
| cetak_invoice_pos | GET pembayaran/cetak_invoice_pos/{id_reg} | Cetak invoice POS/thermal |
| refundproses | POST pembayaran/refundproses | Proses refund |
| cekpassword | POST pembayaran/cekpassword | Validasi password admin untuk refund |
| refundprosesupdate | POST pembayaran/refundprosesupdate | Update data refund |
| opening_kasir | GET pembayaran/opening_kasir | Form opening kasir |
| opening_kasir_act | POST pembayaran/opening_kasir_act | Proses opening kasir |
| closing_kasir | GET pembayaran/closing_kasir | Form closing kasir |
| closing_kasir_act | POST pembayaran/closing_kasir_act | Proses closing kasir |
| list_closing_kasir | GET/POST pembayaran/list_closing_kasir | List riwayat closing |
| print_closing_kasir | GET pembayaran/print_closing_kasir/{id} | Cetak closing kasir |

### pembayaran/controllers/Refund.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| add | GET/POST pembayaran/refund/add | Form refund |
| buat_invoice_refund | POST pembayaran/refund/buat_invoice_refund | Proses invoice refund |
| cetak_invoice_refund_pos | GET pembayaran/refund/cetak_invoice_refund_pos/{id} | Cetak refund POS |

### farmasi/controllers/Farmasi.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET farmasi | List pasien farmasi hari ini |
| pasienaps | GET farmasi/pasienaps | List pasien APS |
| rm | GET farmasi/rm/{id_eresep} | Detail resep per pasien |
| data_list_farmasi_header | POST farmasi/data_list_farmasi_header | AJAX: header farmasi |
| data_list_farmasi | POST farmasi/data_list_farmasi | AJAX: list item farmasi |
| aps | GET farmasi/aps/{id} | Proses APS farmasi |

### mst/controllers/Mst.php (Master Data — controller besar)
| Group | Methods | Endpoint Pattern |
|-------|---------|-----------------|
| Farmasi | mst_farmasi, save_farmasi, edit_farmasi, editthisfarmasi, mstgolongan_chain, mstkategori_chain, mstsubkategori_chain, mstjenis_chain | GET/POST mst/mst_farmasi, mst/save_farmasi, dll |
| Dokter | mst_dokter, save_dokter, edit_dokter, editthis_dokter, deleteitempo_dokter, aktifasiitempo_dokter | GET/POST mst/mst_dokter, mst/save_dokter, dll |
| Jenis Dokter | mst_jenis_dokter, save_jenis_dokter, edit_jenis_dokter, editthis_jenis_dokter, deleteitempo_jenis_dokter, aktifasiitempo_jenis_dokter | GET/POST mst/mst_jenis_dokter, dll |
| Spesialis | mst_spesialis_dokter, save_spesialis_dokter, edit_spesialis_dokter, editthis_spesialis_dokter, deleteitempo_spesialis_dokter, aktifasiitempo_spesialis_dokter | GET/POST mst/mst_spesialis_dokter, dll |
| Sub Spesialis | mst_sub_spesialis_dokter, save_subspesialis_dokter, edit_subspesialis_dokter, editthis_subspesialis_dokter, deleteitempo_subspesialis_dokter, aktifasiitempo_subspesialis_dokter | GET/POST mst/mst_sub_spesialis_dokter, dll |
| Tindakan | mst_tindakan, save_tindakan, edit_tindakan, editthis_tindakan, deleteitempo_tindakan, aktifasiitempo_tindakan, mstsubgrouptindakan_chain | GET/POST mst/mst_tindakan, dll |
| Group Tindakan | mst_group_tindakan, save_group_tindakan, edit_group_tindakan, editthis_group_tindakan, deleteitempo_group_tindakan, aktifasiitempo_group_tindakan | GET/POST mst/mst_group_tindakan, dll |
| Subgroup Tindakan | mst_subgroup_tindakan, save_subgroup_tindakan, edit_subgroup_tindakan, editthis_subgroup_tindakan, deleteitempo_subgroup_tindakan, aktifasiitempo_subgroup_tindakan | GET/POST mst/mst_subgroup_tindakan, dll |
| Jenis Tindakan | mst_jenis_tindakan, save_jenis_tindakan, edit_jenis_tindakan, editthis_jenis_tindakan, deleteitempo_jenis_tindakan, aktifasiitempo_jenis_tindakan | GET/POST mst/mst_jenis_tindakan, dll |
| Kelas | mst_kelas, save_kelas, edit_kelas, editthis_kelas, deleteitempo_kelas, aktifasiitempo_kelas | GET/POST mst/mst_kelas, dll |
| Group (Farmasi) | mst_group, save_group, edit_group, editthis_group, deleteitempo_group, aktifasiitempo_group | GET/POST mst/mst_group, dll |
| Golongan | mst_golongan, save_golongan, edit_golongan, editthis_golongan, deleteitempo_golongan, aktifasiitempo_golongan | GET/POST mst/mst_golongan, dll |
| Kategori | mst_kategori, save_kategori, edit_kategori, editthis_kategori, deleteitempo_kategori, aktifasiitempo_kategori | GET/POST mst/mst_kategori, dll |
| Subkategori | mst_subkategori, save_subkategori, edit_subkategori, editthis_subkategori, deleteitempo_subkategori, aktifasiitempo_subkategori | GET/POST mst/mst_subkategori, dll |
| Jenis (Farmasi) | mst_jenis, save_jenis, edit_jenis, editthis_jenis, deleteitempo_jenis, aktifasiitempo_jenis | GET/POST mst/mst_jenis, dll |
| Satuan | mst_satuan, save_satuan, edit_satuan, editthis_satuan, deleteitempo_satuan, aktifasiitempo_satuan | GET/POST mst/mst_satuan, dll |
| Jumlah Satuan | mst_jumlahsatuan, save_jumlahsatuan, edit_jumlahsatuan, editthis_jumlahsatuan, deleteitempo_jumlahsatuan, aktifasiitempo_jumlahsatuan | GET/POST mst/mst_jumlahsatuan, dll |
| Perusahaan | mst_perusahaan, save_perusahaan, edit_perusahaan, editthis_perusahaan, deleteitempo_perusahaan, aktifasiitempo_perusahaan | GET/POST mst/mst_perusahaan, dll |
| Kategori Perusahaan | mst_kategori_perusahaan, save_kategori_perusahaan, edit_kategori_perusahaan, editthis_kategori_perusahaan, deleteitempo_kategori_perusahaan, aktifasiitempo_kategori_perusahaan | GET/POST mst/mst_kategori_perusahaan, dll |
| Jenis Perusahaan | mst_jenis_perusahaan, save_jenis_perusahaan, edit_jenis_perusahaan, editthis_jenis_perusahaan, deleteitempo_jenis_perusahaan, aktifasiitempo_jenis_perusahaan | GET/POST mst/mst_jenis_perusahaan, dll |
| Tarif Tindakan | mst_tarif_tindakan, edit_tarif_tindakan, mstperusahaan, editthistariftindakan, listtarif, deleteitemedittariftindakan | GET/POST mst/mst_tarif_tindakan, dll |
| Setting Markup | mst_setting_param_harga, edit_markup, editthis_markup | GET/POST mst/mst_setting_param_harga, dll |
| Gudang | mst_gudang, save_gudang, edit_gudang, editthis_gudang, deleteitempo_gudang, aktifasiitempo_gudang | GET/POST mst/mst_gudang, dll |
| Pabrik Alkes | mst_pabrikalkes, save_pabrikalkes, edit_pabrikalkes, editthis_pabrikalkes, deleteitempo_pabrikalkes, aktifasiitempo_pabrikalkes | GET/POST mst/mst_pabrikalkes, dll |
| Supplier Alkes | mst_supplieralkes, save_supplieralkes, edit_supplieralkes, editthis_supplieralkes, deleteitempo_supplieralkes, aktifasiitempo_supplieralkes | GET/POST mst/mst_supplieralkes, dll |
| Daftar Harga | mst_daftarharga, getdatadaftarhargaobat | GET mst/mst_daftarharga |

### mst_bank/controllers/Mst_bank.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_bank | List bank |
| create | GET mst_bank/create | Form tambah bank |
| create_action | POST mst_bank/create_action | Insert bank |
| update | GET mst_bank/update/{id} | Form edit bank |
| update_action | POST mst_bank/update_action | Update bank |
| delete | GET mst_bank/delete/{id} | Hapus bank |

### mst_pasien/controllers/Mst_pasien.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_pasien | List pasien |
| create | GET mst_pasien/create | Form tambah pasien |
| create_action | POST mst_pasien/create_action | Insert pasien |
| update | GET mst_pasien/update/{id} | Form edit pasien |
| update_action | POST mst_pasien/update_action | Update pasien |
| delete | GET mst_pasien/delete/{id} | Hapus pasien |
| inner_pasien_baru_reg | GET mst_pasien/inner_pasien_baru_reg | Form pasien baru inline |
| inner_get_data_autocomplete_id_propinsi | GET mst_pasien/inner_get_data_autocomplete_id_propinsi?term= | AJAX autocomplete propinsi |
| inner_get_data_autocomplete_id_kota | GET mst_pasien/inner_get_data_autocomplete_id_kota?term= | AJAX autocomplete kota |
| inner_get_data_autocomplete_id_kecamatan | GET mst_pasien/inner_get_data_autocomplete_id_kecamatan?term= | AJAX autocomplete kecamatan |
| inner_get_data_autocomplete_id_kelurahan | GET mst_pasien/inner_get_data_autocomplete_id_kelurahan?term= | AJAX autocomplete kelurahan |
| get_new_id_pasien | GET mst_pasien/get_new_id_pasien | AJAX: generate ID pasien baru |

### mst_paket/controllers/Mst_paket.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_paket | List paket medis |
| create | GET mst_paket/create | Form tambah paket |
| create_action | POST mst_paket/create_action | Insert paket |
| update | GET mst_paket/update/{id} | Form edit paket |
| update_action | POST mst_paket/update_action | Update paket |
| delete | GET mst_paket/delete/{id} | Hapus paket |
| inner_get_data_autocomplete_tindakan | GET mst_paket/inner_get_data_autocomplete_tindakan?term= | AJAX autocomplete tindakan |
| inner_get_data_autocomplete_farmasi | GET mst_paket/inner_get_data_autocomplete_farmasi?term= | AJAX autocomplete obat |

### mst_nav_menu/controllers/Mst_nav_menu.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_nav_menu | List menu navigasi |
| create/create_action | GET/POST mst_nav_menu/create, create_action | Tambah menu |
| update/update_action | GET/POST mst_nav_menu/update/{id}, update_action | Edit menu |
| delete | GET mst_nav_menu/delete/{id} | Hapus menu |

### mst_nav_submenu/controllers/Mst_nav_submenu.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_nav_submenu | List submenu |
| create/create_action | GET/POST | Tambah submenu |
| update/update_action | GET/POST | Edit submenu |
| delete | GET | Hapus submenu |

### mst_nav_role/controllers/Mst_nav_role.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_nav_role | List role |
| create/create_action | GET/POST | Tambah role |
| update/update_action | GET/POST | Edit role |
| delete | GET | Hapus role |

### mst_nav_role_menu/controllers/Mst_nav_role_menu.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_nav_role_menu | Mapping role ke menu |
| create/create_action | GET/POST | Assign menu ke role |
| delete | GET | Remove menu dari role |

### mst_nav_user/controllers/Mst_nav_user.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET mst_nav_user | List user |
| create/create_action | GET/POST | Tambah user |
| update/update_action | GET/POST | Edit user |
| delete | GET | Hapus user |

### voucher_disc/controllers/Voucher_disc.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET voucher_disc | List voucher diskon |
| create/create_action | GET/POST | Tambah voucher |
| update/update_action | GET/POST | Edit voucher |
| delete | GET voucher_disc/delete/{id} | Nonaktifkan voucher |
| cetak_vcr | GET voucher_disc/cetak_vcr/{id} | Cetak voucher batch |
| cetak_vcr_single | GET voucher_disc/cetak_vcr_single/{id} | Cetak voucher single |
| cek_voucher | GET voucher_disc/cek_voucher/{code} | AJAX: validasi kode voucher |

### trx_reg_dp/controllers/Trx_reg_dp.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET trx_reg_dp | List pasien DP |
| list_dp_pasien | GET trx_reg_dp/list_dp_pasien/{id_reg} | List DP per pasien |
| create_action | POST trx_reg_dp/create_action | Insert DP |
| dp_all | GET/POST trx_reg_dp/dp_all | List semua DP |
| refund_dp_act | POST trx_reg_dp/refund_dp_act/{id} | Refund DP |
| cetak_invoice_dp_pos | GET trx_reg_dp/cetak_invoice_dp_pos/{id} | Cetak invoice DP POS |

### v_reg/controllers/V_reg.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET/POST v_reg | Laporan registrasi (filter tanggal) |
| pdf | GET v_reg/pdf | Export PDF |
| xls | GET/POST v_reg/xls | Export Excel |

### v_inv/controllers/V_inv.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET/POST v_inv | Laporan invoice (filter tanggal) |
| pdf | GET v_inv/pdf | Export PDF |
| xls | GET/POST v_inv/xls | Export Excel |

### v_jasmed/controllers/V_jasmed.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET/POST v_jasmed | Laporan jasa medis |
| add | GET/POST v_jasmed/add | Tambah perhitungan jasmed |
| add_detail | POST v_jasmed/add_detail | Detail jasmed |
| save | POST v_jasmed/save | Simpan jasmed |
| cetak_share_nakes | GET v_jasmed/cetak_share_nakes/{id} | Cetak share nakes |
| bahan | GET/POST v_jasmed/bahan | Laporan bahan |
| show_all | GET/POST v_jasmed/show_all | Tampilkan semua |
| export_xlsx | GET v_jasmed/export_xlsx/{id} | Export Excel |

### keuangan/controllers/Keuangan.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| tindakan_list | GET/POST keuangan/tindakan_list | Laporan tindakan (filter) |

### etiket_farmasi/controllers/Etiket.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET etiket_farmasi/etiket | List pasien etiket |
| getdatadaftarpasien | POST etiket_farmasi/etiket/getdatadaftarpasien | AJAX: data pasien |
| getdatadetaileresep | POST etiket_farmasi/etiket/getdatadetaileresep | AJAX: detail eresep |
| cetak_etiket | GET etiket_farmasi/etiket/cetak_etiket/{id} | Cetak etiket obat |

### soap_eresep/controllers/Soap_eresep.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| riwayat_resep | POST soap_eresep/riwayat_resep | AJAX: riwayat resep |
| list_resep_baru_input | POST soap_eresep/list_resep_baru_input | AJAX: form resep baru |
| list_riwayat_resep_online | POST soap_eresep/list_riwayat_resep_online | AJAX: list resep online |
| list_riwayat_resep_online_det | POST soap_eresep/list_riwayat_resep_online_det | AJAX: detail resep |
| save_eresep | POST soap_eresep/save_eresep | Simpan e-resep |
| save_eresep_additional | POST soap_eresep/save_eresep_additional | Simpan resep tambahan |
| print_eresep | GET soap_eresep/print_eresep/{id} | Cetak e-resep |
| inner_get_data_autocomplet_obat | GET soap_eresep/inner_get_data_autocomplet_obat?term= | AJAX autocomplete obat |
| inner_get_data_autocomplet_obat_dosis | GET soap_eresep/inner_get_data_autocomplet_obat_dosis?term= | AJAX autocomplete dosis |
| inner_get_data_autocomplet_obat_frekwensi | GET soap_eresep/inner_get_data_autocomplet_obat_frekwensi?term= | AJAX autocomplete frekuensi |
| inner_get_data_autocomplet_obat_tme | GET soap_eresep/inner_get_data_autocomplet_obat_tme?term= | AJAX autocomplete waktu |
| display_eresep_farmasi | POST soap_eresep/display_eresep_farmasi | Tampilkan resep di farmasi |
| set_resep_pulang | POST soap_eresep/set_resep_pulang | Set resep pulang |
| remove_eresep_hangat | POST soap_eresep/remove_eresep_hangat | Hapus resep hangat |
| mst_tpl_racikan | GET soap_eresep/mst_tpl_racikan | Master template racikan |

### rumusharga/controllers/Rumus.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET rumusharga/rumus | List rumus harga |
| listdataharga | GET rumusharga/rumus/listdataharga | AJAX: data harga |
| mstperusahaan | GET rumusharga/rumus/mstperusahaan | AJAX: list perusahaan |
| mstbahan | GET rumusharga/rumus/mstbahan | AJAX: list bahan |
| save | POST rumusharga/rumus/save | Simpan rumus |
| prosesdetailobat | POST rumusharga/rumus/prosesdetailobat | AJAX: detail obat |
| edit/editthis | POST rumusharga/rumus/edit, editthis | Edit rumus |
| deleteitemedit/deleteitempo | POST rumusharga/rumus/deleteitemedit, deleteitempo | Hapus item |

### treatment/controllers/Treatment.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET treatment | List treatment pasien |
| inner_load_treatment | GET treatment/inner_load_treatment/{id_reg} | AJAX: load treatment |
| treatment_update | POST treatment/treatment_update | Update treatment |
| update_treatment | POST treatment/update_treatment | Update treatment alt |

### rincian/controllers/Rincian.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET rincian | List rincian tagihan |
| proses | POST rincian/proses | Proses rincian |
| msttindakan | GET rincian/msttindakan?term= | AJAX autocomplete tindakan |
| mstpasien | GET rincian/mstpasien?term= | AJAX autocomplete pasien |
| printrincian | GET rincian/printrincian/{id} | Cetak rincian |
| printrincianpkt | GET rincian/printrincianpkt/{id} | Cetak rincian paket |

### stokopname/controllers/Sto.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| index | GET stokopname | List stok opname |
| listdatasto | POST stokopname/listdatasto | AJAX: data stok opname |
| mstgudang | GET stokopname/mstgudang | AJAX: list gudang |
| mstobat | GET stokopname/mstobat?term= | AJAX autocomplete obat |
| save | POST stokopname/save | Simpan stok opname |
| startstokopname_set_up | POST stokopname/startstokopname_set_up | Mulai stok opname |
| endstokopname_set_up | POST stokopname/endstokopname_set_up | Selesai stok opname |

### penjualan_obat/controllers/Eresep.php
| Method | Endpoint | Fungsi Bisnis |
|--------|----------|---------------|
| add_additional | POST penjualan_obat/add_additional | Tambah obat tambahan |
| save_eresep_nonracikan | POST penjualan_obat/save_eresep_nonracikan | Simpan resep non-racikan |
| save_eresep_racikan | POST penjualan_obat/save_eresep_racikan | Simpan resep racikan |
| validasiobatnya | POST penjualan_obat/validasiobatnya | Validasi obat |
| cancelobatnya | POST penjualan_obat/cancelobatnya | Cancel obat |
| prosesdetailobat | POST penjualan_obat/prosesdetailobat | AJAX: detail obat + harga |

---

## 2. Model Lama (Project A)

| Module | Model File | Tabel Utama | Fungsi |
|--------|-----------|-------------|--------|
| auth | Models_auth.php | mst_nav_user | Login query |
| home | Globalmodel.php | trx_reg, trx_reg_act | Dashboard aggregates |
| soap | D_Soap.php | soap_asm_ri, trx_reg, mst_pasien, upload_foto_befaft, trx_reg_act | CPPT CRUD, foto, tindakan |
| soap | D_Nurse.php | soap_asm_ri, mst_pasien | TTV perawat |
| trx_reg | Trx_reg_model.php | trx_reg, mst_pasien, mst_dokter, mst_company | Registrasi CRUD |
| pembayaran | Pembayaran_model.php | trx_reg, trx_reg_act, trx_invoice, mst_pasien | Invoice, pembayaran |
| pembayaran | Closing_model.php | trx_kasir_opening, trx_kasir_closing | Kasir opening/closing |
| pembayaran | Refund_model.php | trx_invoice, trx_refund | Refund |
| farmasi | D_Farmasi.php | soap_eresep, soap_eresep_det, mst_farmasi | E-resep, stok |
| mst | D_Mst.php | mst_dokter, mst_farmasi, mst_tindakan, mst_company, mst_tindakan_grup, mst_tindakan_subgrup, dll | Semua master data |
| mst_bank | Mst_bank_model.php | mst_bank | CRUD bank |
| mst_pasien | Mst_pasien_model.php | mst_pasien, mst_propinsi, mst_kota, mst_kecamatan, mst_kelurahan | CRUD pasien + wilayah |
| mst_paket | Mst_paket_model.php | mst_paket, mst_paket_det, trx_reg_paket, trx_reg_paket_det, trx_reg_paket_kunj | Paket medis CRUD |
| mst_nav_menu | Mst_nav_menu_model.php | mst_nav_menu | CRUD menu |
| mst_nav_submenu | Mst_nav_submenu_model.php | mst_nav_submenu | CRUD submenu |
| mst_nav_role | Mst_nav_role_model.php | mst_nav_role | CRUD role |
| mst_nav_role_menu | Mst_nav_role_menu_model.php | mst_nav_role_menu | Mapping role-menu |
| mst_nav_user | Mst_nav_user_model.php | mst_nav_user | CRUD user |
| voucher_disc | Voucher_disc_model.php | mst_voucher_disc | CRUD voucher |
| trx_reg_dp | Trx_reg_dp_model.php | trx_reg_dp | Down payment |
| v_reg | V_reg_model.php | trx_reg, mst_pasien | Laporan registrasi |
| v_inv | V_inv_model.php | trx_invoice, trx_reg | Laporan invoice |
| v_jasmed | V_jasmed_model.php | trx_jasmed, trx_reg_act | Laporan jasa medis |
| keuangan | Keuangan_model.php | trx_reg_act | Laporan keuangan |
| etiket_farmasi | D_Etiket.php | soap_eresep, soap_eresep_det | Etiket obat |
| soap_eresep | Soap_eresep_model.php | soap_eresep, soap_eresep_det, soap_eresep_det_racikan, mst_farmasi | E-resep lengkap |
| rumusharga | D_Rumus.php | mst_rumus_harga, mst_rumus_harga_det | Rumus harga obat |
| treatment | Treatment_model.php | trx_reg_act, mst_tindakan | Treatment pasien |
| rincian | D_Rincian.php | trx_reg_act, trx_invoice | Rincian tagihan |
| stokopname | D_Sto.php | trx_stokopname, trx_stokopname_det, mst_farmasi | Stok opname |
| penjualan_obat | Eresep_model.php | soap_eresep_det, mst_farmasi, trx_stok | Penjualan obat farmasi |

---

## 3. View Lama (Project A)

| Module | Views | Tipe | JS/AJAX |
|--------|-------|------|---------|
| auth | vlogin.php | Form login | - |
| home | vhome.php | Dashboard | Chart.js, AJAX POST |
| soap | list_pasien.php | List + filter | DataTables |
| soap | soap.php | Form CPPT | jQuery autocomplete, AJAX upload, modal foto |
| soap | list_pasien_nurse.php | List perawat | DataTables |
| trx_reg | trx_reg_list.php | List registrasi | DataTables |
| trx_reg | tab_reg.php | Tab pasien lama/baru | jQuery tabs, AJAX load |
| trx_reg | inner_pasien_lama_list.php | Partial: list pasien | AJAX search |
| trx_reg | inner_pasien_lama_reg.php | Partial: form reg | Select2, autocomplete |
| trx_reg | inner_pasien_aps_reg.php | Partial: form APS | Radio, autocomplete |
| trx_reg | trx_reg_form.php | Form edit reg | Select2 |
| trx_reg | inner_paket_medis.php | Partial: paket | AJAX load |
| pembayaran | pembayaran_list.php (pasien_list.php) | List antrian | DataTables |
| pembayaran | pembayaran_trx_open.php | Form pembayaran | Autocomplete tindakan, bank |
| pembayaran | cetak_invoice.php | Print invoice A4 | Print CSS |
| pembayaran | cetak_invoice_pos.php | Print invoice POS | Thermal print |
| pembayaran | opening_kasir.php | Form opening | - |
| pembayaran | closing_kasir.php | Form closing | - |
| pembayaran | print_closing_kasir.php | Print closing | Print CSS |
| farmasi | list_pasien.php | List pasien farmasi | DataTables |
| farmasi | farmasi.php | Proses farmasi | AJAX validasi stok |
| mst | mst_dokter.php | CRUD dokter | DataTables, modal AJAX |
| mst | mst_farmasi.php | CRUD obat/farmasi | DataTables, chain select |
| mst | mst_tindakan.php | CRUD tindakan | DataTables, modal |
| mst | (25 view files total) | Semua master | DataTables, modal AJAX |
| mst_bank | mst_bank_list.php, mst_bank_form.php | CRUD | - |
| mst_pasien | mst_pasien_list.php, mst_pasien_form.php | CRUD | Autocomplete wilayah |
| mst_paket | mst_paket_list.php, mst_paket_form.php | CRUD | Autocomplete tindakan/obat |
| voucher_disc | voucher_disc_list.php, voucher_disc_form.php, voucher_disc_cetak.php | CRUD + cetak | QR Code |
| trx_reg_dp | trx_reg_dp_list.php, trx_reg_dp_form.php, cetak_invoice_dp_pos.php | CRUD + cetak | - |
| v_reg | v_reg_list.php | Laporan | DataTables, date filter |
| v_inv | v_inv_list.php | Laporan | DataTables, date filter |
| v_jasmed | jasmed_list.php, jasmed_add.php, cetak_share_nakes.php | Laporan + cetak | DataTables |
| keuangan | v_tindakan_list.php | Laporan | DataTables, date filter |
| etiket_farmasi | v_etiket.php, cetak_etiket.php | List + cetak | AJAX, thermal print |
| soap_eresep | soap_eresep_form.php, eresep_add.php, print_eresep.php (22 views) | Form resep + cetak | Autocomplete obat, modal racikan |
| rumusharga | list_rumus.php | CRUD rumus | DataTables, modal |
| treatment | treatment_list.php, inner_data_treatment.php | List + modal | AJAX load |
| rincian | rincian.php, print_rincian.php | List + cetak | Autocomplete, print |
| stokopname | list_sto.php | CRUD stok opname | DataTables, modal |

---

## 4. Endpoint/AJAX Inventory

### JSON Response Endpoints (AJAX)
| URL Lama | Method | Parameter | Response | Status Migrasi |
|----------|--------|-----------|----------|----------------|
| home/data_poli_umum | POST | tgl_1 | JSON array [{tgl, jml}] | ✅ migrated |
| home/data_penjualan_obat | POST | tgl_1 | JSON array [{tgl, total}] | ✅ migrated |
| home/graphmanajemen_3 | POST | set_1, set_2 | JSON array [{hari, jml}] | ✅ migrated |
| home/graphmanajemen_4 | POST | set_1, set_2 | JSON array [{hari, total}] | ✅ migrated |
| soap/get_list_cppt | POST | id_pasien | JSON array CPPT | ✅ migrated |
| soap/get_detail_cppt | POST | id_asmri | JSON object CPPT | ✅ migrated |
| soap/msttindakan_cppt | GET | term | JSON array [{label,id,price_cppt,...}] | ✅ migrated |
| soap/list_photo_after | POST | id_pasien_set, id_reg_set, id_cppt_set | JSON array foto | ✅ migrated |
| soap/list_photo_before | POST | id_pasien_set, id_reg_set, id_cppt_set | JSON array foto | ✅ migrated |
| soap/deleteimage | POST | id | JSON {status:true} | ✅ migrated |
| trx_reg/inner_get_data_autocomplete_id_asuransi | GET | term | JSON [{label,id}] | ✅ migrated |
| trx_reg/ajax_dokter | GET | - | JSON [{id_dokter,name}] | ✅ migrated |
| pembayaran/inner_get_data_autocomplete_tindakan | GET | term | JSON [{label,id,price}] | pending |
| pembayaran/inner_get_data_autocomplete_bank | GET | term | JSON [{label,id}] | pending |
| mst/save_dokter | POST | form data | JSON/redirect | pending |
| mst/edit_dokter | POST | id | JSON {row data} | pending |
| mst/editthis_dokter | POST | form data | JSON/redirect | pending |
| mst/save_farmasi | POST | form data | JSON/redirect | pending |
| mst/edit_farmasi | POST | id | JSON {row data} | pending |
| mst/save_tindakan | POST | form data | JSON/redirect | pending |
| mst/edit_tindakan | POST | id | JSON {row data} | pending |
| mst/mstgolongan_chain | POST | id_golongan | JSON [{id,name}] | pending |
| mst/mstkategori_chain | POST | id_kategori | JSON [{id,name}] | pending |
| mst/mstsubkategori_chain | POST | id_subkategori | JSON [{id,name}] | pending |
| mst/mstjenis_chain | POST | id_jenis | JSON [{id,name}] | pending |
| mst/mstsubgrouptindakan_chain | POST | id_group | JSON [{id,name}] | pending |
| voucher_disc/cek_voucher | GET | code | JSON {valid,disc_persen,disc_nominal} | pending |
| etiket_farmasi/etiket/getdatadaftarpasien | POST | filter | JSON array pasien | pending |
| etiket_farmasi/etiket/getdatadetaileresep | POST | id_eresep | JSON detail | pending |
| soap_eresep/inner_get_data_autocomplet_obat | GET | term | JSON [{label,id,price,...}] | pending |
| soap_eresep/inner_get_data_autocomplet_obat_dosis | GET | term | JSON [{label}] | pending |
| soap_eresep/inner_get_data_autocomplet_obat_frekwensi | GET | term | JSON [{label}] | pending |
| soap_eresep/inner_get_data_autocomplet_obat_tme | GET | term | JSON [{label}] | pending |
| rumusharga/rumus/listdataharga | GET | - | JSON array harga | pending |
| rumusharga/rumus/prosesdetailobat | POST | id_obat | JSON detail obat | pending |
| stokopname/listdatasto | POST | filter | JSON array stok | pending |
| stokopname/mstgudang | GET | - | JSON [{id,name}] | pending |
| stokopname/mstobat | GET | term | JSON [{label,id}] | pending |
| rincian/msttindakan | GET | term | JSON [{label,id,price}] | pending |
| rincian/mstpasien | GET | term | JSON [{label,id}] | pending |

---

## 5. Mapping CI4 Baru (ziaaesthetic)

| Module Lama (A) | Module CI4 | Controller Baru | Model Baru | View Baru | Route Baru | Route Alias Lama | Status |
|----------------|-----------|----------------|-----------|----------|-----------|-----------------|--------|
| auth | Auth | Auth.php | - | login.php | /login, /logout | auth/login, auth/do_login, auth/logout | ✅ migrated |
| home | Home | Home.php | - | index.php | /home, /home/data_poli_umum, dll | home/* | ✅ migrated |
| soap | Soap | Soap.php | SoapModel.php | list_pasien.php, soap.php | /soap, /soap/rm/{id}, /soap/get_list_cppt, dll | soap/* | ✅ migrated |
| soap (nurse) | Soap | Nurse.php | - | - | /soap/nurse/* | soap/nurse/* | pending |
| trx_reg | TrxReg | TrxReg.php | TrxRegModel.php | trx_reg_list.php | /trx_reg, /trx_reg/create_action, dll | trx_reg/* | ✅ migrated |
| trx_reg_dp | TrxRegDp | TrxRegDp.php | TrxRegDpModel.php | - | /trx_reg_dp/* | Trx_reg_dp/* | pending |
| pembayaran | Pembayaran | Pembayaran.php | - | index.php | /pembayaran, /pembayaran/trx_open/{id}, dll | Pembayaran/* | ✅ migrated |
| pembayaran (refund) | Pembayaran | Refund.php | - | - | /pembayaran/refund/* | - | pending |
| farmasi | Farmasi | Farmasi.php | - | index.php | /farmasi, /farmasi/proses/{id} | Farmasi/* | ✅ migrated |
| mst | Mst | Mst.php | MstModel.php | (25 views) | /mst/mst_dokter, /mst/mst_farmasi, dll | mst/* | pending |
| mst_bank | MstBank | MstBank.php | MstBankModel.php | - | /mst_bank/* | mst_bank/* | pending |
| mst_pasien | MstPasien | MstPasien.php | MstPasienModel.php | - | /mst_pasien/* | mst_pasien/* | pending |
| mst_paket | MstPaket | MstPaket.php | MstPaketModel.php | - | /mst_paket/* | mst_paket/* | pending |
| mst_nav_menu | Nav | MenuController.php | - | menu_list.php | /nav/menu/* | mst_nav_menu/* | ✅ migrated |
| mst_nav_submenu | Nav | SubmenuController.php | - | - | /nav/submenu/* | mst_nav_submenu/* | pending |
| mst_nav_role | Nav | RoleController.php | - | - | /nav/role/* | mst_nav_role/* | pending |
| mst_nav_role_menu | Nav | RoleMenuController.php | - | rolemenu.php | /nav/rolemenu/* | mst_nav_role_menu/* | ✅ migrated |
| mst_nav_user | Nav | UserController.php | - | user_list.php | /nav/user/* | mst_nav_user/* | ✅ migrated |
| voucher_disc | VoucherDisc | VoucherDisc.php | VoucherDiscModel.php | - | /voucher_disc/* | voucher_disc/* | pending |
| v_reg | VReg | VReg.php | VRegModel.php | - | /v_reg | V_reg | pending |
| v_inv | VInv | VInv.php | VInvModel.php | - | /v_inv | V_inv | pending |
| v_jasmed | VJasmed | VJasmed.php | VJasmedModel.php | - | /v_jasmed | V_jasmed | pending |
| keuangan | Keuangan | Keuangan.php | KeuanganModel.php | - | /keuangan/tindakan_list | Keuangan/tindakan_list | pending |
| etiket_farmasi | Etiket_farmasi | Etiket.php | EtiketModel.php | - | /etiket_farmasi/etiket/* | Etiket_farmasi/etiket/* | pending |
| soap_eresep | Soap (merged) | (in Soap controller) | (in SoapModel) | - | /soap/resep/* | soap_eresep/* | pending |
| rumusharga | Rumusharga | Rumus.php | RumusModel.php | - | /rumusharga/rumus/* | rumusharga/rumus/* | pending |
| treatment | Treatment | Treatment.php | TreatmentModel.php | - | /treatment/* | treatment/* | pending |
| rincian | Rincian | Rincian.php | RincianModel.php | - | /rincian/* | rincian/* | pending |
| stokopname | StokOpname | Sto.php | StoModel.php | - | /stokopname/* | stokopname/* | pending |
| penjualan_obat | PenjualanObat | Eresep.php | EresepModel.php | - | /penjualan_obat/* | penjualan_obat/* | pending |
| bookjadwal | Booking | Booking.php | BookingModel.php | - | /booking/* | bookjadwal/* | pending |
| trx_reg_book | Booking | (merged) | - | - | /booking/* | trx_reg_book/* | pending |
| jasmed | VJasmed (merged) | - | - | - | /v_jasmed/* | jasmed/* | pending |
| jspay | VJasmed (merged) | - | - | - | /v_jasmed/* | jspay/* | pending |
| cafe | - | - | - | - | - | - | skip (tidak dipakai) |
| gdf | - | - | - | - | - | - | skip (gudang farmasi internal) |
| lab | - | - | - | - | - | - | skip (lab tidak aktif) |
| rad | - | - | - | - | - | - | skip (radiologi tidak aktif) |
| fisio | - | - | - | - | - | - | skip (fisioterapi tidak aktif) |
| nurse_station | - | - | - | - | - | - | skip (ranap tidak aktif) |
| erm_ranap | - | - | - | - | - | - | skip (ranap tidak aktif) |
| formkeperawatan_hps | - | - | - | - | - | - | skip (ranap tidak aktif) |
| op_order | - | - | - | - | - | - | skip (OK tidak aktif) |
| resume_medis | - | - | - | - | - | - | skip (ranap tidak aktif) |
| rekam_medis | - | - | - | - | - | - | skip (RM fisik) |
| regis | - | - | - | - | - | - | skip (duplikat trx_reg) |
| spb | - | - | - | - | - | - | skip (SPB internal) |
| wioutpo | - | - | - | - | - | - | skip (warehouse internal) |
| po | - | - | - | - | - | - | skip (PO internal) |
| reqpemobt | - | - | - | - | - | - | skip (request PO internal) |
| drawing | - | - | - | - | - | - | pending (canvas drawing) |
| epoli | - | - | - | - | - | - | pending (e-poli) |
| surat_sakit | - | - | - | - | - | - | pending (surat sakit) |
| usergp | - | - | - | - | - | - | skip (user group legacy) |
| dokter | Soap (merged) | - | - | - | /soap/* | dokter/* | pending |
| mst_vendor | Mst (merged) | - | - | - | /mst/* | mst_vendor/* | pending |
| transaksi | Pembayaran (merged) | - | - | - | /pembayaran/* | transaksi/* | pending |
| v_inv_farm | VPendapatanObat | VPendapatanObat.php | - | - | /v_pendapatan_obat/* | v_inv_farm/* | pending |
| lap_cafe_logistik | - | - | - | - | - | - | skip |
| lap_cafe_pendapatan | - | - | - | - | - | - | skip |
| welcome | - | - | - | - | / (redirect home) | - | ✅ handled |
| theme_default | (layouts/partials) | - | - | main.php, auth.php, partials/* | - | - | ✅ migrated |

---

## 6. CI3 → CI4 Conversion Reference

| CI3 Pattern | CI4 Equivalent |
|------------|----------------|
| `$this->load->model('Model')` | `$model = new ModelClass()` atau `$this->db = \Config\Database::connect()` |
| `$this->input->post('key')` | `$this->request->getPost('key')` |
| `$this->input->get('key')` | `$this->request->getGet('key')` |
| `redirect('url')` | `return redirect()->to(base_url('url'))` |
| `$this->session->userdata['sp']` | `session()->get('sp')` |
| `$this->session->set_userdata(k,v)` | `session()->set(k, v)` |
| `$this->session->sess_destroy()` | `session()->destroy()` |
| `$this->load->view('name', $data)` | `return view('Modules\\Name\\Views\\file', $data)` |
| `echo json_encode($data)` | `return $this->response->setJSON($data)` |
| `$this->db->query($sql)` | `$db->query($sql, $bindings)` |
| `$query->result_array()` | `$query->getResultArray()` |
| `$query->row()` | `$query->getRow()` |
| `$query->row_array()` | `$query->getRowArray()` |
| `$query->num_rows()` | `$query->getNumRows()` |
| `$this->db->insert('table', $data)` | `$db->table('table')->insert($data)` |
| `$this->db->update('table', $data, $where)` | `$db->table('table')->where($where)->update($data)` |
| `$this->db->delete('table', $where)` | `$db->table('table')->where($where)->delete()` |
| `$this->load->library('upload')` | `$file = $this->request->getFile('field'); $file->move($dir)` |
| `$this->session->set_flashdata('msg','x')` | `session()->setFlashdata('msg','x')` |
| `$this->form_validation->set_rules(...)` | `$this->validate([...])` atau `Services::validation()` |
| `base_url('path')` | `base_url('path')` (sama) |
| `site_url('path')` | `site_url('path')` (sama) |
| `$this->db->escape($val)` | `$db->escape($val)` |
| `$this->db->trans_begin()` | `$db->transBegin()` |
| `$this->db->trans_commit()` | `$db->transCommit()` |
| `$this->db->trans_rollback()` | `$db->transRollback()` |
| `$this->db->trans_status()` | `$db->transStatus()` |

---

## 7. Progress Tracker

- [x] Project CI4 created via Composer (v4.7.3)
- [x] .env configured (development, Asia/Jakarta, DB)
- [x] .htaccess root (hide /public)
- [x] HMVC module directories created (35 modules)
- [x] Autoload.php with Modules namespace
- [x] Modules.php with auto-discovery
- [x] AuthFilter + Filters.php
- [x] Theme.php config + helpers (brand, theme, menu)
- [x] Velzon layout (layouts/main.php, layouts/auth.php)
- [x] Partials (topbar, nav-sidebar, footer, vendor-scripts)
- [x] Dynamic menu from DB (role-based)
- [x] Assets copied from B (3724+ files)
- [x] Auth module migrated
- [x] Home module migrated
- [x] Soap module migrated (CPPT, tindakan, upload, foto)
- [x] TrxReg module migrated
- [x] Pembayaran module migrated
- [x] Farmasi module migrated
- [x] Nav module migrated (menu, user, rolemenu)
- [x] Routes with CI3 compatibility aliases
- [x] MIGRATION_MAP.md (this file)
- [x] README_MIGRATION.md
- [ ] Mst module (master data — large)
- [ ] MstBank, MstPasien, MstPaket modules
- [ ] VoucherDisc module
- [ ] TrxRegDp module
- [ ] VReg, VInv, VJasmed (laporan)
- [ ] Keuangan module
- [ ] Etiket_farmasi module
- [ ] Soap_eresep (e-resep) — merged into Soap
- [ ] Rumusharga module
- [ ] Treatment module
- [ ] Rincian module
- [ ] StokOpname module
- [ ] PenjualanObat module
- [ ] Booking module
- [ ] Remaining views migration
- [ ] Full testing

---

## 8. Catatan Penting

1. **Password**: MD5 (legacy). Dipertahankan untuk kompatibilitas. Upgrade ke bcrypt nanti.
2. **SQL Injection**: Banyak raw SQL di A dengan string concat. Di CI4 gunakan parameterized binding.
3. **Session**: Object `sp` disimpan utuh di session. Akses via `session('sp')->field`.
4. **File Upload**: Path lama `assets/files_medis_befaft/` → baru `public/uploads/files_medis_befaft/`.
5. **Multiple DB**: A punya 3 koneksi identik. Disederhanakan jadi 1.
6. **Module skip**: Module ranap (erm_ranap, nurse_station, formkeperawatan_hps), lab, rad, fisio, cafe, gdf, po, spb, wioutpo, reqpemobt di-skip karena tidak aktif di klinik estetik.
7. **Merge**: soap_eresep → Soap module, transaksi → Pembayaran, jasmed/jspay → VJasmed, dokter → Soap.

---

## 9. Dashboard Phase Revision (referensi B)

**Status: Dashboard = revised to match reference B**

### File dashboard B yang dijadikan referensi
| File B | Peran |
|--------|-------|
| `lynd.asteramedika.id/modules/Dashboard/Controllers/Dashboard.php` | Pattern controller dashboard |
| `lynd.asteramedika.id/modules/Dashboard/Views/index.php` | Master view layout dashboard (filter, stat card, chart, tabel pasien, task list, top dokter) |
| `lynd.asteramedika.id/app/Views/partials/title-meta.php` | Head meta + favicon |
| `lynd.asteramedika.id/app/Views/partials/head-css.php` | CSS includes (bootstrap, icons, app, custom) |
| `lynd.asteramedika.id/app/Views/partials/page-title.php` | Breadcrumb + title |
| `lynd.asteramedika.id/app/Views/partials/topbar.php` | Topbar Velzon |
| `lynd.asteramedika.id/app/Views/partials/nav-sidebar.php` | Sidebar dinamis |
| `lynd.asteramedika.id/app/Views/partials/footer.php` | Footer |
| `lynd.asteramedika.id/app/Views/partials/vendor-scripts.php` | Vendor JS includes |
| `lynd.asteramedika.id/app/Views/partials/customizer.php` | Customizer placeholder |
| `lynd.asteramedika.id/modules/Menu/Views/partials/menu.php` | Wrapper topbar+sidebar |
| `lynd.asteramedika.id/assets/material_CI4/assets/...` | Velzon theme assets (CSS/JS/libs) |

### File dashboard ziaaesthetic yang diperbaiki/dibuat
| File | Status |
|------|--------|
| `ziaaesthetic/modules/Dashboard/Controllers/Dashboard.php` | revised (7 endpoints AJAX: index, getSummary, getVisitChart, getPayerChart, getRevenueChart, getLatestPatients, getOperationalTasks, getTopDoctors) |
| `ziaaesthetic/modules/Dashboard/Models/DashboardModel.php` | new (queries dari logic A: trx_reg, mst_dokter, mst_pasien, mst_company, soap_eresep, trx_reg_act) |
| `ziaaesthetic/modules/Dashboard/Views/index.php` | revised (full clone struktur HTML dashboard B, class CSS sama, ApexCharts) |
| `ziaaesthetic/app/Views/partials/title-meta.php` | new (mirror B) |
| `ziaaesthetic/app/Views/partials/head-css.php` | new (mirror B) |
| `ziaaesthetic/app/Views/partials/page-title.php` | new (mirror B) |
| `ziaaesthetic/app/Views/partials/customizer.php` | new (placeholder mirror B) |
| `ziaaesthetic/modules/Menu/Views/partials/menu.php` | new (wrapper topbar+sidebar mirror B) |
| `ziaaesthetic/app/Views/partials/topbar.php` | existing (Velzon style topbar dengan user dropdown) |
| `ziaaesthetic/app/Views/partials/nav-sidebar.php` | existing (sidebar dinamis dari menu_helper) |
| `ziaaesthetic/app/Views/partials/footer.php` | existing |
| `ziaaesthetic/app/Views/partials/vendor-scripts.php` | existing |
| `ziaaesthetic/app/Helpers/theme_helper.php` | existing (theme_asset, theme_assets_base) |
| `ziaaesthetic/app/Helpers/brand_helper.php` | existing (brand_asset) |
| `ziaaesthetic/app/Helpers/menu_helper.php` | existing (get_menu_tree_for_role from mst_nav_menu) |
| `ziaaesthetic/app/Config/Routes.php` | revised (dashboard sebagai default `/`, 7 endpoint AJAX terdaftar) |
| `ziaaesthetic/modules/Auth/Controllers/Auth.php` | revised (redirect ke dashboard setelah login) |
| `ziaaesthetic/modules/Home/Controllers/Home.php` | revised (index() redirect ke dashboard untuk kompatibilitas) |

### Routing
- `/` → Dashboard::index (proteksi auth)
- `/dashboard` → Dashboard::index
- `/dashboard/summary` → Dashboard::getSummary (AJAX JSON)
- `/dashboard/visit-chart` → Dashboard::getVisitChart (AJAX JSON)
- `/dashboard/payer-chart` → Dashboard::getPayerChart (AJAX JSON)
- `/dashboard/revenue-chart` → Dashboard::getRevenueChart (AJAX JSON)
- `/dashboard/latest-patients` → Dashboard::getLatestPatients (AJAX JSON)
- `/dashboard/operational-tasks` → Dashboard::getOperationalTasks (AJAX JSON)
- `/dashboard/top-doctors` → Dashboard::getTopDoctors (AJAX JSON)
- `/home` → redirect ke `/dashboard` (CI3 compat)
- `/home/data_poli_umum`, `data_penjualan_obat`, `graphmanajemen_3/4` → tetap berfungsi (CI3 compat AJAX endpoint)

### Test Result (30/30 PASS)
1. ✅ Asset accessibility (8 files): bootstrap.min.css, icons.min.css, app.min.css, app.js, layout.js, apexcharts.min.js, logo.png, favicon.png
2. ✅ /login returns 200
3. ✅ /dashboard tanpa login redirect 302
4. ✅ Login dengan password salah redirect 303
5. ✅ Login admin/123 → redirect ke /dashboard
6. ✅ /dashboard setelah login returns 200, semua marker HTML hadir (clinic-spinner, sales-forecast-chart, deal-type-charts, revenue-expenses-charts, latestPatientsBody, clinicTaskList, topDoctorsBox, clinicDashboardFilter)
7. ✅ 7 AJAX endpoint dashboard return JSON valid
8. ✅ /logout redirect 302
9. ✅ /dashboard setelah logout redirect ke login
10. ✅ writable/logs tidak ada CRITICAL/ERROR

### Logic / Data Source (mengikuti A)
| Komponen | Data Source (A schema) |
|----------|------------------------|
| Total kunjungan hari ini | `SELECT COUNT(*) FROM trx_reg WHERE DATE(regdate) = CURDATE()` |
| Umum/Asuransi hari ini | `SELECT COUNT(*) FROM trx_reg WHERE DATE(regdate)=CURDATE() AND id_asuransi='0001' OR NULL` |
| Resep menunggu | `soap_eresep` minus `soap_eresep_det.is_validasi=1` |
| Pembayaran pending | `trx_reg.status` belum CLOSED/PAID |
| Visit chart | `GROUP BY DATE(regdate)` dari `trx_reg` |
| Payer chart | `LEFT JOIN mst_company` dengan logika tunai vs asuransi |
| Revenue chart | `SUM(total) FROM trx_reg_act GROUP BY DATE(trxdate)` |
| Latest patients | `trx_reg JOIN mst_pasien JOIN mst_dokter JOIN mst_company` |
| Top doctors | `GROUP BY mst_dokter ORDER BY COUNT DESC` |

Logika business tetap mengikuti A. Tampilan/struktur HTML mengikuti B.
