https://t.me/RX1948
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/self/root/var/www/laciasmara.com/public_html/shop/application/models/Log_m.php
<?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;
    }
}

https://t.me/RX1948 - 2025