dolibarr  x.y.z
company.lib.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2006-2011 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
4  * Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
5  * Copyright (C) 2010-2012 Regis Houssin <regis.houssin@inodbox.com>
6  * Copyright (C) 2013-2014 Florian Henry <florian.henry@open-concept.pro>
7  * Copyright (C) 2013-2014 Juanjo Menent <jmenent@2byte.es>
8  * Copyright (C) 2013 Christophe Battarel <contact@altairis.fr>
9  * Copyright (C) 2013-2018 Alexandre Spangaro <aspangaro@open-dsi.fr>
10  * Copyright (C) 2015-2021 Frédéric France <frederic.france@netlogic.fr>
11  * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
12  * Copyright (C) 2017 Rui Strecht <rui.strecht@aliartalentos.com>
13  * Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
14  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 3 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program. If not, see <https://www.gnu.org/licenses/>.
27  * or see https://www.gnu.org/
28  */
29 
42 function societe_prepare_head(Societe $object)
43 {
44  global $db, $langs, $conf, $user;
45  global $hookmanager;
46 
47  $h = 0;
48  $head = array();
49 
50  $head[$h][0] = DOL_URL_ROOT.'/societe/card.php?socid='.$object->id;
51  $head[$h][1] = $langs->trans("ThirdParty");
52  $head[$h][2] = 'card';
53  $h++;
54 
55  if (empty($conf->global->MAIN_SUPPORT_SHARED_CONTACT_BETWEEN_THIRDPARTIES)) {
56  if (empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->societe->contact->lire) {
57  //$nbContact = count($object->liste_contact(-1,'internal')) + count($object->liste_contact(-1,'external'));
58  $nbContact = 0;
59  // Enable caching of thirdrparty count Contacts
60  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
61  $cachekey = 'count_contacts_thirdparty_'.$object->id;
62  $dataretrieved = dol_getcache($cachekey);
63 
64  if (!is_null($dataretrieved)) {
65  $nbContact = $dataretrieved;
66  } else {
67  $sql = "SELECT COUNT(p.rowid) as nb";
68  $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as p";
69  // Add table from hooks
70  $parameters = array('contacttab' => true);
71  $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
72  $sql .= $hookmanager->resPrint;
73  $sql .= " WHERE p.fk_soc = ".((int) $object->id);
74  // Add where from hooks
75  $parameters = array('contacttab' => true);
76  $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
77  $sql .= $hookmanager->resPrint;
78  $resql = $db->query($sql);
79  if ($resql) {
80  $obj = $db->fetch_object($resql);
81  $nbContact = $obj->nb;
82  }
83 
84  dol_setcache($cachekey, $nbContact, 120); // If setting cache fails, this is not a problem, so we do not test result.
85  }
86 
87  $head[$h][0] = DOL_URL_ROOT.'/societe/contact.php?socid='.$object->id;
88  $head[$h][1] = $langs->trans('ContactsAddresses');
89  if ($nbContact > 0) {
90  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbContact.'</span>';
91  }
92  $head[$h][2] = 'contact';
93  $h++;
94  }
95  } else {
96  $head[$h][0] = DOL_URL_ROOT.'/societe/societecontact.php?socid='.$object->id;
97  $nbContact = count($object->liste_contact(-1, 'internal')) + count($object->liste_contact(-1, 'external'));
98  $head[$h][1] = $langs->trans("ContactsAddresses");
99  if ($nbContact > 0) {
100  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbContact.'</span>';
101  }
102  $head[$h][2] = 'contact';
103  $h++;
104  }
105 
106  if ($object->client == 1 || $object->client == 2 || $object->client == 3) {
107  $head[$h][0] = DOL_URL_ROOT.'/comm/card.php?socid='.$object->id;
108  $head[$h][1] = '';
109  if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && ($object->client == 2 || $object->client == 3)) {
110  $head[$h][1] .= $langs->trans("Prospect");
111  }
112  if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && $object->client == 3) {
113  $head[$h][1] .= ' | ';
114  }
115  if (empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && ($object->client == 1 || $object->client == 3)) {
116  $head[$h][1] .= $langs->trans("Customer");
117  }
118  $head[$h][2] = 'customer';
119  $h++;
120 
121  if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
122  $langs->load("products");
123  // price
124  $head[$h][0] = DOL_URL_ROOT.'/societe/price.php?socid='.$object->id;
125  $head[$h][1] = $langs->trans("CustomerPrices");
126  $head[$h][2] = 'price';
127  $h++;
128  }
129  }
130  $supplier_module_enabled = 0;
131  if ((isModEnabled('fournisseur') && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled('supplier_proposal') || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) {
132  $supplier_module_enabled = 1;
133  }
134  if ($supplier_module_enabled == 1 && $object->fournisseur && !empty($user->rights->fournisseur->lire)) {
135  $head[$h][0] = DOL_URL_ROOT.'/fourn/card.php?socid='.$object->id;
136  $head[$h][1] = $langs->trans("Supplier");
137  $head[$h][2] = 'supplier';
138  $h++;
139  }
140 
141  if (isModEnabled('project') && (!empty($user->rights->projet->lire))) {
142  $nbProject = 0;
143  // Enable caching of thirdrparty count projects
144  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
145  $cachekey = 'count_projects_thirdparty_'.$object->id;
146  $dataretrieved = dol_getcache($cachekey);
147 
148  if (!is_null($dataretrieved)) {
149  $nbProject = $dataretrieved;
150  } else {
151  $sql = "SELECT COUNT(n.rowid) as nb";
152  $sql .= " FROM ".MAIN_DB_PREFIX."projet as n";
153  $sql .= " WHERE fk_soc = ".((int) $object->id);
154  $sql .= " AND entity IN (".getEntity('project').")";
155  $resql = $db->query($sql);
156  if ($resql) {
157  $obj = $db->fetch_object($resql);
158  $nbProject = $obj->nb;
159  } else {
160  dol_print_error($db);
161  }
162  dol_setcache($cachekey, $nbProject, 120); // If setting cache fails, this is not a problem, so we do not test result.
163  }
164  $head[$h][0] = DOL_URL_ROOT.'/societe/project.php?socid='.$object->id;
165  $head[$h][1] = $langs->trans("Projects");
166  if ($nbProject > 0) {
167  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbProject.'</span>';
168  }
169  $head[$h][2] = 'project';
170  $h++;
171  }
172 
173  // Tab to link resources
174  if (isModEnabled('resource') && !empty($conf->global->RESOURCE_ON_THIRDPARTIES)) {
175  $head[$h][0] = DOL_URL_ROOT.'/resource/element_resource.php?element=societe&element_id='.$object->id;
176  $head[$h][1] = $langs->trans("Resources");
177  $head[$h][2] = 'resources';
178  $h++;
179  }
180 
181  // Related items
182  if ((isModEnabled('commande') || isModEnabled('propal') || isModEnabled('facture') || isModEnabled('ficheinter') || (isModEnabled('fournisseur') && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))
183  && empty($conf->global->THIRDPARTIES_DISABLE_RELATED_OBJECT_TAB)) {
184  $head[$h][0] = DOL_URL_ROOT.'/societe/consumption.php?socid='.$object->id;
185  $head[$h][1] = $langs->trans("Referers");
186  $head[$h][2] = 'consumption';
187  $h++;
188  }
189 
190  // Bank accounts
191  if (empty($conf->global->SOCIETE_DISABLE_BANKACCOUNT)) {
192  $nbBankAccount = 0;
193  $foundonexternalonlinesystem = 0;
194  $langs->load("bills");
195 
196  $title = $langs->trans("PaymentModes");
197 
198  if (isModEnabled('stripe')) {
199  //$langs->load("stripe");
200  //$title = $langs->trans("BankAccountsAndGateways");
201 
202  $servicestatus = 0;
203  if (!empty($conf->global->STRIPE_LIVE) && !GETPOST('forcesandbox', 'alpha')) {
204  $servicestatus = 1;
205  }
206 
207  include_once DOL_DOCUMENT_ROOT.'/societe/class/societeaccount.class.php';
208  $societeaccount = new SocieteAccount($db);
209  $stripecu = $societeaccount->getCustomerAccount($object->id, 'stripe', $servicestatus); // Get thirdparty cu_...
210  if ($stripecu) {
211  $foundonexternalonlinesystem++;
212  }
213  }
214 
215  $sql = "SELECT COUNT(n.rowid) as nb";
216  $sql .= " FROM ".MAIN_DB_PREFIX."societe_rib as n";
217  $sql .= " WHERE n.fk_soc = ".((int) $object->id);
218  if (!isModEnabled('stripe')) {
219  $sql .= " AND n.stripe_card_ref IS NULL";
220  } else {
221  $sql .= " AND (n.stripe_card_ref IS NULL OR (n.stripe_card_ref IS NOT NULL AND n.status = ".((int) $servicestatus)."))";
222  }
223 
224  $resql = $db->query($sql);
225  if ($resql) {
226  $obj = $db->fetch_object($resql);
227  $nbBankAccount = $obj->nb;
228  } else {
229  dol_print_error($db);
230  }
231 
232  //if (isModEnabled('stripe') && $nbBankAccount > 0) $nbBankAccount = '...'; // No way to know exact number
233 
234  $head[$h][0] = DOL_URL_ROOT.'/societe/paymentmodes.php?socid='.urlencode($object->id);
235  $head[$h][1] = $title;
236  if ($foundonexternalonlinesystem) {
237  $head[$h][1] .= '<span class="badge marginleftonlyshort">...</span>';
238  } elseif ($nbBankAccount > 0) {
239  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbBankAccount.'</span>';
240  }
241  $head[$h][2] = 'rib';
242  $h++;
243  }
244 
245  if (isModEnabled('website') && (!empty($conf->global->WEBSITE_USE_WEBSITE_ACCOUNTS)) && ($user->hasRight('societe', 'lire'))) {
246  $head[$h][0] = DOL_URL_ROOT.'/societe/website.php?id='.urlencode($object->id);
247  $head[$h][1] = $langs->trans("WebSiteAccounts");
248  $nbNote = 0;
249  $sql = "SELECT COUNT(n.rowid) as nb";
250  $sql .= " FROM ".MAIN_DB_PREFIX."societe_account as n";
251  $sql .= " WHERE fk_soc = ".((int) $object->id).' AND fk_website > 0';
252  $resql = $db->query($sql);
253  if ($resql) {
254  $obj = $db->fetch_object($resql);
255  $nbNote = $obj->nb;
256  } else {
257  dol_print_error($db);
258  }
259  if ($nbNote > 0) {
260  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
261  }
262  $head[$h][2] = 'website';
263  $h++;
264  }
265 
266  if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty') {
267  if (!empty($user->rights->partnership->read)) {
268  $langs->load("partnership");
269  $nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0;
270  $head[$h][0] = DOL_URL_ROOT.'/partnership/partnership_list.php?socid='.$object->id;
271  $head[$h][1] = $langs->trans("Partnerships");
272  $nbNote = 0;
273  $sql = "SELECT COUNT(n.rowid) as nb";
274  $sql .= " FROM ".MAIN_DB_PREFIX."partnership as n";
275  $sql .= " WHERE fk_soc = ".((int) $object->id);
276  $resql = $db->query($sql);
277  if ($resql) {
278  $obj = $db->fetch_object($resql);
279  $nbNote = $obj->nb;
280  } else {
281  dol_print_error($db);
282  }
283  if ($nbNote > 0) {
284  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
285  }
286  $head[$h][2] = 'partnerships';
287  if ($nbPartnership > 0) {
288  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbPartnership.'</span>';
289  }
290  $h++;
291  }
292  }
293 
294  // Show more tabs from modules
295  // Entries must be declared in modules descriptor with line
296  // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
297  // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
298  complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'add', 'core');
299 
300  if ($user->socid == 0) {
301  // Notifications
302  if (isModEnabled('notification')) {
303  $nbNotif = 0;
304  // Enable caching of thirdparty count notifications
305  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
306  $cachekey = 'count_notifications_thirdparty_'.$object->id;
307  $dataretrieved = dol_getcache($cachekey);
308  if (!is_null($dataretrieved)) {
309  $nbNotif = $dataretrieved;
310  } else {
311  $sql = "SELECT COUNT(n.rowid) as nb";
312  $sql .= " FROM ".MAIN_DB_PREFIX."notify_def as n";
313  $sql .= " WHERE fk_soc = ".((int) $object->id);
314  $resql = $db->query($sql);
315  if ($resql) {
316  $obj = $db->fetch_object($resql);
317  $nbNotif = $obj->nb;
318  } else {
319  dol_print_error($db);
320  }
321  dol_setcache($cachekey, $nbNotif, 120); // If setting cache fails, this is not a problem, so we do not test result.
322  }
323 
324  $head[$h][0] = DOL_URL_ROOT.'/societe/notify/card.php?socid='.urlencode($object->id);
325  $head[$h][1] = $langs->trans("Notifications");
326  if ($nbNotif > 0) {
327  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNotif.'</span>';
328  }
329  $head[$h][2] = 'notify';
330  $h++;
331  }
332 
333  // Notes
334  $nbNote = 0;
335  if (!empty($object->note_private)) {
336  $nbNote++;
337  }
338  if (!empty($object->note_public)) {
339  $nbNote++;
340  }
341  $head[$h][0] = DOL_URL_ROOT.'/societe/note.php?id='.urlencode($object->id);
342  $head[$h][1] = $langs->trans("Notes");
343  if ($nbNote > 0) {
344  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
345  }
346  $head[$h][2] = 'note';
347  $h++;
348 
349  // Attached files and Links
350  $totalAttached = 0;
351  // Enable caching of thirdrparty count attached files and links
352  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
353  $cachekey = 'count_attached_thirdparty_'.$object->id;
354  $dataretrieved = dol_getcache($cachekey);
355  if (!is_null($dataretrieved)) {
356  $totalAttached = $dataretrieved;
357  } else {
358  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
359  require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
360  $upload_dir = $conf->societe->multidir_output[$object->entity]."/".$object->id;
361  $nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
362  $nbLinks = Link::count($db, $object->element, $object->id);
363  $totalAttached = $nbFiles + $nbLinks;
364  dol_setcache($cachekey, $totalAttached, 120); // If setting cache fails, this is not a problem, so we do not test result.
365  }
366 
367  $head[$h][0] = DOL_URL_ROOT.'/societe/document.php?socid='.$object->id;
368  $head[$h][1] = $langs->trans("Documents");
369  if (($totalAttached) > 0) {
370  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.($totalAttached).'</span>';
371  }
372  $head[$h][2] = 'document';
373  $h++;
374  }
375 
376  $head[$h][0] = DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id;
377  $head[$h][1] = $langs->trans("Events");
378  if (isModEnabled('agenda')&& (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) {
379  $nbEvent = 0;
380  // Enable caching of thirdrparty count actioncomm
381  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
382  $cachekey = 'count_events_thirdparty_'.$object->id;
383  $dataretrieved = dol_getcache($cachekey);
384  if (!is_null($dataretrieved)) {
385  $nbEvent = $dataretrieved;
386  } else {
387  $sql = "SELECT COUNT(id) as nb";
388  $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm";
389  $sql .= " WHERE fk_soc = ".((int) $object->id);
390  $resql = $db->query($sql);
391  if ($resql) {
392  $obj = $db->fetch_object($resql);
393  $nbEvent = $obj->nb;
394  } else {
395  dol_syslog('Failed to count actioncomm '.$db->lasterror(), LOG_ERR);
396  }
397  dol_setcache($cachekey, $nbEvent, 120); // If setting cache fails, this is not a problem, so we do not test result.
398  }
399 
400  $head[$h][1] .= '/';
401  $head[$h][1] .= $langs->trans("Agenda");
402  if ($nbEvent > 0) {
403  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbEvent.'</span>';
404  }
405  }
406  $head[$h][2] = 'agenda';
407  $h++;
408 
409  // Show more tabs from modules
410  // Entries must be declared in modules descriptor with line
411  // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
412  // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
413  complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'add', 'external');
414 
415  complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'remove');
416 
417  return $head;
418 }
419 
420 
427 function societe_prepare_head2($object)
428 {
429  global $langs, $conf, $user;
430  $h = 0;
431  $head = array();
432 
433  $head[$h][0] = DOL_URL_ROOT.'/societe/card.php?socid='.$object->id;
434  $head[$h][1] = $langs->trans("ThirdParty");
435  $head[$h][2] = 'company';
436  $h++;
437 
438  $head[$h][0] = 'commerciaux.php?socid='.$object->id;
439  $head[$h][1] = $langs->trans("SalesRepresentative");
440  $head[$h][2] = 'salesrepresentative';
441  $h++;
442 
443  return $head;
444 }
445 
446 
447 
454 {
455  global $langs, $conf, $user, $db;
456 
457  $extrafields = new ExtraFields($db);
458  $extrafields->fetch_name_optionals_label('societe');
459  $extrafields->fetch_name_optionals_label('socpeople');
460 
461  $h = 0;
462  $head = array();
463 
464  $head[$h][0] = DOL_URL_ROOT.'/societe/admin/societe.php';
465  $head[$h][1] = $langs->trans("Miscellaneous");
466  $head[$h][2] = 'general';
467  $h++;
468 
469  // Show more tabs from modules
470  // Entries must be declared in modules descriptor with line
471  // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
472  // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
473  complete_head_from_modules($conf, $langs, null, $head, $h, 'company_admin');
474 
475  $head[$h][0] = DOL_URL_ROOT.'/societe/admin/societe_extrafields.php';
476  $head[$h][1] = $langs->trans("ExtraFieldsThirdParties");
477  $nbExtrafields = $extrafields->attributes['societe']['count'];
478  if ($nbExtrafields > 0) {
479  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbExtrafields.'</span>';
480  }
481  $head[$h][2] = 'attributes';
482  $h++;
483 
484  $head[$h][0] = DOL_URL_ROOT.'/societe/admin/contact_extrafields.php';
485  $head[$h][1] = $langs->trans("ExtraFieldsContacts");
486  $nbExtrafields = $extrafields->attributes['socpeople']['count'];
487  if ($nbExtrafields > 0) {
488  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbExtrafields.'</span>';
489  }
490  $head[$h][2] = 'attributes_contacts';
491  $h++;
492 
493  complete_head_from_modules($conf, $langs, null, $head, $h, 'company_admin', 'remove');
494 
495  return $head;
496 }
497 
498 
499 
515 function getCountry($searchkey, $withcode = '', $dbtouse = 0, $outputlangs = '', $entconv = 1, $searchlabel = '')
516 {
517  global $db, $langs;
518 
519  $result = '';
520 
521  // Check parameters
522  if (empty($searchkey) && empty($searchlabel)) {
523  if ($withcode === 'all') {
524  return array('id'=>'', 'code'=>'', 'label'=>'');
525  } else {
526  return '';
527  }
528  }
529  if (!is_object($dbtouse)) {
530  $dbtouse = $db;
531  }
532  if (!is_object($outputlangs)) {
533  $outputlangs = $langs;
534  }
535 
536  $sql = "SELECT rowid, code, label FROM ".MAIN_DB_PREFIX."c_country";
537  if (is_numeric($searchkey)) {
538  $sql .= " WHERE rowid = ".((int) $searchkey);
539  } elseif (!empty($searchkey)) {
540  $sql .= " WHERE code = '".$db->escape($searchkey)."'";
541  } else {
542  $sql .= " WHERE label = '".$db->escape($searchlabel)."'";
543  }
544 
545  $resql = $dbtouse->query($sql);
546  if ($resql) {
547  $obj = $dbtouse->fetch_object($resql);
548  if ($obj) {
549  $label = ((!empty($obj->label) && $obj->label != '-') ? $obj->label : '');
550  if (is_object($outputlangs)) {
551  $outputlangs->load("dict");
552  if ($entconv) {
553  $label = ($obj->code && ($outputlangs->trans("Country".$obj->code) != "Country".$obj->code)) ? $outputlangs->trans("Country".$obj->code) : $label;
554  } else {
555  $label = ($obj->code && ($outputlangs->transnoentitiesnoconv("Country".$obj->code) != "Country".$obj->code)) ? $outputlangs->transnoentitiesnoconv("Country".$obj->code) : $label;
556  }
557  }
558  if ($withcode == 1) {
559  $result = $label ? "$obj->code - $label" : "$obj->code";
560  } elseif ($withcode == 2) {
561  $result = $obj->code;
562  } elseif ($withcode == 3) {
563  $result = $obj->rowid;
564  } elseif ($withcode === 'all') {
565  $result = array('id'=>$obj->rowid, 'code'=>$obj->code, 'label'=>$label);
566  } else {
567  $result = $label;
568  }
569  } else {
570  $result = 'NotDefined';
571  }
572  $dbtouse->free($resql);
573  return $result;
574  } else {
575  dol_print_error($dbtouse, '');
576  }
577  return 'Error';
578 }
579 
595 function getState($id, $withcode = '', $dbtouse = 0, $withregion = 0, $outputlangs = '', $entconv = 1)
596 {
597  global $db, $langs;
598 
599  if (!is_object($dbtouse)) {
600  $dbtouse = $db;
601  }
602 
603  $sql = "SELECT d.rowid as id, d.code_departement as code, d.nom as name, d.active, c.label as country, c.code as country_code, r.code_region as region_code, r.nom as region_name FROM";
604  $sql .= " ".MAIN_DB_PREFIX."c_departements as d, ".MAIN_DB_PREFIX."c_regions as r,".MAIN_DB_PREFIX."c_country as c";
605  $sql .= " WHERE d.fk_region=r.code_region and r.fk_pays=c.rowid and d.rowid=".((int) $id);
606  $sql .= " AND d.active = 1 AND r.active = 1 AND c.active = 1";
607  $sql .= " ORDER BY c.code, d.code_departement";
608 
609  dol_syslog("Company.lib::getState", LOG_DEBUG);
610  $resql = $dbtouse->query($sql);
611  if ($resql) {
612  $obj = $dbtouse->fetch_object($resql);
613  if ($obj) {
614  $label = ((!empty($obj->name) && $obj->name != '-') ? $obj->name : '');
615  if (is_object($outputlangs)) {
616  $outputlangs->load("dict");
617  if ($entconv) {
618  $label = ($obj->code && ($outputlangs->trans("State".$obj->code) != "State".$obj->code)) ? $outputlangs->trans("State".$obj->code) : $label;
619  } else {
620  $label = ($obj->code && ($outputlangs->transnoentitiesnoconv("State".$obj->code) != "State".$obj->code)) ? $outputlangs->transnoentitiesnoconv("State".$obj->code) : $label;
621  }
622  }
623 
624  if ($withcode == 1) {
625  if ($withregion == 1) {
626  return $label = $obj->region_name.' - '.$obj->code.' - '.($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
627  } else {
628  return $label = $obj->code.' - '.($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
629  }
630  } elseif ($withcode == 2) {
631  if ($withregion == 1) {
632  return $label = $obj->region_name.' - '.($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
633  } else {
634  return $label = ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
635  }
636  } elseif ($withcode === 'all') {
637  if ($withregion == 1) {
638  return array('id'=>$obj->id, 'code'=>$obj->code, 'label'=>$label, 'region_code'=>$obj->region_code, 'region'=>$obj->region_name);
639  } else {
640  return array('id'=>$obj->id, 'code'=>$obj->code, 'label'=>$label);
641  }
642  } else {
643  if ($withregion == 1) {
644  return $label = $obj->region_name.' - '.$label;
645  } else {
646  return $label;
647  }
648  }
649  } else {
650  return $langs->transnoentitiesnoconv("NotDefined");
651  }
652  } else {
653  dol_print_error($dbtouse, '');
654  }
655 
656  return '';
657 }
658 
667 function currency_name($code_iso, $withcode = '', $outputlangs = null)
668 {
669  global $langs, $db;
670 
671  if (empty($outputlangs)) {
672  $outputlangs = $langs;
673  }
674 
675  $outputlangs->load("dict");
676 
677  // If there is a translation, we can send immediatly the label
678  if ($outputlangs->trans("Currency".$code_iso) != "Currency".$code_iso) {
679  return ($withcode ? $code_iso.' - ' : '').$outputlangs->trans("Currency".$code_iso);
680  }
681 
682  // If no translation, we read table to get label by default
683  $sql = "SELECT label FROM ".MAIN_DB_PREFIX."c_currencies";
684  $sql .= " WHERE code_iso='".$db->escape($code_iso)."'";
685 
686  $resql = $db->query($sql);
687  if ($resql) {
688  $num = $db->num_rows($resql);
689 
690  if ($num) {
691  $obj = $db->fetch_object($resql);
692  $label = ($obj->label != '-' ? $obj->label : '');
693  if ($withcode) {
694  return ($label == $code_iso) ? "$code_iso" : "$code_iso - $label";
695  } else {
696  return $label;
697  }
698  } else {
699  return $code_iso;
700  }
701  }
702  return 'ErrorWhenReadingCurrencyLabel';
703 }
704 
711 function getFormeJuridiqueLabel($code)
712 {
713  global $db, $langs;
714 
715  if (!$code) {
716  return '';
717  }
718 
719  $sql = "SELECT libelle FROM ".MAIN_DB_PREFIX."c_forme_juridique";
720  $sql .= " WHERE code='".$db->escape($code)."'";
721 
722  dol_syslog("Company.lib::getFormeJuridiqueLabel", LOG_DEBUG);
723  $resql = $db->query($sql);
724  if ($resql) {
725  $num = $db->num_rows($resql);
726 
727  if ($num) {
728  $obj = $db->fetch_object($resql);
729  $label = ($obj->libelle != '-' ? $obj->libelle : '');
730  return $label;
731  } else {
732  return $langs->trans("NotDefined");
733  }
734  }
735 }
736 
737 
745 {
746  // List of all country codes that are in europe for european vat rules
747  // List found on https://ec.europa.eu/taxation_customs/territorial-status-eu-countries-and-certain-territories_en
748  global $conf, $db;
749  $country_code_in_EEC = array();
750 
751  if (!empty($conf->cache['country_code_in_EEC'])) {
752  // Use of cache to reduce number of database requests
753  $country_code_in_EEC = $conf->cache['country_code_in_EEC'];
754  } else {
755  $sql = "SELECT cc.code FROM ".MAIN_DB_PREFIX."c_country as cc";
756  $sql .= " WHERE cc.eec = 1";
757 
758  $resql = $db->query($sql);
759  if ($resql) {
760  $num = $db->num_rows($resql);
761  $i = 0;
762  while ($i < $num) {
763  $objp = $db->fetch_object($resql);
764  $country_code_in_EEC[] = $objp->code;
765  $i++;
766  }
767  } else {
768  dol_print_error($db);
769  }
770  $conf->cache['country_code_in_EEC'] = $country_code_in_EEC;
771  }
772  return $country_code_in_EEC;
773 }
774 
781 function isInEEC($object)
782 {
783  if (empty($object->country_code)) {
784  return false;
785  }
786 
787  $country_code_in_EEC = getCountriesInEEC(); // This make a database call but there is a cache done into $conf->cache['country_code_in_EEC']
788 
789  //print "dd".$object->country_code;
790  return in_array($object->country_code, $country_code_in_EEC);
791 }
792 
793 
806 function show_projects($conf, $langs, $db, $object, $backtopage = '', $nocreatelink = 0, $morehtmlright = '')
807 {
808  global $user, $action, $hookmanager;
809 
810  $i = -1;
811 
812  if (isModEnabled('project') && $user->hasRight('projet', 'lire')) {
813  $langs->load("projects");
814 
815  $newcardbutton = '';
816  if (isModEnabled('project') && $user->hasRight('projet', 'creer') && empty($nocreatelink)) {
817  $newcardbutton .= dolGetButtonTitle($langs->trans('AddProject'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/projet/card.php?socid='.$object->id.'&amp;action=create&amp;backtopage='.urlencode($backtopage));
818  }
819 
820  print "\n";
821  print load_fiche_titre($langs->trans("ProjectsDedicatedToThisThirdParty"), $newcardbutton.$morehtmlright, '');
822 
823  print '<div class="div-table-responsive">'."\n";
824  print '<table class="noborder centpercent">';
825 
826  $sql = "SELECT p.rowid as id, p.entity, p.title, p.ref, p.public, p.dateo as do, p.datee as de, p.fk_statut as status, p.fk_opp_status, p.opp_amount, p.opp_percent, p.tms as date_update, p.budget_amount";
827  $sql .= ", cls.code as opp_status_code";
828  $sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
829  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_lead_status as cls on p.fk_opp_status = cls.rowid";
830  $sql .= " WHERE p.fk_soc = ".((int) $object->id);
831  $sql .= " AND p.entity IN (".getEntity('project').")";
832  $sql .= " ORDER BY p.dateo DESC";
833 
834  $result = $db->query($sql);
835  if ($result) {
836  $num = $db->num_rows($result);
837 
838  print '<tr class="liste_titre">';
839  print '<td>'.$langs->trans("Ref").'</td>';
840  print '<td>'.$langs->trans("Name").'</td>';
841  print '<td class="center">'.$langs->trans("DateStart").'</td>';
842  print '<td class="center">'.$langs->trans("DateEnd").'</td>';
843  print '<td class="right">'.$langs->trans("OpportunityAmountShort").'</td>';
844  print '<td class="center">'.$langs->trans("OpportunityStatusShort").'</td>';
845  print '<td class="right">'.$langs->trans("OpportunityProbabilityShort").'</td>';
846  print '<td class="right">'.$langs->trans("Status").'</td>';
847  print '</tr>';
848 
849  if ($num > 0) {
850  require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
851 
852  $projecttmp = new Project($db);
853 
854  $i = 0;
855 
856  while ($i < $num) {
857  $obj = $db->fetch_object($result);
858  $projecttmp->fetch($obj->id);
859 
860  // To verify role of users
861  $userAccess = $projecttmp->restrictedProjectArea($user);
862 
863  if ($user->rights->projet->lire && $userAccess > 0) {
864  print '<tr class="oddeven">';
865 
866  // Ref
867  print '<td class="nowraponall">';
868  print $projecttmp->getNomUrl(1);
869  print '</td>';
870 
871  // Label
872  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->title).'">'.dol_escape_htmltag($obj->title).'</td>';
873  // Date start
874  print '<td class="center">'.dol_print_date($db->jdate($obj->do), "day").'</td>';
875  // Date end
876  print '<td class="center">'.dol_print_date($db->jdate($obj->de), "day").'</td>';
877  // Opp amount
878  print '<td class="right">';
879  if ($obj->opp_status_code) {
880  print price($obj->opp_amount, 1, '', 1, -1, -1, '');
881  }
882  print '</td>';
883  // Opp status
884  print '<td class="center">';
885  if ($obj->opp_status_code) {
886  print $langs->trans("OppStatus".$obj->opp_status_code);
887  }
888  print '</td>';
889  // Opp percent
890  print '<td class="right">';
891  if ($obj->opp_percent) {
892  print price($obj->opp_percent, 1, '', 1, 0).'%';
893  }
894  print '</td>';
895  // Status
896  print '<td class="right">'.$projecttmp->getLibStatut(5).'</td>';
897 
898  print '</tr>';
899  }
900  $i++;
901  }
902  } else {
903  print '<tr class="oddeven"><td colspan="8"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
904  }
905  $db->free($result);
906  } else {
907  dol_print_error($db);
908  }
909 
910  $parameters = array('sql'=>$sql, 'function'=>'show_projects');
911  $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
912  print $hookmanager->resPrint;
913 
914  print "</table>";
915  print '</div>';
916 
917  print "<br>\n";
918  }
919 
920  return $i;
921 }
922 
923 
935 function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserlogin = 0)
936 {
937  global $user, $conf, $extrafields, $hookmanager;
938  global $contextpage;
939 
940  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
941  $formcompany = new FormCompany($db);
942  $form = new Form($db);
943 
944  $optioncss = GETPOST('optioncss', 'alpha');
945  $sortfield = GETPOST('sortfield', 'aZ09comma');
946  $sortorder = GETPOST('sortorder', 'aZ09comma');
947  $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
948 
949  $search_status = GETPOST("search_status", 'int');
950  if ($search_status == '') {
951  $search_status = 1; // always display active customer first
952  }
953 
954  $search_rowid = GETPOST("search_rowid", 'int');
955  $search_name = GETPOST("search_name", 'alpha');
956  $search_address = GETPOST("search_address", 'alpha');
957  $search_poste = GETPOST("search_poste", 'alpha');
958  $search_note_private = GETPOST('search_note_private', 'alphanohtml');
959  $search_roles = GETPOST("search_roles", 'array');
960 
961  $socialnetworks = getArrayOfSocialNetworks();
962 
963  $searchAddressPhoneDBFields = array(
964  //Address
965  't.address',
966  't.zip',
967  't.town',
968 
969  //Phone
970  't.phone',
971  't.phone_perso',
972  't.phone_mobile',
973 
974  //Fax
975  't.fax',
976 
977  //E-mail
978  't.email',
979  );
980  //Social media
981  // foreach ($socialnetworks as $key => $value) {
982  // if ($value['active']) {
983  // $searchAddressPhoneDBFields['t.'.$key] = "t.socialnetworks->'$.".$key."'";
984  // }
985  // }
986 
987  if (!$sortorder) {
988  $sortorder = "ASC";
989  }
990  if (!$sortfield) {
991  $sortfield = "t.lastname";
992  }
993 
994  if (isModEnabled('clicktodial')) {
995  $user->fetch_clicktodial(); // lecture des infos de clicktodial du user
996  }
997 
998 
999  $contactstatic = new Contact($db);
1000 
1001  $extrafields->fetch_name_optionals_label($contactstatic->table_element);
1002 
1003  $contactstatic->fields = array(
1004  'rowid' =>array('type'=>'integer', 'label'=>"TechnicalID", 'enabled'=>(!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) ? 1 : 0), 'visible'=>(!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) ? 1 : 0), 'position'=>1),
1005  'name' =>array('type'=>'varchar(128)', 'label'=>'Name', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1),
1006  'poste' =>array('type'=>'varchar(128)', 'label'=>'PostOrFunction', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>2, 'index'=>1, 'position'=>20),
1007  'address' =>array('type'=>'varchar(128)', 'label'=>'Address', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>3, 'index'=>1, 'position'=>30),
1008  'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'visible'=>3, 'position'=>35),
1009  'role' =>array('type'=>'checkbox', 'label'=>'Role', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>4, 'index'=>1, 'position'=>40),
1010  'statut' =>array('type'=>'integer', 'label'=>'Status', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'default'=>0, 'index'=>1, 'position'=>50, 'arrayofkeyval'=>array(0=>$contactstatic->LibStatut(0, 1), 1=>$contactstatic->LibStatut(1, 1))),
1011  );
1012 
1013  // Definition of fields for list
1014  $arrayfields = array(
1015  't.rowid'=>array('label'=>"TechnicalID", 'checked'=>(!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) ? 1 : 0), 'enabled'=>(!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) ? 1 : 0), 'position'=>1),
1016  't.name'=>array('label'=>"Name", 'checked'=>1, 'position'=>10),
1017  't.poste'=>array('label'=>"PostOrFunction", 'checked'=>1, 'position'=>20),
1018  't.address'=>array('label'=>(empty($conf->dol_optimize_smallscreen) ? $langs->trans("Address").' / '.$langs->trans("Phone").' / '.$langs->trans("Email") : $langs->trans("Address")), 'checked'=>1, 'position'=>30),
1019  't.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'position'=>35),
1020  'sc.role'=>array('label'=>"ContactByDefaultFor", 'checked'=>1, 'position'=>40),
1021  't.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>50, 'class'=>'center'),
1022  );
1023  // Extra fields
1024  if (!empty($extrafields->attributes[$contactstatic->table_element]['label']) && is_array($extrafields->attributes[$contactstatic->table_element]['label']) && count($extrafields->attributes[$contactstatic->table_element]['label'])) {
1025  foreach ($extrafields->attributes[$contactstatic->table_element]['label'] as $key => $val) {
1026  if (!empty($extrafields->attributes[$contactstatic->table_element]['list'][$key])) {
1027  $arrayfields["ef.".$key] = array(
1028  'label'=>$extrafields->attributes[$contactstatic->table_element]['label'][$key],
1029  'checked'=>(($extrafields->attributes[$contactstatic->table_element]['list'][$key] < 0) ? 0 : 1),
1030  'position'=>1000 + $extrafields->attributes[$contactstatic->table_element]['pos'][$key],
1031  'enabled'=>(abs($extrafields->attributes[$contactstatic->table_element]['list'][$key]) != 3 && $extrafields->attributes[$contactstatic->table_element]['perms'][$key]));
1032  }
1033  }
1034  }
1035 
1036  // Initialize array of search criterias
1037  $search = array();
1038  foreach ($arrayfields as $key => $val) {
1039  $queryName = 'search_'.substr($key, 2);
1040  if (GETPOST($queryName, 'alpha')) {
1041  $search[substr($key, 2)] = GETPOST($queryName, 'alpha');
1042  }
1043  }
1044  $search_array_options = $extrafields->getOptionalsFromPost($contactstatic->table_element, '', 'search_');
1045 
1046  // Purge search criteria
1047  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
1048  $search_rowid = '';
1049  $search_status = '';
1050  $search_name = '';
1051  $search_roles = array();
1052  $search_address = '';
1053  $search_poste = '';
1054  $search_note_private = '';
1055  $search = array();
1056  $search_array_options = array();
1057 
1058  foreach ($contactstatic->fields as $key => $val) {
1059  $search[$key] = '';
1060  }
1061  }
1062 
1063  $contactstatic->fields = dol_sort_array($contactstatic->fields, 'position');
1064  $arrayfields = dol_sort_array($arrayfields, 'position');
1065 
1066  $newcardbutton = '';
1067  if ($user->hasRight('societe', 'contact', 'creer')) {
1068  $addcontact = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("AddContact") : $langs->trans("AddContactAddress"));
1069  $newcardbutton .= dolGetButtonTitle($addcontact, '', 'fa fa-plus-circle', DOL_URL_ROOT.'/contact/card.php?socid='.$object->id.'&amp;action=create&amp;backtopage='.urlencode($backtopage));
1070  }
1071 
1072  print "\n";
1073 
1074  $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("ContactsForCompany") : $langs->trans("ContactsAddressesForCompany"));
1075  print load_fiche_titre($title, $newcardbutton, '');
1076 
1077  print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'" name="formfilter">';
1078  print '<input type="hidden" name="token" value="'.newToken().'">';
1079  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1080  print '<input type="hidden" name="socid" value="'.$object->id.'">';
1081  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1082  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1083  print '<input type="hidden" name="page" value="'.$page.'">';
1084 
1085  $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1086  $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
1087  //if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1);
1088 
1089  print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
1090  print "\n".'<table class="tagtable liste">'."\n";
1091 
1092  $param = "socid=".urlencode($object->id);
1093  if ($search_rowid != '') {
1094  $param .= '&search_rowid='.urlencode($search_rowid);
1095  }
1096  if ($search_status != '') {
1097  $param .= '&search_status='.urlencode($search_status);
1098  }
1099  if (count($search_roles) > 0) {
1100  $param .= implode('&search_roles[]=', $search_roles);
1101  }
1102  if ($search_name != '') {
1103  $param .= '&search_name='.urlencode($search_name);
1104  }
1105  if ($search_poste != '') {
1106  $param .= '&search_poste='.urlencode($search_poste);
1107  }
1108  if ($search_address != '') {
1109  $param .= '&search_address='.urlencode($search_address);
1110  }
1111  if ($search_note_private != '') {
1112  $param .= '&search_note_private='.urlencode($search_note_private);
1113  }
1114  if ($optioncss != '') {
1115  $param .= '&optioncss='.urlencode($optioncss);
1116  }
1117 
1118  // Add $param from extra fields
1119  $extrafieldsobjectkey = $contactstatic->table_element;
1120  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1121 
1122  $sql = "SELECT t.rowid, t.entity, t.lastname, t.firstname, t.fk_pays as country_id, t.civility, t.poste, t.phone as phone_pro, t.phone_mobile, t.phone_perso, t.fax, t.email, t.socialnetworks, t.statut, t.photo,";
1123  $sql .= " t.civility as civility_id, t.address, t.zip, t.town";
1124  $sql .= ", t.note_private";
1125  $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as t";
1126  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople_extrafields as ef on (t.rowid = ef.fk_object)";
1127  $sql .= " WHERE t.fk_soc = ".((int) $object->id);
1128  $sql .= " AND ((t.fk_user_creat = ".((int) $user->id)." AND t.priv = 1) OR t.priv = 0)";
1129  if ($search_rowid) {
1130  $sql .= natural_search('t.rowid', $search_rowid);
1131  }
1132  if ($search_status != '' && $search_status != '-1') {
1133  $sql .= " AND t.statut = ".((int) $search_status);
1134  }
1135  if ($search_name) {
1136  $sql .= natural_search(array('t.lastname', 't.firstname'), $search_name);
1137  }
1138  if ($search_poste) {
1139  $sql .= natural_search('t.poste', $search_poste);
1140  }
1141  if ($search_address) {
1142  $sql .= natural_search($searchAddressPhoneDBFields, $search_address);
1143  }
1144  if ($search_note_private) {
1145  $sql .= natural_search('t.note_private', $search_note_private);
1146  }
1147  if (count($search_roles) > 0) {
1148  $sql .= " AND t.rowid IN (SELECT sc.fk_socpeople FROM ".MAIN_DB_PREFIX."societe_contacts as sc WHERE sc.fk_c_type_contact IN (".$db->sanitize(implode(',', $search_roles))."))";
1149  }
1150  // Add where from extra fields
1151  $extrafieldsobjectkey = $contactstatic->table_element;
1152  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
1153  // Add where from hooks
1154  $parameters = array('socid' => $object->id);
1155  $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
1156  $sql .= $hookmanager->resPrint;
1157  if ($sortfield == "t.name") {
1158  $sql .= " ORDER BY t.lastname $sortorder, t.firstname $sortorder";
1159  } else {
1160  $sql .= " ORDER BY $sortfield $sortorder";
1161  }
1162 
1163  dol_syslog('core/lib/company.lib.php :: show_contacts', LOG_DEBUG);
1164  $result = $db->query($sql);
1165  if (!$result) {
1166  dol_print_error($db);
1167  }
1168 
1169  $num = $db->num_rows($result);
1170 
1171  // Fields title search
1172  // --------------------------------------------------------------------
1173  print '<tr class="liste_titre">';
1174  foreach ($contactstatic->fields as $key => $val) {
1175  $align = '';
1176  if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
1177  $align .= ($align ? ' ' : '').'center';
1178  }
1179  if (in_array($val['type'], array('timestamp'))) {
1180  $align .= ($align ? ' ' : '').'nowrap';
1181  }
1182  if ($key == 'status' || $key == 'statut') {
1183  $align .= ($align ? ' ' : '').'center';
1184  }
1185  if (!empty($arrayfields['t.'.$key]['checked']) || !empty($arrayfields['sc.'.$key]['checked'])) {
1186  print '<td class="liste_titre'.($align ? ' '.$align : '').'">';
1187  if (in_array($key, array('statut'))) {
1188  print $form->selectarray('search_status', array('-1'=>'', '0'=>$contactstatic->LibStatut(0, 1), '1'=>$contactstatic->LibStatut(1, 1)), $search_status, 0, 0, 0, '', 0, 0, 0, '', 'onrightofpage');
1189  } elseif (in_array($key, array('role'))) {
1190  print $formcompany->showRoles("search_roles", $contactstatic, 'edit', $search_roles, 'minwidth200 maxwidth300');
1191  } else {
1192  print '<input type="text" class="flat maxwidth75" name="search_'.$key.'" value="'.(!empty($search[$key]) ? dol_escape_htmltag($search[$key]) : '').'">';
1193  }
1194  print '</td>';
1195  }
1196  }
1197  if ($showuserlogin) {
1198  print '<td class="liste_titre"></td>';
1199  }
1200  // Extra fields
1201  $extrafieldsobjectkey = $contactstatic->table_element;
1202  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1203 
1204  // Fields from hook
1205  $parameters = array('arrayfields'=>$arrayfields);
1206  $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $contactstatic); // Note that $action and $object may have been modified by hook
1207  print $hookmanager->resPrint;
1208  // Action column
1209  print '<td class="liste_titre" align="right">';
1210  print $form->showFilterButtons();
1211  print '</td>';
1212  print '</tr>'."\n";
1213 
1214 
1215  // Fields title label
1216  // --------------------------------------------------------------------
1217  print '<tr class="liste_titre">';
1218  foreach ($contactstatic->fields as $key => $val) {
1219  $align = '';
1220  if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
1221  $align .= ($align ? ' ' : '').'center';
1222  }
1223  if (in_array($val['type'], array('timestamp'))) {
1224  $align .= ($align ? ' ' : '').'nowrap';
1225  }
1226  if ($key == 'status' || $key == 'statut') {
1227  $align .= ($align ? ' ' : '').'center';
1228  }
1229  if (!empty($arrayfields['t.'.$key]['checked'])) {
1230  print getTitleFieldOfList($val['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($align ? 'class="'.$align.'"' : ''), $sortfield, $sortorder, $align.' ')."\n";
1231  }
1232  if ($key == 'role') {
1233  $align .= ($align ? ' ' : '').'left';
1234  }
1235  if (!empty($arrayfields['sc.'.$key]['checked'])) {
1236  print getTitleFieldOfList($arrayfields['sc.'.$key]['label'], 0, $_SERVER['PHP_SELF'], '', '', $param, ($align ? 'class="'.$align.'"' : ''), $sortfield, $sortorder, $align.' ')."\n";
1237  }
1238  }
1239  if ($showuserlogin) {
1240  print '<th class="wrapcolumntitle liste_titre">'.$langs->trans("DolibarrLogin").'</th>';
1241  }
1242  // Extra fields
1243  $extrafieldsobjectkey = $contactstatic->table_element;
1244  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1245  // Hook fields
1246  $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
1247  $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
1248  print $hookmanager->resPrint;
1249  print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ')."\n";
1250  print '</tr>'."\n";
1251 
1252  $i = -1;
1253 
1254  if ($num || (GETPOST('button_search') || GETPOST('button_search.x') || GETPOST('button_search_x'))) {
1255  $i = 0;
1256 
1257  while ($i < $num) {
1258  $obj = $db->fetch_object($result);
1259 
1260  $contactstatic->id = $obj->rowid;
1261  $contactstatic->ref = $obj->rowid;
1262  $contactstatic->statut = $obj->statut;
1263  $contactstatic->lastname = $obj->lastname;
1264  $contactstatic->firstname = $obj->firstname;
1265  $contactstatic->civility_id = $obj->civility_id;
1266  $contactstatic->civility_code = $obj->civility_id;
1267  $contactstatic->poste = $obj->poste;
1268  $contactstatic->address = $obj->address;
1269  $contactstatic->zip = $obj->zip;
1270  $contactstatic->town = $obj->town;
1271  $contactstatic->phone_pro = $obj->phone_pro;
1272  $contactstatic->phone_mobile = $obj->phone_mobile;
1273  $contactstatic->phone_perso = $obj->phone_perso;
1274  $contactstatic->email = $obj->email;
1275  $contactstatic->socialnetworks = $obj->socialnetworks;
1276  $contactstatic->photo = $obj->photo;
1277  $contactstatic->entity = $obj->entity;
1278 
1279  $country_code = getCountry($obj->country_id, 2);
1280  $contactstatic->country_code = $country_code;
1281 
1282  $contactstatic->setGenderFromCivility();
1283  $contactstatic->fetch_optionals();
1284 
1285  $resultRole = $contactstatic->fetchRoles();
1286  if ($resultRole < 0) {
1287  setEventMessages(null, $contactstatic->errors, 'errors');
1288  }
1289 
1290  if (is_array($contactstatic->array_options)) {
1291  foreach ($contactstatic->array_options as $key => $val) {
1292  $obj->$key = $val;
1293  }
1294  }
1295 
1296  print '<tr class="oddeven">';
1297 
1298  // ID
1299  if (!empty($arrayfields['t.rowid']['checked'])) {
1300  print '<td>';
1301  print $contactstatic->id;
1302  print '</td>';
1303  }
1304 
1305  // Photo - Name
1306  if (!empty($arrayfields['t.name']['checked'])) {
1307  print '<td>';
1308  print $form->showphoto('contact', $contactstatic, 0, 0, 0, 'photorefnoborder valignmiddle marginrightonly', 'small', 1, 0, 1);
1309  print $contactstatic->getNomUrl(0, '', 0, '&backtopage='.urlencode($backtopage));
1310  print '</td>';
1311  }
1312 
1313  // Job position
1314  if (!empty($arrayfields['t.poste']['checked'])) {
1315  print '<td>';
1316  if ($obj->poste) {
1317  print $obj->poste;
1318  }
1319  print '</td>';
1320  }
1321 
1322  // Address - Phone - Email
1323  if (!empty($arrayfields['t.address']['checked'])) {
1324  print '<td>';
1325  print $contactstatic->getBannerAddress('contact', $object);
1326  print '</td>';
1327  }
1328 
1329  // Note private
1330  if (!empty($arrayfields['t.note_private']['checked'])) {
1331  print '<td>';
1332  if ($obj->note_private) {
1333  print dol_string_nohtmltag($obj->note_private);
1334  }
1335  print '</td>';
1336  }
1337 
1338  // Role
1339  if (!empty($arrayfields['sc.role']['checked'])) {
1340  print '<td>';
1341  print $formcompany->showRoles("roles", $contactstatic, 'view');
1342  print '</td>';
1343  }
1344 
1345  // Status
1346  if (!empty($arrayfields['t.statut']['checked'])) {
1347  print '<td class="center">'.$contactstatic->getLibStatut(5).'</td>';
1348  }
1349 
1350  if ($showuserlogin) {
1351  print '<td>';
1352  $tmpuser= new User($db);
1353  $resfetch = $tmpuser->fetch(0, '', '', 0, -1, '', $contactstatic->id);
1354  if ($resfetch > 0) {
1355  print $tmpuser->getNomUrl(1, '', 0, 0, 24, 1);
1356  }
1357  print '</td>';
1358  }
1359 
1360  // Extra fields
1361  $extrafieldsobjectkey = $contactstatic->table_element;
1362  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1363 
1364  // Actions
1365  print '<td align="right">';
1366 
1367  // Add to agenda
1368  if (isModEnabled('agenda')&& $user->hasRight('agenda', 'myactions', 'create')) {
1369  print '<a href="'.DOL_URL_ROOT.'/comm/action/card.php?action=create&actioncode=&contactid='.$obj->rowid.'&socid='.$object->id.'&backtopage='.urlencode($backtopage).'">';
1370  print img_object($langs->trans("Event"), "action");
1371  print '</a> &nbsp; ';
1372  }
1373 
1374  // Edit
1375  if ($user->hasRight('societe', 'contact', 'creer')) {
1376  print '<a class="editfielda paddingleft" href="'.DOL_URL_ROOT.'/contact/card.php?action=edit&token='.newToken().'&id='.$obj->rowid.'&backtopage='.urlencode($backtopage).'">';
1377  print img_edit();
1378  print '</a>';
1379  }
1380 
1381  print '</td>';
1382 
1383  print "</tr>\n";
1384  $i++;
1385  }
1386  } else {
1387  $colspan = 1;
1388  foreach ($arrayfields as $key => $val) {
1389  if (!empty($val['checked'])) {
1390  $colspan++;
1391  }
1392  }
1393  print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
1394  }
1395  print "\n</table>\n";
1396  print '</div>';
1397 
1398  print '</form>'."\n";
1399 
1400  return $i;
1401 }
1402 
1403 
1416 function show_actions_todo($conf, $langs, $db, $filterobj, $objcon = '', $noprint = 0, $actioncode = '')
1417 {
1418  global $user, $conf;
1419 
1420  $out = show_actions_done($conf, $langs, $db, $filterobj, $objcon, 1, $actioncode, 'todo');
1421 
1422  if ($noprint) {
1423  return $out;
1424  } else {
1425  print $out;
1426  }
1427 }
1428 
1447 function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprint = 0, $actioncode = '', $donetodo = 'done', $filters = array(), $sortfield = 'a.datep,a.id', $sortorder = 'DESC', $module = '')
1448 {
1449  global $user, $conf;
1450  global $form;
1451  global $param, $massactionbutton;
1452 
1453  $start_year = GETPOST('dateevent_startyear', 'int');
1454  $start_month = GETPOST('dateevent_startmonth', 'int');
1455  $start_day = GETPOST('dateevent_startday', 'int');
1456  $end_year = GETPOST('dateevent_endyear', 'int');
1457  $end_month = GETPOST('dateevent_endmonth', 'int');
1458  $end_day = GETPOST('dateevent_endday', 'int');
1459  $tms_start = '';
1460  $tms_end = '';
1461 
1462  if (!empty($start_year) && !empty($start_month) && !empty($start_day)) {
1463  $tms_start = dol_mktime(0, 0, 0, $start_month, $start_day, $start_year, 'tzuserrel');
1464  }
1465  if (!empty($end_year) && !empty($end_month) && !empty($end_day)) {
1466  $tms_end = dol_mktime(23, 59, 59, $end_month, $end_day, $end_year, 'tzuserrel');
1467  }
1468  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
1469  $tms_start = '';
1470  $tms_end = '';
1471  }
1472  dol_include_once('/comm/action/class/actioncomm.class.php');
1473 
1474  // Check parameters
1475  if (!is_object($filterobj) && !is_object($objcon)) {
1476  dol_print_error('', 'BadParameter');
1477  }
1478 
1479  $out = '';
1480  $histo = array();
1481  $numaction = 0;
1482  $now = dol_now('tzuser');
1483 
1484  // Open DSI -- Fix order by -- Begin
1485  $sortfield_list = explode(',', $sortfield);
1486  $sortfield_label_list = array('a.id' => 'id', 'a.datep' => 'dp', 'a.percent' => 'percent');
1487  $sortfield_new_list = array();
1488  foreach ($sortfield_list as $sortfield_value) {
1489  $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
1490  }
1491  $sortfield_new = implode(',', $sortfield_new_list);
1492 
1493  $sql = '';
1494 
1495  if (isModEnabled('agenda')) {
1496  require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
1497  $hookmanager = new HookManager($db);
1498  // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
1499  $hookmanager->initHooks(array('agendadao'));
1500 
1501  // Recherche histo sur actioncomm
1502  if (is_object($objcon) && $objcon->id > 0) {
1503  $sql = "SELECT DISTINCT a.id, a.label as label,";
1504  } else {
1505  $sql = "SELECT a.id, a.label as label,";
1506  }
1507  $sql .= " a.datep as dp,";
1508  $sql .= " a.datep2 as dp2,";
1509  $sql .= " a.percent as percent, 'action' as type,";
1510  $sql .= " a.fk_element, a.elementtype,";
1511  $sql .= " a.fk_contact,";
1512  $sql .= " c.code as acode, c.libelle as alabel, c.picto as apicto,";
1513  $sql .= " u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname";
1514  if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
1515  $sql .= ", sp.lastname, sp.firstname";
1516  } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
1517  /* Nothing */
1518  } elseif (is_object($filterobj) && get_class($filterobj) == 'Project') {
1519  /* Nothing */
1520  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
1521  $sql .= ", m.lastname, m.firstname";
1522  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
1523  $sql .= ", o.ref";
1524  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
1525  $sql .= ", o.ref";
1526  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
1527  $sql .= ", o.ref";
1528  } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
1529  $sql .= ", o.ref";
1530  } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
1531  $sql .= ", o.ref";
1532  } elseif (is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid']) && $filterobj->table_element && $filterobj->element) {
1533  if (!empty($filterobj->fields['ref'])) {
1534  $sql .= ", o.ref";
1535  } elseif (!empty($filterobj->fields['label'])) {
1536  $sql .= ", o.label";
1537  }
1538  }
1539 
1540  // Fields from hook
1541  $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
1542  $reshook = $hookmanager->executeHooks('showActionsDoneListSelect', $parameters); // Note that $action and $object may have been modified by hook
1543  if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
1544 
1545  $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
1546  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action";
1547  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id";
1548 
1549  $force_filter_contact = false;
1550  if (is_object($objcon) && $objcon->id > 0) {
1551  $force_filter_contact = true;
1552  $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm_resources as r ON a.id = r.fk_actioncomm";
1553  $sql .= " AND r.element_type = '".$db->escape($objcon->table_element)."' AND r.fk_element = ".((int) $objcon->id);
1554  }
1555 
1556  // Fields from hook
1557  $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
1558  $reshook = $hookmanager->executeHooks('showActionsDoneListFrom', $parameters); // Note that $action and $object may have been modified by hook
1559  if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
1560 
1561  if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
1562  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
1563  } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
1564  $sql .= " INNER JOIN ".MAIN_DB_PREFIX."element_resources as er";
1565  $sql .= " ON er.resource_type = 'dolresource'";
1566  $sql .= " AND er.element_id = a.id";
1567  $sql .= " AND er.resource_id = ".((int) $filterobj->id);
1568  } elseif (is_object($filterobj) && get_class($filterobj) == 'Project') {
1569  /* Nothing */
1570  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
1571  $sql .= ", ".MAIN_DB_PREFIX."adherent as m";
1572  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
1573  $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as o";
1574  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
1575  $sql .= ", ".MAIN_DB_PREFIX."product as o";
1576  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
1577  $sql .= ", ".MAIN_DB_PREFIX."ticket as o";
1578  } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
1579  $sql .= ", ".MAIN_DB_PREFIX."bom_bom as o";
1580  } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
1581  $sql .= ", ".MAIN_DB_PREFIX."contrat as o";
1582  } elseif (is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid']) && (!empty($filterobj->fields['ref']) && is_array($filterobj->fields['ref']) || $filterobj->fields['label'] && is_array($filterobj->fields['label'])) && $filterobj->table_element && $filterobj->element) {
1583  $sql .= ", ".MAIN_DB_PREFIX.$filterobj->table_element." as o";
1584  }
1585 
1586  $sql .= " WHERE a.entity IN (".getEntity('agenda').")";
1587  if ($force_filter_contact === false) {
1588  if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur')) && $filterobj->id) {
1589  $sql .= " AND a.fk_soc = ".((int) $filterobj->id);
1590  } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
1591  /* Nothing */
1592  } elseif (is_object($filterobj) && get_class($filterobj) == 'Project' && $filterobj->id) {
1593  $sql .= " AND a.fk_project = ".((int) $filterobj->id);
1594  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
1595  $sql .= " AND a.fk_element = m.rowid AND a.elementtype = 'member'";
1596  if ($filterobj->id) {
1597  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1598  }
1599  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
1600  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
1601  if ($filterobj->id) {
1602  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1603  }
1604  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
1605  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'product'";
1606  if ($filterobj->id) {
1607  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1608  }
1609  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
1610  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
1611  if ($filterobj->id) {
1612  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1613  }
1614  } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
1615  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
1616  if ($filterobj->id) {
1617  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1618  }
1619  } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
1620  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
1621  if ($filterobj->id) {
1622  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1623  }
1624  } elseif (is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid']) && (!empty($filterobj->fields['ref']) && is_array($filterobj->fields['ref']) || $filterobj->fields['label'] && is_array($filterobj->fields['label'])) && $filterobj->table_element && $filterobj->element) {
1625  // Generic case
1626  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = '".$db->escape($filterobj->element).($module ? "@".$module : "")."'";
1627  if ($filterobj->id) {
1628  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1629  }
1630  }
1631  }
1632 
1633  if (!empty($tms_start) && !empty($tms_end)) {
1634  $sql .= " AND ((a.datep BETWEEN '".$db->idate($tms_start)."' AND '".$db->idate($tms_end)."') OR (a.datep2 BETWEEN '".$db->idate($tms_start)."' AND '".$db->idate($tms_end)."'))";
1635  } elseif (empty($tms_start) && !empty($tms_end)) {
1636  $sql .= " AND ((a.datep <= '".$db->idate($tms_end)."') OR (a.datep2 <= '".$db->idate($tms_end)."'))";
1637  } elseif (!empty($tms_start) && empty($tms_end)) {
1638  $sql .= " AND ((a.datep >= '".$db->idate($tms_start)."') OR (a.datep2 >= '".$db->idate($tms_start)."'))";
1639  }
1640 
1641  if (is_array($actioncode) && !empty($actioncode)) {
1642  $sql .= ' AND (';
1643  foreach ($actioncode as $key => $code) {
1644  if ($key != 0) {
1645  $sql .= "OR (";
1646  }
1647  if (!empty($code)) {
1648  addEventTypeSQL($sql, $code);
1649  }
1650  if ($key != 0) {
1651  $sql .= ")";
1652  }
1653  }
1654  $sql .= ')';
1655  } elseif (!empty($actioncode)) {
1656  addEventTypeSQL($sql, $actioncode);
1657  }
1658 
1659  addOtherFilterSQL($sql, $donetodo, $now, $filters);
1660 
1661  // Fields from hook
1662  $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon, 'module' => $module);
1663  $reshook = $hookmanager->executeHooks('showActionsDoneListWhere', $parameters); // Note that $action and $object may have been modified by hook
1664  if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
1665 
1666  if (is_array($actioncode)) {
1667  foreach ($actioncode as $code) {
1668  $sql2 = addMailingEventTypeSQL($code, $objcon, $filterobj);
1669  if (!empty($sql2)) {
1670  if (!empty($sql)) {
1671  $sql = $sql." UNION ".$sql2;
1672  } elseif (empty($sql)) {
1673  $sql = $sql2;
1674  }
1675  break;
1676  }
1677  }
1678  } else {
1679  $sql2 = addMailingEventTypeSQL($actioncode, $objcon, $filterobj);
1680  if (!empty($sql) && !empty($sql2)) {
1681  $sql = $sql." UNION ".$sql2;
1682  } elseif (empty($sql) && !empty($sql2)) {
1683  $sql = $sql2;
1684  }
1685  }
1686  }
1687 
1688  //TODO Add limit in nb of results
1689  if ($sql) {
1690  $sql .= $db->order($sortfield_new, $sortorder);
1691  dol_syslog("company.lib::show_actions_done", LOG_DEBUG);
1692  $resql = $db->query($sql);
1693  if ($resql) {
1694  $i = 0;
1695  $num = $db->num_rows($resql);
1696 
1697  while ($i < $num) {
1698  $obj = $db->fetch_object($resql);
1699 
1700  if ($obj->type == 'action') {
1701  $contactaction = new ActionComm($db);
1702  $contactaction->id = $obj->id;
1703  $result = $contactaction->fetchResources();
1704  if ($result < 0) {
1705  dol_print_error($db);
1706  setEventMessage("company.lib::show_actions_done Error fetch ressource", 'errors');
1707  }
1708 
1709  //if ($donetodo == 'todo') $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
1710  //elseif ($donetodo == 'done') $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
1711  $tododone = '';
1712  if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && (!empty($obj->datep) && $obj->datep > $now))) {
1713  $tododone = 'todo';
1714  }
1715 
1716  $histo[$numaction] = array(
1717  'type'=>$obj->type,
1718  'tododone'=>$tododone,
1719  'id'=>$obj->id,
1720  'datestart'=>$db->jdate($obj->dp),
1721  'dateend'=>$db->jdate($obj->dp2),
1722  'note'=>$obj->label,
1723  'percent'=>$obj->percent,
1724 
1725  'userid'=>$obj->user_id,
1726  'login'=>$obj->user_login,
1727  'userfirstname'=>$obj->user_firstname,
1728  'userlastname'=>$obj->user_lastname,
1729  'userphoto'=>$obj->user_photo,
1730 
1731  'contact_id'=>$obj->fk_contact,
1732  'socpeopleassigned' => $contactaction->socpeopleassigned,
1733  'lastname' => empty($obj->lastname) ? '' : $obj->lastname,
1734  'firstname' => empty($obj->firstname) ? '' : $obj->firstname,
1735  'fk_element'=>$obj->fk_element,
1736  'elementtype'=>$obj->elementtype,
1737  // Type of event
1738  'acode'=>$obj->acode,
1739  'alabel'=>$obj->alabel,
1740  'libelle'=>$obj->alabel, // deprecated
1741  'apicto'=>$obj->apicto
1742  );
1743  } else {
1744  $histo[$numaction] = array(
1745  'type'=>$obj->type,
1746  'tododone'=>'done',
1747  'id'=>$obj->id,
1748  'datestart'=>$db->jdate($obj->dp),
1749  'dateend'=>$db->jdate($obj->dp2),
1750  'note'=>$obj->label,
1751  'percent'=>$obj->percent,
1752  'acode'=>$obj->acode,
1753 
1754  'userid'=>$obj->user_id,
1755  'login'=>$obj->user_login,
1756  'userfirstname'=>$obj->user_firstname,
1757  'userlastname'=>$obj->user_lastname,
1758  'userphoto'=>$obj->user_photo
1759  );
1760  }
1761 
1762  $numaction++;
1763  $i++;
1764  }
1765  } else {
1766  dol_print_error($db);
1767  }
1768  }
1769 
1770  if (isModEnabled('agenda')|| (isModEnabled('mailing') && !empty($objcon->email))) {
1771  $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
1772 
1773  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
1774  include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1775  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1776  require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1777 
1778  $formactions = new FormActions($db);
1779 
1780  $actionstatic = new ActionComm($db);
1781  $userstatic = new User($db);
1782  $userlinkcache = array();
1783  $contactstatic = new Contact($db);
1784  $elementlinkcache = array();
1785 
1786  $out .= '<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER["PHP_SELF"].'" method="POST">';
1787  $out .= '<input type="hidden" name="token" value="'.newToken().'">';
1788  if ($objcon && get_class($objcon) == 'Contact' &&
1789  (is_null($filterobj) || get_class($filterobj) == 'Societe')) {
1790  $out .= '<input type="hidden" name="id" value="'.$objcon->id.'" />';
1791  } else {
1792  $out .= '<input type="hidden" name="id" value="'.$filterobj->id.'" />';
1793  }
1794  if ($filterobj && get_class($filterobj) == 'Societe') {
1795  $out .= '<input type="hidden" name="socid" value="'.$filterobj->id.'" />';
1796  }
1797 
1798  $out .= "\n";
1799 
1800  $out .= '<div class="div-table-responsive-no-min">';
1801  $out .= '<table class="noborder centpercent">';
1802 
1803  $out .= '<tr class="liste_titre">';
1804  if ($donetodo) {
1805  $out .= '<td class="liste_titre"></td>';
1806  }
1807  $out .= '<td class="liste_titre"></td>';
1808  $out .= '<td class="liste_titre"></td>';
1809  $out .= '<td class="liste_titre">';
1810  $out .= $formactions->select_type_actions($actioncode, "actioncode", '', empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1, 0, (empty($conf->global->AGENDA_USE_MULTISELECT_TYPE) ? 0 : 1), 1, 'minwidth100 maxwidth150');
1811  $out .= '</td>';
1812  $out .= '<td class="liste_titre maxwidth100onsmartphone"><input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters['search_agenda_label'].'"></td>';
1813  $out .= '<td class="liste_titre center">';
1814  $out .= $form->selectDateToDate($tms_start, $tms_end, 'dateevent', 1);
1815  $out .= '</td>';
1816  $out .= '<td class="liste_titre"></td>';
1817  $out .= '<td class="liste_titre"></td>';
1818  $out .= '<td class="liste_titre"></td>';
1819  // Action column
1820  $out .= '<td class="liste_titre" align="middle">';
1821  $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
1822  $out .= $searchpicto;
1823  $out .= '</td>';
1824  $out .= '</tr>';
1825 
1826  $out .= '<tr class="liste_titre">';
1827  if ($donetodo) {
1828  $tmp = '';
1829  if (get_class($filterobj) == 'Societe') {
1830  $tmp .= '<a href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.'&status=done">';
1831  }
1832  $tmp .= ($donetodo != 'done' ? $langs->trans("ActionsToDoShort") : '');
1833  $tmp .= ($donetodo != 'done' && $donetodo != 'todo' ? ' / ' : '');
1834  $tmp .= ($donetodo != 'todo' ? $langs->trans("ActionsDoneShort") : '');
1835  //$out.=$langs->trans("ActionsToDoShort").' / '.$langs->trans("ActionsDoneShort");
1836  if (get_class($filterobj) == 'Societe') {
1837  $tmp .= '</a>';
1838  }
1839  $out .= getTitleFieldOfList($tmp);
1840  }
1841  $out .= getTitleFieldOfList("Ref", 0, $_SERVER["PHP_SELF"], 'a.id', '', $param, '', $sortfield, $sortorder);
1842  $out .= getTitleFieldOfList("Owner");
1843  $out .= getTitleFieldOfList("Type");
1844  $out .= getTitleFieldOfList("Label", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
1845  $out .= getTitleFieldOfList("Date", 0, $_SERVER["PHP_SELF"], 'a.datep,a.id', '', $param, '', $sortfield, $sortorder, 'center ');
1846  $out .= getTitleFieldOfList("RelatedObjects", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
1847  $out .= getTitleFieldOfList("ActionOnContact", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'tdoverflowmax125 ', 0, '', 0);
1848  $out .= getTitleFieldOfList("Status", 0, $_SERVER["PHP_SELF"], 'a.percent', '', $param, '', $sortfield, $sortorder, 'center ');
1849  $out .= getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'maxwidthsearch ');
1850  $out .= '</tr>';
1851 
1852  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
1853  $caction = new CActionComm($db);
1854  $arraylist = $caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : 0), '', 1);
1855 
1856  foreach ($histo as $key => $value) {
1857  $actionstatic->fetch($histo[$key]['id']); // TODO Do we need this, we already have a lot of data of line into $histo
1858 
1859  $actionstatic->type_picto = $histo[$key]['apicto'];
1860  $actionstatic->type_code = $histo[$key]['acode'];
1861 
1862  $out .= '<tr class="oddeven">';
1863 
1864  // Done or todo
1865  if ($donetodo) {
1866  $out .= '<td class="nowrap">';
1867  $out .= '</td>';
1868  }
1869 
1870  // Ref
1871  $out .= '<td class="nowraponall">';
1872  if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
1873  $out .= '<a href="'.DOL_URL_ROOT.'/comm/mailing/card.php?id='.$histo[$key]['id'].'">'.img_object($langs->trans("ShowEMailing"), "email").' ';
1874  $out .= $histo[$key]['id'];
1875  $out .= '</a>';
1876  } else {
1877  $out .= $actionstatic->getNomUrl(1, -1);
1878  }
1879  $out .= '</td>';
1880 
1881  // Author of event
1882  $out .= '<td class="tdoverflowmax150">';
1883  //$userstatic->id=$histo[$key]['userid'];
1884  //$userstatic->login=$histo[$key]['login'];
1885  //$out.=$userstatic->getLoginUrl(1);
1886  if ($histo[$key]['userid'] > 0) {
1887  if (isset($userlinkcache[$histo[$key]['userid']])) {
1888  $link = $userlinkcache[$histo[$key]['userid']];
1889  } else {
1890  $userstatic->fetch($histo[$key]['userid']);
1891  $link = $userstatic->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
1892  $userlinkcache[$histo[$key]['userid']] = $link;
1893  }
1894  $out .= $link;
1895  }
1896  $out .= '</td>';
1897 
1898  // Type
1899  $labeltype = $actionstatic->type_code;
1900  if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) {
1901  $labeltype = 'AC_OTH';
1902  }
1903  if (preg_match('/^TICKET_MSG/', $actionstatic->code)) {
1904  $labeltype = $langs->trans("Message");
1905  } else {
1906  if (!empty($arraylist[$labeltype])) {
1907  $labeltype = $arraylist[$labeltype];
1908  }
1909  if ($actionstatic->type_code == 'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
1910  $labeltype .= ' - '.$arraylist[$actionstatic->code]; // Use code in priority on type_code
1911  }
1912  }
1913  $out .= '<td class="tdoverflowmax150" title="'.$labeltype.'">';
1914  $out .= $actionstatic->getTypePicto();
1915  $out .= $labeltype;
1916  $out .= '</td>';
1917 
1918  // Title/Label of event
1919  $out .= '<td class="tdoverflowmax300"';
1920  if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'action') {
1921  $transcode = $langs->trans("Action".$histo[$key]['acode']);
1922  $libelle = ($transcode != "Action".$histo[$key]['acode'] ? $transcode : $histo[$key]['alabel']);
1923  //$actionstatic->libelle=$libelle;
1924  $libelle = $histo[$key]['note'];
1925  $actionstatic->id = $histo[$key]['id'];
1926  $out .= ' title="'.dol_escape_htmltag($libelle).'">';
1927  $out .= dol_trunc($libelle, 120);
1928  }
1929  if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
1930  $out .= '<a href="'.DOL_URL_ROOT.'/comm/mailing/card.php?id='.$histo[$key]['id'].'">'.img_object($langs->trans("ShowEMailing"), "email").' ';
1931  $transcode = $langs->trans("Action".$histo[$key]['acode']);
1932  $libelle = ($transcode != "Action".$histo[$key]['acode'] ? $transcode : 'Send mass mailing');
1933  $out .= ' title="'.dol_escape_htmltag($libelle).'">';
1934  $out .= dol_trunc($libelle, 120);
1935  }
1936  $out .= '</td>';
1937 
1938  // Date
1939  $out .= '<td class="center nowrap">';
1940  $out .= dol_print_date($histo[$key]['datestart'], 'dayhour', 'tzuserrel');
1941  if ($histo[$key]['dateend'] && $histo[$key]['dateend'] != $histo[$key]['datestart']) {
1942  $tmpa = dol_getdate($histo[$key]['datestart'], true);
1943  $tmpb = dol_getdate($histo[$key]['dateend'], true);
1944  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1945  $out .= '-'.dol_print_date($histo[$key]['dateend'], 'hour', 'tzuserrel');
1946  } else {
1947  $out .= '-'.dol_print_date($histo[$key]['dateend'], 'dayhour', 'tzuserrel');
1948  }
1949  }
1950  $late = 0;
1951  if ($histo[$key]['percent'] == 0 && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
1952  $late = 1;
1953  }
1954  if ($histo[$key]['percent'] == 0 && !$histo[$key]['datestart'] && $histo[$key]['dateend'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
1955  $late = 1;
1956  }
1957  if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && $histo[$key]['dateend'] && $histo[$key]['dateend'] < ($now - $delay_warning)) {
1958  $late = 1;
1959  }
1960  if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && !$histo[$key]['dateend'] && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
1961  $late = 1;
1962  }
1963  if ($late) {
1964  $out .= img_warning($langs->trans("Late")).' ';
1965  }
1966  $out .= "</td>\n";
1967 
1968  // Title of event
1969  //$out.='<td>'.dol_trunc($histo[$key]['note'], 40).'</td>';
1970 
1971  // Linked object
1972  $out .= '<td class="nowraponall">';
1973  if (isset($histo[$key]['elementtype']) && !empty($histo[$key]['fk_element'])) {
1974  if (isset($elementlinkcache[$histo[$key]['elementtype']]) && isset($elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']])) {
1975  $link = $elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']];
1976  } else {
1977  if (!isset($elementlinkcache[$histo[$key]['elementtype']])) {
1978  $elementlinkcache[$histo[$key]['elementtype']] = array();
1979  }
1980  $link = dolGetElementUrl($histo[$key]['fk_element'], $histo[$key]['elementtype'], 1);
1981  $elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']] = $link;
1982  }
1983  $out .= $link;
1984  } else {
1985  $out .= '&nbsp;';
1986  }
1987  $out .= '</td>';
1988 
1989  // Contact(s) for action
1990  if (isset($histo[$key]['socpeopleassigned']) && is_array($histo[$key]['socpeopleassigned']) && count($histo[$key]['socpeopleassigned']) > 0) {
1991  $out .= '<td class="valignmiddle">';
1992  $contact = new Contact($db);
1993  foreach ($histo[$key]['socpeopleassigned'] as $cid => $cvalue) {
1994  $result = $contact->fetch($cid);
1995 
1996  if ($result < 0) {
1997  dol_print_error($db, $contact->error);
1998  }
1999 
2000  if ($result > 0) {
2001  $out .= $contact->getNomUrl(-3, '', 10, '', -1, 0, 'paddingright');
2002  if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
2003  if (!empty($contact->phone_pro)) {
2004  $out .= '('.dol_print_phone($contact->phone_pro).')';
2005  }
2006  }
2007  $out .= '<div class="paddingright"></div>';
2008  }
2009  }
2010  $out .= '</td>';
2011  } elseif (empty($objcon->id) && isset($histo[$key]['contact_id']) && $histo[$key]['contact_id'] > 0) {
2012  $contactstatic->lastname = $histo[$key]['lastname'];
2013  $contactstatic->firstname = $histo[$key]['firstname'];
2014  $contactstatic->id = $histo[$key]['contact_id'];
2015  $contactstatic->photo = $histo[$key]['contact_photo'];
2016  $out .= '<td width="120">'.$contactstatic->getNomUrl(-1, '', 10).'</td>';
2017  } else {
2018  $out .= '<td>&nbsp;</td>';
2019  }
2020 
2021  // Status
2022  $out .= '<td class="nowrap center">'.$actionstatic->LibStatut($histo[$key]['percent'], 2, 0, $histo[$key]['datestart']).'</td>';
2023 
2024  // Actions
2025  $out .= '<td></td>';
2026 
2027  $out .= "</tr>\n";
2028  $i++;
2029  }
2030  if (empty($histo)) {
2031  $colspan = 9;
2032  $out .= '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2033  }
2034 
2035  $out .= "</table>\n";
2036  $out .= "</div>\n";
2037 
2038  $out .= '</form>';
2039  }
2040 
2041  if ($noprint) {
2042  return $out;
2043  } else {
2044  print $out;
2045  }
2046 }
2047 
2057 function show_subsidiaries($conf, $langs, $db, $object)
2058 {
2059  global $user;
2060 
2061  $i = -1;
2062 
2063  $sql = "SELECT s.rowid, s.client, s.fournisseur, s.nom as name, s.name_alias, s.email, s.address, s.zip, s.town, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur, s.canvas";
2064  $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
2065  $sql .= " WHERE s.parent = ".((int) $object->id);
2066  $sql .= " AND s.entity IN (".getEntity('societe').")";
2067  $sql .= " ORDER BY s.nom";
2068 
2069  $result = $db->query($sql);
2070  $num = $db->num_rows($result);
2071 
2072  if ($num) {
2073  $socstatic = new Societe($db);
2074 
2075  print load_fiche_titre($langs->trans("Subsidiaries"), '', '');
2076 
2077  print "\n".'<div class="div-table-responsive-no-min">'."\n";
2078  print '<table class="noborder centpercent">'."\n";
2079 
2080  print '<tr class="liste_titre"><td>'.$langs->trans("Company").'</td>';
2081  print '<td>'.$langs->trans("Address").'</td><td>'.$langs->trans("Zip").'</td>';
2082  print '<td>'.$langs->trans("Town").'</td><td>'.$langs->trans("CustomerCode").'</td>';
2083  print "<td>&nbsp;</td>";
2084  print "</tr>";
2085 
2086  $i = 0;
2087 
2088  while ($i < $num) {
2089  $obj = $db->fetch_object($result);
2090 
2091  $socstatic->id = $obj->rowid;
2092  $socstatic->name = $obj->name;
2093  $socstatic->name_alias = $obj->name_alias;
2094  $socstatic->email = $obj->email;
2095  $socstatic->code_client = $obj->code_client;
2096  $socstatic->code_fournisseur = $obj->code_client;
2097  $socstatic->code_compta = $obj->code_compta;
2098  $socstatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
2099  $socstatic->email = $obj->email;
2100  $socstatic->canvas = $obj->canvas;
2101  $socstatic->client = $obj->client;
2102  $socstatic->fournisseur = $obj->fournisseur;
2103 
2104  print '<tr class="oddeven">';
2105 
2106  print '<td class="tdoverflowmax150">';
2107  print $socstatic->getNomUrl(1);
2108  print '</td>';
2109 
2110  print '<td class="tdoverflowmax400" title="'.dol_escape_htmltag($obj->address).'">'.dol_escape_htmltag($obj->address).'</td>';
2111  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->zip).'">'.$obj->zip.'</td>';
2112  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->town).'">'.$obj->town.'</td>';
2113  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->code_client).'">'.$obj->code_client.'</td>';
2114 
2115  print '<td class="center">';
2116  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/societe/card.php?socid='.((int) $obj->rowid).'&action=edit&token='.newToken().'">';
2117  print img_edit();
2118  print '</a></td>';
2119 
2120  print "</tr>\n";
2121  $i++;
2122  }
2123  print "\n</table>\n";
2124  print '</div>'."\n";
2125  }
2126 
2127  print "<br>\n";
2128 
2129  return $i;
2130 }
2139 function addEventTypeSQL(&$sql, $actioncode, $sqlANDOR = "AND")
2140 {
2141  global $conf, $db;
2142  // Condition on actioncode
2143 
2144  if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
2145  if ($actioncode == 'AC_NON_AUTO') {
2146  $sql .= " $sqlANDOR c.type != 'systemauto'";
2147  } elseif ($actioncode == 'AC_ALL_AUTO') {
2148  $sql .= " $sqlANDOR c.type = 'systemauto'";
2149  } else {
2150  if ($actioncode == 'AC_OTH') {
2151  $sql .= " $sqlANDOR c.type != 'systemauto'";
2152  } elseif ($actioncode == 'AC_OTH_AUTO') {
2153  $sql .= " $sqlANDOR c.type = 'systemauto'";
2154  }
2155  }
2156  } else {
2157  if ($actioncode == 'AC_NON_AUTO') {
2158  $sql .= " $sqlANDOR c.type != 'systemauto'";
2159  } elseif ($actioncode == 'AC_ALL_AUTO') {
2160  $sql .= " $sqlANDOR c.type = 'systemauto'";
2161  } else {
2162  $sql .= " $sqlANDOR c.code = '".$db->escape($actioncode)."'";
2163  }
2164  }
2165 
2166  return $sql;
2167 }
2168 
2178 function addOtherFilterSQL(&$sql, $donetodo, $now, $filters)
2179 {
2180  global $conf, $db;
2181  // Condition on actioncode
2182 
2183  if ($donetodo == 'todo') {
2184  $sql .= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
2185  } elseif ($donetodo == 'done') {
2186  $sql .= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
2187  }
2188  if (is_array($filters) && $filters['search_agenda_label']) {
2189  $sql .= natural_search('a.label', $filters['search_agenda_label']);
2190  }
2191 
2192  return $sql;
2193 }
2194 
2203 function addMailingEventTypeSQL($actioncode, $objcon, $filterobj)
2204 {
2205  global $conf, $langs, $db;
2206  // Add also event from emailings. TODO This should be replaced by an automatic event ? May be it's too much for very large emailing.
2207  if (isModEnabled('mailing') && !empty($objcon->email)
2208  && (empty($actioncode) || $actioncode == 'AC_OTH_AUTO' || $actioncode == 'AC_EMAILING')) {
2209  $langs->load("mails");
2210 
2211  $sql2 = "SELECT m.rowid as id, m.titre as label, mc.date_envoi as dp, mc.date_envoi as dp2, '100' as percent, 'mailing' as type";
2212  $sql2 .= ", null as fk_element, '' as elementtype, null as contact_id";
2213  $sql2 .= ", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
2214  $sql2 .= ", u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname"; // User that valid action
2215  if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
2216  $sql2 .= ", '' as lastname, '' as firstname";
2217  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
2218  $sql2 .= ", '' as lastname, '' as firstname";
2219  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
2220  $sql2 .= ", '' as ref";
2221  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
2222  $sql2 .= ", '' as ref";
2223  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
2224  $sql2 .= ", '' as ref";
2225  }
2226  $sql2 .= " FROM ".MAIN_DB_PREFIX."mailing as m, ".MAIN_DB_PREFIX."mailing_cibles as mc, ".MAIN_DB_PREFIX."user as u";
2227  $sql2 .= " WHERE mc.email = '".$db->escape($objcon->email)."'"; // Search is done on email.
2228  $sql2 .= " AND mc.statut = 1";
2229  $sql2 .= " AND u.rowid = m.fk_user_valid";
2230  $sql2 .= " AND mc.fk_mailing=m.rowid";
2231  return $sql2;
2232  }
2233 }
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
Class to manage agenda events (actions)
Class to manage different types of events.
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class to manage hooks.
Class to manage projects.
Class for SocieteAccount.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:45
show_projects($conf, $langs, $db, $object, $backtopage='', $nocreatelink=0, $morehtmlright='')
Show html area for list of projects.
show_contacts($conf, $langs, $db, $object, $backtopage='', $showuserlogin=0)
Show html area for list of contacts.
currency_name($code_iso, $withcode='', $outputlangs=null)
Return label of currency or code+label.
getCountriesInEEC()
Return list of countries that are inside the EEC (European Economic Community) Note: Try to keep this...
show_actions_todo($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='')
Show html area with actions to do.
show_actions_done($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC', $module='')
Show html area with actions (done or not, ignore the name of function).
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
societe_prepare_head2($object)
Return array of tabs to used on page.
show_subsidiaries($conf, $langs, $db, $object)
Show html area for list of subsidiaries.
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
Definition: company.lib.php:42
getState($id, $withcode='', $dbtouse=0, $withregion=0, $outputlangs='', $entconv=1)
Return state translated from an id.
addOtherFilterSQL(&$sql, $donetodo, $now, $filters)
Add Event Type SQL.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
addEventTypeSQL(&$sql, $actioncode, $sqlANDOR="AND")
Add Event Type SQL.
societe_admin_prepare_head()
Return array head with list of tabs to view object informations.
getFormeJuridiqueLabel($code)
Retourne le nom traduit de la forme juridique.
addMailingEventTypeSQL($actioncode, $objcon, $filterobj)
Add Mailing Event Type SQL.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:61
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
getArrayOfSocialNetworks()
Get array of social network dictionary.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessage($mesgs, $style='mesgs')
Set event message in dol_events session object.
if(!function_exists('utf8_encode')) if(!function_exists('utf8_decode')) getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
complete_head_from_modules($conf, $langs, $object, &$head, &$h, $type, $mode='add', $filterorigmodule='')
Complete or removed entries into a head array (used to build tabs).
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_setcache($memoryid, $data, $expire=0)
Save data into a memory area shared by all users, all sessions on server.
Definition: memory.lib.php:68
dol_getcache($memoryid)
Read a memory area shared by all users, all sessions on server.
Definition: memory.lib.php:135