File: //proc/self/cwd/nueva/modules/roja45quotationsprofree/classes/QuotationRequest.php
<?php
/**
* QuotationRequest.
*
* @author Roja45
* @copyright 2016 Roja45
* @license license.txt
* @category QuotationRequest
*
* 2016 ROJA45 - All rights reserved.
*
* DISCLAIMER
* Changing this file will render any support provided by us null and void.
*/
/**
* QuotationRequest.
*
* @author Roja45 <support@roja45.com>
* @copyright 2016 Roja45
* @license license.txt
* @category Class
*
* 2016 ROJA45 - All rights reserved.
*
* DISCLAIMER
* Changing this file will render any support provided by us null and void.
*/
class QuotationRequest extends ObjectModel
{
public $id_roja45_quotation_request;
public $id_shop;
public $id_currency;
public $id_customer;
public $id_guest;
public $id_lang;
public $date_add;
public $date_upd;
public $secure_key;
public static $_instance = array();
protected static $_nbProducts = array();
protected $_products = null;
protected static $_totalWeight = array();
protected $_taxCalculationMethod = PS_TAX_EXC;
protected static $_customer = null;
/**
* @see ObjectModel::$definition
*/
public static $definition = array(
'table' => 'roja45_quotationspro_request',
'primary' => 'id_roja45_quotation_request',
'multilang' => false,
'fields' => array(
'id_shop' => array(
'type' => self::TYPE_INT,
'lang' => false,
'required' => true
),
'id_currency' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_guest' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'secure_key' => array('type' => self::TYPE_STRING, 'size' => 32),
'date_add' => array(
'type' => self::TYPE_DATE,
'lang' => false,
'required' => true
),
'date_upd' => array(
'type' => self::TYPE_DATE,
'lang' => false,
'required' => true
),
),
);
public function __construct($id = null, $id_lang = null)
{
parent::__construct($id);
if ($this->id_customer) {
if (isset(Context::getContext()->customer) && Context::getContext()->customer->id == $this->id_customer) {
$customer = Context::getContext()->customer;
} else {
$customer = new Customer((int)$this->id_customer);
}
QuotationRequest::$_customer = $customer;
if ((!$this->secure_key || $this->secure_key == '-1') && $customer->secure_key) {
$this->secure_key = $customer->secure_key;
$this->save();
}
}
$this->setTaxCalculationMethod();
}
public static function getInstance()
{
if (!QuotationRequest::$_instance) {
if ($id_roja45_quotation_request = Context::getContext()->cookie->__get('quotation_request')) {
$_instance = new QuotationRequest($id_roja45_quotation_request);
if (!Validate::isLoadedObject($_instance)) {
Context::getContext()->cookie->__unset('quotation_request');
$id_roja45_quotation_request = 0;
}
}
if (!$id_roja45_quotation_request) {
$_instance = new QuotationRequest();
$_instance->id_shop = Context::getContext()->shop->id;
$_instance->date_add = date('Y-m-d H:i:s');
$_instance->id_lang = (int)Context::getContext()->language->id;
$_instance->id_currency = (int)Context::getContext()->currency->id;
if ($_instance->save()) {
Context::getContext()->cookie->__set('quotation_request', $_instance->id);
}
}
if ($_instance->id_lang != (int)Context::getContext()->language->id || $_instance->id_currency != (int)Context::getContext()->currency->id) {
$_instance->id_lang = (int)Context::getContext()->language->id;
$_instance->id_currency = (int)Context::getContext()->currency->id;
$_instance->save();
}
}
return $_instance;
}
public function nbProducts()
{
if (!$this->id) {
return 0;
}
return Cart::getNbProducts($this->id);
}
public function getProducts(
$refresh = false,
$id_product = false,
$id_country = null
) {
if (!$this->id) {
return array();
}
// Product cache must be strictly compared to NULL, or else an empty cart will add dozens of queries
if ($this->_products !== null && !$refresh) {
// Return product row with specified ID if it exists
if (is_int($id_product)) {
foreach ($this->_products as $product) {
if ($product['id_product'] == $id_product) {
return array($product);
}
}
return array();
}
return $this->_products;
}
$sql = new DbQuery();
$sql->select(
'rp.`id_roja45_quotation_request`, rp.`id_product_attribute`, rp.`id_product`, rp.`qty` AS quote_quantity,
rp.id_shop, pl.`name`, p.`is_virtual`, pl.`description_short`, pl.`available_now`, pl.`available_later`,
product_shop.`id_category_default`, p.`id_supplier`, p.`id_manufacturer`, product_shop.`on_sale`,
product_shop.`ecotax`, product_shop.`additional_shipping_cost`,product_shop.`available_for_order`,
product_shop.`price`, product_shop.`active`, product_shop.`unity`, product_shop.`unit_price_ratio`,
stock.`quantity` AS quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`weight`,
p.`date_add`, p.`date_upd`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category'
);
$sql->from('roja45_quotationspro_requestproduct', 'rp');
$sql->leftJoin('product', 'p', 'p.`id_product` = rp.`id_product`');
$sql->innerJoin(
'product_shop',
'product_shop',
'(product_shop.`id_shop` = rp.`id_shop` AND product_shop.`id_product` = p.`id_product`)'
);
$sql->leftJoin(
'product_lang',
'pl',
'p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang(
'pl',
'rp.id_shop'
)
);
$sql->leftJoin(
'category_lang',
'cl',
'product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl', 'rp.id_shop')
);
$sql->leftJoin(
'product_supplier',
'ps',
'ps.`id_product` = rp.`id_product` AND ps.`id_product_attribute` = rp.`id_product_attribute` AND ps.`id_supplier` = p.`id_supplier`'
);
// @todo test if everything is ok, then refactorise call of this method
$sql->join(Product::sqlStock('rp', 'rp'));
// Build WHERE clauses
$sql->where('rp.`id_roja45_quotation_request` = '.(int)$this->id);
if ($id_product) {
$sql->where('rp.`id_product` = '.(int)$id_product);
}
$sql->where('p.`id_product` IS NOT NULL');
// Build ORDER BY
$sql->orderBy('rp.`date_add`, rp.`id_product`, rp.`id_product_attribute` ASC');
if (Combination::isFeatureActive()) {
$sql->select('
product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr,
IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference,
(p.`weight`+ pa.`weight`) weight_attribute,
IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13,
IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc,
IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity,
IF(product_attribute_shop.wholesale_price > 0, product_attribute_shop.wholesale_price, product_shop.`wholesale_price`) wholesale_price
');
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = rp.`id_product_attribute`');
$sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.`id_shop` = rp.`id_shop` AND product_attribute_shop.`id_product_attribute` = pa.`id_product_attribute`)');
} else {
$sql->select(
'p.`reference` AS reference, p.`ean13`,
p.`upc` AS upc, product_shop.`minimal_quantity` AS minimal_quantity, product_shop.`wholesale_price` wholesale_price'
);
}
$sql->select('image_shop.`id_image` id_image, il.`legend`');
$sql->leftJoin('image_shop', 'image_shop', 'image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$this->id_shop);
$sql->leftJoin('image_lang', 'il', 'il.`id_image` = image_shop.`id_image` AND il.`id_lang` = '.(int)$this->id_lang);
$result = Db::getInstance()->executeS($sql->build());
$products_ids = array();
$pa_ids = array();
if ($result) {
foreach ($result as $key => $row) {
$products_ids[] = $row['id_product'];
$pa_ids[] = $row['id_product_attribute'];
}
} else {
return array();
}
$this->_products = array();
foreach ($result as &$row) {
// Add additional info
$attributes = Db::getInstance()->executeS(
' SELECT pac.`id_product_attribute`, agl.`public_name` AS public_group_name, al.`name` AS attribute_name
FROM `'._DB_PREFIX_.'product_attribute_combination` pac
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (
a.`id_attribute` = al.`id_attribute`
AND al.`id_lang` = '.(int)$this->id_lang.'
)
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (
ag.`id_attribute_group` = agl.`id_attribute_group`
AND agl.`id_lang` = '.(int)$this->id_lang.'
)
WHERE pac.`id_product_attribute` = '.$row['id_product_attribute'] .'
ORDER BY ag.`position` ASC, a.`position` ASC'
);
if (count($attributes)) {
$row['attributes'] = '';
$row['attributes_small'] = '';
}
foreach ($attributes as $attribute) {
$row['attributes'] .= $attribute['public_group_name'].' : '.$attribute['attribute_name'].', ';
$row['attributes_small'] .= $attribute['attribute_name'].', ';
}
$row['link'] = Context::getContext()->link->getProductLink(
$row['id_product'],
$row['link_rewrite'],
$row['category']
);
$row['image_quote'] = Context::getContext()->link->getImageLink(
$row['link_rewrite'],
$row['id_image'],
ImageType::getFormatedName('cart')
);
//$row['image_cart'] = '';
$row['qty_in_cart'] = Db::getInstance()->getValue(
'SELECT qty
FROM `'._DB_PREFIX_.'roja45_quotationspro_requestproduct`
WHERE `id_roja45_quotation_request` = '.(int) $row['id_roja45_quotation_request'] .'
AND `id_product` = '.(int) $row['id_product']
);
$this->_products[] = $row;
}
return $this->_products;
}
public function updateQty(
$quantity,
$id_product,
$id_product_attribute = null,
$mode = 'up',
Shop $shop = null
) {
if (!$shop) {
$shop = Context::getContext()->shop;
}
if (!$mode) {
$mode = 'up';
}
$id_customization = null;
$product = new Product($id_product, false, Configuration::get('PS_LANG_DEFAULT'), $shop->id);
if ($id_product_attribute) {
$combination = new Combination((int)$id_product_attribute);
if ($combination->id_product != $id_product) {
return false;
}
}
/* If we have a product combination, the minimal quantity is set with the one of this combination */
if (!empty($id_product_attribute)) {
$minimal_quantity = (int)Attribute::getAttributeMinimalQty($id_product_attribute);
} else {
$minimal_quantity = (int)$product->minimal_quantity;
}
if (!Validate::isLoadedObject($product)) {
die(Tools::displayError());
}
if (isset(self::$_nbProducts[$this->id])) {
unset(self::$_nbProducts[$this->id]);
}
if (isset(self::$_totalWeight[$this->id])) {
unset(self::$_totalWeight[$this->id]);
}
if ((int)$quantity <= 0) {
return $this->deleteProduct(
(int) $id_product,
(int) $id_product_attribute,
(int) $id_customization
);
} elseif (!$product->available_for_order) {
return false;
} else {
$result = $this->containsProduct(
(int) $id_product,
(int) $id_product_attribute,
(int) $id_customization
);
if ($result) {
if ($mode == 'up') {
$sql = 'SELECT stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
FROM '._DB_PREFIX_.'product p
'.Product::sqlStock('p', $id_product_attribute, true, $shop).'
WHERE p.id_product = '.$id_product;
$result2 = Db::getInstance()->getRow($sql);
$product_qty = (int)$result2['quantity'];
$new_qty = (int)$result['qty'] + (int)$quantity;
//$qty = '+ '.(int)$quantity;
if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock'])) {
if ($new_qty > $product_qty) {
return false;
}
}
} elseif ($mode == 'down') {
//$qty = '- '.(int)$quantity;
$new_qty = (int)$result['qty'] - (int)$quantity;
if ($new_qty < $minimal_quantity && $minimal_quantity > 1) {
return -1;
}
} else {
return false;
}
/* Delete product from cart */
if ($new_qty <= 0) {
return $this->deleteProduct(
(int)$id_product,
(int)$id_product_attribute,
(int)$id_customization
);
} elseif ($new_qty < $minimal_quantity) {
return -1;
} else {
QuotationRequestProduct::updateQty((int)$this->id, $id_product, $id_product_attribute, $new_qty);
}
} elseif ($mode == 'up') {
$sql = 'SELECT stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
FROM '._DB_PREFIX_.'product p
'.Product::sqlStock('p', $id_product_attribute, true, $shop).'
WHERE p.id_product = '.$id_product;
$result2 = Db::getInstance()->getRow($sql);
if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock'])) {
if ((int)$quantity > $result2['quantity']) {
return false;
}
}
if ((int)$quantity < $minimal_quantity) {
return -1;
}
$request_product = new QuotationRequestProduct();
$request_product->id_product = (int )$id_product;
$request_product->id_shop = (int) $shop->id;
$request_product->id_product_attribute = (int) $id_product_attribute;
$request_product->id_roja45_quotation_request = (int)$this->id;
$request_product->qty = (int) $quantity;
$request_product->date_add = (int) $quantity;
if (!$request_product->save()) {
return false;
}
}
}
$this->_products = $this->getProducts();
$this->update();
return true;
}
public function getLastProductAdded()
{
// TODO - return last product added.
}
public function deleteProduct(
$id_product,
$id_product_attribute = null
) {
if (isset(self::$_nbProducts[$this->id])) {
unset(self::$_nbProducts[$this->id]);
}
if (isset(self::$_totalWeight[$this->id])) {
unset(self::$_totalWeight[$this->id]);
}
/* Product deletion */
$result = Db::getInstance()->execute(
'DELETE FROM `'._DB_PREFIX_.'roja45_quotationspro_requestproduct`
WHERE `id_product` = '.(int)$id_product.
(!is_null($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : '').'
AND `id_roja45_quotation_request` = '.(int)$this->id
);
if ($result) {
$return = $this->update();
// refresh cache of self::_products
$this->_products = $this->getProducts();
return $return;
}
return false;
}
public function deleteProducts()
{
/* Product deletion */
foreach ($this->getProducts() as $product) {
$this->deleteProduct($product['id_product'], $product['id_product_attribute']);
}
}
public function containsProduct($id_product, $id_product_attribute = 0, $id_customization = 0)
{
$sql = new DbQuery();
$sql->select('rp.qty');
$sql->from('roja45_quotationspro_requestproduct', 'rp');
if ($id_customization) {
$sql->join(
'LEFT JOIN `'._DB_PREFIX_.'customization` cs
ON (c.id_product = rp.id_product) AND c.`id_product_attribute` = rp.`id_product_attribute`'
);
}
$sql->where('rp.`id_product` = '.(int)$id_product);
$sql->where('rp.`id_product_attribute` = '.(int)$id_product_attribute);
$sql->where('rp.`id_roja45_quotation_request` = '.(int)$this->id);
$sql = $sql->build();
$result = Db::getInstance()->getRow($sql);
return $result;
}
public function update($null_values = false)
{
if (isset(self::$_nbProducts[$this->id])) {
unset(self::$_nbProducts[$this->id]);
}
if (isset(self::$_totalWeight[$this->id])) {
unset(self::$_totalWeight[$this->id]);
}
$this->_products = null;
$return = parent::update($null_values);
return $return;
}
public function getSummaryDetails($id_lang = null, $refresh = false)
{
$products = $this->getProducts();
$summary = array(
'products' => array_values($products),
'nbTotalProducts' => count($products),
'request_qty' => QuotationRequest::getNumberOfProducts($this->id),
);
return $summary;
}
public function setTaxCalculationMethod()
{
$this->_taxCalculationMethod = Group::getPriceDisplayMethod(Group::getCurrent()->id);
}
public static function getNumberOfProducts($id_roja45_quotation_request)
{
if (isset(self::$_nbProducts[$id_roja45_quotation_request]) &&
self::$_nbProducts[$id_roja45_quotation_request] !== null) {
return self::$_nbProducts[$id_roja45_quotation_request];
}
self::$_nbProducts[$id_roja45_quotation_request] = (int)Db::getInstance()->getValue(
'SELECT SUM(`qty`)
FROM `'._DB_PREFIX_.'roja45_quotationspro_requestproduct`
WHERE `id_roja45_quotation_request` = '.(int)$id_roja45_quotation_request
);
return self::$_nbProducts[$id_roja45_quotation_request];
}
}