diff --git a/htdocs/comm/prospect/prospects.php b/htdocs/comm/prospect/prospects.php index 5e7771691df..38d225e3484 100644 --- a/htdocs/comm/prospect/prospects.php +++ b/htdocs/comm/prospect/prospects.php @@ -28,6 +28,7 @@ require("./pre.inc.php"); require_once(DOL_DOCUMENT_ROOT."/prospect.class.php"); $langs->load("propal"); +$langs->load("companies"); // Security check $socid = isset($_GET["socid"])?$_GET["socid"]:''; @@ -47,7 +48,97 @@ $pagenext = $page + 1; if (! $sortorder) $sortorder="ASC"; if (! $sortfield) $sortfield="s.nom"; +// Added by Matelli (see http://matelli.fr/showcases/patchs-dolibarr/enhance-prospect-searching.html) +// Load potentiels filters +$search_level_from = isset($_GET["search_level_from"])?$_GET["search_level_from"]:(isSet($_POST["search_level_from"])?$_POST["search_level_from"]:''); +$search_level_to = isset($_GET["search_level_to"])?$_GET["search_level_to"]:(isSet($_POST["search_level_to"])?$_POST["search_level_to"]:''); +// If both parameters are set, search for everything BETWEEN them +if ($search_level_from != '' && $search_level_to != '') +{ + // Ensure that these parameters are numbers + $search_level_from = (int) $search_level_from; + $search_level_to = (int) $search_level_to; + + // If from is greater than to, reverse orders + if ($search_level_from > $search_level_to) + { + $tmp = $search_level_to; + $search_level_to = $search_level_from; + $search_level_from = $tmp; + } + + // Generate the SQL request + $sortwhere = '(sortorder BETWEEN '.$search_level_from.' AND '.$search_level_to.') AS is_in_range'; +} +// If only "from" parameter is set, search for everything GREATER THAN it +else if ($search_level_from != '') +{ + // Ensure that this parameter is a number + $search_level_from = (int) $search_level_from; + + // Generate the SQL request + $sortwhere = '(sortorder >= '.$search_level_from.') AS is_in_range'; +} +// If only "to" parameter is set, search for everything LOWER THAN it +else if ($search_level_to != '') +{ + // Ensure that this parameter is a number + $search_level_to = (int) $search_level_to; + + // Generate the SQL request + $sortwhere = '(sortorder <= '.$search_level_to.') AS is_in_range'; +} +// If no parameters are set, dont search for anything +else +{ + $sortwhere = '0 as is_in_range'; +} + +// Select every potentiels, and note each potentiels which fit in search parameters +dolibarr_syslog('prospects::prospects_prospect_level',LOG_DEBUG); +$sql = "SELECT code, label, sortorder, ".$sortwhere; +$sql.= " FROM ".MAIN_DB_PREFIX."c_prospectlevel"; +$sql.= " WHERE active > 0"; +$sql.= " ORDER BY sortorder"; +$resql = $db->query($sql); +if ($resql) +{ + $tab_level = array(); + $search_levels = array(); + + while ($obj = $db->fetch_object($resql)) + { + // Compute level text + $level=$langs->trans($obj->code); + if ($level == $obj->code) $level=$langs->trans($obj->label); + + // Put it in the array sorted by sortorder + $tab_level[$obj->sortorder] = $level; + + // If this potentiel fit in parameters, add its code to the $search_levels array + if ($obj->is_in_range == 1) + { + $search_levels[] = '"'.preg_replace('[^A-Za-z0-9_-]', '', $obj->code).'"'; + } + + $i++; + } + + // Implode the $search_levels array so that it can be use in a "IN (...)" where clause. + // If no paramters was set, $search_levels will be empty + $search_levels = implode(',', $search_levels); +} +else dolibarr_print_error($db); + +// Load sale and categ filters +$search_sale = isset($_GET["search_sale"])?$_GET["search_sale"]:$_POST["search_sale"]; +$search_categ = isset($_GET["search_categ"])?$_GET["search_categ"]:$_POST["search_categ"]; +// If the user must only see his prospect, force searching by him +if (!$user->rights->societe->client->voir && !$socid) $search_sale = $user->id; + +// List of avaible states; we'll need that for each lines (quick changing prospect states) and for search bar (filter by prospect state) +$sts = array(-1,0,1,2,3); /* * Actions @@ -67,13 +158,23 @@ if ($_GET["action"] == 'cstc') $sql = "SELECT s.rowid, s.nom, s.ville, ".$db->pdate("s.datec")." as datec, ".$db->pdate("s.datea")." as datea,"; $sql.= " st.libelle as stcomm, s.prefix_comm, s.fk_stcomm, s.fk_prospectlevel,"; $sql.= " d.nom as departement"; -if (!$user->rights->societe->client->voir && !$socid) $sql .= ", sc.fk_soc, sc.fk_user"; +// Updated by Matelli (see http://matelli.fr/showcases/patchs-dolibarr/enhance-prospect-searching.html) +// We'll need these fields in order to filter by sale (including the case where the user can only see his prospects) +if ($search_sale) $sql .= ", sc.fk_soc, sc.fk_user"; +// We'll need these fields in order to filter by categ +if ($search_categ) $sql .= ", cs.fk_categorie, cs.fk_societe"; $sql .= " FROM ".MAIN_DB_PREFIX."c_stcomm as st"; -if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +// We'll need this table joined to the select in order to filter by sale +if ($search_sale) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +// We'll need this table joined to the select in order to filter by categ +if ($search_categ) $sql .= ", ".MAIN_DB_PREFIX."categorie_societe as cs"; $sql.= ", ".MAIN_DB_PREFIX."societe as s"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as d on (d.rowid = s.fk_departement)"; $sql.= " WHERE s.fk_stcomm = st.id AND s.client = 2"; -if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; +// Join for the needed table to filter by sale +if ($search_sale) $sql .= " AND s.rowid = sc.fk_soc"; +// Join for the needed table to filter by categ +if ($search_categ) $sql .= " AND s.rowid = cs.fk_societe"; if (isset($stcomm) && $stcomm != '') { @@ -86,6 +187,21 @@ if ($user->societe_id) if ($_GET["search_nom"]) $sql .= " AND s.nom like '%".addslashes(strtolower($_GET["search_nom"]))."%'"; if ($_GET["search_ville"]) $sql .= " AND s.ville like '%".addslashes(strtolower($_GET["search_ville"]))."%'"; +// Insert levels filters +if ($search_levels) +{ + $sql .= " AND s.fk_prospectlevel IN (".$search_levels.')'; +} +// Insert salee filter +if ($search_sale) +{ + $sql .= " AND sc.fk_user = ".$search_sale; +} +// Insert categ filter +if ($search_categ) +{ + $sql .= " AND cs.fk_categorie = ".$search_categ; +} if ($socname) { @@ -122,9 +238,109 @@ if ($resql) } $param='&stcomm='.$stcomm.'&search_nom='.urlencode($_GET["search_nom"]).'&search_ville='.urlencode($_GET["search_ville"]); - + // Added by Matelli (see http://matelli.fr/showcases/patchs-dolibarr/enhance-prospect-searching.html) + // Store the status filter in the URL + if (isSet($search_cstc)) + { + foreach ($search_cstc as $key => $value) + { + if ($value == 'true') + $param.='&search_cstc['.((int) $key).']=true'; + else + $param.='&search_cstc['.((int) $key).']=false'; + } + } + // Store the potentiels filters in the URL + if ($search_level_from != '') + { + $param.='&search_level_from='.$search_level_from; + } + if ($search_level_to != '') + { + $param.='&search_level_to='.$search_level_to; + } + // Store the categ filter in the URL + if ($search_categ != '') + { + $param.='&search_categ='.$search_categ; + } + // Store the sale filter in the URL + if ($search_sale != '') + { + $param.='&search_sale='.$search_sale; + } + // $param and $urladd should have the same value + $urladd = $param; + print_barre_liste($langs->trans("ListOfProspects"), $page, $_SERVER["PHP_SELF"], $param, $sortfield,$sortorder,'',$num,$nbtotalofrecords); + + // Print the search-by-sale and search-by-categ filters + print '