|
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
defined('BASEPATH') or exit('No direct script access allowed');
/**
* Promotional Campaign Usage Model
* For tracking actual usage/conversions (orders)
*
* Location: application/models/Promotional_campaign_usage_model.php
*/
class Promotional_campaign_usage_m extends CI_Model
{
protected $table = 'promotional_campaign_usage';
/**
* Insert usage record
*
* @param array $data
* @return int|bool
*/
public function insert($data)
{
if ($this->db->insert($this->table, $data)) {
return $this->db->insert_id();
}
return false;
}
/**
* Get user usage count for campaign
*
* @param int $campaign_id
* @param int $user_id (null for guest)
* @param string $session_id
* @return int
*/
public function get_user_usage_count($campaign_id, $user_id = null, $session_id = null)
{
$this->db->where('campaign_id', $campaign_id);
if ($user_id) {
// For logged in users
$this->db->where('user_id', $user_id);
} else {
// For guests, check by session or IP
$this->db->group_start();
if ($session_id) {
$this->db->or_where('session_id', $session_id);
}
$this->db->or_where('ip_address', $this->input->ip_address());
$this->db->group_end();
}
return $this->db->count_all_results($this->table);
}
/**
* Get campaign usage by date range
*
* @param int $campaign_id
* @param string $date_from
* @param string $date_to
* @return array
*/
public function get_usage_by_date($campaign_id, $date_from, $date_to)
{
return $this->db
->select('DATE(used_at) as date, COUNT(*) as count, SUM(discount_amount) as total_discount')
->where('campaign_id', $campaign_id)
->where('used_at >=', $date_from)
->where('used_at <=', $date_to)
->group_by('date')
->order_by('date', 'ASC')
->get($this->table)
->result();
}
/**
* Get total discount given for campaign
*
* @param int $campaign_id
* @return float
*/
public function get_total_discount($campaign_id)
{
$result = $this->db
->select_sum('discount_amount')
->where('campaign_id', $campaign_id)
->get($this->table)
->row();
return $result->discount_amount ?? 0;
}
/**
* Get usage details with order info
*
* @param int $campaign_id
* @param array $options [limit, offset]
* @return array
*/
public function get_usage_details($campaign_id, $options = [])
{
$this->db
->select('cu.*, o.order_number, o.total_amount, o.status as order_status, u.name as user_name, u.email')
->from($this->table . ' cu')
->join('orders o', 'o.id = cu.order_id', 'left')
->join('users u', 'u.id = cu.user_id', 'left')
->where('cu.campaign_id', $campaign_id)
->order_by('cu.used_at', 'DESC');
if (isset($options['limit'])) {
$this->db->limit($options['limit'], $options['offset'] ?? 0);
}
return $this->db->get()->result();
}
/**
* Get average order value for campaign
*
* @param int $campaign_id
* @return float
*/
public function get_average_order_value($campaign_id)
{
$result = $this->db
->select('AVG(o.total_amount) as avg_value')
->from($this->table . ' cu')
->join('orders o', 'o.id = cu.order_id')
->where('cu.campaign_id', $campaign_id)
->get()
->row();
return $result->avg_value ?? 0;
}
/**
* Check if user has used campaign before
*
* @param int $campaign_id
* @param int $user_id
* @param string $session_id
* @return bool
*/
public function has_user_used_campaign($campaign_id, $user_id = null, $session_id = null)
{
$this->db->where('campaign_id', $campaign_id);
if ($user_id) {
$this->db->where('user_id', $user_id);
} else if ($session_id) {
$this->db->where('session_id', $session_id);
} else {
return false;
}
return $this->db->count_all_results($this->table) > 0;
}
/**
* Get top users by discount amount
*
* @param int $campaign_id
* @param int $limit
* @return array
*/
public function get_top_users($campaign_id, $limit = 10)
{
return $this->db
->select('u.name, u.email, COUNT(*) as usage_count, SUM(cu.discount_amount) as total_discount')
->from($this->table . ' cu')
->join('users u', 'u.id = cu.user_id')
->where('cu.campaign_id', $campaign_id)
->where('cu.user_id IS NOT NULL')
->group_by('cu.user_id')
->order_by('total_discount', 'DESC')
->limit($limit)
->get()
->result();
}
}