From f41fcad52696295d946d3eebedb044f2744051ce Mon Sep 17 00:00:00 2001 From: mikael-zakaria Date: Tue, 4 Nov 2025 09:42:03 +0700 Subject: [PATCH] Update Zones (Skipped) --- app/Controllers/Zones.php | 2 +- app/Models/SyncCRM/ZonesModel.php | 70 +++++++++++++++++-------------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/app/Controllers/Zones.php b/app/Controllers/Zones.php index 62ea9e1..7ff72e4 100644 --- a/app/Controllers/Zones.php +++ b/app/Controllers/Zones.php @@ -74,7 +74,7 @@ class Zones extends BaseController { 'inserted' => $record['inserted'], 'updated' => $record['updated'], 'deleted' => $record['deleted'], - // 'total' => count($crmData) + 'skipped' => $record['skipped'] ] ]); } catch (\Exception $e) { diff --git a/app/Models/SyncCRM/ZonesModel.php b/app/Models/SyncCRM/ZonesModel.php index f8c6d71..253838c 100644 --- a/app/Models/SyncCRM/ZonesModel.php +++ b/app/Models/SyncCRM/ZonesModel.php @@ -37,41 +37,50 @@ class ZonesModel extends BaseModel { // synchronize with crm.zones public function synchronize($crmData) { - $db = \Config\Database::connect(); $db->transBegin(); try { - // Ambil semua data zoneid di database lokal $localData = $this->findAll(); - $localIds = array_column($localData, 'zoneid'); + $localMap = array_column($localData, null, 'zoneid'); + $crmIds = array_column($crmData, 'zoneid'); - // Siapkan ID dari data CRM - $crmIds = array_column($crmData, 'zoneid'); + $record = ['inserted' => 0, 'updated' => 0, 'deleted' => 0, 'skipped' => 0]; - // Hitung statistik - $record = [ - 'inserted' => 0, - 'updated' => 0, - 'deleted' => 0, - ]; - - // Insert atau Update data foreach ($crmData as $zone) { if (!isset($zone['zoneid'])) continue; - $exists = $this->find($zone['zoneid']); + if (isset($localMap[$zone['zoneid']])) { + // Ambil data lokal untuk perbandingan + $localRow = $localMap[$zone['zoneid']]; + + // Buat array subset dari kolom yang relevan untuk dibandingkan + $fieldsToCompare = ['parentzoneid', 'zonecode', 'zoneclass', 'zonename']; + + $isDifferent = false; + foreach ($fieldsToCompare as $field) { + $crmVal = $zone[$field] ?? null; + $localVal = $localRow[$field] ?? null; + + if ($crmVal != $localVal) { // gunakan != agar beda tipe tetap terdeteksi + $isDifferent = true; + break; + } + } + + if ($isDifferent) { + $this->update($zone['zoneid'], [ + 'parentzoneid' => $zone['parentzoneid'], + 'zonecode' => $zone['zonecode'], + 'zoneclass' => $zone['zoneclass'], + 'zonename' => $zone['zonename'] + ]); + $this->checkDbError($db, 'Update Zones'); + $record['updated']++; + } else { + $record['skipped']++; // tandai bahwa data identik, tidak diupdate + } - if ($exists) { - // Update jika sudah ada - $this->update($zone['zoneid'], [ - 'parentzoneid' => $zone['parentzoneid'], - 'zonecode' => $zone['zonecode'], - 'zoneclass' => $zone['zoneclass'], - 'zonename' => $zone['zonename'] - ]); - $this->checkDbError($db, 'Update Zones'); - $record['updated']++; } else { // Insert jika belum ada $this->insert($zone); @@ -80,27 +89,26 @@ class ZonesModel extends BaseModel { } } - // Hapus data yang sudah tidak ada di CRM - foreach ($localIds as $localId) { + // Hapus data yang tidak ada di CRM + foreach ($localMap as $localId => $row) { if (!in_array($localId, $crmIds)) { $this->delete($localId); $this->checkDbError($db, 'Delete Zones'); - $record['deleted']++;; + $record['deleted']++; } } - + $db->transCommit(); } catch (\Exception $e) { $db->transRollback(); - throw $e; + throw $e; } - $db->transComplete(); - return $record; } + // Check Error and Send Spesific Messages private function checkDbError($db, string $context) { $error = $db->error();