|
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 Cart_model extends MY_Model
{
public function __construct()
{
parent::__construct();
$this->load->library('session');
$this->load->library('user_agent');
}
function update_cart($rowid, $qty, $price, $amount)
{
$data = array(
'rowid' => $rowid,
'qty' => $qty,
'price' => $price,
'amount' => $amount
);
$this->cart->update($data);
}
public function add_to_cart($post_data, $id_customer)
{
$product_id = (int) $post_data['product_id'];
$product_detail_id = (int) $post_data['id'];
$product_variant = $post_data['variant'];
$attribute_detail_id = $post_data['attribute_detail_id'];
$qty = (int) $post_data['qty'];
$price = (float) $post_data['price'];
$sku = $post_data['sku'];
log_message('error', 'Add to Cart Data: ' . json_encode($post_data));
// Validasi input
if (!$product_id || !$product_detail_id || !$qty || !$price) {
return ['status' => 'error', 'message' => 'Invalid product data.'];
}
// Ambil detail produk dari database
$this->db->select('
pd.id AS product_detail_id,
p.id_products AS product_id,
p.title AS product_name,
pi.image AS product_image,
pd.price,
pd.discounted_price,
s.stock,
s.stock_keep,
s.stock_reject,
s.stock_sample,
(s.stock - s.stock_keep - s.stock_reject - s.stock_sample) AS stock_sell
');
$this->db->from('product_details pd');
$this->db->join('products p', 'p.id_products = pd.product_id', 'left');
$this->db->join('product_images pi', 'pd.id = pi.product_details_id', 'left');
$this->db->join('stock s', 'pd.id = s.id_product_detail', 'left');
$this->db->where('pd.id', $product_detail_id);
$this->db->where('p.product_status', 1);
$product = $this->db->get()->row();
// Periksa apakah produk ditemukan
if (!$product) {
return ['status' => 'error', 'message' => 'Produk yang dipilih tidak ditemukan.'];
}
// Periksa stok produk
if ($product->stock_sell < $qty) {
return ['status' => 'error', 'message' => 'Stok tidak tersedia. Kamu bisa pilih varian lain.'];
}
// Tandai jika ada produk dengan harga diskon di keranjang
if ($product->discounted_price > 0) {
$this->session->set_userdata('cart_has_discounted_items', 'yes');
}
$data_utm = $this->session->userdata('data_utm') ?: [];
if (isset($data_utm['utm_campaign']) && $data_utm['utm_campaign'] === 'thr-21-03-2025') {
$this->session->set_userdata('cart_has_discounted_items', 'yes');
}
// Ambil metode pengiriman yang tersedia
$shipment_method_ids = $this->db->select('shipment_method_id')
->get_where('shipment_method_product', ['product_id' => $product->product_id])
->result_array();
// Format ulang shipment method menjadi array numerik
$shipment_methods = array_column($shipment_method_ids, 'shipment_method_id');
// Data untuk dimasukkan ke dalam keranjang
$data = [
'product_id' => $product->product_id,
'id' => $product->product_detail_id,
'qty' => $qty,
'price' => $price,
'variant' => $product_variant,
'name' => ucwords($product->product_name),
'shipment_method_ids' => $shipment_methods,
'sku' => $sku,
'is_discounted' => (!is_null($product->discounted_price) && $product->discounted_price > 0),
'discounted_price' => $product->discounted_price,
'real_price' => $product->price,
'options' => [
'attribute_detail_ids' => $attribute_detail_id,
'image' => $product->product_image,
'stock' => $product->stock,
'stock_keep' => $product->stock_keep,
'stock_sell' => $product->stock_sell,
'stock_condition' => ($product->stock_sell > 0) ? 'In Stock' : 'Out of Stock',
],
];
// Simpan riwayat keranjang
$data_cart_history = [
'customer_id' => $id_customer,
'ip_address' => $this->input->ip_address(),
'url_current' => current_url(),
'url_referer' => $this->agent->referrer() ?? NULL,
'product_name' => ucwords($product->product_name),
'product_id' => $product_id,
'product_detail_id' => $product_detail_id,
'qty' => $qty,
'price' => $price,
'user_agent' => $this->agent->agent_string() ?? NULL
];
// Proses transaksi database
$this->db->trans_start();
$this->db->insert('cart_history', $data_cart_history);
// Tambahkan ke keranjang
$this->cart->product_name_rules = '[:print:]';
$cart_inserted = $this->cart->insert($data);
$latest_item = end($this->cart->contents());
// Commit transaksi jika sukses, rollback jika gagal
if ($cart_inserted && $this->db->trans_complete()) {
return [
'status' => 'success',
'message' => 'Product added to cart successfully.',
'cart_count' => count($this->cart->contents()),
'latest_item' => $latest_item,
];
} else {
$this->db->trans_rollback();
return ['status' => 'error', 'message' => 'Failed to add product to cart.'];
}
}
public function move_temp_cart_to_user_cart($customer_id)
{
$cart_items = $this->session->userdata('temp_cart') ?? [];
log_message('error', 'Temp Cart Data: ' . json_encode($cart_items));
if (empty($cart_items)) {
log_message('error', 'Temp Cart is empty. Skipping migration.');
return;
}
foreach ($cart_items as $item) {
log_message('error', 'Moving item to cart: ' . json_encode($item));
$this->add_to_cart($item, $customer_id);
}
// Hapus session `temp_cart` setelah dipindahkan ke cart user
$this->session->unset_userdata('temp_cart');
$this->session->set_userdata('redirect_to_cart', true);
}
public function get_product_data($post_data)
{
$product_id = (int) $post_data['product_id'];
$product_detail_id = (int) $post_data['product_detail_id'];
$product_variant = $post_data['product_variant'];
$attribute_detail_id = $post_data['attribute_detail_id'];
$qty = (int) $post_data['qty'];
$price = (float) $post_data['price'];
$sku = $post_data['sku'];
log_message('error', 'Add to Cart Datas: ' . json_encode($post_data));
if (!$product_id || !$product_detail_id || !$qty || !$price) {
return ['status' => 'error', 'message' => 'Invalid product data.'];
}
// Ambil detail produk
$this->db->select('
pd.id AS product_detail_id,
p.id_products AS product_id,
p.title AS product_name,
pi.image AS product_image,
pd.price,
pd.discounted_price,
s.stock,
s.stock_keep,
(s.stock - s.stock_keep) AS stock_sell
');
$this->db->from('product_details pd');
$this->db->join('products p', 'p.id_products = pd.product_id', 'left');
$this->db->join('product_images pi', 'pd.id = pi.product_details_id', 'left');
$this->db->join('stock s', 'pd.id = s.id_product_detail', 'left');
$this->db->where('pd.id', $product_detail_id);
$this->db->where('p.product_status', 1);
$product = $this->db->get()->row();
if (!$product) {
return ['status' => 'error', 'message' => 'Produk tidak ditemukan.'];
}
if ($product->stock_sell < $qty) {
return ['status' => 'error', 'message' => 'Stok tidak tersedia. Pilih varian lain.'];
}
return [
'status' => 'success',
'data' => [
'product_id' => $product->product_id,
'id' => $product->product_detail_id,
'qty' => $qty,
'price' => $price,
'variant' => $product_variant,
'name' => ucwords($product->product_name),
'sku' => $sku,
'is_discounted' => (!is_null($product->discounted_price) && $product->discounted_price > 0),
'options' => [
'attribute_detail_ids' => $attribute_detail_id,
'image' => $product->product_image,
'stock' => $product->stock,
'stock_keep' => $product->stock_keep,
'stock_condition' => ($product->stock_sell > 0) ? 'In Stock' : 'Out of Stock',
],
]
];
}
public function get_cart_history()
{
$this->db->select('
cart_history.customer_id,
cart_history.product_id,
cart_history.product_detail_id,
cart_history.product_name,
cart_history.created_at,
c.name AS customer_name,
c.email AS customer_email,
c.phone AS customer_phone
');
$this->db->from('cart_history');
$this->db->join('customers c', 'c.id_customers = cart_history.customer_id', 'left');
$this->db->order_by('cart_history.created_at', 'DESC');
return $this->db->get()->result();
}
}