load->library('AuditService'); } public function duplicate_refs() { if (strtolower((string)app_env('APP_ENV', ENVIRONMENT)) === 'production') { echo "Ditolak: repair ini hanya untuk development.\n"; return; } $groups=$this->db->select('no_ref, COUNT(*) total')->from('journals')->group_by('no_ref')->having('COUNT(*) >',1)->get()->result(); $changed=0; $this->db->trans_begin(); try { foreach($groups as $group) { $rows=$this->db->query('SELECT id,no_ref FROM journals WHERE no_ref=? ORDER BY id ASC FOR UPDATE',array($group->no_ref))->result(); array_shift($rows); foreach($rows as $row) { $suffix='-D'.$row->id; $new=substr($row->no_ref,0,50-strlen($suffix)).$suffix; $this->db->where('id',$row->id)->update('journals',array('no_ref'=>$new)); $this->auditservice->record('development_repair','journal',$row->id,'renumber_duplicate_reference',array('no_ref'=>$row->no_ref),array('no_ref'=>$new),null); echo $row->no_ref.' -> '.$new."\n"; $changed++; } } if(!$this->db->trans_status()) throw new RuntimeException('Repair database gagal.'); $this->db->trans_commit(); echo "Selesai: {$changed} referensi diperbaiki.\n"; } catch(Throwable $e) { $this->db->trans_rollback(); echo 'Gagal: '.$e->getMessage()."\n"; } } }