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: //proc/self/cwd/nueva/modules/chatgptcontentgenerator/src/Entity/GptSpinoffConnections.php
<?php
/**
 * 2007-2024 PrestaShop
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to http://www.prestashop.com for more information.
 *
 *  @author    PrestaShop SA <contact@prestashop.com>
 *  @copyright 2007-2024 PrestaShop SA
 *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 *  International Registered Trademark & Property of PrestaShop SA
 */

namespace PrestaShop\Module\Chatgptcontentgenerator\Entity;

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

class GptSpinoffConnections extends \ObjectModel
{
    public $id;
    public $id_spinoff;
    public $id_product;
    public $stock;

    public const SPINOFF_STOCK_COMMON = 1;
    public const SPINOFF_STOCK_INDIVIDUAL = 2;

    public static $definition = [
        'table' => 'spinoff_connections',
        'primary' => 'id',
        'multilang' => false,
        'fields' => [
            'id_spinoff' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true],
            'id_product' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true],
            'stock' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true],
        ],
    ];

    public static function getConectionsByProductId($id_product)
    {
        if (!$id_product) {
            return [];
        }

        $sql = 'SELECT id_spinoff, stock FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`
                WHERE id_product = ' . (int) $id_product;

        return \Db::getInstance()->executeS($sql);
    }

    public static function getConectionsBySpinOffId($id_spinoff)
    {
        if (!$id_spinoff) {
            return [];
        }
        $sql = 'SELECT id, id_spinoff, stock, id_product FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`
                WHERE id_spinoff = ' . (int) $id_spinoff;

        return \Db::getInstance()->getRow($sql);
    }

    public static function deleteConectionsBySpinOffId($id_spinoff)
    {
        if (!$id_spinoff) {
            return false;
        }

        $sql = 'DELETE FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`
                WHERE id_spinoff = ' . (int) $id_spinoff;

        return \Db::getInstance()->execute($sql);
    }

    public static function getAllConections()
    {
        $sql = 'SELECT id_spinoff FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`';

        return \Db::getInstance()->executeS($sql);
    }

    public static function getAllConectionsInfoByLang($id_lang, $isActive = true)
    {
        if (!$id_lang) {
            return [];
        }

        $sql = 'SELECT sc.`id_spinoff`, pl.`name` FROM `' . _DB_PREFIX_ . self::$definition['table'] . '` sc
                LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl ON (pl.`id_product` = sc.`id_spinoff`)';

        if (true === $isActive) {
            $sql .= ' LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON (p.`id_product` = sc.`id_spinoff`)';
        }

        $sql .= ' WHERE pl.`id_lang` = ' . (int) $id_lang;

        if (true === $isActive) {
            $sql .= ' AND p.`active` = 1';
        }

        $sql .= ' ORDER BY pl.`name`';

        return \Db::getInstance()->executeS($sql);
    }

    public function delete()
    {
        $product = new \Product($this->id_spinoff);
        $product->delete();

        return parent::delete();
    }

    public static function getConectionsBySpinOffIdList(array $spinoffIdList)
    {
        if (!$spinoffIdList) {
            return [];
        }
        $sql = 'SELECT id_spinoff FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`
                WHERE id_spinoff IN (' . implode(', ', $spinoffIdList) . ') ';

        return \Db::getInstance()->executeS($sql);
    }

    public static function countSpinOffsByProductId($id_product)
    {
        if (!$id_product) {
            return [];
        }
        $sql = 'SELECT COUNT(*) AS spinoffs_count FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`
                WHERE id_product = ' . (int) $id_product;

        return \Db::getInstance()->executeS($sql);
    }

    public static function countAllSpinOffs()
    {
        $sql = 'SELECT COUNT(*) AS spinoffs_count FROM `' . _DB_PREFIX_ . self::$definition['table'] . '`';

        $count = \Db::getInstance()->getRow($sql);

        return isset($count['spinoffs_count']) ? (int) $count['spinoffs_count'] : 0;
    }

    public static function updateStockByProductList(array $product_list, $id_lang)
    {
        \Chatgptcontentgenerator::$isUpdateStock = false;
        foreach ($product_list as $product) {
            $attributes_list = [];
            $id_product = $product['product_id'];
            $id_product_attribute = $product['product_attribute_id'];

            if (isset($product['quantity'])) {
                $quantity = (int) $product['quantity'];
            } else {
                $quantity = \StockAvailable::getQuantityAvailableByProduct($id_product, $id_product_attribute);
            }

            if ($id_product_attribute) {
                $product = new \Product($id_product);
                foreach ($product->getAttributesGroups($id_lang, $id_product_attribute) as $attributeGroup) {
                    $attributes_list[] = $attributeGroup['id_attribute'];
                }
            }

            // if the main product
            $spinOffs = self::getConectionsByProductId($id_product);
            if ($spinOffs) {
                foreach ($spinOffs as $spinOff) {
                    if ($spinOff['stock'] == self::SPINOFF_STOCK_COMMON) {
                        self::updateProductStock($spinOff['id_spinoff'], $attributes_list, $quantity);
                    }
                }
            }

            // if the spinn off product
            $spinoffConnections = self::getConectionsBySpinOffId($id_product);
            if ($spinoffConnections && $spinoffConnections['stock'] == self::SPINOFF_STOCK_COMMON) {
                self::updateProductStock($spinoffConnections['id_product'], $attributes_list, $quantity);

                $spinOffs = self::getConectionsByProductId($spinoffConnections['id_product']);
                if ($spinOffs) {
                    foreach ($spinOffs as $spinOff) {
                        if ($spinOff['stock'] == self::SPINOFF_STOCK_COMMON && $spinOff['id_spinoff'] != $id_product) {
                            self::updateProductStock($spinOff['id_spinoff'], $attributes_list, $quantity);
                        }
                    }
                }
            }
        }
        \Chatgptcontentgenerator::$isUpdateStock = true;
    }

    public static function updateProductStock($id_product, $attributes_list, $quantity)
    {
        $id_product_attribute = 0;

        if ($attributes_list) {
            $product = new \Product($id_product);
            $id_product_attribute = $product->productAttributeExists($attributes_list, false, null, false, true);
        }

        \StockAvailable::setQuantity($id_product, $id_product_attribute, $quantity);
    }
}