Current File : /var/www/vinorea/modules/ipexportimport/classes/import/order/EIAOrderCartRule.php
<?php
/**
 *
 * NOTICE OF LICENSE
 *
 *  @author    SmartPresta <tehran.alishov@gmail.com>
 *  @copyright 2024 SmartPresta
 *  @license   Commercial License
 */

if (!defined('_PS_VERSION_')) {
    exit;
}

class EIAOrderCartRule
{

    public $id_order;
    public $name;
    public $value;
    public $code;
    public $value_tax_excl;
    public $id_order_cart_rule;
    public $id_cart_rule;
    public $free_shipping;
    public $baseOrderData;
    public $row;
    public $id_process;
    public $validateOnly;

    public function __construct($id_order = null, $baseOrderData = null, $row = null, $id_process = null, $validateOnly = false)
    {
        $this->id_order = (int) $id_order;
        $this->baseOrderData = $baseOrderData;
        $this->row = $row;
        $this->id_process = $id_process;
        $this->validateOnly = $validateOnly;
    }

    public function save()
    {
        if (empty($this->baseOrderData['cart_rule_name'])) {
            return false;
        }

        foreach ($this->baseOrderData['cart_rule_name'] as $key => $val) {
            $this->id_order_cart_rule = $id_order_cart_rule = $this->getOrderCartRule($key);
            $obj = new OrderCartRule($id_order_cart_rule);
            $this->getObjectVariables($this->baseOrderData, $obj, $key);
            $obj->id_cart_rule = $this->id_cart_rule;
            $obj->id_order = $this->id_order;
            $obj->name = $this->name;
            $obj->value = $this->value;
            $obj->value_tax_excl = $this->value_tax_excl;
            $obj->free_shipping = $this->free_shipping;
            if (($error = $obj->validateFields(false, true)) !== true) {
                throw new PrestaShopException("Error: $error. ID: $this->id_order. Row in file: $this->row.");
            }
            $this->validateOnly || $obj->save();
        }
    }

    private function getObjectVariables($data, $obj, $key)
    {
        if (isset($data['cart_rule_code'][$key])) {
            $this->code = $data['cart_rule_code'][$key] ? $data['cart_rule_code'][$key] : '';
        }

        if (isset($data['cart_rule_name'][$key])) {
            $this->name = $data['cart_rule_name'][$key] ? $data['cart_rule_name'][$key] : '';
        } else {
            $this->name = $obj->name;
        }

        if (isset($data['cart_rule_value'][$key])) {
            $this->value = $data['cart_rule_value'][$key] ? EIATools::preparePrice($data['cart_rule_value'][$key]) : 0;
        } else {
            $this->value = $obj->value;
        }

        if (isset($data['cart_rule_value_tax_excl'][$key])) {
            $this->value_tax_excl = $data['cart_rule_value_tax_excl'][$key] ? EIATools::preparePrice($data['cart_rule_value_tax_excl'][$key]) : 0;
        } else {
            $this->value_tax_excl = $obj->value_tax_excl;
        }

        if (isset($data['cart_rule_free_shipping'][$key])) {
            $this->free_shipping = $data['cart_rule_free_shipping'][$key] ? (int) $data['cart_rule_free_shipping'][$key] : 0;
        } else {
            $this->free_shipping = $obj->free_shipping;
        }

        if (!$this->id_order_cart_rule) {
            $this->id_cart_rule = $this->getCartRule($key);
        } else {
            $this->id_cart_rule = $obj->id_cart_rule;
        }
    }

    private function getOrderCartRule($key)
    {
        $name = '';
        if (isset($this->baseOrderData['cart_rule_name'][$key]) && $this->baseOrderData['cart_rule_name'][$key]) {
            $name = " AND o.name = '" . pSQL($this->baseOrderData['cart_rule_name'][$key]) . "'";
        }

        if (!$name) {
            return false;
        }

        $sql = "
            SELECT *
            FROM " . _DB_PREFIX_ . "order_cart_rule as o
            WHERE o.id_order = " . (int) $this->id_order . "
            " . $name . "
           ";
        $order_cart_rule = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
        if (isset($order_cart_rule['id_order_cart_rule']) && $order_cart_rule['id_order_cart_rule']) {
            return $order_cart_rule['id_order_cart_rule'];
        }
        return false;
    }

    private function getCartRule($key)
    {
        $code = '';
        if (isset($this->baseOrderData['cart_rule_code'][$key]) && $this->baseOrderData['cart_rule_code'][$key]) {
            $code = " AND c.code = '" . pSQL($this->baseOrderData['cart_rule_code'][$key]) . "'";
        }

        if (!$code) {
            return false;
        }

        $sql = "
            SELECT *
            FROM " . _DB_PREFIX_ . "cart_rule as c
            WHERE 1
            " . $code . "
           ";
        $cart_rule = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
        if (isset($cart_rule['id_cart_rule']) && $cart_rule['id_cart_rule']) {
            return $cart_rule['id_cart_rule'];
        }
        return false;
    }

}