2
0
forked from Wavyzz/dolibarr
Files
dolibarr-fork/htdocs/comm/mailing/class/advtargetemailing.class.php
MDW a04f2bf4e7 Qual: Spelling fixes that newly appeared. (#27495)
* Qual: Spelling fixes that newly appeared.

# Qual: Fix spelling erros that appeared since the bulk updates.

These issues mostly appeared since the bulk updates (a few ones were postponed
to make sure no real spelling errors were missed.)

* Update modulebuilder.lib.php

* Update pdf_standard.modules.php

---------

Co-authored-by: Laurent Destailleur <eldy@destailleur.fr>
2024-01-14 12:26:37 +01:00

962 lines
34 KiB
PHP

<?php
/* Advance Targeting Emailing for mass emailing module
* Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* \file comm/mailing/class/advtargetemailing.class.php
* \ingroup mailing
* \brief This file is an example CRUD class file (Create/Read/Update/Delete)
*/
/**
* Class to manage advanced emailing target selector
*/
class AdvanceTargetingMailing extends CommonObject
{
/**
* @var DoliDB Database handler.
*/
public $db;
/**
* @var string ID to identify managed object
*/
public $element = 'advtargetemailing';
/**
* @var string Name of table without prefix where object is stored
*/
public $table_element = 'mailing_advtarget';
/**
* @var int ID
*/
public $id;
/**
* @var string name
*/
public $name;
/**
* @var int element id (it's not the name of a field)
*/
public $fk_element;
/**
* @var string type element
*/
public $type_element;
/**
* @var string filter value
*/
public $filtervalue;
/**
* @var int user author id
*/
public $fk_user_author;
/**
* @var int|string datec
*/
public $datec = '';
/**
* @var int user mod id
*/
public $fk_user_mod;
/**
* @var int|string tms
*/
public $tms = '';
/**
* @var array select target type
*/
public $select_target_type = array();
/**
* @var array type status comm prospect
*/
public $type_statuscommprospect = array();
public $thirdparty_lines;
public $contact_lines;
/**
* Constructor
*
* @param DoliDB $db Database handler
*/
public function __construct($db)
{
global $langs;
$langs->load('customers');
$this->db = $db;
$this->select_target_type = array(
'2' => $langs->trans('Contacts'),
'1' => $langs->trans('Contacts').'+'.$langs->trans('ThirdParty'),
'3' => $langs->trans('ThirdParty'),
'4' => $langs->trans('ContactsWithThirdpartyFilter')
);
require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php';
$customerStatic = new Client($this->db);
$customerStatic->loadCacheOfProspStatus();
if (!empty($customerStatic->cacheprospectstatus)) {
foreach ($customerStatic->cacheprospectstatus as $dataProspectSt) {
$this->type_statuscommprospect[$dataProspectSt['id']]=$dataProspectSt['label'];
}
} else {
$this->type_statuscommprospect = array(
-1 => $langs->trans("StatusProspect-1"),
0 => $langs->trans("StatusProspect0"),
1 => $langs->trans("StatusProspect1"),
2 => $langs->trans("StatusProspect2"),
3 => $langs->trans("StatusProspect3")
);
}
}
/**
* Create object into database
*
* @param User $user User that creates
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int Return integer <0 if KO, Id of created object if OK
*/
public function create($user, $notrigger = 0)
{
global $conf, $langs;
$error = 0;
// Clean parameters
if (isset($this->fk_element)) {
$this->fk_element = (int) $this->fk_element;
}
if (isset($this->type_element)) {
$this->type_element = trim($this->type_element);
}
if (isset($this->name)) {
$this->name = trim($this->name);
}
if (isset($this->filtervalue)) {
$this->filtervalue = trim($this->filtervalue);
}
// Check parameters
// Put here code to add control on parameters values
// Insert request
$sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_advtarget(";
$sql .= "name,";
$sql .= "entity,";
$sql .= "fk_element,";
$sql .= "type_element,";
$sql .= "filtervalue,";
$sql .= "fk_user_author,";
$sql .= "datec,";
$sql .= "fk_user_mod";
$sql .= ") VALUES (";
$sql .= " ".(!isset($this->name) ? 'NULL' : "'".$this->db->escape($this->name)."'").",";
$sql .= " ".$conf->entity.",";
$sql .= " ".(!isset($this->fk_element) ? 'NULL' : "'".$this->db->escape($this->fk_element)."'").",";
$sql .= " ".(!isset($this->type_element) ? 'NULL' : "'".$this->db->escape($this->type_element)."'").",";
$sql .= " ".(!isset($this->filtervalue) ? 'NULL' : "'".$this->db->escape($this->filtervalue)."'").",";
$sql .= " ".$user->id.",";
$sql .= " '".$this->db->idate(dol_now())."',";
$sql .= " ".$user->id;
$sql .= ")";
$this->db->begin();
dol_syslog(get_class($this)."::create", LOG_DEBUG);
$resql = $this->db->query($sql);
if (!$resql) {
$error++;
$this->errors[] = "Error ".$this->db->lasterror();
}
if (!$error) {
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."mailing_advtarget");
}
// Commit or rollback
if ($error) {
foreach ($this->errors as $errmsg) {
dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
$this->error .= ($this->error ? ', '.$errmsg : $errmsg);
}
$this->db->rollback();
return -1 * $error;
} else {
$this->db->commit();
return $this->id;
}
}
/**
* Load object in memory from the database
*
* @param int $id Id object
* @return int Return integer <0 if KO, >0 if OK
*/
public function fetch($id)
{
global $langs;
$sql = "SELECT";
$sql .= " t.rowid,";
$sql .= " t.name,";
$sql .= " t.entity,";
$sql .= " t.fk_element,";
$sql .= " t.type_element,";
$sql .= " t.filtervalue,";
$sql .= " t.fk_user_author,";
$sql .= " t.datec,";
$sql .= " t.fk_user_mod,";
$sql .= " t.tms";
$sql .= " FROM ".MAIN_DB_PREFIX."mailing_advtarget as t";
$sql .= " WHERE t.rowid = ".((int) $id);
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
if ($this->db->num_rows($resql)) {
$obj = $this->db->fetch_object($resql);
$this->id = $obj->rowid;
$this->name = $obj->name;
$this->entity = $obj->entity;
$this->fk_element = $obj->fk_element;
$this->type_element = $obj->type_element;
$this->filtervalue = $obj->filtervalue;
$this->fk_user_author = $obj->fk_user_author;
$this->datec = $this->db->jdate($obj->datec);
$this->fk_user_mod = $obj->fk_user_mod;
$this->tms = $this->db->jdate($obj->tms);
}
$this->db->free($resql);
return 1;
} else {
$this->error = "Error ".$this->db->lasterror();
dol_syslog(get_class($this)."::fetch ".$this->error, LOG_ERR);
return -1;
}
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load object in memory from the database
*
* @param int $id Id object
* @return int Return integer <0 if KO, >0 if OK
*/
public function fetch_by_mailing($id = 0)
{
// phpcs:enable
global $langs;
$sql = "SELECT";
$sql .= " t.rowid,";
$sql .= " t.name,";
$sql .= " t.entity,";
$sql .= " t.fk_element,";
$sql .= " t.type_element,";
$sql .= " t.filtervalue,";
$sql .= " t.fk_user_author,";
$sql .= " t.datec,";
$sql .= " t.fk_user_mod,";
$sql .= " t.tms";
$sql .= " FROM ".MAIN_DB_PREFIX."mailing_advtarget as t";
if (!empty($id)) {
$sql .= " WHERE t.fk_element = ".((int) $id)." AND type_element = 'mailing'";
} else {
$sql .= " WHERE t.fk_element = ".((int) $this->fk_element)." AND type_element = 'mailing'";
}
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
if ($this->db->num_rows($resql)) {
$obj = $this->db->fetch_object($resql);
$this->id = $obj->rowid;
$this->name = $obj->name;
$this->entity = $obj->entity;
$this->fk_element = $obj->fk_element;
$this->type_element = $obj->type_element;
$this->filtervalue = $obj->filtervalue;
$this->fk_user_author = $obj->fk_user_author;
$this->datec = $this->db->jdate($obj->datec);
$this->fk_user_mod = $obj->fk_user_mod;
$this->tms = $this->db->jdate($obj->tms);
}
$this->db->free($resql);
return 1;
} else {
$this->error = "Error ".$this->db->lasterror();
dol_syslog(get_class($this)."::fetch ".$this->error, LOG_ERR);
return -1;
}
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load object in memory from the database
*
* @param int $id Id object
* @param string $type_element Type target
* @return int Return integer <0 if KO, >0 if OK
*/
public function fetch_by_element($id = 0, $type_element = 'mailing')
{
// phpcs:enable
global $langs;
$sql = "SELECT";
$sql .= " t.rowid,";
$sql .= " t.name,";
$sql .= " t.entity,";
$sql .= " t.fk_element,";
$sql .= " t.type_element,";
$sql .= " t.filtervalue,";
$sql .= " t.fk_user_author,";
$sql .= " t.datec,";
$sql .= " t.fk_user_mod,";
$sql .= " t.tms";
$sql .= " FROM ".MAIN_DB_PREFIX."mailing_advtarget as t";
if (!empty($id)) {
$sql .= " WHERE t.fk_element = ".((int) $id)." AND type_element = '".$this->db->escape($type_element)."'";
} else {
$sql .= " WHERE t.fk_element = ".((int) $this->fk_element)." AND type_element = '".$this->db->escape($type_element)."'";
}
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
if ($this->db->num_rows($resql)) {
$obj = $this->db->fetch_object($resql);
$this->id = $obj->rowid;
$this->name = $obj->name;
$this->entity = $obj->entity;
$this->fk_element = $obj->fk_element;
$this->type_element = $obj->type_element;
$this->filtervalue = $obj->filtervalue;
$this->fk_user_author = $obj->fk_user_author;
$this->datec = $this->db->jdate($obj->datec);
$this->fk_user_mod = $obj->fk_user_mod;
$this->tms = $this->db->jdate($obj->tms);
}
$this->db->free($resql);
return 1;
} else {
$this->error = "Error ".$this->db->lasterror();
dol_syslog(get_class($this)."::fetch ".$this->error, LOG_ERR);
return -1;
}
}
/**
* Update object into database
*
* @param User $user User that modifies
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int Return integer <0 if KO, >0 if OK
*/
public function update($user, $notrigger = 0)
{
global $conf, $langs;
$error = 0;
// Clean parameters
if (isset($this->fk_element)) {
$this->fk_element = (int) $this->fk_element;
}
if (isset($this->type_element)) {
$this->type_element = trim($this->type_element);
}
if (isset($this->name)) {
$this->name = trim($this->name);
}
if (isset($this->filtervalue)) {
$this->filtervalue = trim($this->filtervalue);
}
// Check parameters
// Put here code to add a control on parameters values
// Update request
$sql = "UPDATE ".MAIN_DB_PREFIX."mailing_advtarget SET";
$sql .= " name=".(isset($this->name) ? "'".$this->db->escape($this->name)."'" : "''").",";
$sql .= " entity=".$conf->entity.",";
$sql .= " fk_element=".(isset($this->fk_element) ? $this->fk_element : "null").",";
$sql .= " type_element=".(isset($this->type_element) ? "'".$this->db->escape($this->type_element)."'" : "null").",";
$sql .= " filtervalue=".(isset($this->filtervalue) ? "'".$this->db->escape($this->filtervalue)."'" : "null").",";
$sql .= " fk_user_mod=".$user->id;
$sql .= " WHERE rowid=".((int) $this->id);
$this->db->begin();
dol_syslog(get_class($this)."::update", LOG_DEBUG);
$resql = $this->db->query($sql);
if (!$resql) {
$error++;
$this->errors[] = "Error ".$this->db->lasterror();
}
// Commit or rollback
if ($error) {
foreach ($this->errors as $errmsg) {
dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
$this->error .= ($this->error ? ', '.$errmsg : $errmsg);
}
$this->db->rollback();
return -1 * $error;
} else {
$this->db->commit();
return 1;
}
}
/**
* Delete object in database
*
* @param User $user User that deletes
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int Return integer <0 if KO, >0 if OK
*/
public function delete($user, $notrigger = 0)
{
global $conf, $langs;
$error = 0;
$this->db->begin();
if (!$error) {
$sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_advtarget";
$sql .= " WHERE rowid=".((int) $this->id);
dol_syslog(get_class($this)."::delete sql=".$sql);
$resql = $this->db->query($sql);
if (!$resql) {
$error++;
$this->errors[] = "Error ".$this->db->lasterror();
}
}
// Commit or rollback
if ($error) {
foreach ($this->errors as $errmsg) {
dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
$this->error .= ($this->error ? ', '.$errmsg : $errmsg);
}
$this->db->rollback();
return -1 * $error;
} else {
$this->db->commit();
return 1;
}
}
/**
* Save query in database to retrieve it
*
* @param User $user User that deletes
* @param array $arrayquery All element to Query
* @return int Return integer <0 if KO, >0 if OK
*/
public function savequery($user, $arrayquery)
{
global $langs, $conf;
if (!empty($arrayquery)) {
$result = $this->fetch_by_mailing($this->fk_element);
$this->filtervalue = json_encode($arrayquery);
if ($result < 0) {
return -1;
}
if (!empty($this->id)) {
$this->update($user);
} else {
$this->create($user);
}
}
return -1;
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load object in memory from database
*
* @param array $arrayquery All element to Query
* @return int Return integer <0 if KO, >0 if OK
*/
public function query_thirdparty($arrayquery)
{
// phpcs:enable
global $langs, $conf, $extrafields;
$sql = "SELECT";
$sql .= " t.rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."societe as t";
$sql .= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."societe_extrafields as te ON te.fk_object=t.rowid ";
$sqlwhere = array();
$sqlwhere[] = 't.entity IN ('.getEntity('societe').')';
if (count($arrayquery) > 0) {
if (array_key_exists('cust_saleman', $arrayquery)) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as saleman ON saleman.fk_soc = t.rowid";
}
if (array_key_exists('cust_categ', $arrayquery)) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_societe as custcateg ON custcateg.fk_soc = t.rowid";
}
if (!empty($arrayquery['cust_name'])) {
$sqlwhere[] = $this->transformToSQL('t.nom', $arrayquery['cust_name']);
}
if (!empty($arrayquery['cust_code'])) {
$sqlwhere[] = $this->transformToSQL('t.code_client', $arrayquery['cust_code']);
}
if (!empty($arrayquery['cust_adress'])) {
$sqlwhere[] = $this->transformToSQL('t.address', $arrayquery['cust_adress']);
}
if (!empty($arrayquery['cust_zip'])) {
$sqlwhere[] = $this->transformToSQL('t.zip', $arrayquery['cust_zip']);
}
if (!empty($arrayquery['cust_city'])) {
$sqlwhere[] = $this->transformToSQL('t.town', $arrayquery['cust_city']);
}
if (!empty($arrayquery['cust_mothercompany'])) {
$str = $this->transformToSQL('nom', $arrayquery['cust_mothercompany']);
$sqlwhere[] = " (t.parent IN (SELECT rowid FROM ".MAIN_DB_PREFIX."societe WHERE (".$str.")))";
}
if (!empty($arrayquery['cust_status']) && count($arrayquery['cust_status']) > 0) {
$sqlwhere[] = " (t.status IN (".$this->db->sanitize(implode(',', $arrayquery['cust_status']))."))";
}
if (!empty($arrayquery['cust_typecust']) && count($arrayquery['cust_typecust']) > 0) {
$sqlwhere[] = " (t.client IN (".$this->db->sanitize(implode(',', $arrayquery['cust_typecust']))."))";
}
if (!empty($arrayquery['cust_comm_status']) && count($arrayquery['cust_comm_status']) > 0) {
$sqlwhere[] = " (t.fk_stcomm IN (".$this->db->sanitize(implode(',', $arrayquery['cust_comm_status']))."))";
}
if (!empty($arrayquery['cust_prospect_status']) && count($arrayquery['cust_prospect_status']) > 0) {
$sqlwhere[] = " (t.fk_prospectlevel IN (".$this->db->sanitize("'".implode("','", $arrayquery['cust_prospect_status'])."'", 1)."))";
}
if (!empty($arrayquery['cust_typeent']) && count($arrayquery['cust_typeent']) > 0) {
$sqlwhere[] = " (t.fk_typent IN (".$this->db->sanitize(implode(',', $arrayquery['cust_typeent']))."))";
}
if (!empty($arrayquery['cust_saleman']) && count($arrayquery['cust_saleman']) > 0) {
$sqlwhere[] = " (saleman.fk_user IN (".$this->db->sanitize(implode(',', $arrayquery['cust_saleman']))."))";
}
if (!empty($arrayquery['cust_country']) && count($arrayquery['cust_country']) > 0) {
$sqlwhere[] = " (t.fk_pays IN (".$this->db->sanitize(implode(',', $arrayquery['cust_country']))."))";
}
if (!empty($arrayquery['cust_effectif_id']) && count($arrayquery['cust_effectif_id']) > 0) {
$sqlwhere[] = " (t.fk_effectif IN (".$this->db->sanitize(implode(',', $arrayquery['cust_effectif_id']))."))";
}
if (!empty($arrayquery['cust_categ']) && count($arrayquery['cust_categ']) > 0) {
$sqlwhere[] = " (custcateg.fk_categorie IN (".$this->db->sanitize(implode(',', $arrayquery['cust_categ']))."))";
}
if (!empty($arrayquery['cust_language']) && count($arrayquery['cust_language']) > 0) {
$sqlwhere[] = " (t.default_lang IN (".$this->db->sanitize("'".implode("','", $arrayquery['cust_language'])."'", 1)."))";
}
//Standard Extrafield feature
if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
$socstatic = new Societe($this->db);
$elementtype = $socstatic->table_element;
$extrafields->fetch_name_optionals_label($elementtype);
foreach ($extrafields->attributes[$elementtype]['label'] as $key => $val) {
if (($extrafields->attributes[$elementtype]['type'][$key] == 'varchar') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'text')) {
if (!empty($arrayquery['options_'.$key])) {
$sqlwhere[] = " (te.".$key." LIKE '".$this->db->escape($arrayquery["options_".$key])."')";
}
} elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'int') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'double')) {
if (!empty($arrayquery['options_'.$key.'_max'])) {
$sqlwhere[] = " (te.".$key." >= ".((float) $arrayquery["options_".$key."_max"])." AND te.".$key." <= ".((float) $arrayquery["options_".$key.'_min']).")";
}
} elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'date') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'datetime')) {
if (!empty($arrayquery['options_'.$key.'_end_dt'])) {
$sqlwhere[] = " (te.".$key." >= '".$this->db->idate($arrayquery["options_".$key."_st_dt"])."' AND te.".$key." <= '".$this->db->idate($arrayquery["options_".$key."_end_dt"])."')";
}
} elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'boolean') {
if ($arrayquery['options_'.$key] != '') {
$sqlwhere[] = " (te.".$key." = ".((int) $arrayquery["options_".$key]).")";
}
} elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'link') {
if ($arrayquery['options_'.$key] > 0) {
$sqlwhere[]= " (te.".$key." = ".((int) $arrayquery["options_".$key]).")";
}
} else {
if (is_array($arrayquery['options_'.$key])) {
$sqlwhere[] = " (te.".$key." IN (".$this->db->sanitize("'".implode("','", $arrayquery["options_".$key])."'", 1)."))";
} elseif (!empty($arrayquery['options_'.$key])) {
$sqlwhere[] = " (te.".$key." LIKE '".$this->db->escape($arrayquery["options_".$key])."')";
}
}
}
}
if (count($sqlwhere) > 0) {
$sql .= " WHERE ".implode(" AND ", $sqlwhere);
}
}
dol_syslog(get_class($this)."::query_thirdparty", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
$this->thirdparty_lines = array();
$num = $this->db->num_rows($resql);
$i = 0;
if ($num) {
while ($i < $num) {
$obj = $this->db->fetch_object($resql);
$this->thirdparty_lines[$i] = $obj->rowid;
$i++;
}
}
$this->db->free($resql);
return $num;
} else {
$this->error = "Error ".$this->db->lasterror();
dol_syslog(get_class($this)."::query_thirdparty ".$this->error, LOG_ERR);
return -1;
}
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load object in memory from database
*
* @param array $arrayquery All element to Query
* @param int $withThirdpartyFilter add contact with tridparty filter
* @return int Return integer <0 if KO, >0 if OK
*/
public function query_contact($arrayquery, $withThirdpartyFilter = 0)
{
// phpcs:enable
global $langs, $conf;
$sql = "SELECT";
$sql .= " t.rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as t";
$sql .= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."socpeople_extrafields as te ON te.fk_object=t.rowid ";
if (!empty($withThirdpartyFilter)) {
$sql .= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."societe as ts ON ts.rowid=t.fk_soc";
$sql .= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."societe_extrafields as tse ON tse.fk_object=ts.rowid ";
}
$sqlwhere = array();
$sqlwhere[] = 't.entity IN ('.getEntity('contact').')';
if (count($arrayquery) > 0) {
if (array_key_exists('contact_categ', $arrayquery)) {
$sql .= " LEFT OUTER JOIN ".MAIN_DB_PREFIX."categorie_contact as contactcateg ON contactcateg.fk_socpeople=t.rowid ";
}
if (!empty($arrayquery['contact_lastname'])) {
$sqlwhere[] = $this->transformToSQL('t.lastname', $arrayquery['contact_lastname']);
}
if (!empty($arrayquery['contact_firstname'])) {
$sqlwhere[] = $this->transformToSQL('t.firstname', $arrayquery['contact_firstname']);
}
if (!empty($arrayquery['contact_country']) && count($arrayquery['contact_country'])) {
$sqlwhere[] = " (t.fk_pays IN (".$this->db->sanitize($this->db->escape(implode(',', $arrayquery['contact_country'])))."))";
}
if (!empty($arrayquery['contact_status']) && count($arrayquery['contact_status']) > 0) {
$sqlwhere[] = " (t.statut IN (".$this->db->sanitize($this->db->escape(implode(',', $arrayquery['contact_status'])))."))";
}
if (!empty($arrayquery['contact_civility']) && count($arrayquery['contact_civility']) > 0) {
$sqlwhere[] = " (t.civility IN (".$this->db->sanitize("'".implode("','", $arrayquery['contact_civility'])."'", 1)."))";
}
if ($arrayquery['contact_no_email'] != '') {
$tmpwhere = '';
if (!empty($arrayquery['contact_no_email'])) {
$tmpwhere .= "(t.email IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE t.entity IN (".getEntity('mailing').") AND email = '".$this->db->escape($arrayquery['contact_no_email'])."'))";
} else {
$tmpwhere .= "(t.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE t.entity IN (".getEntity('mailing').") AND email = '".$this->db->escape($arrayquery['contact_no_email'])."'))";
}
$sqlwhere[] = $tmpwhere;
}
if ($arrayquery['contact_update_st_dt'] != '') {
$sqlwhere[] = " (t.tms >= '".$this->db->idate($arrayquery['contact_update_st_dt'])."' AND t.tms <= '".$this->db->idate($arrayquery['contact_update_end_dt'])."')";
}
if ($arrayquery['contact_create_st_dt'] != '') {
$sqlwhere[] = " (t.datec >= '".$this->db->idate($arrayquery['contact_create_st_dt'])."' AND t.datec <= '".$this->db->idate($arrayquery['contact_create_end_dt'])."')";
}
if (!empty($arrayquery['contact_categ']) && count($arrayquery['contact_categ']) > 0) {
$sqlwhere[] = " (contactcateg.fk_categorie IN (".$this->db->escape(implode(",", $arrayquery['contact_categ']))."))";
}
//Standard Extrafield feature
if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
$contactstatic = new Contact($this->db);
$elementtype = $contactstatic->table_element;
// fetch optionals attributes and labels
dol_include_once('/core/class/extrafields.class.php');
$extrafields = new ExtraFields($this->db);
$extrafields->fetch_name_optionals_label($elementtype);
$extrafields->fetch_name_optionals_label($elementtype);
foreach ($extrafields->attributes[$elementtype]['label'] as $key => $val) {
if (($extrafields->attributes[$elementtype]['type'][$key] == 'varchar') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'text')) {
if (!empty($arrayquery['options_'.$key.'_cnct'])) {
$sqlwhere[] = " (te.".$key." LIKE '".$this->db->escape($arrayquery["options_".$key."_cnct"])."')";
}
} elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'int') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'double')) {
if (!empty($arrayquery['options_'.$key.'_max_cnct'])) {
$sqlwhere[] = " (te.".$key." >= ".((float) $arrayquery["options_".$key."_max_cnct"])." AND te.".$key." <= ".((float) $arrayquery["options_".$key."_min_cnct"]).")";
}
} elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'date') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'datetime')) {
if (!empty($arrayquery['options_'.$key.'_end_dt_cnct'])) {
$sqlwhere[] = " (te.".$key." >= '".$this->db->idate($arrayquery["options_".$key."_st_dt_cnct"])."' AND te.".$key." <= '".$this->db->idate($arrayquery["options_".$key."_end_dt_cnct"])."')";
}
} elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'boolean') {
if ($arrayquery['options_'.$key.'_cnct'] != '') {
if ($arrayquery['options_'.$key.'_cnct'] == 0) {
$sqlwhere[] = " (te.".$key." = ".((int) $arrayquery["options_".$key."_cnct"])." OR ((te.".$key." IS NULL) AND (te.fk_object IS NOT NULL)))";
} else {
$sqlwhere[] = " (te.".$key." = ".((int) $arrayquery["options_".$key."_cnct"]).")";
}
}
} else {
if (is_array($arrayquery['options_'.$key.'_cnct'])) {
$sqlwhere[] = " (te.".$key." IN (".$this->db->sanitize("'".implode("','", $arrayquery["options_".$key."_cnct"])."'", 1)."))";
} elseif (!empty($arrayquery['options_'.$key.'_cnct'])) {
$sqlwhere[] = " (te.".$key." LIKE '".$this->db->escape($arrayquery["options_".$key."_cnct"])."')";
}
}
}
if (!empty($withThirdpartyFilter)) {
if (array_key_exists('cust_saleman', $arrayquery)) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as saleman ON saleman.fk_soc = ts.rowid";
}
if (array_key_exists('cust_categ', $arrayquery)) {
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_societe as custcateg ON custcateg.fk_soc = ts.rowid";
}
if (!empty($arrayquery['cust_name'])) {
$sqlwhere[] = $this->transformToSQL('ts.nom', $arrayquery['cust_name']);
}
if (!empty($arrayquery['cust_code'])) {
$sqlwhere[] = $this->transformToSQL('ts.code_client', $arrayquery['cust_code']);
}
if (!empty($arrayquery['cust_adress'])) {
$sqlwhere[] = $this->transformToSQL('ts.address', $arrayquery['cust_adress']);
}
if (!empty($arrayquery['cust_zip'])) {
$sqlwhere[] = $this->transformToSQL('ts.zip', $arrayquery['cust_zip']);
}
if (!empty($arrayquery['cust_city'])) {
$sqlwhere[] = $this->transformToSQL('ts.town', $arrayquery['cust_city']);
}
if (!empty($arrayquery['cust_mothercompany'])) {
$str = $this->transformToSQL('nom', $arrayquery['cust_mothercompany']);
$sqlwhere[] = " (ts.parent IN (SELECT rowid FROM ".MAIN_DB_PREFIX."societe WHERE (".$str.")))";
}
if (!empty($arrayquery['cust_status']) && count($arrayquery['cust_status']) > 0) {
$sqlwhere[] = " (ts.status IN (".$this->db->sanitize(implode(',', $arrayquery['cust_status']))."))";
}
if (!empty($arrayquery['cust_typecust']) && count($arrayquery['cust_typecust']) > 0) {
$sqlwhere[] = " (ts.client IN (".$this->db->sanitize(implode(',', $arrayquery['cust_typecust']))."))";
}
if (!empty($arrayquery['cust_comm_status']) && count($arrayquery['cust_comm_status']) > 0) {
$sqlwhere[] = " (ts.fk_stcomm IN (".$this->db->sanitize(implode(',', $arrayquery['cust_comm_status']))."))";
}
if (!empty($arrayquery['cust_prospect_status']) && count($arrayquery['cust_prospect_status']) > 0) {
$sqlwhere[] = " (ts.fk_prospectlevel IN ('".$this->db->sanitize(implode("','", $arrayquery['cust_prospect_status']))."'))";
}
if (!empty($arrayquery['cust_typeent']) && count($arrayquery['cust_typeent']) > 0) {
$sqlwhere[] = " (ts.fk_typent IN (".$this->db->sanitize(implode(',', $arrayquery['cust_typeent']))."))";
}
if (!empty($arrayquery['cust_saleman']) && count($arrayquery['cust_saleman']) > 0) {
$sqlwhere[] = " (saleman.fk_user IN (".$this->db->sanitize(implode(',', $arrayquery['cust_saleman']))."))";
}
if (!empty($arrayquery['cust_country']) && count($arrayquery['cust_country']) > 0) {
$sqlwhere[] = " (ts.fk_pays IN (".$this->db->sanitize(implode(',', $arrayquery['cust_country']))."))";
}
if (!empty($arrayquery['cust_effectif_id']) && count($arrayquery['cust_effectif_id']) > 0) {
$sqlwhere[] = " (ts.fk_effectif IN (".$this->db->sanitize(implode(',', $arrayquery['cust_effectif_id']))."))";
}
if (!empty($arrayquery['cust_categ']) && count($arrayquery['cust_categ']) > 0) {
$sqlwhere[] = " (custcateg.fk_categorie IN (".$this->db->sanitize(implode(',', $arrayquery['cust_categ']))."))";
}
if (!empty($arrayquery['cust_language']) && count($arrayquery['cust_language']) > 0) {
$sqlwhere[] = " (ts.default_lang IN ('".$this->db->sanitize(implode("','", $arrayquery['cust_language']))."'))";
}
//Standard Extrafield feature
if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
$socstatic = new Societe($this->db);
$elementtype = $socstatic->table_element;
// fetch optionals attributes and labels
dol_include_once('/core/class/extrafields.class.php');
$extrafields = new ExtraFields($this->db);
$extrafields->fetch_name_optionals_label($elementtype);
foreach ($extrafields->attributes[$elementtype]['label'] as $key => $val) {
if (($extrafields->attributes[$elementtype]['type'][$key] == 'varchar') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'text')) {
if (!empty($arrayquery['options_'.$key])) {
$sqlwhere[] = " (tse.".$key." LIKE '".$this->db->escape($arrayquery['options_'.$key])."')";
}
} elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'int') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'double')) {
if (!empty($arrayquery['options_'.$key.'_max'])) {
$sqlwhere[] = " (tse.".$key." >= ".((float) $arrayquery["options_".$key."_max"])." AND tse.".$key." <= ".((float) $arrayquery["options_".$key."_min"]).")";
}
} elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'date') ||
($extrafields->attributes[$elementtype]['type'][$key] == 'datetime')) {
if (!empty($arrayquery['options_'.$key.'_end_dt'])) {
$sqlwhere[] = " (tse.".$key." >= '".$this->db->idate($arrayquery["options_".$key."_st_dt"])."' AND tse.".$key." <= '".$this->db->idate($arrayquery["options_".$key."_end_dt"])."')";
}
} elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'boolean') {
if ($arrayquery['options_'.$key] != '') {
$sqlwhere[] = " (tse.".$key." = ".((int) $arrayquery["options_".$key]).")";
}
} else {
if (is_array($arrayquery['options_'.$key])) {
$sqlwhere[] = " (tse.".$key." IN (".$this->db->sanitize("'".implode("','", $arrayquery["options_".$key])."'", 1)."))";
} elseif (!empty($arrayquery['options_'.$key])) {
$sqlwhere[] = " (tse.".$key." LIKE '".$this->db->escape($arrayquery["options_".$key])."')";
}
}
}
}
}
}
if (count($sqlwhere) > 0) {
$sql .= " WHERE ".implode(" AND ", $sqlwhere);
}
}
dol_syslog(get_class($this)."::query_contact", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql) {
$this->contact_lines = array();
$num = $this->db->num_rows($resql);
$i = 0;
if ($num) {
while ($i < $num) {
$obj = $this->db->fetch_object($resql);
$this->contact_lines[$i] = $obj->rowid;
$i++;
}
}
$this->db->free($resql);
return $num;
} else {
$this->error = "Error ".$this->db->lasterror();
dol_syslog(get_class($this)."::query_contact ".$this->error, LOG_ERR);
return -1;
}
}
/**
* Parse criteria to return a SQL query formatted
*
* @param string $column_to_test column to test
* @param string $criteria Use %% as magic characters. For example to find all item like <b>jean, joe, jim</b>, you can input <b>j%%</b>, you can also use ; as separator for value,
* and use ! for except this value.
* For example jean;joe;jim%%;!jimo;!jima%> will target all jean, joe, start with jim but not jimo and not everythnig that start by jima
* @return string Sql to use for the where condition
*/
public function transformToSQL($column_to_test, $criteria)
{
$return_sql_criteria = '(';
//This is a multiple value test
if (preg_match('/;/', $criteria)) {
$return_sql_not_like = array();
$return_sql_like = array();
$criteria_array = explode(';', $criteria);
foreach ($criteria_array as $inter_criteria) {
if (preg_match('/!/', $inter_criteria)) {
$return_sql_not_like[] = '('.$column_to_test.' NOT LIKE \''.str_replace('!', '', $inter_criteria).'\')';
} else {
$return_sql_like[] = '('.$column_to_test.' LIKE \''.$inter_criteria.'\')';
}
}
if (count($return_sql_like) > 0) {
$return_sql_criteria .= '('.implode(' OR ', $return_sql_like).')';
}
if (count($return_sql_not_like) > 0) {
$return_sql_criteria .= ' AND ('.implode(' AND ', $return_sql_not_like).')';
}
} else {
$return_sql_criteria .= $column_to_test.' LIKE \''.$this->db->escape($criteria).'\'';
}
$return_sql_criteria .= ')';
return $return_sql_criteria;
}
}