HEX
Server: Apache
System: Linux srv13.cpanelhost.cl 3.10.0-962.3.2.lve1.5.38.el7.x86_64 #1 SMP Thu Jun 18 05:28:41 EDT 2020 x86_64
User: cca63905 (4205)
PHP: 7.3.20
Disabled: NONE
Upload Files
File: /home4/cca63905/www/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];
    }
}