|
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 : /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;
}
}