Server : Apache/2.4.18 (Ubuntu) System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 User : oppastar ( 1041) PHP Version : 7.0.33-0ubuntu0.16.04.15 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, Directory : /proc/self/root/var/www/laciasmara.com/public_html/shop/application/models/ |
Upload File : |
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Log_m extends MY_Model { protected $_table_name = 'activity_logs'; protected $_primary_key = 'log_id'; protected $_order_by = 'log_id'; function __construct() { parent::__construct(); } /** * Simpan log aktivitas * * @param string $action_type Jenis tindakan (ex: UPDATE_ORDER, UPDATE_STOCK) * @param string $table_name Nama tabel yang diubah * @param string $record_id ID record yang diubah * @param string $description Deskripsi perubahan dalam format teks * @param string $field_name (opsional) Nama field yang diubah * @param string $old_value (opsional) Nilai lama sebelum perubahan * @param string $new_value (opsional) Nilai baru setelah perubahan * @param string $reference_url (opsional) URL untuk melihat detail * @return int ID log yang baru disimpan */ public function save_log($action_type, $table_name, $record_id, $description, $field_name = null, $old_value = null, $new_value = null, $reference_url = null, $record_type = null) { // Dapatkan data user yang login $user_id = $this->session->userdata('user_id'); $user_name = $this->session->userdata('name'); // Jika tidak ada user yang login, set nilai default if (empty($user_id)) { $user_id = 0; $user_name = 'System'; } // Siapkan data untuk dimasukkan ke database $data = array( 'timestamp' => date('Y-m-d H:i:s'), 'user_id' => $user_id, 'user_name' => $user_name, 'action_type' => $action_type, 'table_name' => $table_name, 'record_id' => $record_id, 'record_type' => $record_type, 'description' => $description, 'ip_address' => $this->input->ip_address() ); // Tambahkan data opsional jika ada if (!is_null($field_name)) $data['field_name'] = $field_name; if (!is_null($old_value)) $data['old_value'] = $old_value; if (!is_null($new_value)) $data['new_value'] = $new_value; if (!is_null($reference_url)) $data['reference_url'] = $reference_url; // Simpan ke database return $this->db->insert('activity_logs', $data); } /** * Fungsi khusus untuk mencatat log perubahan order * * @param string $order_id ID order * @param string $description Deskripsi perubahan * @param string $field_name Nama field yang diubah * @param string $old_value Nilai lama * @param string $new_value Nilai baru * @param string $reference_url URL referensi (opsional) * @return int ID log yang baru disimpan */ public function log_order_update($order_id, $description, $field_name, $old_value, $new_value, $reference_url = null) { $log_id = $this->save_log( 'UPDATE_ORDER', 'orders', $order_id, $description, $field_name, $old_value, $new_value, $reference_url, 'orders' ); if (!$log_id) { $db_error = $this->db->error(); // Ambil error dari database log_message('error', 'Gagal menyimpan log order update: ' . json_encode($db_error)); } else { log_message('debug', "Log order update berhasil: Order ID: $order_id, Field: $field_name, Old: $old_value, New: $new_value"); } return $log_id; } /** * Fungsi untuk mencatat log ketika order baru dibuat * * @param string $order_id ID order * @param string $customer_name Nama customer * @param string $order_total Total order * @param string $reference_url URL referensi (opsional) * @return int ID log yang baru disimpan */ public function log_order_create($order_id, $description, $reference_url = null) { if (!empty($reference_url)) { $description .= " Lihat detail order di sini."; } $log_id = $this->save_log( 'CREATE_ORDER', 'orders', $order_id, $description, null, // Tidak ada field yang diubah null, // Tidak ada nilai lama null, // Tidak ada nilai baru $reference_url ); if (!$log_id) { $db_error = $this->db->error(); // Ambil error dari database log_message('error', 'Gagal menyimpan log order create: ' . json_encode($db_error)); } else { log_message('debug', "Log order create berhasil: Order ID: $order_id"); } return $log_id; } /** * Fungsi khusus untuk mencatat log perubahan stok * * @param string $order_id ID order * @param string $product_id ID produk * @param string $product_name Nama produk * @param int $old_stock Stok lama * @param int $new_stock Stok baru * @param string $reference_url URL referensi (opsional) * @return int ID log yang baru disimpan */ public function log_stock_update($order_id = null, $product_id, $product_name, $old_stock, $new_stock, $reference_url = null, $description = null, $field = null, $record_type) { $username = !empty($this->session->userdata('name')) ? $this->session->userdata('name') : 'System'; $recipient_name = ''; if (!empty($order_id)) { $this->db->select('recipient_name'); $this->db->where('id_orders', $order_id); $query = $this->db->get('orders'); $order = $query->row(); $recipient_name = $order ? $order->recipient_name : ''; } if ($description === null) { $description = "Stok produk {$product_name} (ID: {$product_id}) telah diperbarui dari {$old_stock} menjadi {$new_stock} oleh {$username}."; if ($old_stock < $new_stock) { $description .= " Stok bertambah karena pengembalian atau pembatalan pesanan" . (!empty($order_id) ? " dengan Order ID: " . $order_id : "."); } elseif ($old_stock > $new_stock) { $description .= " Stok berkurang karena transaksi penjualan" . (!empty($recipient_name) ? " untuk {$recipient_name}" : "") . (!empty($order_id) ? " dengan Order ID: " . $order_id : "."); } } return $this->save_log( 'UPDATE_STOCK', 'stock', $order_id ? $order_id : $product_id, $description, $field, $old_stock, $new_stock, $reference_url, $record_type ); } /** * Mendapatkan log berdasarkan jenis tindakan * * @param string $action_type Jenis tindakan * @param int $limit Batas jumlah log * @param int $offset Offset untuk pagination * @return array Daftar log */ public function get_logs_by_action($action_type, $limit = 10, $offset = 0) { $this->db->where('action_type', $action_type); $this->db->order_by('timestamp', 'DESC'); $this->db->limit($limit, $offset); return $this->db->get($this->_table_name)->result(); } /** * Mendapatkan log berdasarkan ID record dan nama tabel * * @param string $table_name Nama tabel * @param string $record_id ID record * @param int $limit Batas jumlah log * @param int $offset Offset untuk pagination * @return array Daftar log */ public function get_logs_by_record($table_name, $record_id, $limit = 10, $offset = 0) { $this->db->where('table_name', $table_name); $this->db->where('record_id', $record_id); $this->db->order_by('timestamp', 'DESC'); $this->db->limit($limit, $offset); return $this->db->get($this->_table_name)->result(); } /** * Mengirim notifikasi ke pengguna berdasarkan role dan kondisi field * * @param string $action_type Tipe aksi (misalnya 'UPDATE_ORDER') * @param int $log_id ID dari log aktivitas * @param string $message Pesan notifikasi yang akan dikirim * @param string $field_name Nama field yang diubah (opsional) * @param string $field_value Nilai baru dari field (opsional) * @return void */ public function send_order_notifications($action_type, $log_id, $message, $field_name = null, $field_value = null) { // Buat query dasar $this->db->select('recipient_role'); $this->db->from('notification_rules'); $this->db->where('action_type', $action_type); $this->db->where('is_active', 1); // Tambahkan kondisi field jika disediakan if ($field_name !== null) { $this->db->group_start(); $this->db->where('field_name', $field_name); $this->db->where('field_value', $field_value); $this->db->or_where('field_name IS NULL', null, false); // Juga ambil rules yang tidak mementingkan field tertentu $this->db->group_end(); } $rules_query = $this->db->get(); if ($rules_query->num_rows() == 0) { return; // Tidak ada aturan notifikasi yang cocok } // Proses seperti sebelumnya... foreach ($rules_query->result() as $rule) { $role = $rule->recipient_role; // Dapatkan semua user dengan role tersebut $this->db->select('id'); $this->db->from('admin_users'); $this->db->where('role', $role); $this->db->where('status', 'active'); $users_query = $this->db->get(); if ($users_query->num_rows() > 0) { $batch_data = array(); foreach ($users_query->result() as $user) { $batch_data[] = array( 'user_id' => $user->id, 'log_id' => $log_id, 'message' => $message, 'is_read' => 0, 'created_at' => date('Y-m-d H:i:s') ); } if (!empty($batch_data)) { $this->db->insert_batch('notifications', $batch_data); } } } } // Notification public function get_unread_count($user_id) { $this->db->where('user_id', $user_id); $this->db->where('is_read', 0); return $this->db->count_all_results('notifications'); } public function get_notifications($user_id, $limit = 10) { $this->db->select('notifications.*, activity_logs.reference_url'); $this->db->from('notifications'); $this->db->join('activity_logs', 'notifications.log_id = activity_logs.log_id', 'left'); $this->db->where('notifications.user_id', $user_id); $this->db->order_by('notifications.created_at', 'DESC'); $this->db->limit($limit); $query = $this->db->get(); return $query->result_array(); } public function mark_as_read($notification_id, $user_id) { $this->db->where('notification_id', $notification_id); $this->db->where('user_id', $user_id); // Pastikan user hanya bisa menandai notifikasinya sendiri $this->db->update('notifications', ['is_read' => 1]); return $this->db->affected_rows() > 0; } public function mark_all_as_read($user_id) { $this->db->where('user_id', $user_id); $this->db->where('is_read', 0); $this->db->update('notifications', ['is_read' => 1]); return true; } }