<?php
class ModelCatalogAuction extends Model {
	public function getAuctions($data = array()) {
		$auction_data = array();
		if ($data) {
			$sql = "SELECT a.*, pa.*, pad.name AS auction_name, p.image AS product_image, pd.name AS product_name, p.viewed AS product_viewed, pd.meta_description AS meta_description, pd.meta_keyword AS meta_keyword, c.email AS customer_email,";
			$sql .= " IF(a.total_no_of_bid > '0', a.highest_bid_amount, pa.starting_price) AS current_bid_amount,";
			$sql .= " (SELECT COUNT(DISTINCT order_product_id) FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) WHERE op.product_id = pa.product_id AND o.order_status_id > '0' GROUP BY op.product_id) AS product_orders,";
			$sql .= " (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = pa.product_id AND r1.status = '1' GROUP BY r1.product_id) AS product_rating,";
			$sql .= " (SELECT COUNT(DISTINCT review_id) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = pa.product_id AND r2.status = '1' GROUP BY r2.product_id) AS product_reviews,";
			$sql .= " IF(p.product_id IN ('" . str_replace(",", "','", (string)$this->config->get('featured_product')) . "'), '1', '0') AS product_featured";
			$sql .= " FROM " . DB_PREFIX . "auction a";
			$sql .= " INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_auction_description pad ON (pa.product_auction_id = pad.product_auction_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (pa.product_id = p.product_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "customer c ON (a.highest_bidder_id = c.customer_id)";
			if ($data['completed']) {
				$sql .= " WHERE a.auction_status_id IN ('" . (int)$data['auction_status_ids']['won'] . "', '" . (int)$data['auction_status_ids']['expired'] . "', '" . (int)$data['auction_status_ids']['sold'] . "', '" . (int)$data['auction_status_ids']['voided'] . "')";
			} else {
				$sql .= " WHERE a.auction_status_id IN ('" . (int)$data['auction_status_ids']['inprogress'] . "', '" . (int)$data['auction_status_ids']['extended'] . "')";
			}
			$sql .= " AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'";
			$sql .= " AND pad.language_id = '" . (int)$this->config->get('config_language_id') . "'";
			$sql .= " AND p.status = '1'";
			$sql .= " AND p.date_available <= NOW()";
			$sql .= " AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'"; 
			$sql .= " GROUP BY a.auction_id";
			$sort_data = array(
				'a.real_ending_time',
				'a.date_closed',
				'a.total_no_of_bid',
				'product_orders',
				'pa.starting_time',
				'product_featured',
				'product_name',
				'current_bid_amount',
				'pa.buyout_price',
				'product_viewed',
				'product_rating',
				'product_reviews'
			);	
			if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
				if ($data['sort'] == 'product_name') {
					$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
				} else {
					$sql .= " ORDER BY " . $data['sort'];
				}
			} else {
				if ($data['completed']) {
					$sql .= " ORDER BY a.date_closed";
					$data['order'] = 'DESC';
				} else {
					$sql .= " ORDER BY a.real_ending_time";
				}
			}
			if (isset($data['order']) && $data['order'] == 'DESC') {
				$sql .= " DESC, a.total_no_of_bid DESC";
			} else {
				$sql .= " ASC, a.total_no_of_bid DESC";
			}
			if (isset($data['start']) || isset($data['limit'])) {
				if ($data['start'] < 0) {
					$data['start'] = 0;
				}
				if ($data['limit'] < 1) {
					$data['limit'] = $this->config->get('config_catalog_limit');
				}
				$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
			}
			$query = $this->db->query($sql);
			$auction_data = $query->rows;
		}
		return $auction_data;
	}

	public function getTotalAuctions($data = array()) {
		$auction_total = 0;
		if ($data) {
			$sql = "SELECT COUNT(DISTINCT a.auction_id) AS total";
			$sql .= " FROM " . DB_PREFIX . "auction a";
			$sql .= " INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_auction_description pad ON (pa.product_auction_id = pad.product_auction_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (pa.product_id = p.product_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)";
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
			if ($data['completed']) {
				$sql .= " WHERE a.auction_status_id IN ('" . (int)$data['auction_status_ids']['won'] . "', '" . (int)$data['auction_status_ids']['expired'] . "', '" . (int)$data['auction_status_ids']['sold'] . "', '" . (int)$data['auction_status_ids']['voided'] . "')";
			} else {
				$sql .= " WHERE a.auction_status_id IN ('" . (int)$data['auction_status_ids']['inprogress'] . "', '" . (int)$data['auction_status_ids']['extended'] . "')";
			}
			$sql .= " AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'";
			$sql .= " AND pad.language_id = '" . (int)$this->config->get('config_language_id') . "'";
			$sql .= " AND p.status = '1'";
			$sql .= " AND p.date_available <= NOW()";
			$sql .= " AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'"; 
			$query = $this->db->query($sql);
			$auction_total = $query->row['total'];
		}
		return $auction_total;
	}

	public function setAuctionBidSetting($auction_bid_setting_id, $auction_id, $customer_id, $set_auto_bid, $max_bid_amount, $persistent_bidding) {
		$save_success = 0;
		if ($auction_id && $customer_id && isset($set_auto_bid) && $max_bid_amount > 0 && isset($persistent_bidding)) {
			if (!$auction_bid_setting_id) {
				$sql_start = "INSERT INTO ";
				$sql_date  = "date_added = '" . date('Y-m-d H:i:s') . "'";
				$sql_end   = "";
				$sql_type  = 1;
			} else {
				$sql_start = "UPDATE ";
				$sql_date  = "date_modified = '" . date('Y-m-d H:i:s') . "'";
				$sql_end   = " WHERE auction_bid_setting_id = '" . (int)$auction_bid_setting_id . "'";
				$sql_end  .= " AND auction_id = '" . (int)$auction_id . "'";
				$sql_end  .= " AND customer_id = '" . (int)$customer_id . "'";
				$sql_type  = 2;
			}
			$sql = $sql_start . DB_PREFIX . "auction_bid_setting SET ";
			$sql .= "auction_id = '" . (int)$auction_id . "', ";
			$sql .= "customer_id = '" . (int)$customer_id . "', ";
			$sql .= "set_auto_bid = '" . (int)$set_auto_bid . "', ";
			$sql .= "max_bid_amount = '" . (float)$max_bid_amount . "', ";
			$sql .= "persistent_bidding = '" . (int)$persistent_bidding . "', ";
			$sql .= $sql_date;
			$sql .= $sql_end;
			$this->db->query($sql);
			if ($sql_type == 1) {
				$save_success = (int)$this->db->getLastId();
			} else {
				$save_success = (int)$this->db->countAffected();
			}
		}
		return $save_success;
	}

	public function setAuctionNewBid($auction_id, $customer_id, $bid_amount, $bid_time, $is_auto_bid, $auction_bid_status_id, $ip_address) {
		$bid_success = 0;
		if ($auction_id && $customer_id && $bid_amount > 0 && $bid_time && isset($is_auto_bid) && $auction_bid_status_id && $ip_address) {
			$sql = "INSERT INTO " . DB_PREFIX . "auction_bid SET ";
			$sql .= "auction_id = '" . (int)$auction_id . "', ";
			$sql .= "customer_id = '" . (int)$customer_id . "', ";
			$sql .= "bid_amount = '" . (float)$bid_amount . "', ";
			$sql .= "bid_time = '" . (int)$bid_time . "', ";
			$sql .= "is_auto_bid = '" . (int)$is_auto_bid . "', ";
			$sql .= "auction_bid_status_id = '" . (int)$auction_bid_status_id . "', ";
			$sql .= "ip_address = '" . $this->db->escape($ip_address) . "'";
			$this->db->query($sql);
			$bid_success = (int)$this->db->getLastId();
		}
		return $bid_success;
	}

	public function setAuctionOutBid($auction_id, $highest_bid_amount, $auction_bid_status_ids) {
		if ($auction_id && $highest_bid_amount > 0) {
			$sql = "UPDATE " . DB_PREFIX . "auction_bid SET ";
			$sql .= "auction_bid_status_id = '" . $auction_bid_status_ids['outbid'] . "'";
			$sql .= " WHERE auction_id = '" . (int)$auction_id . "'";
			$sql .= " AND bid_amount < '" . (float)$highest_bid_amount . "'";
			$sql .= " AND auction_bid_status_id = '" . $auction_bid_status_ids['winning'] . "'";
			$this->db->query($sql);
		}
	}

	public function setAuctionVoidedBid($auction_id, $auction_bid_status_ids) {
		if ($auction_id) {
			$sql = "UPDATE " . DB_PREFIX . "auction_bid SET ";
			$sql .= "auction_bid_status_id = '" . $auction_bid_status_ids['voided'] . "'";
			$sql .= " WHERE auction_id = '" . (int)$auction_id . "'";
			$sql .= " AND auction_bid_status_id IN ('" . $auction_bid_status_ids['winning'] . "', '" . $auction_bid_status_ids['buyout'] . "')";
			$this->db->query($sql);
		}
	}

	public function setAuctionUpdate($auction_id, $auction_updates) {
		if ($auction_id && $auction_updates) {
			$sql = "UPDATE " . DB_PREFIX . "auction SET ";
			if (isset($auction_updates['highest_bid_id'])) {
				$sql .= "highest_bid_id = '" . (int)$auction_updates['highest_bid_id'] . "', ";
			}
			if (isset($auction_updates['highest_bidder_id'])) {
				$sql .= "highest_bidder_id = '" . (int)$auction_updates['highest_bidder_id'] . "', ";
			}
			if (isset($auction_updates['highest_bid_amount'])) {
				$sql .= "highest_bid_amount = '" . (float)$auction_updates['highest_bid_amount'] . "', ";
			}
			if (isset($auction_updates['highest_bid_time'])) {
				$sql .= "highest_bid_time = '" . (int)$auction_updates['highest_bid_time'] . "', ";
			}
			if (isset($auction_updates['total_no_of_bid'])) {
				$sql .= "total_no_of_bid = '" . (int)$auction_updates['total_no_of_bid'] . "', ";
			}
			if (isset($auction_updates['total_auto_bid'])) {
				$sql .= "total_auto_bid = '" . (int)$auction_updates['total_auto_bid'] . "', ";
			}
			if (isset($auction_updates['reserve_met'])) {
				$sql .= "reserve_met = '" . (int)$auction_updates['reserve_met'] . "', ";
			}
			if (isset($auction_updates['buyout_made'])) {
				$sql .= "buyout_made = '" . (int)$auction_updates['buyout_made'] . "', ";
			}
			if (isset($auction_updates['real_ending_time'])) {
				$sql .= "real_ending_time = '" . (int)$auction_updates['real_ending_time'] . "', ";
			}
			if (isset($auction_updates['extension_count'])) {
				$sql .= "extension_count = '" . (int)$auction_updates['extension_count'] . "', ";
			}
			if (isset($auction_updates['relisting_count'])) {
				$sql .= "relisting_count = '" . (int)$auction_updates['relisting_count'] . "', ";
			}
			if (isset($auction_updates['auction_status_id'])) {
				$sql .= "auction_status_id = '" . (int)$auction_updates['auction_status_id'] . "', ";
			}
			if (isset($auction_updates['date_closed'])) {
				$sql .= "date_closed = '" . date('Y-m-d H:i:s', $auction_updates['date_closed']) . "', ";
			}
			$sql .= "date_modified = '" . date('Y-m-d H:i:s') . "'";
			$sql .= " WHERE auction_id = '" . (int)$auction_id . "'";
			$this->db->query($sql);
		}
	}

	public function setAuctionInsert($auction_properties) {
		if (!empty($auction_properties)) {
			$sql = "INSERT INTO " . DB_PREFIX . "product_auction SET ";
			$sql .= "product_id = '" . (int)$auction_properties['product_id'] . "', ";
			$sql .= "reserved_quantity = '" . (int)$auction_properties['reserved_quantity'] . "', ";
			$sql .= "starting_time = '" . (int)$auction_properties['starting_time'] . "', ";
			$sql .= "ending_time = '" . (int)$auction_properties['ending_time'] . "', ";
			$sql .= "starting_price = '" . (float)$auction_properties['starting_price'] . "', ";
			$sql .= "reserve_price = '" . (float)$auction_properties['reserve_price'] . "', ";
			$sql .= "buyout_price = '" . (float)$auction_properties['buyout_price'] . "', ";
			$sql .= "min_increment = '" . (float)$auction_properties['min_increment'] . "', ";
			$sql .= "allow_auto_bid = '" . (int)$auction_properties['allow_auto_bid'] . "', ";
			$sql .= "fast_fwd_auto_bids = '" . (int)$auction_properties['fast_fwd_auto_bids'] . "', ";
			$sql .= "allow_auto_extend = '" . (int)$auction_properties['allow_auto_extend'] . "', ";
			$sql .= "extension_duration = '" . (int)$auction_properties['extension_duration'] . "', ";
			$sql .= "extension_window = '" . (int)$auction_properties['extension_window'] . "'";
			$this->db->query($sql);
			$product_auction_id = (int)$this->db->getLastId();
			$auction_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_auction_description WHERE product_auction_id = '" . (int)$auction_properties['product_auction_id'] . "'");
			$auction_names = array();
			foreach ($auction_description_query->rows as $auction_description) {
				$auction_names[$auction_description['language_id']] = $auction_description['name'];
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_auction_description SET product_auction_id = '" . (int)$product_auction_id . "', language_id = '" . (int)$auction_description['language_id'] . "', name = '" . $this->db->escape($auction_description['name']) . "'");
			}
			$sql = "INSERT INTO " . DB_PREFIX . "auction SET ";
			$sql .= "product_auction_id = '" . (int)$product_auction_id . "', ";
			$sql .= "real_ending_time = '" . (int)$auction_properties['ending_time'] . "', ";
			$sql .= "relisting_count = '" . (int)$auction_properties['relisting_count'] . "', ";
			$sql .= "auction_status_id = '" . (int)$auction_properties['auction_status_id'] . "', ";
			$sql .= "date_added = '" . date('Y-m-d H:i:s') . "'";
			$this->db->query($sql);
			$auction_id = (int)$this->db->getLastId();
			if (!empty($auction_names[$this->config->get('config_language_id')])) {
				$auction_name = $auction_names[$this->config->get('config_language_id')];
			} else {
				$auction_name = $this->config->get('config_name') . ' Product Auction';
			}
			$keyword = 'auction-' . $auction_id . '-' . preg_replace('/\s+/', '_', preg_replace("/[^a-z0-9 ]/", '', html_entity_decode(strtolower($auction_name), ENT_QUOTES, 'UTF-8')));
			$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'auction_id=" . $auction_id . "', keyword = '" . $this->db->escape($keyword) . "'");
		}
	}

	public function setAuctionReturnQuantity($product_id, $reserved_quantity) {
		if ($product_id && $reserved_quantity) {
			$sql = "UPDATE " . DB_PREFIX . "product SET ";
			$sql .= "quantity = quantity + '" . (int)$reserved_quantity . "'";
			$sql .= " WHERE product_id = '" . (int)$product_id . "'";
			$sql .= " AND subtract = '1'";
			$this->db->query($sql);
		}
	}

	public function setCustomerCartDetails($customer_id, $cart) {
		if ($customer_id && isset($cart) && is_array($cart)) {
			$sql = "UPDATE " . DB_PREFIX . "customer SET ";
			$sql .= "cart = '" . serialize($cart) . "'";
			$sql .= " WHERE customer_id = '" . (int)$customer_id . "'";
			$this->db->query($sql);
		}
	}

	public function setGlobalAuctionNotifyBidders($auction_id, $customer_id, $notification_id, $notify_type) {
		if ($auction_id && $customer_id && isset($notification_id) && $notify_type) {
			$customer_query = $this->db->query("SELECT email FROM " . DB_PREFIX . "customer WHERE customer_id = '" . (int)$customer_id . "'");
			$product_query = $this->db->query("SELECT pa.product_id, pd.name AS product_name, pa.reserved_quantity FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (pa.product_id = pd.product_id) WHERE a.auction_id = '" . (int)$auction_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'");
			if ($customer_query->num_rows && $product_query->num_rows) {
				if ($notification_id) {
					$sql = "UPDATE " . DB_PREFIX . "auction_notification SET ";
				} else {
					$sql = "INSERT INTO " . DB_PREFIX . "auction_notification SET ";
					$sql .= "auction_id = '" . (int)$auction_id . "', ";
					$sql .= "customer_id = '" . (int)$customer_id . "', ";
				}
				if ($notify_type == '1stbid') {
					$sql .= "notify_1stbid = '1', ";
				} elseif ($notify_type == 'outbid') {
					$sql .= "notify_outbid = '1', ";
				} elseif ($notify_type == 'overrun') {
					$sql .= "notify_overrun = '1', ";
				} elseif ($notify_type == 'ending') {
					$sql .= "notify_ending = '1', ";
				} elseif ($notify_type == 'extended') {
					$sql .= "notify_extended = '1', ";
				} elseif ($notify_type == 'won') {
					$sql .= "notify_won = '1', ";
				} elseif ($notify_type == 'lost') {
					$sql .= "notify_lost = '1', ";
				} elseif ($notify_type == 'expired') {
					$sql .= "notify_expired = '1', ";
				} elseif ($notify_type == 'voided') {
					$sql .= "notify_voided = '1', ";
				} elseif ($notify_type == 'payment') {
					$sql .= "notify_payment = notify_payment + '1', ";
				}
				$sql .= "date_notified = '" . date('Y-m-d H:i:s') . "'";
				if ($notification_id) {
					$sql .= " WHERE auction_notification_id = '" . (int)$notification_id . "'";
				}
				$this->db->query($sql);
				$this->language->load('mail/auction');
				$display_name = strlen(stripslashes($product_query->row['product_name'])) > 30 ? substr(stripslashes($product_query->row['product_name']), 0, 30) . ' ...' : stripslashes($product_query->row['product_name']);
				$display_name = (int)$product_query->row['reserved_quantity'] > 1 ? $product_query->row['reserved_quantity'] . ' x ' . $display_name : $display_name;
				$subject = sprintf($this->language->get('text_subject'), $this->config->get('config_name'), $auction_id, $this->language->get('text_' . $notify_type . '1'));
				$message = sprintf($this->language->get('text_header'), $this->config->get('config_name')) . "\n\n";
				$message .= sprintf($this->language->get('text_' . $notify_type . '2'), $display_name) . "\n\n";
				$message .= $this->language->get('text_body') . "\n";
				$message .= $this->url->link('product/product', 'product_id=' . $product_query->row['product_id'] . '&auction_id=' . $auction_id) . "\n\n";
				$message .= $this->language->get('text_footer') . "\n";
				$message .= $this->url->link('product/auction') . "\n\n";
				$message .= $this->language->get('text_thanks') . "\n";
				$message .= $this->config->get('config_name');
				$mail = new Mail();
				$mail->protocol = $this->config->get('config_mail_protocol');
				$mail->parameter = $this->config->get('config_mail_parameter');
				$mail->hostname = $this->config->get('config_smtp_host');
				$mail->username = $this->config->get('config_smtp_username');
				$mail->password = $this->config->get('config_smtp_password');
				$mail->port = $this->config->get('config_smtp_port');
				$mail->timeout = $this->config->get('config_smtp_timeout');				
				$mail->setTo(strtolower(stripslashes($customer_query->row['email'])));
				$mail->setFrom($this->config->get('config_email'));
				$mail->setSender($this->config->get('config_name'));
				$mail->setSubject(html_entity_decode($subject, ENT_QUOTES, 'UTF-8'));
				$mail->setText(html_entity_decode($message, ENT_QUOTES, 'UTF-8'));
				$mail->send();
			}
		}
	}

	public function getAuctionDetails($auction_id) {
		$query = $this->db->query("SELECT a.*, pa.*, pad.name AS auction_name, c.email AS customer_email FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) LEFT JOIN " . DB_PREFIX . "product_auction_description pad ON (pa.product_auction_id = pad.product_auction_id) LEFT JOIN " . DB_PREFIX . "customer c ON (a.highest_bidder_id = c.customer_id) WHERE a.auction_id = '" . (int)$auction_id . "' AND pad.language_id = '" . (int)$this->config->get('config_language_id') . "' GROUP BY a.auction_id");
		return $query->row;
	}

	public function getAuctionValidity($product_id, $auction_id, $auction_status_ids) {
		$query = $this->db->query("SELECT SUM(auction_id) AS auction_valid FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.auction_id = '" . (int)$auction_id . "' AND a.auction_status_id IN ('" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "', '" . (int)$auction_status_ids['won'] . "', '" . (int)$auction_status_ids['expired'] . "', '" . (int)$auction_status_ids['sold'] . "', '" . (int)$auction_status_ids['voided'] . "')");
		return $query->row['auction_valid'];
	}

	public function getLiveAuctions($auction_status_ids, $limit) {
		$query = $this->db->query("SELECT a.*, pa.*, pad.name AS auction_name, p.product_id AS product_id, p.image AS product_image, pd.name AS product_name, c.email AS customer_email FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) LEFT JOIN " . DB_PREFIX . "product_auction_description pad ON (pa.product_auction_id = pad.product_auction_id) LEFT JOIN " . DB_PREFIX . "product p ON (pa.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "customer c ON (a.highest_bidder_id = c.customer_id) WHERE a.auction_status_id IN ('" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "') AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND pad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY a.auction_id ORDER BY a.real_ending_time ASC, a.total_no_of_bid DESC LIMIT " . (int)$limit);
		return $query->rows;
	}

	public function getLiveAuctionsByProductId($product_id, $auction_status_ids) {
		$query = $this->db->query("SELECT a.*, pa.*, pad.name AS auction_name, p.image AS product_image, pd.name AS product_name, c.email AS customer_email FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) LEFT JOIN " . DB_PREFIX . "product_auction_description pad ON (pa.product_auction_id = pad.product_auction_id) LEFT JOIN " . DB_PREFIX . "product p ON (pa.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "customer c ON (a.highest_bidder_id = c.customer_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.auction_status_id IN ('" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "') AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND pad.language_id = '" . (int)$this->config->get('config_language_id') . "' GROUP BY a.auction_id ORDER BY a.real_ending_time ASC");
		return $query->rows;
	}

	public function getTotalLiveAuctionsByProductId($product_id, $auction_status_ids) {
		$query = $this->db->query("SELECT COUNT(*) AS total_auctions FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.auction_status_id IN ('" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "')");
		return $query->row['total_auctions'];
	}

	public function getLiveAuctionIdsByProductId($product_id, $auction_status_ids) {
		$query = $this->db->query("SELECT auction_id FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.auction_status_id IN ('" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "')");
		return $query->rows;
	}

	public function getAuctionsPriceRange($product_id, $auction_status_ids) {
		$query = $this->db->query("SELECT SUM(pa.reserved_quantity) AS availability, MAX(a.highest_bid_amount / pa.reserved_quantity) AS high_bid, MIN(pa.starting_price / pa.reserved_quantity) AS min_price, MAX(pa.reserve_price / pa.reserved_quantity) AS max_price, MIN(pa.buyout_price / pa.reserved_quantity) AS min_buy, MAX(pa.buyout_price / pa.reserved_quantity) AS max_buy FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.auction_status_id IN ('" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "')");
		return $query->row;
	}

	public function getAuctionBids($auction_id, $start = 0, $limit = 20) {
		if ($start < 0) { $start = 0; }
		if ($limit < 1) { $limit = 20; }	
		$query = $this->db->query("SELECT ab.*, c.email FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "customer c ON (ab.customer_id = c.customer_id) WHERE ab.auction_id = '" . (int)$auction_id . "' ORDER BY ab.bid_amount DESC LIMIT " . (int)$start . "," . (int)$limit);
		return $query->rows;
	}

	public function getAuctionBidSettingByCustomerId($auction_id, $customer_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "auction_bid_setting WHERE auction_id = '" . (int)$auction_id . "' AND customer_id = '" . (int)$customer_id . "'");
		return $query->row;
	}

	public function getWonAuctionIds($auction_status_ids) {
		$query = $this->db->query("SELECT auction_id FROM " . DB_PREFIX . "auction WHERE auction_status_id = '" . (int)$auction_status_ids['won'] . "'");
		return $query->rows;
	}

	public function getActiveAuctionId($auction_id, $auction_status_ids) {
		$query = $this->db->query("SELECT auction_id FROM " . DB_PREFIX . "auction WHERE auction_id = '" . (int)$auction_id . "' AND auction_status_id IN ('" . (int)$auction_status_ids['starting'] . "', '" . (int)$auction_status_ids['relisting'] . "', '" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "')");
		return $query->rows;
	}

	public function getActiveAuctionIdsByProductId($product_id, $auction_status_ids) {
		$query = $this->db->query("SELECT auction_id FROM " . DB_PREFIX . "auction a INNER JOIN " . DB_PREFIX . "product_auction pa ON (a.product_auction_id = pa.product_auction_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.auction_status_id IN ('" . (int)$auction_status_ids['starting'] . "', '" . (int)$auction_status_ids['relisting'] . "', '" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "')");
		return $query->rows;
	}

	public function getActiveAuctionIds($auction_status_ids) {
		$query = $this->db->query("SELECT auction_id FROM " . DB_PREFIX . "auction WHERE auction_status_id IN ('" . (int)$auction_status_ids['starting'] . "', '" . (int)$auction_status_ids['relisting'] . "', '" . (int)$auction_status_ids['inprogress'] . "', '" . (int)$auction_status_ids['extended'] . "')");
		return $query->rows;
	}

	public function getTotalAuctionBids($auction_id) {
		$query = $this->db->query("SELECT COUNT(*) AS total_bids FROM " . DB_PREFIX . "auction_bid WHERE auction_id = '" . (int)$auction_id . "'");
		return $query->row['total_bids'];
	}

	public function getTotalAuctionAutoBids($auction_id) {
		$query = $this->db->query("SELECT COUNT(*) AS auto_bids FROM " . DB_PREFIX . "auction_bid WHERE auction_id = '" . (int)$auction_id . "' AND is_auto_bid = '1'");
		return $query->row['auto_bids'];
	}

	public function getTopAuctionBidDetails($auction_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "auction_bid WHERE auction_id = '" . (int)$auction_id . "' ORDER BY bid_amount DESC LIMIT 1");
		return $query->row;
	}

	public function getAuctionAutoBidSettings($auction_id, $next_bid_amount) {
		$query = $this->db->query("SELECT customer_id, max_bid_amount, persistent_bidding FROM " . DB_PREFIX . "auction_bid_setting WHERE auction_id = '" . (int)$auction_id . "' AND max_bid_amount >= '" . (float)$next_bid_amount . "' AND set_auto_bid = '1'");
		return $query->rows;
	}

	public function getGlobalAuctionPoll($auction_ids, $last_polled) {
		$query = $this->db->query("SELECT a.*, c.email AS customer_email, ab.ip_address AS ip_address FROM " . DB_PREFIX . "auction a LEFT JOIN " . DB_PREFIX . "customer c ON (a.highest_bidder_id = c.customer_id) LEFT JOIN " . DB_PREFIX . "auction_bid ab ON (a.highest_bid_id = ab.auction_bid_id) WHERE a.auction_id IN (" . (string)$auction_ids . ") AND a.date_modified >= '" . date('Y-m-d H:i:s', (int)$last_polled) . "' GROUP BY a.auction_id ORDER BY a.date_modified ASC LIMIT 100");
		return $query->rows;
	}

	public function getAuctionOrderId($auction_id) {
		$query = $this->db->query("SELECT SUM(order_auction_id) AS order_auction_id FROM " . DB_PREFIX . "auction WHERE auction_id = '" . (int)$auction_id . "'");
		return $query->row['order_auction_id'];
	}

	public function getCustomerCartDetails($customer_id) {
		$query = $this->db->query("SELECT cart FROM " . DB_PREFIX . "customer WHERE customer_id = '" . (int)$customer_id . "'");
		return $query->row;
	}

	public function getAuctionNotifyBidders1stBid() {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_1stbid = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_added >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 72))) . "' AND ab.bid_time >= '" . (int)(time() - (3600 * 6)) . "' GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersOutBid() {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_outbid = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_added >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 72))) . "' AND ab.customer_id <> a.highest_bidder_id AND a.highest_bid_time >= '" . (int)(time() - (3600 * 6)) . "' GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersOverrun() {
		$query = $this->db->query("SELECT abs.auction_id, abs.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid_setting abs INNER JOIN " . DB_PREFIX . "auction a ON (abs.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (abs.auction_id = an.auction_id AND abs.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_overrun = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_added >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 72))) . "' AND abs.set_auto_bid = '1' AND a.highest_bid_amount > abs.max_bid_amount AND abs.customer_id <> a.highest_bidder_id AND a.highest_bid_time >= '" . (int)(time() - (3600 * 6)) . "' GROUP BY abs.auction_id, abs.customer_id ORDER BY abs.auction_id ASC , abs.customer_id ASC LIMIT 5");		// 0.0006s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersEnding() {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_ending = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_added >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 72))) . "' AND a.real_ending_time >= '" . time() . "' AND a.real_ending_time <= '" . (int)(time() + 300) . "' GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0003s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersExtended() {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab  INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id)LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_extended = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_added >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 72))) . "' AND a.extension_count > '0' AND a.highest_bid_time >= '" . (int)(time() - (3600 * 6)) . "' GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersWon($auction_status_ids) {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_won = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_closed >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 24))) . "' AND a.auction_status_id = '" . (int)$auction_status_ids['won'] . "' AND ab.customer_id = a.highest_bidder_id GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersLost($auction_status_ids) {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_lost = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_closed >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 24))) . "' AND a.auction_status_id = '" . (int)$auction_status_ids['won'] . "' AND ab.customer_id <> a.highest_bidder_id GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersExpired($auction_status_ids) {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_expired = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_closed >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 24))) . "' AND a.auction_status_id = '" . (int)$auction_status_ids['expired'] . "' GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersVoided($auction_status_ids) {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_voided = '0') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "') AND a.date_modified >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 24))) . "' AND a.auction_status_id = '" . (int)$auction_status_ids['voided'] . "' GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}

	public function getAuctionNotifyBiddersPayment($auction_status_ids, $payment_period) {
		$query = $this->db->query("SELECT ab.auction_id, ab.customer_id, an.auction_notification_id FROM " . DB_PREFIX . "auction_bid ab INNER JOIN " . DB_PREFIX . "auction a ON (ab.auction_id = a.auction_id) LEFT JOIN " . DB_PREFIX . "auction_notification an ON (ab.auction_id = an.auction_id AND ab.customer_id = an.customer_id) WHERE (an.auction_notification_id IS NULL OR an.notify_payment < '" . (int)$payment_period . "') AND (an.date_notified IS NULL OR an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 24))) . "' OR (an.date_notified <= '" . date('Y-m-d H:i:s', (int)(time() - 300)) . "' AND an.notify_payment = '0')) AND a.date_closed >= '" . date('Y-m-d H:i:s', (int)(time() - (3600 * 24 * (int)$payment_period))) . "' AND a.auction_status_id = '" . (int)$auction_status_ids['won'] . "' AND ab.customer_id = a.highest_bidder_id GROUP BY ab.auction_id, ab.customer_id ORDER BY ab.auction_id ASC , ab.customer_id ASC LIMIT 5");		// 0.0004s
		return $query->rows;
	}
}
?>