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/Order_m.php
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');



class Order_m extends MY_Model

{



	protected $_table_name = 'orders';

	protected $_primary_key = 'id_orders';

	protected $_order_by = 'id_orders';



	public $add_order_rules = array(

		array(

			'field'   => 'customer_id',

			'label'   => 'Customer',

			'rules'   => 'trim|required'

		),

		array(

			'field'   => 'kurir_id',

			'label'   => 'Kurir',

			'rules'   => 'trim|required'

		),

	);





	function __construct()

	{

		parent::__construct();

		// Load model yang diperlukan

		$this->load->model('order_detail_m');

		$this->load->model('log_m');

		$this->load->model('customer_m');

		$this->load->model('configuration_m');

	}



	public function add_order($data)

	{

		$this->db->insert('orders', $data);

		return $this->db->insert_id();

	}



	//function count all record for orders

	public function record_count()

	{

		return $this->db->get('orders')->num_rows();

	}



	// Hitung order pending

	public function get_pending_order_count($is_retailer = false)

	{

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 0, 1, dan 3

		$this->db->where_in('orders.payment_status', [0, 1, 3]);



		// Tentukan filter reseller_id berdasarkan parameter

		$this->db->where('customers.reseller_id ' . ($is_retailer ? 'IS NOT NULL' : 'IS NULL'));

		$this->db->where('orders.customer_id !=', 2615);

		return $this->db->count_all_results();

	}



	// Hitung order dengan status proccess

	public function get_processing_order_count($is_retailer = false)

	{

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 4

		$this->db->where('orders.payment_status', 4);



		// Tentukan filter reseller_id berdasarkan parameter

		$this->db->where('customers.reseller_id ' . ($is_retailer ? 'IS NOT NULL' : 'IS NULL'));

		$this->db->where('orders.customer_id !=', 2615);

		return $this->db->count_all_results();

	}



	// lagi dikirim

	public function get_shipped_order_count($is_retailer = false)

	{

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 4

		$this->db->where('orders.payment_status', 4);

		$this->db->where('orders.no_resi IS NOT NULL', null, false);

		$this->db->where('orders.no_resi !=', '');



		// Tentukan filter reseller_id berdasarkan parameter

		$this->db->where('customers.reseller_id ' . ($is_retailer ? 'IS NOT NULL' : 'IS NULL'));

		$this->db->where('orders.customer_id !=', 2615);

		return $this->db->count_all_results();

	}



	// Hitung order dengan status terkirim

	public function get_delivered_order_count($is_retailer = false)

	{

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 5

		$this->db->where('orders.payment_status', 5);



		// Tentukan filter reseller_id berdasarkan parameter

		$this->db->where('customers.reseller_id ' . ($is_retailer ? 'IS NOT NULL' : 'IS NULL'));

		$this->db->where('orders.customer_id !=', 2615);

		return $this->db->count_all_results();

	}



	public function get_need_to_confirm_order_count()

	{

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 3 dan payment_confirm 1

		$this->db->where('orders.payment_status', 3);

		$this->db->where('orders.payment_confirm', 1);

		$this->db->where('orders.customer_id !=', 2615);



		return $this->db->count_all_results();

	}





	// Hitung order dengan status selesai

	public function get_finished_order_count($is_retailer = false)

	{

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 8

		$this->db->where('orders.payment_status', 8);



		// Tentukan filter reseller_id berdasarkan parameter

		$this->db->where('customers.reseller_id ' . ($is_retailer ? 'IS NOT NULL' : 'IS NULL'));



		return $this->db->count_all_results();

	}



	public function fetch_order_by_id($id_order)

	{

		// Validasi id_order

		$id_order = (int) $id_order;



		if (empty($id_order)) {

			return null;

		}



		// Build main query

		$this->db->select('o.id_orders, o.customer_id, o.order_date, o.payment_status, o.payment_confirm, o.payment_confirm_details, o.grand_total_amount, o.total_amount, o.payment_type, o.payment_date, o.cancel_date, o.recipient_name, o.address, o.district, o.subdistrict, o.province, o.postcode, o.phone, o.email, o.country, o.redeemed_voucher_code, o.redeemed_voucher_type, o.redeemed_voucher_value, o.redeemed_voucher_amount, o.shipping_fee, o.plus_reward, o.minus_reward, o.minus_reward_amount, o.no_resi, o.customer_note, o.admin_note, o.plus_reward_given, o.current_reward, o.sisa_reward, o.order_language, o.doku_approval_result, o.doku_status, o.doku_payment_channel, o.doku_session_id, o.first, o.gift_receiver_name, o.gift_receiver_phone, o.insurance_status, o.insurance_cost, o.referral, o.source, o.medium, o.campaign, o.tokopedia_invoice, o.updated_at, o.created_by, o.updated_by');

		$this->db->from('orders o');

		$this->db->where('o.id_orders', $id_order);



		// Execute query

		$query = $this->db->get();



		// Jika tidak ditemukan, return null

		if ($query->num_rows() == 0) {

			return null;

		}



		// Ambil data order

		$order = $query->row();

		$order->is_referral = false;

		$order->referred_by = '';



		// Check if referral exists in orders table

		if (!empty($order->referral)) {

			// Query to check if referral matches with any affiliator's referral code (case insensitive)

			$this->db->select('nama');

			$this->db->from('affiliator_register');

			$this->db->where('LOWER(referral) = LOWER("' . $order->referral . '")');

			$referral_query = $this->db->get();



			if ($referral_query->num_rows() > 0) {

				$affiliator = $referral_query->row();

				$order->is_referral = true;

				$order->referred_by = $affiliator->nama;

			}

		}



		// If not found by referral, check redeemed_voucher_code

		if (!$order->is_referral && !empty($order->redeemed_voucher_code)) {

			$this->db->select('nama');

			$this->db->from('affiliator_register');

			$this->db->where('LOWER(referral) = LOWER("' . $order->redeemed_voucher_code . '")');

			$voucher_referral_query = $this->db->get();



			if ($voucher_referral_query->num_rows() > 0) {

				$affiliator = $voucher_referral_query->row();

				$order->is_referral = true;

				$order->referred_by = $affiliator->nama;

			}

		}



		// Get customer information if available

		if ($order->customer_id) {

			$this->db->select('c.id_customers, c.name as customer_name, c.email as customer_email, c.recipient_name, c.shipping_name, c.shipping_address, c.shipping_province, c.shipping_district, c.shipping_subdistrict, c.shipping_country, c.shipping_postcode, c.shipping_phone, c.current_pointreward as customer_points, c.reseller_id, c.is_first, c.refferal, c.source');

			$this->db->from('customers c');

			$this->db->where('c.id_customers', $order->customer_id);

			$customer_query = $this->db->get();



			if ($customer_query->num_rows() > 0) {

				$order->customer_detail = $customer_query->row();

			}

		}



		// Get order details (products ordered)

		$this->db->select('

			od.id_orders_detail,

			od.item_id, 

			od.product_id, 

			od.item_name, 

			od.item_price, 

			od.quantity, 

			od.subtotal, 

			od.sku, 

			od.attributes, 

			od.chosen_shipping_id,

			sm.name as shipping_method_name,

			pi.image as product_image

		');

		$this->db->from('orders_detail od');

		$this->db->join('shipment_method sm', 'od.chosen_shipping_id = sm.id', 'left');

		$this->db->join('product_images pi', 'od.item_id = pi.product_details_id AND pi.priority = 1 AND pi.status = 1', 'left');

		$this->db->where('od.orders_id', $order->id_orders);

		$details_query = $this->db->get();

		$order->items = $details_query->result();



		// Calculate total items

		$order->total_items = 0;

		foreach ($order->items as $item) {

			$order->total_items += $item->quantity;

		}



		// Format some data

		$order->order_date_formatted = date('d M Y H:i', strtotime($order->order_date));



		// Get shipping history if exists

		$this->db->select('*');

		$this->db->from('shipping');

		$this->db->where('order_id', $order->id_orders);

		$shipping_query = $this->db->get();

		$order->shipping_history = $shipping_query->result();



		// Set payment status text

		switch ($order->payment_status) {

			case 0:

				$order->payment_status_text = 'Pending';

				$order->payment_status_class = 'bg-yellow-100 text-yellow-700 px-2 py-1 rounded';

				break;

			case 1:

				$order->payment_status_text = 'Menunggu Pembayaran';

				$order->payment_status_class = 'bg-orange-100 text-orange-700 px-2 py-1 rounded';

				break;

			case 2:

				$order->payment_status_text = 'Dibatalin';

				$order->payment_status_class = 'bg-red-100 text-red-700 px-2 py-1 rounded';

				break;

			case 3:

				$order->payment_status_text = 'Sudah Dibayar';

				$order->payment_status_class = 'bg-green-100 text-green-700 px-2 py-1 rounded';

				break;

			case 4:

				$order->payment_status_text = 'Diproses';

				$order->payment_status_class = 'bg-blue-100 text-blue-700 px-2 py-1 rounded';

				break;

			case 5:

				$order->payment_status_text = 'Selesai';

				$order->payment_status_class = 'bg-gray-100 text-gray-700 px-2 py-1 rounded';

				break;

			case 8:

				$order->payment_status_text = 'Selesai (Retailer)';

				$order->payment_status_class = 'bg-purple-100 text-purple-700 px-2 py-1 rounded';

				break;

			default:

				$order->payment_status_text = 'Unknown';

				$order->payment_status_class = 'bg-gray-300 text-gray-800 px-2 py-1 rounded';

		}



		// Calculate total before discount

		$total_before_discount = 0;

		foreach ($order->items as $item) {

			$total_before_discount += $item->subtotal;

		}

		$order->total_before_discount = $total_before_discount;



		// Calculate discount amount

		$order->discount_amount = 0;

		if (!empty($order->redeemed_voucher_code)) {

			$order->discount_amount = $order->redeemed_voucher_amount;

		}



		return $order;

	}



	public function cancel_expired_orders()

	{

		// Cari order yang belum dibayar (payment_confirm = 0) 

		$start = '2025-07-01 00:00:00';

		$end = '2025-07-31 23:59:59';

		$deadline = date('Y-m-d H:i:s', strtotime('-24 hours'));



		$this->db->select('orders.id_orders, orders.customer_id, orders.total_amount, orders.referral, orders.redeemed_voucher_code, orders.order_language');

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers');

		$this->db->where('orders.payment_confirm', 0);

		$this->db->where_in('orders.payment_status', [0, 1]);

		$this->db->where('orders.order_date >=', $start);

		$this->db->where('orders.order_date <=', $end);

		$this->db->where('orders.order_date <', $deadline);

		$this->db->group_start();

		$this->db->where('customers.reseller_id IS NULL', null, false);

		$this->db->or_where('customers.reseller_id', '');

		$this->db->or_where('customers.id_customers', 2615);

		$this->db->group_end();



		$expired_orders = $this->db->get()->result();

		$updated_count = 0;



		foreach ($expired_orders as $order) {

			// Mulai transaksi untuk setiap order

			$this->db->trans_begin();



			try {

				// Set data untuk update status order

				$orders_data = [

					'payment_status' => 2, // Set sebagai cancel

					'payment_status_message' => 'Auto cancelled due to no payment within 24 hours',

					'cancel_date' => date('Y-m-d'),

					'updated_at' => date('Y-m-d H:i:s'),

					'updated_by' => 'System'

				];



				// Update status order

				$this->db->where('id_orders', $order->id_orders);

				$this->db->update('orders', $orders_data);



				// Handle pengurangan komisi

				$this->handleCancelCommission($order->id_orders, $order);



				// Return stock ke inventory

				$this->returnStockToInventory($order->id_orders, $order->customer_id);



				// Return customer point reward

				$this->returnCustomerPointReward($order->id_orders, $order->customer_id);



				// Kirim email notifikasi pembatalan

				$this->sendCancelNotification($order->id_orders);



				// Commit transaksi jika semua berhasil

				$this->db->trans_commit();

				$updated_count++;



				// Log untuk debugging

				log_message('info', "Order ID {$order->id_orders} berhasil dibatalkan secara otomatis setelah 24 jam tidak dibayar.");

			} catch (Exception $e) {

				// Rollback transaksi jika terjadi error

				$this->db->trans_rollback();

				log_message('error', "Gagal membatalkan Order ID {$order->id_orders}: " . $e->getMessage());

			}

		}



		return $updated_count;

	}



	/**

	 * Menangani pengurangan komisi saat pesanan dibatalkan

	 */

	public function handleCancelCommission($order_id, $order_data)

	{

		log_message('debug', "handleCancelCommission: Memproses Order ID: {$order_id}");



		$referral_code = !empty($order_data->referral) ? $order_data->referral : $order_data->redeemed_voucher_code;

		log_message('debug', "Referral Code: " . ($referral_code ?: 'Tidak Ada'));



		if (empty($referral_code)) {

			log_message('debug', "handleCancelCommission: Tidak ada referral code, proses dihentikan.");

			return;

		}



		// Ambil kategori affiliator berdasarkan kode

		$this->db->select('kategori, id_customer');

		$this->db->from('affiliator_register');

		$this->db->where('referral', $referral_code);

		$affiliator = $this->db->get()->row();



		if (!$affiliator) {

			log_message('debug', "handleCancelCommission: Affiliator tidak ditemukan.");

			return;

		}



		log_message('debug', "Affiliator ditemukan: {$affiliator->id_customer} - Kategori: {$affiliator->kategori}");



		// Hitung pengurangan komisi

		$deduction = 0;

		if ($affiliator->kategori == 'asmaradoor') {

			$deduction = 0.10 * $order_data->total_amount;

		} elseif ($affiliator->kategori == 'asmarasana') {

			$deduction = 0.20 * $order_data->total_amount;

		}



		log_message('debug', "Pengurangan Komisi: {$deduction}");



		if ($deduction > 0) {

			$this->db->set('komisi_order', "komisi_order - $deduction", FALSE);

			$this->db->where('customer_id', $affiliator->id_customer);

			$this->db->update('affiliator_link');

			log_message('debug', "Komisi di affiliator_link diperbarui.");



			$this->db->set('komisi', "komisi - $deduction", FALSE);

			$this->db->where('id_customer', $affiliator->id_customer);

			$this->db->update('affiliator_register');

			log_message('debug', "Komisi di affiliator_register diperbarui.");

		}

	}



	/**

	 * Mengembalikan stok ke inventory saat pesanan dibatalkan

	 */

	public function returnStockToInventory($order_id, $customer_id)

	{

		log_message('debug', "returnStockToInventory: Memproses Order ID: {$order_id}");



		$order_details = $this->order_detail_m->get_orders_detail($order_id);

		log_message('debug', "Total Item: " . count($order_details));



		$user_name = $this->session->userdata('name') ?? 'System';



		foreach ($order_details as $item) {

			log_message('debug', "Mengembalikan stok untuk produk ID: {$item->product_id} - Item ID: {$item->item_id}");



			$this->db->select('stock, id')

				->from('stock')

				->where('id_product', $item->product_id)

				->where('id_product_detail', $item->item_id)

				->where('warehouse_id', $item->warehouse_id);

			$current_stock = $this->db->get()->row();



			if (!$current_stock) {

				log_message('error', "Stock data tidak ditemukan untuk Produk ID: {$item->product_id}");

				continue;

			}



			$qty = ($item->is_backorder == 'yes') ? 0 : $item->quantity;



			if ($qty > 0) {

				$old_stock = $current_stock->stock;

				$new_stock = $old_stock + $qty;



				log_message('debug', "Stok Sebelumnya: {$old_stock}, Stok Baru: {$new_stock}");



				$this->db->where('id_product', $item->product_id);

				$this->db->where('id_product_detail', $item->item_id);

				$this->db->where('warehouse_id', $item->warehouse_id);

				$this->db->update('stock', ['stock' => $new_stock]);



				log_message('debug', "Stock diperbarui di database.");



				$this->db->insert('stock_movement', [

					'stock_id' => $current_stock->id,

					'type' => '+',

					'stock_change' => (int)$qty,

					'remark' => "Pembatalan Pesanan dengan Order ID: {$order_id} - Mengembalikan {$qty} unit ke stok.",

					'total' => $new_stock,

					'name' => $user_name

				]);



				log_message('debug', "Stock movement dicatat.");

				$referenceUrl = base_url('admin/orders/detail/' . $order_id);

				$this->log_m->log_stock_update(

					$order_id,

					$item->item_id,

					$item->item_name,

					$old_stock,

					$new_stock,

					$referenceUrl,

					null,

					'stock',

					'orders'

				);



				log_message('debug', "Stock update log dicatat.");

			}

		}

	}



	/**

	 * Mengembalikan point reward customer saat pesanan dibatalkan

	 */

	public function returnCustomerPointReward($order_id, $customer_id)

	{

		log_message('debug', "returnCustomerPointReward: Mengembalikan poin untuk Order ID: {$order_id}, Customer ID: {$customer_id}");



		$this->db->select('current_pointreward')->from('customers')->where('id_customers', $customer_id);

		$current_point = (int)$this->db->get()->row()->current_pointreward;



		log_message('debug', "Poin saat ini: {$current_point}");



		$this->db->select('current_reward, sisa_reward, minus_reward')->from('orders')->where('id_orders', $order_id);

		$rewards = $this->db->get()->row();



		if (!$rewards) {

			log_message('error', "Data reward tidak ditemukan untuk Order ID: {$order_id}");

			return;

		}



		$minus_point = (int) $rewards->minus_reward;

		$current_reward = (int) $rewards->current_reward;

		$sisa_reward = (int) $rewards->sisa_reward;



		log_message('debug', "Data Reward - Current: {$current_reward}, Sisa: {$sisa_reward}, Minus: {$minus_point}");



		if (($sisa_reward + $minus_point) == $current_reward) {

			$updated_point = $current_point + $minus_point;



			log_message('debug', "Poin yang akan ditambahkan: {$minus_point}, Poin Baru: {$updated_point}");



			$this->db->where('id_customers', $customer_id);

			$this->db->update('customers', ['current_pointreward' => $updated_point]);



			log_message('debug', "Poin customer diperbarui di database.");

		} else {

			log_message('error', "Validasi perhitungan reward gagal untuk Order ID: {$order_id}");

		}

	}



	public function sendCancelNotification($order_id)

	{

		log_message('debug', "sendCancelNotification: Memproses Order ID: {$order_id}");



		// Get order data

		$order = $this->get_order($order_id);

		$customer = $this->customer_m->get_customer($order->customer_id);



		// Get website configuration

		$this->db->select('logo, from_email, website_name')->from('configuration')->where('id_configuration', 1);

		$website_data = $this->db->get()->row();



		$email_data = [

			'order' => $order,

			'customer' => $customer,

			'logo' => $website_data->logo,

			'website_name' => $website_data->website_name,

			'emails' => $this->configuration_m->get_emails(),

			'email' => $customer->email,

			'minus_point' => $order->minus_reward,

			'title' => 'Order Cancel'

		];



		// Tentukan template email berdasarkan bahasa

		if ($order->order_language == 'english') {

			$email_data['subject'] = 'Your Order Has Been Automatically Cancelled';

			$view_file = 'email/english/order_cancel';

		} else {

			$email_data['subject'] = 'Pesanan Anda Otomatis Dibatalkan';

			$view_file = 'email/indonesian/order_cancel';

		}



		// Catat log perubahan status

		$description_notes = "Status Pesanan {$order_id} otomatis diubah menjadi 'Batal' oleh sistem setelah 24 jam tidak ada pembayaran.";

		$this->log_m->log_order_update(

			$order_id,

			$description_notes,

			'payment_status',

			$order->payment_status,  // Status lama

			'2'                       // Status baru (batal)

		);



		// Kirim email menggunakan metode dari MY_Controller

		$this->send_email($view_file, $email_data);

	}



	// public function get_order($order_id)

	// {

	// 	return $this->db->get_where('orders', ['id_orders' => $order_id])->row();

	// }



	/**

	 * Fungsi send_email yang diambil dari MY_Controller

	 */

	private function send_email($view_file, $email_data, $e_msg = false)

	{

		// Get website data

		$website_data = $this->db

			->select(

				'logo, from_email, website_name, email_smtp_host, email_smtp_port, email_smtp_password, email_smtp'

			)

			->from('configuration')

			->where('id_configuration', 1)

			->get()

			->row();

		$email_data['website_name'] = $website_data->website_name;

		$email_data['logo'] = $website_data->logo;



		$this->load->library('email');

		$config['protocol'] = 'smtp';

		$config['smtp_host'] = $website_data->email_smtp_host;

		$config['smtp_port'] = $website_data->email_smtp_port;

		$config['smtp_user'] = $website_data->email_smtp;

		$config['smtp_pass'] = $website_data->email_smtp_password;

		$config['mailtype'] = 'html';

		$config['smtp_crypto'] = 'ssl';

		$config['charset'] = 'iso-8859-1';

		$config['wordwrap'] = true;

		$config['newline'] = "\r\n";

		$this->email->set_crlf("\r\n");

		$this->email->initialize($config);

		$this->email->from($website_data->from_email, $website_data->website_name);

		$this->email->to($email_data['email']);

		$this->email->subject($email_data['subject']);



		if ($e_msg === false) {

			$email = $this->load->view($view_file, $email_data, true);

			$this->email->message($email);

		} else {

			$this->email->message($view_file);

		}



		$success = $this->email->send();



		if (!$success) {

			log_message('error', "Gagal mengirim email untuk Order ID: {$email_data['order']->id_orders} - " . $this->email->print_debugger(array('headers')));

		} else {

			log_message('info', "Email notifikasi pembatalan otomatis berhasil dikirim untuk Order ID: {$email_data['order']->id_orders}");

		}



		return $success;

	}



	public function record_count_incoming()

	{

		// Join dengan tabel customers untuk memeriksa reseller_id

		$this->db->select('orders.id_orders');

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 0 dan 1

		$this->db->where_in('orders.payment_status', array(0, 1, 3));



		// Filter untuk reseller_id yang null

		$this->db->where('customers.reseller_id IS NULL');



		return $this->db->count_all_results();

	}



	public function record_count_incoming_retailer()

	{

		// Join dengan tabel customers untuk memeriksa reseller_id

		$this->db->select('orders.id_orders');

		$this->db->from('orders');

		$this->db->join('customers', 'orders.customer_id = customers.id_customers', 'left');



		// Filter berdasarkan payment_status 0 dan 1

		$this->db->where_in('orders.payment_status', array(0, 1, 3));



		// Filter untuk reseller_id yang null

		$this->db->where('customers.reseller_id IS NOT NULL');



		return $this->db->count_all_results();

	}



	//pagination included

	function get_all_orders($limit, $start)

	{

		$this->db->select('*');

		$this->db->from('orders');

		// $this->db->join('customers', 'customers.id_customers = orders.customer_id');

		$this->db->order_by('id_orders', 'desc');

		$this->db->limit($limit, $start);

		$query = $this->db->get();

		return $query->result();

	}



	function get_all_orders_retailer($limit, $start)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('customers', 'customers.id_customers = orders.customer_id');

		$this->db->where('customers.reseller_id IS NOT NULL');

		$this->db->order_by('id_orders', 'desc');

		$this->db->limit($limit, $start);

		$query = $this->db->get();

		return $query->result();

	}



	function warestats($wareid)

	{

		$this->db->select('warehouse_id')->from('orders_detail')->where('orders_id', $wareid);

		$warehouse_ids = $this->db->get()->result();



		$warehouse_id_array = array();



		foreach ($warehouse_ids as $warehouse_id) {

			if (!in_array($warehouse_id->warehouse_id, $warehouse_id_array)) {

				$warehouse_id_array[] = $warehouse_id->warehouse_id;

			}

		}



		if (count($warehouse_id_array) > 1) {

			return 'Iya';

		} else {

			return 'Tidak';

		}

	}



	function filterdata($search, $filterkey, $dataenter, $iduser, $length, $start)

	{

		$this->db->select('warehouse_id,role')->from('users')->where('id', $iduser);

		$user = $this->db->get()->row();



		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('customers', 'customers.id_customers = orders.customer_id');



		if (!empty($search)) {

			$this->db->like("orders.id_orders", $search);

		}



		if ($user->role == 'apoteker') {

			$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			$this->db->where('orders_detail.warehouse_id', $user->warehouse_id);

			$this->db->group_by('orders.id_orders');

		}

		$this->db->where('customers.reseller_id IS NULL');



		if ($filterkey == 'voucher') {

			if ($dataenter == '1') {

				$this->db->where('redeemed_voucher_code !=', null);

			} else {

				$this->db->where('redeemed_voucher_code', null);

			}

		} else if ($filterkey == 'flashsale') {

			if ($user->role != 'apoteker') {

				$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			}

			$this->db->where('orders_detail.is_flashsale', $dataenter);

		} else if ($filterkey == 'sale') {

			if ($user->role != 'apoteker') {

				$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			}

			$this->db->where('orders_detail.is_sale', $dataenter);

		} else if ($filterkey == 'date') {

			$ex = explode('_', $dataenter);

			$this->db->where('orders.order_date >=', $ex[0]);

			$this->db->where('orders.order_date <=', $ex[1]);

		} else if ($filterkey == 'totalorder') {

			$ex = explode('_', $dataenter);

			$this->db->where('((orders.total_amount+IFNULL(ABS(orders.sisa_kembali),0))-IFNULL(orders.redeemed_voucher_value,0))+(IFNULL(orders.shipping_fee,0)-IFNULL(orders.free_shipping_fee,0)) >=', $ex[0]);

			$this->db->where('((orders.total_amount+IFNULL(ABS(orders.sisa_kembali),0))-IFNULL(orders.redeemed_voucher_value,0))+(IFNULL(orders.shipping_fee,0)-IFNULL(orders.free_shipping_fee,0)) <=', $ex[1]);

		} else if ($filterkey == 'product') {

			if ($user->role != 'apoteker') {

				$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			}

			$this->db->where('orders_detail.product_id', $dataenter);

			$this->db->where('orders_detail.product_id', $dataenter);

		} else if ($filterkey == 'sync') {

			$this->db->where('orders.status_jurnalid', 'sync');

		} else if ($filterkey == 'open') {

			$this->db->where('orders.status_jurnalid', 'open');

			$this->db->where('orders.payment_status', '5');

		} else {

			if (!empty($filterkey)) {

				$this->db->like($filterkey, $dataenter);

			}

		}



		if ($length != '' and $start != '') {

			$this->db->limit($length, $start);

		}





		$this->db->order_by('orders.id_orders', 'desc');

		return $this->db->get();

	}



	function filterdataretailer($search, $filterkey, $dataenter, $iduser, $length, $start)

	{

		$this->db->select('warehouse_id,role')->from('users')->where('id', $iduser);

		$user = $this->db->get()->row();



		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('customers', 'customers.id_customers = orders.customer_id');

		if (!empty($search)) {

			$this->db->like("orders.id_orders", $search);

		}



		if ($user->role == 'apoteker') {

			$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			$this->db->where('orders_detail.warehouse_id', $user->warehouse_id);

			$this->db->group_by('orders.id_orders');

		}

		$this->db->where('customers.reseller_id IS NOT NULL');

		if ($filterkey == 'voucher') {

			if ($dataenter == '1') {

				$this->db->where('redeemed_voucher_code !=', null);

			} else {

				$this->db->where('redeemed_voucher_code', null);

			}

		} else if ($filterkey == 'flashsale') {

			if ($user->role != 'apoteker') {

				$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			}

			$this->db->where('orders_detail.is_flashsale', $dataenter);

		} else if ($filterkey == 'sale') {

			if ($user->role != 'apoteker') {

				$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			}

			$this->db->where('orders_detail.is_sale', $dataenter);

		} else if ($filterkey == 'date') {

			$ex = explode('_', $dataenter);

			$this->db->where('orders.order_date >=', $ex[0]);

			$this->db->where('orders.order_date <=', $ex[1]);

		} else if ($filterkey == 'totalorder') {

			$ex = explode('_', $dataenter);

			$this->db->where('((orders.total_amount+IFNULL(ABS(orders.sisa_kembali),0))-IFNULL(orders.redeemed_voucher_value,0))+(IFNULL(orders.shipping_fee,0)-IFNULL(orders.free_shipping_fee,0)) >=', $ex[0]);

			$this->db->where('((orders.total_amount+IFNULL(ABS(orders.sisa_kembali),0))-IFNULL(orders.redeemed_voucher_value,0))+(IFNULL(orders.shipping_fee,0)-IFNULL(orders.free_shipping_fee,0)) <=', $ex[1]);

		} else if ($filterkey == 'product') {

			if ($user->role != 'apoteker') {

				$this->db->join('orders_detail', 'orders_detail.orders_id = orders.id_orders');

			}

			$this->db->where('orders_detail.item_id', $dataenter);

			$this->db->where('orders_detail.item_id', $dataenter);

		} else if ($filterkey == 'sync') {

			$this->db->where('orders.status_jurnalid', 'sync');

		} else if ($filterkey == 'open') {

			$this->db->where('orders.status_jurnalid', 'open');

			$this->db->where('orders.payment_status', '5');

		} else {

			if (!empty($filterkey)) {

				$this->db->like($filterkey, $dataenter);

			}

		}



		if ($length != '' and $start != '') {

			$this->db->limit($length, $start);

		}



		$this->db->order_by('orders.id_orders', 'desc');

		return $this->db->get();

	}



	function filterexcel($filterkey, $dataenter, $iduser)

	{

		$this->db->select('warehouse_id,role')->from('users')->where('id', $iduser);

		$user = $this->db->get()->row();



		$this->db->select('*');

		$this->db->from('orders_detail');



		if ($user->role == 'apoteker') {

			$this->db->join('orders', 'orders_detail.orders_id = orders.id_orders');

			$this->db->where('orders_detail.warehouse_id', $user->warehouse_id);

			$this->db->group_by('orders.id_orders');

		} else {

			$this->db->join('orders', 'orders_detail.orders_id = orders.id_orders');

		}



		if ($filterkey != '') {

			if ($filterkey == 'voucher') {

				if ($dataenter == '1') {

					$this->db->where('orders.redeemed_voucher_code !=', null);

				} else {

					$this->db->where('orders.redeemed_voucher_code', null);

				}

			} else if ($filterkey == 'flashsale') {

				$this->db->where('orders_detail.is_flashsale', $dataenter);

			} else if ($filterkey == 'sale') {

				$this->db->where('orders_detail.is_sale', $dataenter);

			} else if ($filterkey == 'date') {

				$ex = explode('_', $dataenter);

				$this->db->where('orders.order_date >=', $ex[0]);

				$this->db->where('orders.order_date <=', $ex[1]);

			} else if ($filterkey == 'totalorder') {

				$ex = explode('_', $dataenter);

				$this->db->where('((orders.total_amount+IFNULL(ABS(orders.sisa_kembali),0))-IFNULL(orders.redeemed_voucher_value,0))+(IFNULL(orders.shipping_fee,0)-IFNULL(orders.free_shipping_fee,0)) >=', $ex[0]);

				$this->db->where('((orders.total_amount+IFNULL(ABS(orders.sisa_kembali),0))-IFNULL(orders.redeemed_voucher_value,0))+(IFNULL(orders.shipping_fee,0)-IFNULL(orders.free_shipping_fee,0)) <=', $ex[1]);

			} else if ($filterkey == 'product') {

				$this->db->where('orders_detail.item_id', $dataenter);

			} else {

				if (!empty($filterkey)) {

					$this->db->like($filterkey, $dataenter);

				}

			}

		}



		$this->db->order_by('orders_detail.orders_id', 'desc');

		return $this->db->get()->result();

	}



	function paystats($statspay)

	{

		switch ($statspay) {

			case 0:

				return '<span style="color:black; font-weight:bold;">Pending</span>';

				break;

			case 1:

				return '<span style="color:brown; font-weight:bold;">Belum bayar</span>';

				break;

			case 2:

				return '<span style="color:red; font-weight:bold;">Batal</span>';

				break;

			case 3:

				return '<span style="color:green; font-weight:bold;">Sudah bayar</span>';

				break;

			case 4:

				return '<span style="color:blue; font-weight:bold;">Proses</span>';

				break;

			case 5:

				return '<span style="color:blue; font-weight:bold;">Terkirim</span>';

				break;

			case 8:

				return '<span style="color:blue; font-weight:bold;">Selesai</span>';

				break;

			case 9:

				return '<span style="color:red; font-weight:bold;">Komplain</span>';

				break;

			case 6:

				return '<span style="color:brown; font-weight:bold;">Dibayar sebagian (indent)</span>';

				break;

		}

	}



	function paymettype($paytype, $payconf, $paystatsmsg)

	{

		if ($paytype == 'bank transfer BCA') {

			if ($payconf == 1) {

				return 'Konfirmasi bayar: Sudah';

			} else {

				return 'Konfirmasi bayar: Belum';

			}

		} elseif ($paytype == 'bank transfer MANDIRI') {

			if ($payconf == 1) {

				return 'Konfirmasi bayar: Sudah';

			} else {

				return 'Konfirmasi bayar: Belum';

			}

		} elseif ($paytype == 'midtrans') {

			return $paystatsmsg;

		}

	}



	public function updateongkir($id, $data)

	{

		$this->db->where('id_orders', $id);

		$this->db->update('orders', $data);

	}





	//pagination included lol

	function report_get_all_orders()

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('customers', 'customers.id_customers = orders.customer_id');

		$this->db->group_start();

		$this->db->where('payment_status', 3);

		$this->db->or_where('payment_status', 4);

		$this->db->or_where('payment_status', 5);

		$this->db->group_end();

		$this->db->order_by('id_orders', 'desc');

		// $this->db->limit($limit, $start);

		$query = $this->db->get();

		return $query->result();

	}



	function sales_report($mulai, $getData, $title, $startDate, $endDate)

	{

		$page = isset($getData) ? (int)$getData : 1;

		$halaman = ($page > 1) ? ($page * $mulai) - $mulai : 0;



		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('orders_detail', 'orders.id_orders = orders_detail.orders_id AND orders_detail.status = 2');

		if (!empty($title)) {

			$this->db->like('item_name', $title);

		}



		if (!empty($startDate) && !empty($endDate)) {

			$this->db->where("orders.order_date >=", $startDate);

			$this->db->where('orders.order_date <=', $endDate);

		} else {

			if (!empty($startDate)) {

				$this->db->where("orders.order_date >=", $startDate);

			} else if (!empty($endDate)) {

				$this->db->where('orders.order_date <=', $endDate);

			}

		}

		$this->db->where('orders.customer_id <>', '6292');

		$this->db->group_by('orders_detail.item_id,orders_detail.item_price');

		$this->db->order_by('orders_detail.item_name', 'desc');

		$this->db->limit($mulai, $halaman);

		$query = $this->db->get();

		return $query->result();

	}



	function getallqty($prodid, $title, $startDate, $endDate, $price)

	{

		$this->db->select('sum(orders_detail.quantity) as qty');

		//$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('orders_detail', 'orders.id_orders = orders_detail.orders_id AND orders_detail.status = 2');

		if (!empty($title)) {

			$this->db->like('item_name', $title);

		}



		if (!empty($startDate) && !empty($endDate)) {

			$this->db->where("orders.order_date >=", $startDate);

			$this->db->where('orders.order_date <=', $endDate);

		} else {

			if (!empty($startDate)) {

				$this->db->where("orders.order_date >=", $startDate);

			} else if (!empty($endDate)) {

				$this->db->where('orders.order_date <=', $endDate);

			}

		}

		if (!empty($price)) {

			$this->db->where("orders_detail.item_price", $price);

		}

		$this->db->where('orders.customer_id <>', '6292');

		$this->db->where("orders_detail.item_id", $prodid);

		$query = $this->db->get();

		return $query->row();

	}



	function sales_report_all($title, $startDate, $endDate)

	{

		$this->db->select('*');

		$this->db->from('orders_detail');

		$this->db->where('orders_detail.status', 2);

		if (!empty($title)) {

			$this->db->like('item_name', $title);

		}



		if (!empty($startDate) && !empty($endDate)) {

			$this->db->join('orders', 'orders.id_orders = orders_detail.orders_id');

			$this->db->where("orders.order_date >=", $startDate);

			$this->db->where('orders.order_date <=', $endDate);

		} else {

			$this->db->join('orders', 'orders.id_orders = orders_detail.orders_id');

			if (!empty($startDate)) {

				$this->db->where("orders.order_date >=", $startDate);

			} else if (!empty($endDate)) {

				$this->db->where('orders.order_date <=', $endDate);

			}

		}

		$query = $this->db->get();

		return $query->result();

	}



	function tpage_salesreport($title, $startDate, $endDate)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('orders_detail', 'orders.id_orders = orders_detail.orders_id AND orders_detail.status = 2');

		if (!empty($title)) {

			$this->db->like('item_name', $title);

		}



		if (!empty($startDate) && !empty($endDate)) {

			$this->db->where("orders.order_date >=", $startDate);

			$this->db->where('orders.order_date <=', $endDate);

		} else {

			if (!empty($startDate)) {

				$this->db->where("orders.order_date >=", $startDate);

			} else if (!empty($endDate)) {

				$this->db->where('orders.order_date <=', $endDate);

			}

		}

		$this->db->where('orders.customer_id <>', '6292');

		$this->db->group_by('orders_detail.item_id');

		//$this->db->group_by('orders_detail.item_id,orders_detail.item_price');

		$this->db->order_by('orders_detail.item_name', 'desc');

		$query = $this->db->get();

		return $query->result();

	}



	function excel_export()

	{

		$this->db->select('

			orders_id,

			item_name,

			item_price,

			quantity,

			subtotal,

			warehouse_id,

			chosen_shipping_id,

			shipping_fee,

			is_backorder,

			status,

			no_resi

		');

		$this->db->from('orders_detail');

		$this->db->order_by('orders_id', 'desc');

		$query = $this->db->get();

		return $query->result();

	}



	//get specific order with its customer details 

	function get_order($id)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->where('id_orders', $id);

		$query = $this->db->get();

		return $query->row();

	}



	//update credit card payment status

	function update_payment_status($id, $data)

	{

		$this->db->where('id_orders', $id);

		$this->db->update('orders', $data);

	}



	function get_order_history($id_customer)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->where('customer_id', $id_customer);

		$this->db->order_by('id_orders', 'DESC');

		$query = $this->db->get();

		return $query->result();

	}



	//function count record based on chosen date range

	function record_count_search_date($date_start, $date_end)

	{



		$this->db->select('*');

		$this->db->from('orders');

		$this->db->group_start();

		$this->db->where('payment_status', 3);

		$this->db->or_where('payment_status', 4);

		$this->db->or_where('payment_status', 5);

		$this->db->group_end();



		$this->db->where('order_date >=', $date_start);

		$this->db->where('order_date <=', $date_end);

		$query = $this->db->get();

		return $query->num_rows();

	}



	//function find store by filtering between 2 dates lol

	function find_order_by_date($date_start, $date_end, $payment)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->group_start();

		$this->db->where('payment_status', 3);

		$this->db->or_where('payment_status', 4);

		$this->db->or_where('payment_status', 5);



		$this->db->group_end();



		$this->db->where('order_date >=', $date_start);

		$this->db->where('order_date <=', $date_end);

		if ($payment != 'all') $this->db->where('payment_type', $payment);

		$this->db->order_by('order_date', 'DESC');

		// $this->db->limit($limit, $start);

		$query = $this->db->get();

		return $query->result();

	}



	function get_notification_order($warehouse_id)

	{

		$ordernotif = 0;

		$data = array(3, 1, 4); //Paid, Unpaid, Process



		if ($warehouse_id == 0) {

			$this->db->select('*');

			$this->db->from('orders');

			$this->db->where_in('payment_status', $data);

			$ordernotif = $this->db->get()->num_rows();

		} else {

			$this->db->select('distinct id_orders', false);

			$this->db->from('orders');

			$this->db->join('orders_detail', 'orders.id_orders = orders_detail.orders_id');

			$this->db->where_in('payment_status', $data);

			$this->db->where('warehouse_id', $warehouse_id);

			$ordernotif = $this->db->get()->num_rows();

		}



		return $ordernotif;

	}



	function get_customer_by_order($order_id)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->where('id_orders', $order_id);



		$id_customer = $this->db->get()->row()->customer_id;

		return $id_customer;

	}



	//pagination included

	function report_get_all_orders_count()

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->join('customers', 'customers.id_customers = orders.customer_id');

		$this->db->group_start();

		$this->db->where('payment_status', 3);

		$this->db->or_where('payment_status', 4);

		$this->db->or_where('payment_status', 5);

		$this->db->group_end();

		$this->db->order_by('id_orders', 'desc');

		$query = $this->db->get();

		return $query->num_rows();

	}



	function cek_order($id, $paymentstatus)

	{

		$this->db->select('*');

		$this->db->from('orders');

		$this->db->where('id_orders', $id);



		$currpayment = $this->db->get()->row()->payment_status;

		//return $currpayment." - ".$paymentstatus;



		if ($paymentstatus == 2) {

			return true;

		} else if ($paymentstatus > $currpayment) {

			return true;

		} else {

			return false;

		}

	}



	function cek_orderdetail($id, $status)

	{

		$this->db->select('*');

		$this->db->from('orders_detail');

		$this->db->where('id_orders_detail', $id);



		$currpayment = $this->db->get()->row()->status;

		//return $currpayment." - ".$paymentstatus;



		if ($status == $currpayment) {

			return true;

		} else {

			return false;

		}

	}



	function cek_stok($idproduct, $qty, $warehouse)

	{

		$wh_type = $this->db->select("*")->from("warehouse")->where('id', $warehouse)->get()->row()->warehouse_type;

		$count = $this->db->select("*")->from("stock")->where("warehouse_id", $warehouse)->where("id_product", $idproduct)->get()->num_rows();



		if ($count > 0) {

			if ($wh_type == "virtual") {

				$current_stock = (int) $this->db->select("IFNULL(stock_virtual,0) stock_virtual")->from("stock")->where("warehouse_id", $warehouse)->where("id_product", $idproduct)->get()->row()->stock_virtual;

			} else {

				$current_stock = (int) $this->db->select("IFNULL(stock,0) stock")->from("stock")->where("warehouse_id", $warehouse)->where("id_product", $idproduct)->get()->row()->stock;

			}



			if ($qty > $current_stock) {

				return false;

			} else {

				return true;

			}

		} else {

			return false;

		}

	}

}


https://t.me/RX1948 - 2025