Current File : /var/www/vinorea/modules/sendinblue/hooks/ActionProductsHook.php
<?php
/**
 * 2007-2025 Sendinblue
 *
 * 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 contact@sendinblue.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    Sendinblue <contact@sendinblue.com>
 * @copyright 2007-2025 Sendinblue
 * @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 * International Registered Trademark & Property of Sendinblue
 */

namespace Sendinblue\Hooks;

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

class ActionProductsHook extends AbstractHook
{
    const EVENT_PRODUCT_CREATED = '/events/%s/products_sync?action=product_created';

    const EVENT_PRODUCT_DELETED = '/events/%s/products_sync?action=product_deleted';

    const EVENT_PRODUCT_UPDATED = '/events/%s/products_sync?action=product_updated';

    const EVENT_PRODUCT_VIEWED = '/events/%s/product_viewed';

    public function handleEvent($data)
    {
        try {
            $product = [];
            if (empty($data['id_product'])) {
                return $product;
            }

            $defaultLanguage = (int) \Context::getContext()->language->id;

            $data = new \Product($data['id_product'], false, $defaultLanguage);
            $link = new \Link();

            $productName = $data->name;
            if (is_array($productName)) {
                foreach ($productName as $value) {
                    if (isset($value)) {
                        $productName = $value;
                        break;
                    }
                }
            }
            $product['id'] = (int) $data->id;
            $product['name'] = $productName;
            $product['date_created'] = date(DATE_ATOM, strtotime($data->date_add));
            $product['date_modified'] = date(DATE_ATOM, strtotime($data->date_upd));
            $product['permalink'] = $link->getProductLink($data);
            $product['type'] = isset($data->product_type) ? $data->product_type : '';
            $product['status'] = isset($data->active) ? 'active' : 'inactive';
            $product['description'] = isset($data->description) ? $data->description : '';
            $product['short_description'] = isset($data->description_short) ? $data->description_short : '';
            $product['sku'] = $data->reference;
            $product['price'] = (string) \ProductCore::getPriceStatic($data->id);
            $product['regular_price'] = $data->wholesale_price;
            $product['sale_price'] = $data->price;
            $product['stock_status'] = $data->state ? 'available' : 'unavailable';
            $product['category_names'] = [];
            if (!empty($data->id_category_default)) {
                $category = new \Category($data->id_category_default, $defaultLanguage);
                $product['category_names'] = $category->name;
                $product['categories'][] = (object) [
                    'id' => (int) $category->id,
                    'name' => $category->name,
                    'slug' => $category->link_rewrite,
                    'parent' => (int) $category->id_parent,
                    'description' => $category->description,
                    'display' => $category->active ? 'active' : 'inactive',
                    'image' => (object) [
                        'id' => (int) $category->id_image,
                        'src' => 'http://' . $link->getImageLink($category->link_rewrite, $category->id_image),
                    ],
                    'menu_order' => (int) $category->level_depth,
                ];
            }
            $imagesQuery = sprintf('SELECT id_image FROM %simage_shop WHERE id_product = %s AND id_shop = %s AND cover = %d', _DB_PREFIX_, $data->id, $data->id_shop_default, 1);
            $images = \DbCore::getInstance()->executeS($imagesQuery, true, false);
            $product['main_image_src'] = '';
            if (!empty($images)) {
                $product['images'] = [];
                foreach ($images as $image) {
                    $img_obj = (object) [
                        'id' => (int) $image['id_image'],
                        'src' => 'http://' . $link->getImageLink($data->link_rewrite, $image['id_image']),
                    ];
                    array_push($product['images'], $img_obj);
                    if (empty($product['main_image_src'])) {
                        $product['main_image_src'] = $img_obj->src;
                    }
                }
            }

            return $product;
        } catch (\Exception $e) {
            \PrestaShopLogger::addLog($e->getMessage(), 3);
        }
    }

    public function productAddEvent($product)
    {
        try {
            $product = $this->handleEvent($product);
            if (!empty($product)) {
                $this->getApiClientService()->productEvents($product, self::EVENT_PRODUCT_CREATED);
            }
        } catch (\Exception $e) {
            $this->logError($e->getMessage());
        }
    }

    public function productUpdateEvent($product)
    {
        try {
            $product = $this->handleEvent($product);
            if (!empty($product)) {
                $this->getApiClientService()->productEvents($product, self::EVENT_PRODUCT_UPDATED);
            }
        } catch (\Exception $e) {
            $this->logError($e->getMessage());
        }
    }

    public function productDeleteEvent($product)
    {
        try {
            if (!empty($product['id_product'])) {
                $data = [];
                $data['id'] = (int) $product['id_product'];
                $this->getApiClientService()->productEvents($data, self::EVENT_PRODUCT_DELETED);
            }
        } catch (\Exception $e) {
            $this->logError($e->getMessage());
        }
    }

    public function updateQuantityEvents($data)
    {
        try {
            $product = $this->handleEvent($data);
            if (!empty($product)) {
                $product['quantity'] = (string) $data['quantity'];
                $this->getApiClientService()->productEvents($product, self::EVENT_PRODUCT_UPDATED);
            }
        } catch (\Exception $e) {
            $this->logError($e->getMessage());
        }
    }

    public function productViewedEvent($param)
    {
        try {
            $product = $this->handleEvent($param);
            $product['url'] = $product['permalink'];
            $product['image'] = $product['main_image_src'] ? $product['main_image_src'] : '';
            $product['category'] = $product['category_names'] ? $product['category_names'] : '';
            $context = \Context::getContext();
            $shopName = $context->shop->name;
            $shopUrl = \Tools::getHttpHost(true) . __PS_BASE_URI__;
            $defaultCurrencyId = \Configuration::get('PS_CURRENCY_DEFAULT', null, null, $context->shop->id);
            $currency = new \Currency($defaultCurrencyId);
            $email = $this->getContextCustomer()->email;

            if (empty($email)) {
                return;
            }

            $productViewedPayload = [
                'id' => $context->cookie->PHPSESSID ? $context->cookie->PHPSESSID : hash('sha256', $email),
                'data' => [
                    'items' => $product,
                    'currency' => $currency->iso_code,
                    'shop_name' => $shopName,
                    'shop_url' => $shopUrl,
                    'email' => $email,
                ],
            ];
            if (!empty($product)) {
                $this->getApiClientService()->productEvents($productViewedPayload, self::EVENT_PRODUCT_VIEWED);
            }
        } catch (\Exception $e) {
            $this->logError($e->getMessage());
        }
    }
}