Current File : /var/www/vinorea/modules/sendinblue/services/CustomerService.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\Services;
if (!defined('_PS_VERSION_')) {
exit;
}
class CustomerService
{
/**
* @param array $filter
* @param int $limit
* @param int $offset
*
* @return array
*
* @throws \PrestaShopDatabaseException
*/
public function getCustomers($filter, $limit, $offset)
{
$sqlAnd = '';
if (is_array($filter) && !empty($filter)) {
foreach ($filter as $field => $value) {
$sqlAnd .= ' AND c.`' . bqSQL($field) . '` = "' . pSQL($value) . '"';
}
}
$shop_id = \Shop::getContextShopID(true);
if (!empty($shop_id)) {
$sqlAnd .= ' AND c.`id_shop` = ' . $shop_id;
$shop_group = \Shop::getContextShopGroupID();
if (!empty($shop_group)) {
$sqlAnd .= ' AND c.`id_shop_group` = ' . $shop_group;
}
}
$data = ['customers' => \Db::getInstance()->executeS('
SELECT DISTINCT
c.`id_customer` AS id,
LOWER(c.`email`) AS email,
c.`firstname`,
c.`lastname`,
c.`id_default_group`,
c.`id_default_group`,
GROUP_CONCAT(DISTINCT cg.`id_group`) AS id_group,
c.`id_gender`,
c.`newsletter`,
DATE(c.`newsletter_date_add`) AS newsletter_date_add,
c.`birthday`,
cl.`name` AS country,
s.`name` AS state,
a.`company`,
a.`city`,
a.`address1`,
a.`address2`,
a.`postcode`,
a.`vat_number`,
DATE(c.`date_add`) AS date_add,
DATE(c.`date_upd`) AS date_upd,
l.`iso_code` AS id_lang,
a.phone AS phone
FROM `' . _DB_PREFIX_ . 'customer` c
LEFT JOIN `' . _DB_PREFIX_ . 'customer_group` cg ON (c.`id_customer` = cg.`id_customer`)
LEFT JOIN `' . _DB_PREFIX_ . 'address` a ON (c.`id_customer` = a.`id_customer`)
LEFT JOIN `' . _DB_PREFIX_ . 'lang` l ON (c.`id_lang` = l.`id_lang`)
LEFT JOIN `' . _DB_PREFIX_ . 'country_lang` cl ON (a.`id_country` = cl.`id_country`)
LEFT JOIN `' . _DB_PREFIX_ . 'state` s ON (a.`id_state` = s.`id_state`)
WHERE c.`active` = 1 ' . $sqlAnd . '
GROUP BY c.`id_customer`
ORDER BY c.`id_customer` ASC
LIMIT ' . (int) $limit . '
OFFSET ' . (int) $offset . '
')];
$all_groups = \Group::getGroups(\ConfigurationCore::get('PS_LANG_DEFAULT'));
foreach ($data['customers'] as $key => $value) {
$data['customers'][$key]['id_group'] = $this->getAllGroupsOfCustomer(explode(',', $value['id_group']), $all_groups);
$data['customers'][$key]['id_shop'] = $shop_id;
}
return $data;
}
public function getCustomersCount($filter)
{
$customersSubscribedCount = 0;
$customersBlackslistedCount = 0;
$sqlAnd = '';
if (is_array($filter) && !empty($filter)) {
foreach ($filter as $field => $value) {
$sqlAnd .= ' AND c.`' . bqSQL($field) . '` = "' . pSQL($value) . '"';
}
}
$shop_id = \Shop::getContextShopID(true);
if (!empty($shop_id)) {
$sqlAnd .= ' AND c.`id_shop` = ' . $shop_id;
$shop_group = \Shop::getContextShopGroupID();
if (!empty($shop_group)) {
$sqlAnd .= ' AND c.`id_shop_group` = ' . $shop_group;
}
}
$data = ['customers' => \Db::getInstance()->executeS('
SELECT DISTINCT c.`id_customer` AS id, c.`newsletter`,
GROUP_CONCAT(DISTINCT cg.`id_group`) AS id_group
FROM `' . _DB_PREFIX_ . 'customer` c
LEFT JOIN `' . _DB_PREFIX_ . 'customer_group` cg ON (c.`id_customer` = cg.`id_customer`)
LEFT JOIN `' . _DB_PREFIX_ . 'address` a ON (c.`id_customer` = a.`id_customer`)
LEFT JOIN `' . _DB_PREFIX_ . 'lang` l ON (c.`id_lang` = l.`id_lang`)
LEFT JOIN `' . _DB_PREFIX_ . 'country_lang` cl ON (a.`id_country` = cl.`id_country`)
LEFT JOIN `' . _DB_PREFIX_ . 'state` s ON (a.`id_state` = s.`id_state`)
WHERE c.`active` = 1 ' . $sqlAnd . '
GROUP BY c.`id_customer`
')];
foreach ($data['customers'] as $key => $value) {
if ($value['newsletter'] == 1) {
++$customersSubscribedCount;
} elseif ($value['newsletter'] == 0) {
++$customersBlackslistedCount;
}
}
return [
'subscribed' => $customersSubscribedCount,
'blacklisted' => $customersBlackslistedCount,
];
}
private function getAllGroupsOfCustomer($customer_groups, $all_groups)
{
array_walk($customer_groups, function (&$customer_groups, $key, $all_groups) {
foreach ($all_groups as $group) {
if ($customer_groups == $group['id_group']) {
$customer_groups = $group['name'];
}
}
}, $all_groups);
$customer_groups = !empty($customer_groups) ? implode(', ', $customer_groups) : '';
return $customer_groups;
}
}