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/Hooks/HooksPS81.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\Hooks;

use PrestaShop\Module\Chatgptcontentgenerator\Entity\GptContentGenerator as ContentGeneratorEntity;
use PrestaShop\Module\Chatgptcontentgenerator\Entity\GptHistory;
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\DataColumn;
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\StatusColumn;
use PrestaShop\PrestaShop\Core\Grid\Filter\Filter;
use PrestaShopBundle\Form\Admin\Type\IntegerMinMaxFilterType;
use PrestaShopBundle\Form\Admin\Type\YesAndNoChoiceType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

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

class HooksPS81 extends AbstractHooks
{
    public function __construct(\Chatgptcontentgenerator $module)
    {
        $this->isNewVersion = $this->isProductFormV2();

        parent::__construct($module);
    }

    public function getRegisterHooks(): array
    {
        return array_merge(
            parent::getRegisterHooks(),
            [
                'actionProductGridDefinitionModifier',
                'actionProductGridQueryBuilderModifier',
                'actionAfterUpdateCombinationListFormHandler',
                'displayAdminProductsMainStepLeftColumnBottom',
                'actionObjectProductUpdateBefore',
                'actionCategoryFormBuilderModifier',
                'actionObjectCategoryUpdateBefore',
                'actionCmsPageFormBuilderModifier',
                'actionObjectCmsUpdateBefore',
                'actionProductFormBuilderModifier',
                'actionBeforeUpdateProductFormHandler',
                'actionObjectProductDeleteBefore',
                'actionObjectCategoryDeleteBefore',
                'actionObjectCmsPageDeleteBefore',
            ]
        );
    }

    protected function getAdminPageName(): array
    {
        $adminPageName = '';
        $adminPageId = 0;

        if ($request = $this->getRequest()) {
            if (in_array($request->attributes->get('_route'), ['admin_products_index', 'admin_product_catalog'])) {
                $adminPageName = 'productsList';
            } elseif ($request->attributes->get('_route') == 'admin_categories_index') {
                $adminPageName = 'categoriesList';
            } elseif (in_array($request->attributes->get('_route'), ['admin_product_form', 'admin_products_edit'])) {
                $adminPageName = 'productForm';
            } elseif ($request->attributes->get('_route') == 'admin_categories_edit') {
                $adminPageName = 'categoryForm';
                $adminPageId = (int) $request->attributes->get('categoryId');
            } elseif ($request->attributes->get('_route') == 'admin_cms_pages_edit'
                || $request->attributes->get('_route') == 'admin_cms_pages_create') {
                $adminPageName = 'cmsForm';
                $adminPageId = (int) $request->attributes->get('cmsPageId');
            }
        }

        return [$adminPageName, $adminPageId];
    }

    protected function getProductId(): int
    {
        $id = (int) $this->getRequest()->attributes->get('productId');
        return $id ? $id : (int) $this->getRequest()->attributes->get('id');
    }

    protected function getMediaPatchForVersion(): string
    {
        return 'ps81';
    }

    public function _hookActionCategoryGridDefinitionModifierDev(array $params)
    {
        // $this->setDefinitionModifier($params['definition']);
        $definition = $params['definition'];
        $definition
            ->getColumns()
            ->addAfter(
                'name',
                (new DataColumn('generated_langs'))
                    ->setName($this->translator->trans('Content ChatGPT', [], 'Modules.Chatgptcontentgenerator.Admin'))
                    ->setOptions([
                        'field' => 'generated_langs',
                    ])
            )
            ->addAfter(
                'generated_langs',
                (new DataColumn('translated_langs'))
                    ->setName($this->translator->trans('Tranlsate ChatGPT', [], 'Modules.Chatgptcontentgenerator.Admin'))
                    ->setOptions([
                        'field' => 'translated_langs',
                    ])
            )
        ;

        $definition->getFilters()
            ->add(
                (new Filter('generated_langs', ChoiceType::class))
                    ->setTypeOptions([
                        'required' => false,
                        'multiple' => true,
                        'placeholder' => $this->translator->trans('All', [], 'Admin.Global'),
                        'choices' => $this->getLanguages(),
                        'attr' => [
                            'class' => 'gpt-select2',
                        ],
                    ])
                    ->setAssociatedColumn('generated_langs')
            )
            ->add(
                (new Filter('translated_langs', ChoiceType::class))
                    ->setTypeOptions([
                        'required' => false,
                        'multiple' => true,
                        'choices' => $this->getLanguages(),
                        'attr' => [
                            'class' => 'gpt-select2',
                        ],
                    ])
                    ->setAssociatedColumn('translated_langs')
            )
        ;
    }

    public function _hookActionCategoryGridQueryBuilderModifierDev(array $params)
    {
        $subTable = $this->prepareContentGeneratorSql($params, ContentGeneratorEntity::TYPE_CATEGORY);

        $params['search_query_builder']->leftJoin(
            'c',
            $subTable,
            'content_gen',
            'content_gen.`id_object` = c.`id_category`'
        );

        $params['search_query_builder']->addSelect('content_gen.generated_langs, content_gen.translated_langs');

        $params['count_query_builder']->leftJoin(
            'c',
            $subTable,
            'content_gen',
            'content_gen.`id_object` = c.`id_category`'
        );

        // $params['count_query_builder']->leftJoin(
        //     'p',
        //     '`' . pSQL(_DB_PREFIX_) . 'spinoff_connections`',
        //     'con',
        //     'p.`id_product` = con.`id_spinoff`'
        // );

        // $params['search_query_builder']->leftJoin(
        //     'p',
        //     '`' . pSQL(_DB_PREFIX_) . 'spinoff_connections`',
        //     'con',
        //     'p.`id_product` = con.`id_spinoff`'
        // );
    }

    public function _hookActionProductGridDefinitionModifier(array $params)
    {
        $this->setDefinitionModifier($params['definition']);
    }

    public function _hookActionProductGridQueryBuilderModifier(array $params)
    {
        $subTable = $this->prepareContentGeneratorSql($params, ContentGeneratorEntity::TYPE_PRODUCT);

        $params['search_query_builder']->leftJoin(
            'p',
            $subTable,
            'content_gen',
            'content_gen.`id_object` = p.`id_product`'
        );

        $params['count_query_builder']->leftJoin(
            'p',
            $subTable,
            'content_gen',
            'content_gen.`id_object` = p.`id_product`'
        );

        $params['count_query_builder']->leftJoin(
            'p',
            '`' . pSQL(_DB_PREFIX_) . 'spinoff_connections`',
            'con',
            'p.`id_product` = con.`id_spinoff`'
        );

        $params['search_query_builder']->leftJoin(
            'p',
            '`' . pSQL(_DB_PREFIX_) . 'spinoff_connections`',
            'con',
            'p.`id_product` = con.`id_spinoff`'
        );
    }

    protected function setDefinitionModifier($definition)
    {
        $definition
            ->getColumns()
            ->addAfter(
                'name',
                (new DataColumn('generated_langs'))
                    ->setName($this->translator->trans('Content ChatGPT', [], 'Modules.Chatgptcontentgenerator.Admin'))
                    ->setOptions([
                        'field' => 'generated_langs',
                    ])
            )
            ->addAfter(
                'generated_langs',
                (new DataColumn('translated_langs'))
                    ->setName($this->translator->trans('Tranlsate ChatGPT', [], 'Modules.Chatgptcontentgenerator.Admin'))
                    ->setOptions([
                        'field' => 'translated_langs',
                    ])
            )
            ->addAfter(
                'active',
                (new StatusColumn('is_spinoff'))
                    ->setName($this->translator->trans('is Spin-off', [], 'Modules.Chatgptspinoff.Admin'))
                    ->setOptions([
                        'field' => 'is_spinoff',
                    ])
            )
            ->addAfter(
                'active',
                (new DataColumn('count_spinoffs'))
                    ->setName($this->translator->trans('Spin-offs', [], 'Modules.Chatgptspinoff.Admin'))
                    ->setOptions([
                        'field' => 'count_spinoffs',
                    ])
            )
        ;

        $definition->getFilters()
            ->add(
                (new Filter('generated_langs', ChoiceType::class))
                    ->setTypeOptions([
                        'required' => false,
                        'multiple' => true,
                        'placeholder' => $this->translator->trans('All', [], 'Admin.Global'),
                        'choices' => $this->getLanguages(),
                        'attr' => [
                            'class' => 'gpt-select2',
                        ],
                    ])
                    ->setAssociatedColumn('generated_langs')
            )
            ->add(
                (new Filter('translated_langs', ChoiceType::class))
                    ->setTypeOptions([
                        'required' => false,
                        'multiple' => true,
                        'choices' => $this->getLanguages(),
                        'attr' => [
                            'class' => 'gpt-select2',
                        ],
                    ])
                    ->setAssociatedColumn('translated_langs')
            )
            ->add(
                (new Filter('is_spinoff', YesAndNoChoiceType::class))
                    ->setAssociatedColumn('is_spinoff')
            )
            ->add(
                (new Filter('count_spinoffs', IntegerMinMaxFilterType::class))
                    ->setTypeOptions([
                        'required' => false,
                    ])
                    ->setAssociatedColumn('count_spinoffs')
            )
        ;
    }

    protected function prepareContentGeneratorSql(&$params, $type)
    {
        /** @var QueryBuilder $searchQueryBuilder */
        $searchQueryBuilder = $params['search_query_builder'];

        /** @var CustomerFilters $searchCriteria */
        $searchCriteria = $params['search_criteria'];

        /** @var QueryBuilder $countQueryBuilder */
        $countQueryBuilder = $params['count_query_builder'];

        $subSelect = '';

        foreach ($searchCriteria->getFilters() as $filterName => $filterValue) {
            if ('generated_langs' === $filterName) {
                if (!is_array($filterValue)) {
                    $filterValue = [$filterValue];
                }

                $subSelect .= ', SUM(IF(gptgc.id_lang IN (' .
                    pSql(implode(', ', $filterValue)) . ') ' .
                    'AND IFNULL(gptgc.is_generated, 0)=1, 1, 0)) AS `gcolumn`';

                $sqlWhereGeneratedLangs = 'IFNULL(content_gen.gcolumn, 0) = ' . count($filterValue);
                $searchQueryBuilder->andWhere($sqlWhereGeneratedLangs);
                $countQueryBuilder->andWhere($sqlWhereGeneratedLangs);
            }

            if ('translated_langs' === $filterName) {
                if (!is_array($filterValue)) {
                    $filterValue = [$filterValue];
                }

                $subSelect .= ', SUM(IF(gptgc.id_lang IN (' .
                    pSql(implode(', ', $filterValue)) . ') ' .
                    'AND IFNULL(gptgc.is_translated, 0)=1, 1, 0)) AS `tcolumn`';

                $sqlWhereTranslatedLangs = 'IFNULL(content_gen.tcolumn, 0) = ' . count($filterValue);
                $searchQueryBuilder->andWhere($sqlWhereTranslatedLangs);
                $countQueryBuilder->andWhere($sqlWhereTranslatedLangs);
            }

            if ('is_spinoff' === $filterName) {
                if ($filterValue) {
                    $sqlWhereIsSpinOff = 'con.`id_spinoff` > 0';
                } else {
                    $sqlWhereIsSpinOff = 'con.`id_spinoff` IS NULL';
                }
                $searchQueryBuilder->andWhere($sqlWhereIsSpinOff);
                $countQueryBuilder->andWhere($sqlWhereIsSpinOff);
            }

            if ('count_spinoffs' === $filterName) {
                $sqlQueryLeftJoin = '(
                    SELECT id_product, COUNT(*) AS count_spinoffs
                    FROM ' . pSQL(_DB_PREFIX_) . 'spinoff_connections
                    GROUP BY id_product
                )';

                $searchQueryBuilder->leftJoin(
                    'p',
                    $sqlQueryLeftJoin,
                    'soc',
                    'p.`id_product` = soc.`id_product`'
                );

                $countQueryBuilder->leftJoin(
                    'p',
                    $sqlQueryLeftJoin,
                    'soc',
                    'p.`id_product` = soc.`id_product`'
                );

                if (isset($filterValue['min_field'])) {
                    $searchQueryBuilder->andWhere('IFNULL(count_spinoffs, 0) >= :count_spinoffs_min');
                    $searchQueryBuilder->setParameter('count_spinoffs_min', $filterValue['min_field']);

                    $countQueryBuilder->andWhere('IFNULL(count_spinoffs, 0) >= :count_spinoffs_min');
                    $countQueryBuilder->setParameter('count_spinoffs_min', $filterValue['min_field']);
                }
                if (isset($filterValue['max_field'])) {
                    $searchQueryBuilder->andWhere('IFNULL(count_spinoffs, 0) <= :count_spinoffs_max');
                    $searchQueryBuilder->setParameter('count_spinoffs_max', $filterValue['max_field']);

                    $countQueryBuilder->andWhere('IFNULL(count_spinoffs, 0) <= :count_spinoffs_max');
                    $countQueryBuilder->setParameter('count_spinoffs_max', $filterValue['max_field']);
                }
            }
        }

        $subTable = '(
            SELECT
                gptgc.id_object,
                GROUP_CONCAT(IF(IFNULL(gptgc.is_generated, 0)=1, l.iso_code, NULL) SEPARATOR \',\') AS `generated_langs`,
                GROUP_CONCAT(IF(IFNULL(gptgc.is_translated, 0)=1, l.iso_code, NULL) SEPARATOR \',\') AS `translated_langs`
                ' . $subSelect . '
            FROM `' . pSQL(_DB_PREFIX_) . 'content_generator` AS gptgc
            LEFT JOIN `' . pSQL(_DB_PREFIX_) . 'lang` as l ON (gptgc.`id_lang` = l.`id_lang`)
            WHERE gptgc.object_type = ' . (int) $type .
            ' GROUP BY gptgc.id_object
        )';

        if ($type == ContentGeneratorEntity::TYPE_PRODUCT) {
            $searchQueryBuilder->addSelect('
                IFNULL(content_gen.`generated_langs`, \'---\') AS generated_langs,
                IFNULL(content_gen.`translated_langs`, \'---\') AS translated_langs,
                CASE WHEN con.`id_spinoff` IS NULL THEN 0 ELSE 1 END AS `is_spinoff`,
                IFNULL(
                    (SELECT COUNT(*) FROM `' . pSQL(_DB_PREFIX_) . 'spinoff_connections` con2
                        WHERE con2.`id_product` = p.`id_product` GROUP BY con2.`id_product`),
                    \'---\') AS count_spinoffs
            ');
        }

        return $subTable;
    }

    public function _hookActionAfterUpdateCombinationListFormHandler(array $params)
    {
        if (!empty($params['id']) && !empty($params['form_data'])) {
            $idProduct = $params['id'];
            $product_list = [];

            if (!GptSpinoffConnections::getConectionsBySpinOffId($idProduct)) {
                foreach ($params['form_data'] as $combination) {
                    $product_list[] = [
                        'product_id' => $idProduct,
                        'product_attribute_id' => $combination['combination_id'],
                        'quantity' => $combination['delta_quantity']['quantity'],
                    ];
                }
            }

            if ($product_list) {
                GptSpinoffConnections::updateStockByProductList($product_list, $this->context->language->id);
            }
        }
    }

    protected function getGptVersionSelectors(): array
    {
        if ($this->isProductFormV2() == false) {
            return array_merge(
                parent::getGptVersionSelectors(),
                [
                    'pfLiTabs6Id' => 'tab_step6',
                    'pfContent6Id' => 'step6',
                    'pfTabsContentId' => 'form-loading',
                    'pfIsoCodeId' => 'form_switch_language',
                    'pfName' => '#form_step1_name_',
                    'pfDescription' => '#description',
                    'pfDescriptionShort' => '#description_short',
                    'pfManufacturerId' => '#form_step1_id_manufacturer',

                    'plProductFormId' => 'product_catalog_list',
                    'plBulkMenu' => '.bulk-catalog .dropdown-menu',
                    'plBulkSelectedName' => 'bulk_action_selected_products[]',
                ]
            );
        }

        return parent::getGptVersionSelectors();
    }

    protected function getContentEditorPreffix(): array
    {
        if ($this->isProductFormV2() == false) {
            return array_merge(
                parent::getContentEditorPreffix(),
                [
                    'description' => 'form_step1_description_',
                    'descriptionShort' => 'form_step1_description_short_',
                    'name' => 'form_step1_name_',
                ]
            );
        }

        return parent::getContentEditorPreffix();
    }

    public function _hookActionObjectProductUpdateBefore(array $params)
    {
        if ($this->isProductFormV2() == false) {
            if (\Tools::isSubmit('is_gpt_edited') && \Tools::getValue('is_gpt_edited') === '1') {
                $id_product = $params['object']->id;
                $product = new \Product($id_product);

                GptHistory::addHistoryList($id_product, $product->name, $product->description, $product->description_short);
            }
        }
    }

    public function _hookActionBeforeUpdateProductFormHandler(array $params)
    {
        if (\Tools::isSubmit('is_gpt_edited') && \Tools::getValue('is_gpt_edited') === '1') {
            $id_product = $params['id'];
            $product = new \Product($id_product);

            GptHistory::addHistoryList($id_product, $product->name, $product->description, $product->description_short);
        }
    }
}