diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php index 995ac7e..5257630 100644 --- a/app/Controllers/MasterController.php +++ b/app/Controllers/MasterController.php @@ -595,7 +595,7 @@ class MasterController extends ResourceController //--------------------------------------------------------------------------------------- - public function getHistory() + public function getHistoryOld() { $db = \Config\Database::connect(); @@ -663,6 +663,193 @@ class MasterController extends ResourceController ]); } + public function getHistory() + { + $db = \Config\Database::connect(); + + $tableName = $this->request->getGet('table_name'); + $pk = $this->request->getGet('pk'); + + if (!$tableName || !$pk) { + return $this->response->setJSON(['status' => 'failed', 'message' => 'table_name and pk are required']); + } + + $history = $db->table('partner_audit_history pah') + ->select("pah.column_name, pah.old_val, pah.new_val, pah.changed_on, ps.name AS changed_by") + ->join('partner_staff ps', 'ps.id = pah.user_id', 'left') + ->where(['pah.table_name' => $tableName, 'pah.pk' => $pk]) + ->orderBy('pah.changed_on', 'DESC') + ->get()->getResultArray(); + + if (empty($history)) { + return $this->response->setJSON(['status' => 'success', 'data' => [], 'message' => 'No audit history found']); + } + + $result = []; + + $ignoreColumns = [ + 'updated_on', + 'created_on', + 'updated_by', + 'created_by', + 'id' // Usually PKs are ignored too + ]; + + foreach ($history as $row) { + $column = $row['column_name']; + + // SKIP the iteration if the column is in our ignore list + if (in_array($column, $ignoreColumns)) { + continue; + } + + $formatted = $this->formatAuditRow($row); + $label = $formatted['label']; + $old = $formatted['old']; + $new = $formatted['new']; + $by = $row['changed_by'] ?? 'System'; + + // Professional Message logic + if ($old === '-' || $old === '') { + $message = "{$label} was set to **{$new}** by {$by}"; + } else { + $message = "{$label} updated from '{$old}' to '{$new}' by {$by}"; + } + + $result[] = [ + // 'column_name' => $label, + 'column_name' => $column, + 'message' => $message, + 'changed_on' => $row['changed_on'] ? date("d-m-Y", strtotime($row['changed_on'])) : '', + 'changed_by' => $by + ]; + } + + return $this->response->setJSON(['status' => 'success', 'data' => $result]); + } + + private function formatAuditRow($row) + { + $col = $row['column_name']; + $old = $row['old_val']; + $new = $row['new_val']; + + // Default formatting + $label = ucwords(str_replace('_', ' ', $col)); + $fOld = $old ?? '-'; + $fNew = $new ?? '-'; + + switch ($col) { + // --- ID to Name Lookups --- + case 'enquiry_id': + $label = "Enquiry"; + $fOld = $this->fetchName('partner_enquiry', 'name', $old); + $fNew = $this->fetchName('partner_enquiry', 'name', $new); + break; + + case 'insurance_plan_type_id': + $label = "Insurance Plan Type"; + $fOld = $this->fetchName('partner_insurance_plan_type_master', 'insurance_plan_type', $old); + $fNew = $this->fetchName('partner_insurance_plan_type_master', 'insurance_plan_type', $new); + break; + + case 'manager_id': + $label = "Manager"; + $fOld = $this->fetchName('partner_staff', 'name', $old, ['role_id' => 1]); + $fNew = $this->fetchName('partner_staff', 'name', $new, ['role_id' => 1]); + break; + + case 'updated_by': + case 'created_by': + case 'assigned_to': + $fOld = $this->fetchName('partner_staff', 'name', $old); + $fNew = $this->fetchName('partner_staff', 'name', $new); + break; + + case 'pos_id': + $label = "POS"; + $fOld = $this->fetchName('partner_pos', 'name', $old); + $fNew = $this->fetchName('partner_pos', 'name', $new); + break; + + // --- Date Formatting --- + case 'created_on': + case 'updated_on': + case 'issued_date': + case 'start_date': + case 'end_date': + case 'date_of_registration': + case 'enquiry_created_on': + if($col == 'enquiry_created_on') $label = "Received Date"; + $fOld = ($old && $old != '0000-00-00') ? date("d-m-Y", strtotime($old)) : '-'; + $fNew = ($new && $new != '0000-00-00') ? date("d-m-Y", strtotime($new)) : '-'; + break; + + // --- Status / Boolean Mapping --- + case 'is_active': + $label = "Data Status"; + $fOld = ($old == 1) ? "ACTIVE" : "INACTIVE"; + $fNew = ($new == 1) ? "ACTIVE" : "INACTIVE"; + break; + + case 'is_invoice_generated': + case 'is_data_accuracy_checked': + $label = ($col == 'is_invoice_generated') ? "Invoice Generated" : "Data Accuracy Checked"; + $fOld = ($old == 1) ? "YES" : "NO"; + $fNew = ($new == 1) ? "YES" : "NO"; + break; + + case 'is_data_created_by_handler': + case 'is_data_created_by_staff': + $label = str_replace('Is ', '', $label); + $map = [null => "-", 1 => "Yes", 0 => "No"]; + $fOld = $map[$old] ?? "-"; + $fNew = $map[$new] ?? "-"; + break; + case 'broker_id': + $label = "Broker"; + $fOld = $this->fetchName('partner_brokers', 'name', $old); + $fNew = $this->fetchName('partner_brokers', 'name', $new); + break; + case 'insurer_id': + $label = "Insurer"; + $fOld = $this->fetchName('insurers', 'name', $old); + $fNew = $this->fetchName('insurers', 'name', $new); + break; + case 'payment_mode_id': + $label = "Payment Mode"; + $fOld = $this->fetchName('partner_payment_mode_master', 'value', $old); + $fNew = $this->fetchName('partner_payment_mode_master', 'value', $new); + + case 'insurer_branch_id': + $label = "Insurer Branch"; + $fOld = $this->fetchName('insurer_branch', 'branch_name', $old); + $fNew = $this->fetchName('insurer_branch', 'branch_name', $new); + case 'vehicle_type_id': + $label = "Vehicle Type"; + $fOld = $this->fetchName('vehicle_type', 'vehicle_type', $old); + $fNew = $this->fetchName('vehicle_type', 'vehicle_type', $new); + case 'agent_id': + $label = "Partner"; + $fOld = $this->fetchName('partner_agent', 'name', $old); + $fNew = $this->fetchName('partner_agent', 'name', $new); + } + + return ['label' => $label, 'old' => $fOld, 'new' => $fNew]; + } + + private function fetchName($table, $nameCol, $id, $additionalWhere = []) + { + if (!$id) return '-'; + $db = \Config\Database::connect(); + $builder = $db->table($table); + $builder->select($nameCol)->where('id', $id); + foreach ($additionalWhere as $col => $val) { + $builder->where($col, $val); + } + $result = $builder->get()->getRowArray(); + return $result[$nameCol] ?? '-'; + }