From 7db10f5cc6f60795a9e730dece92001d42209144 Mon Sep 17 00:00:00 2001 From: mikael-zakaria Date: Thu, 2 Oct 2025 09:41:29 +0700 Subject: [PATCH] Update (insert, patch & get/show) Patient Pattat dan perbaikan Patcom --- app/Models/PatientModel.php | 83 +++++++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 13 deletions(-) diff --git a/app/Models/PatientModel.php b/app/Models/PatientModel.php index 2f78ef6..a638123 100644 --- a/app/Models/PatientModel.php +++ b/app/Models/PatientModel.php @@ -70,8 +70,9 @@ class PatientModel extends Model { // Default nested structures $patient['PatIdt'] = null; + $patient['PatCom'] = null; $patient['PatAtt'] = []; - + foreach ($rows as $row) { if ($row['IdentifierType'] && $row['Identifier'] && !$patient['PatIdt']) { $patient['PatIdt'] = [ @@ -80,6 +81,10 @@ class PatientModel extends Model { ]; } + if ($row['Comment']) { + $patient['PatCom'] = $row['Comment']; + } + if ($row['Address']) { $patient['PatAtt'][] = ['Address' => $row['Address']]; } @@ -111,14 +116,14 @@ class PatientModel extends Model { $patcom['InternalPID'] = $newInternalPID; $db->table('patcom')->insert($patcom); } - /* + if (!empty($patatt)) { foreach ($patatt as &$row) { $row['InternalPID'] = $newInternalPID; } $db->table('patatt')->upsertBatch($patatt); } - */ + $db->transComplete(); if ($db->transStatus() === false) { @@ -137,7 +142,8 @@ class PatientModel extends Model { $db = \Config\Database::connect(); $patidt = $input['PatIdt'] ?? []; $patatt = $input['PatAtt'] ?? []; - $patcom['Comment'] = $input['Comment'] ?? []; + $patcom['Comment'] = $input['PatCom'] ?? []; + try { $db->transStart(); $InternalPID = $input['InternalPID']; @@ -160,23 +166,74 @@ class PatientModel extends Model { if ($exists) { $db->table('patcom')->where('InternalPID', $InternalPID)->update($patcom); } else { - $patidt['InternalPID'] = $InternalPID; + $patcom['InternalPID'] = $InternalPID; $db->table('patcom')->insert($patcom); } } else { $db->table('patcom')->where('InternalPID', $InternalPID)->delete(); } - /* + + $now = date('Y-m-d H:i:s'); if (!empty($patatt)) { - $db->table('patatt')->where('InternalPID', $InternalPID)->delete(); - foreach ($patatt as $row) { - $row['InternalPID'] = $InternalPID; - $db->table('patatt')->insert($row); - } + // Ambil daftar address aktif (DelDate IS NULL) di DB + $oldActive = $db->table('patatt') + ->select('Address') + ->where('InternalPID', $InternalPID) + ->where('DelDate', null) + ->get()->getResultArray(); + $oldActive = array_column($oldActive, 'Address'); + + // Normalisasi & dedup input baru (berdasarkan Address) + $mapNew = []; + foreach ($patatt as $row) { + if (!isset($row['Address'])) continue; + $mapNew[$row['Address']] = $row; // overwrite duplikat di input + } + $newData = array_keys($mapNew); + + // Hitung yang perlu ditambah & dihapus + $added = array_diff($newData, $oldActive); // baru (belum aktif) + $removed = array_diff($oldActive, $newData); // dulu aktif tapi hilang di input + + + // 1) Soft delete yang dihapus + if (!empty($removed)) { + $db->table('patatt') + ->where('InternalPID', $InternalPID) + ->whereIn('Address', $removed) + ->set('DelDate', $now) + ->update(); + } + + // 2) Tambahkan yang baru + foreach ($added as $addr) { + $data = $mapNew[$addr]; + $data['InternalPID'] = $InternalPID; + + // Coba REACTIVATE satu baris yang pernah di-soft delete (kalau ada) + $builder = $db->table('patatt'); + $builder->set('DelDate', null); + // Kalau ada kolom lain yang mau di-update saat re-activate, set di sini juga + // mis: $builder->set('Note', $data['Note'] ?? null); + + $builder->where('InternalPID', $InternalPID) + ->where('Address', $addr) + ->where('(DelDate IS NOT NULL)', null, false) + ->orderBy('PatAttID', 'DESC') + ->limit(1) + ->update(); + + if ($db->affectedRows() === 0) { + // Tidak ada baris soft-deleted untuk alamat ini → INSERT baru + $db->table('patatt')->insert($data); + } + } + } else { - $db->table('patatt')->where('InternalPID', $InternalPID)->delete(); + // Input kosong → semua yang masih aktif di-soft delete + $db->table('patatt')->where('InternalPID', $InternalPID)->where('DelDate', null)->set('DelDate', $now)->update(); } - */ + $db->transComplete(); if ($db->transStatus() === false) {