dolibarr  17.0.4
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  $sql .= " AND entity IN (".getEntity($object->element).")";
75  // Add where from hooks
76  $parameters = array('contacttab' => true);
77  $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
78  $sql .= $hookmanager->resPrint;
79  $resql = $db->query($sql);
80  if ($resql) {
81  $obj = $db->fetch_object($resql);
82  $nbContact = $obj->nb;
83  }
84 
85  dol_setcache($cachekey, $nbContact, 120); // If setting cache fails, this is not a problem, so we do not test result.
86  }
87 
88  $head[$h][0] = DOL_URL_ROOT.'/societe/contact.php?socid='.$object->id;
89  $head[$h][1] = $langs->trans('ContactsAddresses');
90  if ($nbContact > 0) {
91  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbContact.'</span>';
92  }
93  $head[$h][2] = 'contact';
94  $h++;
95  }
96  } else {
97  $head[$h][0] = DOL_URL_ROOT.'/societe/societecontact.php?socid='.$object->id;
98  $nbContact = count($object->liste_contact(-1, 'internal')) + count($object->liste_contact(-1, 'external'));
99  $head[$h][1] = $langs->trans("ContactsAddresses");
100  if ($nbContact > 0) {
101  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbContact.'</span>';
102  }
103  $head[$h][2] = 'contact';
104  $h++;
105  }
106 
107  if ($object->client == 1 || $object->client == 2 || $object->client == 3) {
108  $head[$h][0] = DOL_URL_ROOT.'/comm/card.php?socid='.$object->id;
109  $head[$h][1] = '';
110  if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && ($object->client == 2 || $object->client == 3)) {
111  $head[$h][1] .= $langs->trans("Prospect");
112  }
113  if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && $object->client == 3) {
114  $head[$h][1] .= ' | ';
115  }
116  if (empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && ($object->client == 1 || $object->client == 3)) {
117  $head[$h][1] .= $langs->trans("Customer");
118  }
119  $head[$h][2] = 'customer';
120  $h++;
121 
122  if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
123  $langs->load("products");
124  // price
125  $head[$h][0] = DOL_URL_ROOT.'/societe/price.php?socid='.$object->id;
126  $head[$h][1] = $langs->trans("CustomerPrices");
127  $head[$h][2] = 'price';
128  $h++;
129  }
130  }
131  $supplier_module_enabled = 0;
132  if ((isModEnabled('fournisseur') && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled('supplier_proposal') || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) {
133  $supplier_module_enabled = 1;
134  }
135  if ($supplier_module_enabled == 1 && $object->fournisseur && !empty($user->rights->fournisseur->lire)) {
136  $head[$h][0] = DOL_URL_ROOT.'/fourn/card.php?socid='.$object->id;
137  $head[$h][1] = $langs->trans("Supplier");
138  $head[$h][2] = 'supplier';
139  $h++;
140  }
141 
142  if (isModEnabled('project') && (!empty($user->rights->projet->lire))) {
143  $nbProject = 0;
144  // Enable caching of thirdrparty count projects
145  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
146  $cachekey = 'count_projects_thirdparty_'.$object->id;
147  $dataretrieved = dol_getcache($cachekey);
148 
149  if (!is_null($dataretrieved)) {
150  $nbProject = $dataretrieved;
151  } else {
152  $sql = "SELECT COUNT(n.rowid) as nb";
153  $sql .= " FROM ".MAIN_DB_PREFIX."projet as n";
154  $sql .= " WHERE fk_soc = ".((int) $object->id);
155  $sql .= " AND entity IN (".getEntity('project').")";
156  $resql = $db->query($sql);
157  if ($resql) {
158  $obj = $db->fetch_object($resql);
159  $nbProject = $obj->nb;
160  } else {
161  dol_print_error($db);
162  }
163  dol_setcache($cachekey, $nbProject, 120); // If setting cache fails, this is not a problem, so we do not test result.
164  }
165  $head[$h][0] = DOL_URL_ROOT.'/societe/project.php?socid='.$object->id;
166  $head[$h][1] = $langs->trans("Projects");
167  if ($nbProject > 0) {
168  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbProject.'</span>';
169  }
170  $head[$h][2] = 'project';
171  $h++;
172  }
173 
174  // Tab to link resources
175  if (isModEnabled('resource') && !empty($conf->global->RESOURCE_ON_THIRDPARTIES)) {
176  $head[$h][0] = DOL_URL_ROOT.'/resource/element_resource.php?element=societe&element_id='.$object->id;
177  $head[$h][1] = $langs->trans("Resources");
178  $head[$h][2] = 'resources';
179  $h++;
180  }
181 
182  // Related items
183  if ((isModEnabled('commande') || isModEnabled('propal') || isModEnabled('facture') || isModEnabled('ficheinter') || (isModEnabled('fournisseur') && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))
184  && empty($conf->global->THIRDPARTIES_DISABLE_RELATED_OBJECT_TAB)) {
185  $head[$h][0] = DOL_URL_ROOT.'/societe/consumption.php?socid='.$object->id;
186  $head[$h][1] = $langs->trans("Referers");
187  $head[$h][2] = 'consumption';
188  $h++;
189  }
190 
191  // Bank accounts
192  if (empty($conf->global->SOCIETE_DISABLE_BANKACCOUNT)) {
193  $nbBankAccount = 0;
194  $foundonexternalonlinesystem = 0;
195  $langs->load("bills");
196 
197  $title = $langs->trans("PaymentModes");
198 
199  if (isModEnabled('stripe')) {
200  //$langs->load("stripe");
201  //$title = $langs->trans("BankAccountsAndGateways");
202 
203  $servicestatus = 0;
204  if (!empty($conf->global->STRIPE_LIVE) && !GETPOST('forcesandbox', 'alpha')) {
205  $servicestatus = 1;
206  }
207 
208  include_once DOL_DOCUMENT_ROOT.'/societe/class/societeaccount.class.php';
209  $societeaccount = new SocieteAccount($db);
210  $stripecu = $societeaccount->getCustomerAccount($object->id, 'stripe', $servicestatus); // Get thirdparty cu_...
211  if ($stripecu) {
212  $foundonexternalonlinesystem++;
213  }
214  }
215 
216  $sql = "SELECT COUNT(n.rowid) as nb";
217  $sql .= " FROM ".MAIN_DB_PREFIX."societe_rib as n";
218  $sql .= " WHERE n.fk_soc = ".((int) $object->id);
219  if (!isModEnabled('stripe')) {
220  $sql .= " AND n.stripe_card_ref IS NULL";
221  } else {
222  $sql .= " AND (n.stripe_card_ref IS NULL OR (n.stripe_card_ref IS NOT NULL AND n.status = ".((int) $servicestatus)."))";
223  }
224 
225  $resql = $db->query($sql);
226  if ($resql) {
227  $obj = $db->fetch_object($resql);
228  $nbBankAccount = $obj->nb;
229  } else {
230  dol_print_error($db);
231  }
232 
233  //if (isModEnabled('stripe') && $nbBankAccount > 0) $nbBankAccount = '...'; // No way to know exact number
234 
235  $head[$h][0] = DOL_URL_ROOT.'/societe/paymentmodes.php?socid='.urlencode($object->id);
236  $head[$h][1] = $title;
237  if ($foundonexternalonlinesystem) {
238  $head[$h][1] .= '<span class="badge marginleftonlyshort">...</span>';
239  } elseif ($nbBankAccount > 0) {
240  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbBankAccount.'</span>';
241  }
242  $head[$h][2] = 'rib';
243  $h++;
244  }
245 
246  if (isModEnabled('website') && (!empty($conf->global->WEBSITE_USE_WEBSITE_ACCOUNTS)) && ($user->hasRight('societe', 'lire'))) {
247  $head[$h][0] = DOL_URL_ROOT.'/societe/website.php?id='.urlencode($object->id);
248  $head[$h][1] = $langs->trans("WebSiteAccounts");
249  $nbNote = 0;
250  $sql = "SELECT COUNT(n.rowid) as nb";
251  $sql .= " FROM ".MAIN_DB_PREFIX."societe_account as n";
252  $sql .= " WHERE fk_soc = ".((int) $object->id).' AND fk_website > 0';
253  $resql = $db->query($sql);
254  if ($resql) {
255  $obj = $db->fetch_object($resql);
256  $nbNote = $obj->nb;
257  } else {
258  dol_print_error($db);
259  }
260  if ($nbNote > 0) {
261  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
262  }
263  $head[$h][2] = 'website';
264  $h++;
265  }
266 
267  if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty') {
268  if (!empty($user->rights->partnership->read)) {
269  $langs->load("partnership");
270  $nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0;
271  $head[$h][0] = DOL_URL_ROOT.'/partnership/partnership_list.php?socid='.$object->id;
272  $head[$h][1] = $langs->trans("Partnerships");
273  $nbNote = 0;
274  $sql = "SELECT COUNT(n.rowid) as nb";
275  $sql .= " FROM ".MAIN_DB_PREFIX."partnership as n";
276  $sql .= " WHERE fk_soc = ".((int) $object->id);
277  $resql = $db->query($sql);
278  if ($resql) {
279  $obj = $db->fetch_object($resql);
280  $nbNote = $obj->nb;
281  } else {
282  dol_print_error($db);
283  }
284  if ($nbNote > 0) {
285  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
286  }
287  $head[$h][2] = 'partnerships';
288  if ($nbPartnership > 0) {
289  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbPartnership.'</span>';
290  }
291  $h++;
292  }
293  }
294 
295  // Show more tabs from modules
296  // Entries must be declared in modules descriptor with line
297  // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
298  // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
299  complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'add', 'core');
300 
301  if ($user->socid == 0) {
302  // Notifications
303  if (isModEnabled('notification')) {
304  $nbNotif = 0;
305  // Enable caching of thirdparty count notifications
306  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
307  $cachekey = 'count_notifications_thirdparty_'.$object->id;
308  $dataretrieved = dol_getcache($cachekey);
309  if (!is_null($dataretrieved)) {
310  $nbNotif = $dataretrieved;
311  } else {
312  $sql = "SELECT COUNT(n.rowid) as nb";
313  $sql .= " FROM ".MAIN_DB_PREFIX."notify_def as n";
314  $sql .= " WHERE fk_soc = ".((int) $object->id);
315  $resql = $db->query($sql);
316  if ($resql) {
317  $obj = $db->fetch_object($resql);
318  $nbNotif = $obj->nb;
319  } else {
320  dol_print_error($db);
321  }
322  dol_setcache($cachekey, $nbNotif, 120); // If setting cache fails, this is not a problem, so we do not test result.
323  }
324 
325  $head[$h][0] = DOL_URL_ROOT.'/societe/notify/card.php?socid='.urlencode($object->id);
326  $head[$h][1] = $langs->trans("Notifications");
327  if ($nbNotif > 0) {
328  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNotif.'</span>';
329  }
330  $head[$h][2] = 'notify';
331  $h++;
332  }
333 
334  // Notes
335  $nbNote = 0;
336  if (!empty($object->note_private)) {
337  $nbNote++;
338  }
339  if (!empty($object->note_public)) {
340  $nbNote++;
341  }
342  $head[$h][0] = DOL_URL_ROOT.'/societe/note.php?id='.urlencode($object->id);
343  $head[$h][1] = $langs->trans("Notes");
344  if ($nbNote > 0) {
345  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
346  }
347  $head[$h][2] = 'note';
348  $h++;
349 
350  // Attached files and Links
351  $totalAttached = 0;
352  // Enable caching of thirdrparty count attached files and links
353  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
354  $cachekey = 'count_attached_thirdparty_'.$object->id;
355  $dataretrieved = dol_getcache($cachekey);
356  if (!is_null($dataretrieved)) {
357  $totalAttached = $dataretrieved;
358  } else {
359  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
360  require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
361  $upload_dir = $conf->societe->multidir_output[$object->entity]."/".$object->id;
362  $nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
363  $nbLinks = Link::count($db, $object->element, $object->id);
364  $totalAttached = $nbFiles + $nbLinks;
365  dol_setcache($cachekey, $totalAttached, 120); // If setting cache fails, this is not a problem, so we do not test result.
366  }
367 
368  $head[$h][0] = DOL_URL_ROOT.'/societe/document.php?socid='.$object->id;
369  $head[$h][1] = $langs->trans("Documents");
370  if (($totalAttached) > 0) {
371  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.($totalAttached).'</span>';
372  }
373  $head[$h][2] = 'document';
374  $h++;
375  }
376 
377  $head[$h][0] = DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id;
378  $head[$h][1] = $langs->trans("Events");
379  if (isModEnabled('agenda')&& (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read))) {
380  $nbEvent = 0;
381  // Enable caching of thirdparty count actioncomm
382  require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
383  $cachekey = 'count_events_thirdparty_'.$object->id;
384  $dataretrieved = dol_getcache($cachekey);
385  if (!is_null($dataretrieved)) {
386  $nbEvent = $dataretrieved;
387  } else {
388  $sql = "SELECT COUNT(id) as nb";
389  $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm";
390  $sql .= " WHERE fk_soc = ".((int) $object->id);
391  $resql = $db->query($sql);
392  if ($resql) {
393  $obj = $db->fetch_object($resql);
394  $nbEvent = $obj->nb;
395  } else {
396  dol_syslog('Failed to count actioncomm '.$db->lasterror(), LOG_ERR);
397  }
398  dol_setcache($cachekey, $nbEvent, 120); // If setting cache fails, this is not a problem, so we do not test result.
399  }
400 
401  $head[$h][1] .= '/';
402  $head[$h][1] .= $langs->trans("Agenda");
403  if ($nbEvent > 0) {
404  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbEvent.'</span>';
405  }
406  }
407  $head[$h][2] = 'agenda';
408  $h++;
409 
410  // Show more tabs from modules
411  // Entries must be declared in modules descriptor with line
412  // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
413  // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
414  complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'add', 'external');
415 
416  complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'remove');
417 
418  return $head;
419 }
420 
421 
428 function societe_prepare_head2($object)
429 {
430  global $langs, $conf, $user;
431  $h = 0;
432  $head = array();
433 
434  $head[$h][0] = DOL_URL_ROOT.'/societe/card.php?socid='.$object->id;
435  $head[$h][1] = $langs->trans("ThirdParty");
436  $head[$h][2] = 'company';
437  $h++;
438 
439  $head[$h][0] = 'commerciaux.php?socid='.$object->id;
440  $head[$h][1] = $langs->trans("SalesRepresentative");
441  $head[$h][2] = 'salesrepresentative';
442  $h++;
443 
444  return $head;
445 }
446 
447 
448 
455 {
456  global $langs, $conf, $user, $db;
457 
458  $extrafields = new ExtraFields($db);
459  $extrafields->fetch_name_optionals_label('societe');
460  $extrafields->fetch_name_optionals_label('socpeople');
461 
462  $h = 0;
463  $head = array();
464 
465  $head[$h][0] = DOL_URL_ROOT.'/societe/admin/societe.php';
466  $head[$h][1] = $langs->trans("Miscellaneous");
467  $head[$h][2] = 'general';
468  $h++;
469 
470  // Show more tabs from modules
471  // Entries must be declared in modules descriptor with line
472  // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
473  // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
474  complete_head_from_modules($conf, $langs, null, $head, $h, 'company_admin');
475 
476  $head[$h][0] = DOL_URL_ROOT.'/societe/admin/societe_extrafields.php';
477  $head[$h][1] = $langs->trans("ExtraFieldsThirdParties");
478  $nbExtrafields = $extrafields->attributes['societe']['count'];
479  if ($nbExtrafields > 0) {
480  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbExtrafields.'</span>';
481  }
482  $head[$h][2] = 'attributes';
483  $h++;
484 
485  $head[$h][0] = DOL_URL_ROOT.'/societe/admin/contact_extrafields.php';
486  $head[$h][1] = $langs->trans("ExtraFieldsContacts");
487  $nbExtrafields = $extrafields->attributes['socpeople']['count'];
488  if ($nbExtrafields > 0) {
489  $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbExtrafields.'</span>';
490  }
491  $head[$h][2] = 'attributes_contacts';
492  $h++;
493 
494  complete_head_from_modules($conf, $langs, null, $head, $h, 'company_admin', 'remove');
495 
496  return $head;
497 }
498 
499 
500 
516 function getCountry($searchkey, $withcode = '', $dbtouse = 0, $outputlangs = '', $entconv = 1, $searchlabel = '')
517 {
518  global $db, $langs;
519 
520  $result = '';
521 
522  // Check parameters
523  if (empty($searchkey) && empty($searchlabel)) {
524  if ($withcode === 'all') {
525  return array('id'=>'', 'code'=>'', 'label'=>'');
526  } else {
527  return '';
528  }
529  }
530  if (!is_object($dbtouse)) {
531  $dbtouse = $db;
532  }
533  if (!is_object($outputlangs)) {
534  $outputlangs = $langs;
535  }
536 
537  $sql = "SELECT rowid, code, label FROM ".MAIN_DB_PREFIX."c_country";
538  if (is_numeric($searchkey)) {
539  $sql .= " WHERE rowid = ".((int) $searchkey);
540  } elseif (!empty($searchkey)) {
541  $sql .= " WHERE code = '".$db->escape($searchkey)."'";
542  } else {
543  $sql .= " WHERE label = '".$db->escape($searchlabel)."'";
544  }
545 
546  $resql = $dbtouse->query($sql);
547  if ($resql) {
548  $obj = $dbtouse->fetch_object($resql);
549  if ($obj) {
550  $label = ((!empty($obj->label) && $obj->label != '-') ? $obj->label : '');
551  if (is_object($outputlangs)) {
552  $outputlangs->load("dict");
553  if ($entconv) {
554  $label = ($obj->code && ($outputlangs->trans("Country".$obj->code) != "Country".$obj->code)) ? $outputlangs->trans("Country".$obj->code) : $label;
555  } else {
556  $label = ($obj->code && ($outputlangs->transnoentitiesnoconv("Country".$obj->code) != "Country".$obj->code)) ? $outputlangs->transnoentitiesnoconv("Country".$obj->code) : $label;
557  }
558  }
559  if ($withcode == 1) {
560  $result = $label ? "$obj->code - $label" : "$obj->code";
561  } elseif ($withcode == 2) {
562  $result = $obj->code;
563  } elseif ($withcode == 3) {
564  $result = $obj->rowid;
565  } elseif ($withcode === 'all') {
566  $result = array('id'=>$obj->rowid, 'code'=>$obj->code, 'label'=>$label);
567  } else {
568  $result = $label;
569  }
570  } else {
571  $result = 'NotDefined';
572  }
573  $dbtouse->free($resql);
574  return $result;
575  } else {
576  dol_print_error($dbtouse, '');
577  }
578  return 'Error';
579 }
580 
596 function getState($id, $withcode = '', $dbtouse = 0, $withregion = 0, $outputlangs = '', $entconv = 1)
597 {
598  global $db, $langs;
599 
600  if (!is_object($dbtouse)) {
601  $dbtouse = $db;
602  }
603 
604  $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";
605  $sql .= " ".MAIN_DB_PREFIX."c_departements as d, ".MAIN_DB_PREFIX."c_regions as r,".MAIN_DB_PREFIX."c_country as c";
606  $sql .= " WHERE d.fk_region=r.code_region and r.fk_pays=c.rowid and d.rowid=".((int) $id);
607  $sql .= " AND d.active = 1 AND r.active = 1 AND c.active = 1";
608  $sql .= " ORDER BY c.code, d.code_departement";
609 
610  dol_syslog("Company.lib::getState", LOG_DEBUG);
611  $resql = $dbtouse->query($sql);
612  if ($resql) {
613  $obj = $dbtouse->fetch_object($resql);
614  if ($obj) {
615  $label = ((!empty($obj->name) && $obj->name != '-') ? $obj->name : '');
616  if (is_object($outputlangs)) {
617  $outputlangs->load("dict");
618  if ($entconv) {
619  $label = ($obj->code && ($outputlangs->trans("State".$obj->code) != "State".$obj->code)) ? $outputlangs->trans("State".$obj->code) : $label;
620  } else {
621  $label = ($obj->code && ($outputlangs->transnoentitiesnoconv("State".$obj->code) != "State".$obj->code)) ? $outputlangs->transnoentitiesnoconv("State".$obj->code) : $label;
622  }
623  }
624 
625  if ($withcode == 1) {
626  if ($withregion == 1) {
627  return $label = $obj->region_name.' - '.$obj->code.' - '.($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
628  } else {
629  return $label = $obj->code.' - '.($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
630  }
631  } elseif ($withcode == 2) {
632  if ($withregion == 1) {
633  return $label = $obj->region_name.' - '.($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
634  } else {
635  return $label = ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
636  }
637  } elseif ($withcode === 'all') {
638  if ($withregion == 1) {
639  return array('id'=>$obj->id, 'code'=>$obj->code, 'label'=>$label, 'region_code'=>$obj->region_code, 'region'=>$obj->region_name);
640  } else {
641  return array('id'=>$obj->id, 'code'=>$obj->code, 'label'=>$label);
642  }
643  } else {
644  if ($withregion == 1) {
645  return $label = $obj->region_name.' - '.$label;
646  } else {
647  return $label;
648  }
649  }
650  } else {
651  return $langs->transnoentitiesnoconv("NotDefined");
652  }
653  } else {
654  dol_print_error($dbtouse, '');
655  }
656 }
657 
666 function currency_name($code_iso, $withcode = '', $outputlangs = null)
667 {
668  global $langs, $db;
669 
670  if (empty($outputlangs)) {
671  $outputlangs = $langs;
672  }
673 
674  $outputlangs->load("dict");
675 
676  // If there is a translation, we can send immediatly the label
677  if ($outputlangs->trans("Currency".$code_iso) != "Currency".$code_iso) {
678  return ($withcode ? $code_iso.' - ' : '').$outputlangs->trans("Currency".$code_iso);
679  }
680 
681  // If no translation, we read table to get label by default
682  $sql = "SELECT label FROM ".MAIN_DB_PREFIX."c_currencies";
683  $sql .= " WHERE code_iso='".$db->escape($code_iso)."'";
684 
685  $resql = $db->query($sql);
686  if ($resql) {
687  $num = $db->num_rows($resql);
688 
689  if ($num) {
690  $obj = $db->fetch_object($resql);
691  $label = ($obj->label != '-' ? $obj->label : '');
692  if ($withcode) {
693  return ($label == $code_iso) ? "$code_iso" : "$code_iso - $label";
694  } else {
695  return $label;
696  }
697  } else {
698  return $code_iso;
699  }
700  }
701  return 'ErrorWhenReadingCurrencyLabel';
702 }
703 
710 function getFormeJuridiqueLabel($code)
711 {
712  global $db, $langs;
713 
714  if (!$code) {
715  return '';
716  }
717 
718  $sql = "SELECT libelle FROM ".MAIN_DB_PREFIX."c_forme_juridique";
719  $sql .= " WHERE code='".$db->escape($code)."'";
720 
721  dol_syslog("Company.lib::getFormeJuridiqueLabel", LOG_DEBUG);
722  $resql = $db->query($sql);
723  if ($resql) {
724  $num = $db->num_rows($resql);
725 
726  if ($num) {
727  $obj = $db->fetch_object($resql);
728  $label = ($obj->libelle != '-' ? $obj->libelle : '');
729  return $label;
730  } else {
731  return $langs->trans("NotDefined");
732  }
733  }
734 }
735 
736 
744 {
745  // List of all country codes that are in europe for european vat rules
746  // List found on https://ec.europa.eu/taxation_customs/territorial-status-eu-countries-and-certain-territories_en
747  global $conf, $db;
748  $country_code_in_EEC = array();
749 
750  if (!empty($conf->cache['country_code_in_EEC'])) {
751  // Use of cache to reduce number of database requests
752  $country_code_in_EEC = $conf->cache['country_code_in_EEC'];
753  } else {
754  $sql = "SELECT cc.code FROM ".MAIN_DB_PREFIX."c_country as cc";
755  $sql .= " WHERE cc.eec = 1";
756 
757  $resql = $db->query($sql);
758  if ($resql) {
759  $num = $db->num_rows($resql);
760  $i = 0;
761  while ($i < $num) {
762  $objp = $db->fetch_object($resql);
763  $country_code_in_EEC[] = $objp->code;
764  $i++;
765  }
766  } else {
767  dol_print_error($db);
768  }
769  $conf->cache['country_code_in_EEC'] = $country_code_in_EEC;
770  }
771  return $country_code_in_EEC;
772 }
773 
780 function isInEEC($object)
781 {
782  if (empty($object->country_code)) {
783  return false;
784  }
785 
786  $country_code_in_EEC = getCountriesInEEC(); // This make a database call but there is a cache done into $conf->cache['country_code_in_EEC']
787 
788  //print "dd".$object->country_code;
789  return in_array($object->country_code, $country_code_in_EEC);
790 }
791 
792 
805 function show_projects($conf, $langs, $db, $object, $backtopage = '', $nocreatelink = 0, $morehtmlright = '')
806 {
807  global $user, $action, $hookmanager;
808 
809  $i = -1;
810 
811  if (isModEnabled('project') && $user->hasRight('projet', 'lire')) {
812  $langs->load("projects");
813 
814  $newcardbutton = '';
815  if (isModEnabled('project') && $user->hasRight('projet', 'creer') && empty($nocreatelink)) {
816  $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));
817  }
818 
819  print "\n";
820  print load_fiche_titre($langs->trans("ProjectsDedicatedToThisThirdParty"), $newcardbutton.$morehtmlright, '');
821 
822  print '<div class="div-table-responsive">'."\n";
823  print '<table class="noborder centpercent">';
824 
825  $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";
826  $sql .= ", cls.code as opp_status_code";
827  $sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
828  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_lead_status as cls on p.fk_opp_status = cls.rowid";
829  $sql .= " WHERE p.fk_soc = ".((int) $object->id);
830  $sql .= " AND p.entity IN (".getEntity('project').")";
831  $sql .= " ORDER BY p.dateo DESC";
832 
833  $result = $db->query($sql);
834  if ($result) {
835  $num = $db->num_rows($result);
836 
837  print '<tr class="liste_titre">';
838  print '<td>'.$langs->trans("Ref").'</td>';
839  print '<td>'.$langs->trans("Name").'</td>';
840  print '<td class="center">'.$langs->trans("DateStart").'</td>';
841  print '<td class="center">'.$langs->trans("DateEnd").'</td>';
842  print '<td class="right">'.$langs->trans("OpportunityAmountShort").'</td>';
843  print '<td class="center">'.$langs->trans("OpportunityStatusShort").'</td>';
844  print '<td class="right">'.$langs->trans("OpportunityProbabilityShort").'</td>';
845  print '<td class="right">'.$langs->trans("Status").'</td>';
846  print '</tr>';
847 
848  if ($num > 0) {
849  require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
850 
851  $projecttmp = new Project($db);
852 
853  $i = 0;
854 
855  while ($i < $num) {
856  $obj = $db->fetch_object($result);
857  $projecttmp->fetch($obj->id);
858 
859  // To verify role of users
860  $userAccess = $projecttmp->restrictedProjectArea($user);
861 
862  if ($user->rights->projet->lire && $userAccess > 0) {
863  print '<tr class="oddeven">';
864 
865  // Ref
866  print '<td class="nowraponall">';
867  print $projecttmp->getNomUrl(1);
868  print '</td>';
869 
870  // Label
871  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->title).'">'.dol_escape_htmltag($obj->title).'</td>';
872  // Date start
873  print '<td class="center">'.dol_print_date($db->jdate($obj->do), "day").'</td>';
874  // Date end
875  print '<td class="center">'.dol_print_date($db->jdate($obj->de), "day").'</td>';
876  // Opp amount
877  print '<td class="right">';
878  if ($obj->opp_status_code) {
879  print '<span class="amount">'.price($obj->opp_amount, 1, '', 1, -1, -1, '').'</span>';
880  }
881  print '</td>';
882  // Opp status
883  print '<td class="center">';
884  if ($obj->opp_status_code) {
885  print $langs->trans("OppStatus".$obj->opp_status_code);
886  }
887  print '</td>';
888  // Opp percent
889  print '<td class="right">';
890  if ($obj->opp_percent) {
891  print price($obj->opp_percent, 1, '', 1, 0).'%';
892  }
893  print '</td>';
894  // Status
895  print '<td class="right">'.$projecttmp->getLibStatut(5).'</td>';
896 
897  print '</tr>';
898  }
899  $i++;
900  }
901  } else {
902  print '<tr class="oddeven"><td colspan="8"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
903  }
904  $db->free($result);
905  } else {
906  dol_print_error($db);
907  }
908 
909  $parameters = array('sql'=>$sql, 'function'=>'show_projects');
910  $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
911  print $hookmanager->resPrint;
912 
913  print "</table>";
914  print '</div>';
915 
916  print "<br>\n";
917  }
918 
919  return $i;
920 }
921 
922 
934 function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserlogin = 0)
935 {
936  global $user, $conf, $extrafields, $hookmanager;
937  global $contextpage;
938 
939  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
940  $formcompany = new FormCompany($db);
941  $form = new Form($db);
942 
943  $optioncss = GETPOST('optioncss', 'alpha');
944  $sortfield = GETPOST('sortfield', 'aZ09comma');
945  $sortorder = GETPOST('sortorder', 'aZ09comma');
946  $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
947 
948  $search_status = GETPOST("search_status", 'int');
949  if ($search_status == '') {
950  $search_status = 1; // always display active customer first
951  }
952 
953  $search_rowid = GETPOST("search_rowid", 'int');
954  $search_name = GETPOST("search_name", 'alpha');
955  $search_address = GETPOST("search_address", 'alpha');
956  $search_poste = GETPOST("search_poste", 'alpha');
957  $search_note_private = GETPOST('search_note_private', 'alphanohtml');
958  $search_roles = GETPOST("search_roles", 'array');
959 
960  $socialnetworks = getArrayOfSocialNetworks();
961 
962  $searchAddressPhoneDBFields = array(
963  //Address
964  't.address',
965  't.zip',
966  't.town',
967 
968  //Phone
969  't.phone',
970  't.phone_perso',
971  't.phone_mobile',
972 
973  //Fax
974  't.fax',
975 
976  //E-mail
977  't.email',
978  );
979  //Social media
980  // foreach ($socialnetworks as $key => $value) {
981  // if ($value['active']) {
982  // $searchAddressPhoneDBFields['t.'.$key] = "t.socialnetworks->'$.".$key."'";
983  // }
984  // }
985 
986  if (!$sortorder) {
987  $sortorder = "ASC";
988  }
989  if (!$sortfield) {
990  $sortfield = "t.lastname";
991  }
992 
993  if (isModEnabled('clicktodial')) {
994  $user->fetch_clicktodial(); // lecture des infos de clicktodial du user
995  }
996 
997 
998  $contactstatic = new Contact($db);
999 
1000  $extrafields->fetch_name_optionals_label($contactstatic->table_element);
1001 
1002  $contactstatic->fields = array(
1003  '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),
1004  'name' =>array('type'=>'varchar(128)', 'label'=>'Name', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1),
1005  'poste' =>array('type'=>'varchar(128)', 'label'=>'PostOrFunction', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>2, 'index'=>1, 'position'=>20),
1006  'address' =>array('type'=>'varchar(128)', 'label'=>'Address', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>3, 'index'=>1, 'position'=>30),
1007  'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>(!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'visible'=>3, 'position'=>35),
1008  'role' =>array('type'=>'checkbox', 'label'=>'Role', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>4, 'index'=>1, 'position'=>40),
1009  '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))),
1010  );
1011 
1012  // Definition of fields for list
1013  $arrayfields = array(
1014  '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),
1015  't.name'=>array('label'=>"Name", 'checked'=>1, 'position'=>10),
1016  't.poste'=>array('label'=>"PostOrFunction", 'checked'=>1, 'position'=>20),
1017  '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),
1018  't.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'position'=>35),
1019  'sc.role'=>array('label'=>"ContactByDefaultFor", 'checked'=>1, 'position'=>40),
1020  't.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>50, 'class'=>'center'),
1021  );
1022  // Extra fields
1023  if (!empty($extrafields->attributes[$contactstatic->table_element]['label']) && is_array($extrafields->attributes[$contactstatic->table_element]['label']) && count($extrafields->attributes[$contactstatic->table_element]['label'])) {
1024  foreach ($extrafields->attributes[$contactstatic->table_element]['label'] as $key => $val) {
1025  if (!empty($extrafields->attributes[$contactstatic->table_element]['list'][$key])) {
1026  $arrayfields["ef.".$key] = array(
1027  'label'=>$extrafields->attributes[$contactstatic->table_element]['label'][$key],
1028  'checked'=>(($extrafields->attributes[$contactstatic->table_element]['list'][$key] < 0) ? 0 : 1),
1029  'position'=>1000 + $extrafields->attributes[$contactstatic->table_element]['pos'][$key],
1030  'enabled'=>(abs($extrafields->attributes[$contactstatic->table_element]['list'][$key]) != 3 && $extrafields->attributes[$contactstatic->table_element]['perms'][$key]));
1031  }
1032  }
1033  }
1034 
1035  // Initialize array of search criterias
1036  $search = array();
1037  foreach ($arrayfields as $key => $val) {
1038  $queryName = 'search_'.substr($key, 2);
1039  if (GETPOST($queryName, 'alpha')) {
1040  $search[substr($key, 2)] = GETPOST($queryName, 'alpha');
1041  }
1042  }
1043  $search_array_options = $extrafields->getOptionalsFromPost($contactstatic->table_element, '', 'search_');
1044 
1045  // Purge search criteria
1046  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
1047  $search_rowid = '';
1048  $search_status = '';
1049  $search_name = '';
1050  $search_roles = array();
1051  $search_address = '';
1052  $search_poste = '';
1053  $search_note_private = '';
1054  $search = array();
1055  $search_array_options = array();
1056 
1057  foreach ($contactstatic->fields as $key => $val) {
1058  $search[$key] = '';
1059  }
1060  }
1061 
1062  $contactstatic->fields = dol_sort_array($contactstatic->fields, 'position');
1063  $arrayfields = dol_sort_array($arrayfields, 'position');
1064 
1065  $newcardbutton = '';
1066  if ($user->hasRight('societe', 'contact', 'creer')) {
1067  $addcontact = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("AddContact") : $langs->trans("AddContactAddress"));
1068  $newcardbutton .= dolGetButtonTitle($addcontact, '', 'fa fa-plus-circle', DOL_URL_ROOT.'/contact/card.php?socid='.$object->id.'&amp;action=create&amp;backtopage='.urlencode($backtopage));
1069  }
1070 
1071  print "\n";
1072 
1073  $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("ContactsForCompany") : $langs->trans("ContactsAddressesForCompany"));
1074  print load_fiche_titre($title, $newcardbutton, '');
1075 
1076  print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'" name="formfilter">';
1077  print '<input type="hidden" name="token" value="'.newToken().'">';
1078  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1079  print '<input type="hidden" name="socid" value="'.$object->id.'">';
1080  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1081  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1082  print '<input type="hidden" name="page" value="'.$page.'">';
1083 
1084  $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1085  $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
1086  //if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1);
1087 
1088  print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
1089  print "\n".'<table class="tagtable liste">'."\n";
1090 
1091  $param = "socid=".urlencode($object->id);
1092  if ($search_rowid != '') {
1093  $param .= '&search_rowid='.urlencode($search_rowid);
1094  }
1095  if ($search_status != '') {
1096  $param .= '&search_status='.urlencode($search_status);
1097  }
1098  if (count($search_roles) > 0) {
1099  $param .= implode('&search_roles[]=', $search_roles);
1100  }
1101  if ($search_name != '') {
1102  $param .= '&search_name='.urlencode($search_name);
1103  }
1104  if ($search_poste != '') {
1105  $param .= '&search_poste='.urlencode($search_poste);
1106  }
1107  if ($search_address != '') {
1108  $param .= '&search_address='.urlencode($search_address);
1109  }
1110  if ($search_note_private != '') {
1111  $param .= '&search_note_private='.urlencode($search_note_private);
1112  }
1113  if ($optioncss != '') {
1114  $param .= '&optioncss='.urlencode($optioncss);
1115  }
1116 
1117  // Add $param from extra fields
1118  $extrafieldsobjectkey = $contactstatic->table_element;
1119  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1120 
1121  $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, t.fk_soc,";
1122  $sql .= " t.civility as civility_id, t.address, t.zip, t.town";
1123  $sql .= ", t.note_private";
1124  $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as t";
1125  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople_extrafields as ef on (t.rowid = ef.fk_object)";
1126  $sql .= " WHERE t.fk_soc = ".((int) $object->id);
1127  $sql .= " AND t.entity IN (".getEntity($object->element).")";
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->fk_soc = $obj->fk_soc;
1278  $contactstatic->entity = $obj->entity;
1279 
1280  $country_code = getCountry($obj->country_id, 2);
1281  $contactstatic->country_code = $country_code;
1282 
1283  $contactstatic->setGenderFromCivility();
1284  $contactstatic->fetch_optionals();
1285 
1286  $resultRole = $contactstatic->fetchRoles();
1287  if ($resultRole < 0) {
1288  setEventMessages(null, $contactstatic->errors, 'errors');
1289  }
1290 
1291  if (is_array($contactstatic->array_options)) {
1292  foreach ($contactstatic->array_options as $key => $val) {
1293  $obj->$key = $val;
1294  }
1295  }
1296 
1297  print '<tr class="oddeven">';
1298 
1299  // ID
1300  if (!empty($arrayfields['t.rowid']['checked'])) {
1301  print '<td>';
1302  print $contactstatic->id;
1303  print '</td>';
1304  }
1305 
1306  // Photo - Name
1307  if (!empty($arrayfields['t.name']['checked'])) {
1308  print '<td>';
1309  print $form->showphoto('contact', $contactstatic, 0, 0, 0, 'photorefnoborder valignmiddle marginrightonly', 'small', 1, 0, 1);
1310  print $contactstatic->getNomUrl(0, '', 0, '&backtopage='.urlencode($backtopage));
1311  print '</td>';
1312  }
1313 
1314  // Job position
1315  if (!empty($arrayfields['t.poste']['checked'])) {
1316  print '<td>';
1317  if ($obj->poste) {
1318  print $obj->poste;
1319  }
1320  print '</td>';
1321  }
1322 
1323  // Address - Phone - Email
1324  if (!empty($arrayfields['t.address']['checked'])) {
1325  print '<td>';
1326  print $contactstatic->getBannerAddress('contact', $object);
1327  print '</td>';
1328  }
1329 
1330  // Note private
1331  if (!empty($arrayfields['t.note_private']['checked'])) {
1332  print '<td>';
1333  if ($obj->note_private) {
1334  print dol_string_nohtmltag($obj->note_private);
1335  }
1336  print '</td>';
1337  }
1338 
1339  // Role
1340  if (!empty($arrayfields['sc.role']['checked'])) {
1341  print '<td>';
1342  print $formcompany->showRoles("roles", $contactstatic, 'view');
1343  print '</td>';
1344  }
1345 
1346  // Status
1347  if (!empty($arrayfields['t.statut']['checked'])) {
1348  print '<td class="center">'.$contactstatic->getLibStatut(5).'</td>';
1349  }
1350 
1351  if ($showuserlogin) {
1352  print '<td>';
1353  $tmpuser= new User($db);
1354  $resfetch = $tmpuser->fetch(0, '', '', 0, -1, '', $contactstatic->id);
1355  if ($resfetch > 0) {
1356  print $tmpuser->getNomUrl(1, '', 0, 0, 24, 1);
1357  }
1358  print '</td>';
1359  }
1360 
1361  // Extra fields
1362  $extrafieldsobjectkey = $contactstatic->table_element;
1363  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1364 
1365  // Actions
1366  print '<td align="right">';
1367 
1368  // Add to agenda
1369  if (isModEnabled('agenda')&& $user->hasRight('agenda', 'myactions', 'create')) {
1370  print '<a href="'.DOL_URL_ROOT.'/comm/action/card.php?action=create&actioncode=&contactid='.$obj->rowid.'&socid='.$object->id.'&backtopage='.urlencode($backtopage).'">';
1371  print img_object($langs->trans("Event"), "action");
1372  print '</a> &nbsp; ';
1373  }
1374 
1375  // Edit
1376  if ($user->hasRight('societe', 'contact', 'creer')) {
1377  print '<a class="editfielda paddingleft" href="'.DOL_URL_ROOT.'/contact/card.php?action=edit&token='.newToken().'&id='.$obj->rowid.'&backtopage='.urlencode($backtopage).'">';
1378  print img_edit();
1379  print '</a>';
1380  }
1381 
1382  print '</td>';
1383 
1384  print "</tr>\n";
1385  $i++;
1386  }
1387 
1388  if ($num == 0) {
1389  $colspan = 1 + ($showuserlogin ? 1 : 0);
1390  foreach ($arrayfields as $key => $val) {
1391  if (!empty($val['checked'])) {
1392  $colspan++;
1393  }
1394  }
1395  print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
1396  }
1397  } else {
1398  $colspan = 1 + ($showuserlogin ? 1 : 0);
1399  foreach ($arrayfields as $key => $val) {
1400  if (!empty($val['checked'])) {
1401  $colspan++;
1402  }
1403  }
1404  print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
1405  }
1406  print "\n</table>\n";
1407  print '</div>';
1408 
1409  print '</form>'."\n";
1410 
1411  return $i;
1412 }
1413 
1414 
1427 function show_actions_todo($conf, $langs, $db, $filterobj, $objcon = '', $noprint = 0, $actioncode = '')
1428 {
1429  global $user, $conf;
1430 
1431  $out = show_actions_done($conf, $langs, $db, $filterobj, $objcon, 1, $actioncode, 'todo');
1432 
1433  if ($noprint) {
1434  return $out;
1435  } else {
1436  print $out;
1437  }
1438 }
1439 
1458 function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprint = 0, $actioncode = '', $donetodo = 'done', $filters = array(), $sortfield = 'a.datep,a.id', $sortorder = 'DESC', $module = '')
1459 {
1460  global $user, $conf;
1461  global $form;
1462  global $param, $massactionbutton;
1463 
1464  $start_year = GETPOST('dateevent_startyear', 'int');
1465  $start_month = GETPOST('dateevent_startmonth', 'int');
1466  $start_day = GETPOST('dateevent_startday', 'int');
1467  $end_year = GETPOST('dateevent_endyear', 'int');
1468  $end_month = GETPOST('dateevent_endmonth', 'int');
1469  $end_day = GETPOST('dateevent_endday', 'int');
1470  $tms_start = '';
1471  $tms_end = '';
1472 
1473  if (!empty($start_year) && !empty($start_month) && !empty($start_day)) {
1474  $tms_start = dol_mktime(0, 0, 0, $start_month, $start_day, $start_year, 'tzuserrel');
1475  }
1476  if (!empty($end_year) && !empty($end_month) && !empty($end_day)) {
1477  $tms_end = dol_mktime(23, 59, 59, $end_month, $end_day, $end_year, 'tzuserrel');
1478  }
1479  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
1480  $tms_start = '';
1481  $tms_end = '';
1482  }
1483  dol_include_once('/comm/action/class/actioncomm.class.php');
1484 
1485  // Check parameters
1486  if (!is_object($filterobj) && !is_object($objcon)) {
1487  dol_print_error('', 'BadParameter');
1488  }
1489 
1490  $out = '';
1491  $histo = array();
1492  $numaction = 0;
1493  $now = dol_now('tzuser');
1494 
1495  // Open DSI -- Fix order by -- Begin
1496  $sortfield_list = explode(',', $sortfield);
1497  $sortfield_label_list = array('a.id' => 'id', 'a.datep' => 'dp', 'a.percent' => 'percent');
1498  $sortfield_new_list = array();
1499  foreach ($sortfield_list as $sortfield_value) {
1500  $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
1501  }
1502  $sortfield_new = implode(',', $sortfield_new_list);
1503 
1504  $sql = '';
1505 
1506  if (isModEnabled('agenda')) {
1507  require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
1508  $hookmanager = new HookManager($db);
1509  // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
1510  $hookmanager->initHooks(array('agendadao'));
1511 
1512  // Recherche histo sur actioncomm
1513  if (is_object($objcon) && $objcon->id > 0) {
1514  $sql = "SELECT DISTINCT a.id, a.label as label,";
1515  } else {
1516  $sql = "SELECT a.id, a.label as label,";
1517  }
1518  $sql .= " a.datep as dp,";
1519  $sql .= " a.datep2 as dp2,";
1520  $sql .= " a.percent as percent, 'action' as type,";
1521  $sql .= " a.fk_element, a.elementtype,";
1522  $sql .= " a.fk_contact,";
1523  $sql .= " c.code as acode, c.libelle as alabel, c.picto as apicto,";
1524  $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";
1525  if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
1526  $sql .= ", sp.lastname, sp.firstname";
1527  } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
1528  /* Nothing */
1529  } elseif (is_object($filterobj) && get_class($filterobj) == 'Project') {
1530  /* Nothing */
1531  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
1532  $sql .= ", m.lastname, m.firstname";
1533  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
1534  $sql .= ", o.ref";
1535  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
1536  $sql .= ", o.ref";
1537  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
1538  $sql .= ", o.ref";
1539  } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
1540  $sql .= ", o.ref";
1541  } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
1542  $sql .= ", o.ref";
1543  } elseif (is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid']) && $filterobj->table_element && $filterobj->element) {
1544  if (!empty($filterobj->fields['ref'])) {
1545  $sql .= ", o.ref";
1546  } elseif (!empty($filterobj->fields['label'])) {
1547  $sql .= ", o.label";
1548  }
1549  }
1550 
1551  // Fields from hook
1552  $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
1553  $reshook = $hookmanager->executeHooks('showActionsDoneListSelect', $parameters); // Note that $action and $object may have been modified by hook
1554  if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
1555 
1556  $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
1557  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action";
1558  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id";
1559 
1560  $force_filter_contact = false;
1561  if (is_object($objcon) && $objcon->id > 0) {
1562  $force_filter_contact = true;
1563  $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm_resources as r ON a.id = r.fk_actioncomm";
1564  $sql .= " AND r.element_type = '".$db->escape($objcon->table_element)."' AND r.fk_element = ".((int) $objcon->id);
1565  }
1566 
1567  // Fields from hook
1568  $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
1569  $reshook = $hookmanager->executeHooks('showActionsDoneListFrom', $parameters); // Note that $action and $object may have been modified by hook
1570  if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
1571 
1572  if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
1573  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
1574  } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
1575  $sql .= " INNER JOIN ".MAIN_DB_PREFIX."element_resources as er";
1576  $sql .= " ON er.resource_type = 'dolresource'";
1577  $sql .= " AND er.element_id = a.id";
1578  $sql .= " AND er.resource_id = ".((int) $filterobj->id);
1579  } elseif (is_object($filterobj) && get_class($filterobj) == 'Project') {
1580  /* Nothing */
1581  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
1582  $sql .= ", ".MAIN_DB_PREFIX."adherent as m";
1583  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
1584  $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as o";
1585  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
1586  $sql .= ", ".MAIN_DB_PREFIX."product as o";
1587  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
1588  $sql .= ", ".MAIN_DB_PREFIX."ticket as o";
1589  } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
1590  $sql .= ", ".MAIN_DB_PREFIX."bom_bom as o";
1591  } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
1592  $sql .= ", ".MAIN_DB_PREFIX."contrat as o";
1593  } 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) {
1594  $sql .= ", ".MAIN_DB_PREFIX.$filterobj->table_element." as o";
1595  }
1596 
1597  $sql .= " WHERE a.entity IN (".getEntity('agenda').")";
1598  if ($force_filter_contact === false) {
1599  if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur')) && $filterobj->id) {
1600  $sql .= " AND a.fk_soc = ".((int) $filterobj->id);
1601  } elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
1602  /* Nothing */
1603  } elseif (is_object($filterobj) && get_class($filterobj) == 'Project' && $filterobj->id) {
1604  $sql .= " AND a.fk_project = ".((int) $filterobj->id);
1605  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
1606  $sql .= " AND a.fk_element = m.rowid AND a.elementtype = 'member'";
1607  if ($filterobj->id) {
1608  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1609  }
1610  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
1611  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
1612  if ($filterobj->id) {
1613  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1614  }
1615  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
1616  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'product'";
1617  if ($filterobj->id) {
1618  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1619  }
1620  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
1621  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
1622  if ($filterobj->id) {
1623  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1624  }
1625  } elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
1626  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
1627  if ($filterobj->id) {
1628  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1629  }
1630  } elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
1631  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
1632  if ($filterobj->id) {
1633  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1634  }
1635  } 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) {
1636  // Generic case
1637  $sql .= " AND a.fk_element = o.rowid AND a.elementtype = '".$db->escape($filterobj->element).($module ? "@".$module : "")."'";
1638  if ($filterobj->id) {
1639  $sql .= " AND a.fk_element = ".((int) $filterobj->id);
1640  }
1641  }
1642  }
1643 
1644  if (!empty($tms_start) && !empty($tms_end)) {
1645  $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)."'))";
1646  } elseif (empty($tms_start) && !empty($tms_end)) {
1647  $sql .= " AND ((a.datep <= '".$db->idate($tms_end)."') OR (a.datep2 <= '".$db->idate($tms_end)."'))";
1648  } elseif (!empty($tms_start) && empty($tms_end)) {
1649  $sql .= " AND ((a.datep >= '".$db->idate($tms_start)."') OR (a.datep2 >= '".$db->idate($tms_start)."'))";
1650  }
1651 
1652  if (is_array($actioncode) && !empty($actioncode)) {
1653  $sql .= ' AND (';
1654  foreach ($actioncode as $key => $code) {
1655  if ($key != 0) {
1656  $sql .= "OR (";
1657  }
1658  if (!empty($code)) {
1659  addEventTypeSQL($sql, $code);
1660  }
1661  if ($key != 0) {
1662  $sql .= ")";
1663  }
1664  }
1665  $sql .= ')';
1666  } elseif (!empty($actioncode)) {
1667  addEventTypeSQL($sql, $actioncode);
1668  }
1669 
1670  addOtherFilterSQL($sql, $donetodo, $now, $filters);
1671 
1672  // Fields from hook
1673  $parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon, 'module' => $module);
1674  $reshook = $hookmanager->executeHooks('showActionsDoneListWhere', $parameters); // Note that $action and $object may have been modified by hook
1675  if (!empty($hookmanager->resPrint)) $sql.= $hookmanager->resPrint;
1676 
1677  if (is_array($actioncode)) {
1678  foreach ($actioncode as $code) {
1679  $sql2 = addMailingEventTypeSQL($code, $objcon, $filterobj);
1680  if (!empty($sql2)) {
1681  if (!empty($sql)) {
1682  $sql = $sql." UNION ".$sql2;
1683  } elseif (empty($sql)) {
1684  $sql = $sql2;
1685  }
1686  break;
1687  }
1688  }
1689  } else {
1690  $sql2 = addMailingEventTypeSQL($actioncode, $objcon, $filterobj);
1691  if (!empty($sql) && !empty($sql2)) {
1692  $sql = $sql." UNION ".$sql2;
1693  } elseif (empty($sql) && !empty($sql2)) {
1694  $sql = $sql2;
1695  }
1696  }
1697  }
1698 
1699  //TODO Add limit in nb of results
1700  if ($sql) {
1701  $sql .= $db->order($sortfield_new, $sortorder);
1702 
1703  dol_syslog("company.lib::show_actions_done", LOG_DEBUG);
1704 
1705  $resql = $db->query($sql);
1706  if ($resql) {
1707  $i = 0;
1708  $num = $db->num_rows($resql);
1709 
1710  while ($i < $num) {
1711  $obj = $db->fetch_object($resql);
1712 
1713  if ($obj->type == 'action') {
1714  $contactaction = new ActionComm($db);
1715  $contactaction->id = $obj->id;
1716  $result = $contactaction->fetchResources();
1717  if ($result < 0) {
1718  dol_print_error($db);
1719  setEventMessage("company.lib::show_actions_done Error fetch ressource", 'errors');
1720  }
1721 
1722  //if ($donetodo == 'todo') $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
1723  //elseif ($donetodo == 'done') $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
1724  $tododone = '';
1725  if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && (!empty($obj->datep) && $obj->datep > $now))) {
1726  $tododone = 'todo';
1727  }
1728 
1729  $histo[$numaction] = array(
1730  'type'=>$obj->type,
1731  'tododone'=>$tododone,
1732  'id'=>$obj->id,
1733  'datestart'=>$db->jdate($obj->dp),
1734  'dateend'=>$db->jdate($obj->dp2),
1735  'note'=>$obj->label,
1736  'percent'=>$obj->percent,
1737 
1738  'userid'=>$obj->user_id,
1739  'login'=>$obj->user_login,
1740  'userfirstname'=>$obj->user_firstname,
1741  'userlastname'=>$obj->user_lastname,
1742  'userphoto'=>$obj->user_photo,
1743 
1744  'contact_id'=>$obj->fk_contact,
1745  'socpeopleassigned' => $contactaction->socpeopleassigned,
1746  'lastname' => empty($obj->lastname) ? '' : $obj->lastname,
1747  'firstname' => empty($obj->firstname) ? '' : $obj->firstname,
1748  'fk_element'=>$obj->fk_element,
1749  'elementtype'=>$obj->elementtype,
1750  // Type of event
1751  'acode'=>$obj->acode,
1752  'alabel'=>$obj->alabel,
1753  'libelle'=>$obj->alabel, // deprecated
1754  'apicto'=>$obj->apicto
1755  );
1756  } else {
1757  $histo[$numaction] = array(
1758  'type'=>$obj->type,
1759  'tododone'=>'done',
1760  'id'=>$obj->id,
1761  'datestart'=>$db->jdate($obj->dp),
1762  'dateend'=>$db->jdate($obj->dp2),
1763  'note'=>$obj->label,
1764  'percent'=>$obj->percent,
1765  'acode'=>$obj->acode,
1766 
1767  'userid'=>$obj->user_id,
1768  'login'=>$obj->user_login,
1769  'userfirstname'=>$obj->user_firstname,
1770  'userlastname'=>$obj->user_lastname,
1771  'userphoto'=>$obj->user_photo
1772  );
1773  }
1774 
1775  $numaction++;
1776  $i++;
1777  }
1778  } else {
1779  dol_print_error($db);
1780  }
1781  }
1782 
1783  if (isModEnabled('agenda')|| (isModEnabled('mailing') && !empty($objcon->email))) {
1784  $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
1785 
1786  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
1787  include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1788  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1789  require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1790 
1791  $formactions = new FormActions($db);
1792 
1793  $actionstatic = new ActionComm($db);
1794  $userstatic = new User($db);
1795  $userlinkcache = array();
1796  $contactstatic = new Contact($db);
1797  $elementlinkcache = array();
1798 
1799  $out .= '<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER["PHP_SELF"].'" method="POST">';
1800  $out .= '<input type="hidden" name="token" value="'.newToken().'">';
1801  if ($objcon && get_class($objcon) == 'Contact' &&
1802  (is_null($filterobj) || get_class($filterobj) == 'Societe')) {
1803  $out .= '<input type="hidden" name="id" value="'.$objcon->id.'" />';
1804  } else {
1805  $out .= '<input type="hidden" name="id" value="'.$filterobj->id.'" />';
1806  }
1807  if ($filterobj && get_class($filterobj) == 'Societe') {
1808  $out .= '<input type="hidden" name="socid" value="'.$filterobj->id.'" />';
1809  }
1810 
1811  $out .= "\n";
1812 
1813  $out .= '<div class="div-table-responsive-no-min">';
1814  $out .= '<table class="noborder centpercent">';
1815 
1816  $out .= '<tr class="liste_titre">';
1817  if ($donetodo) {
1818  $out .= '<td class="liste_titre"></td>';
1819  }
1820 
1821  $out .= '<td class="liste_titre"><input type="text" class="width50" name="search_rowid" value="'.(isset($filters['search_rowid']) ? $filters['search_rowid'] : '').'"></td>';
1822  $out .= '<td class="liste_titre"></td>';
1823  $out .= '<td class="liste_titre">';
1824  $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');
1825  $out .= '</td>';
1826  $out .= '<td class="liste_titre maxwidth100onsmartphone"><input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters['search_agenda_label'].'"></td>';
1827  $out .= '<td class="liste_titre center">';
1828  $out .= $form->selectDateToDate($tms_start, $tms_end, 'dateevent', 1);
1829  $out .= '</td>';
1830  $out .= '<td class="liste_titre"></td>';
1831  $out .= '<td class="liste_titre"></td>';
1832  $out .= '<td class="liste_titre"></td>';
1833  // Action column
1834  $out .= '<td class="liste_titre" align="middle">';
1835  $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
1836  $out .= $searchpicto;
1837  $out .= '</td>';
1838  $out .= '</tr>';
1839 
1840  $out .= '<tr class="liste_titre">';
1841  if ($donetodo) {
1842  $tmp = '';
1843  if (get_class($filterobj) == 'Societe') {
1844  $tmp .= '<a href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.'&status=done">';
1845  }
1846  $tmp .= ($donetodo != 'done' ? $langs->trans("ActionsToDoShort") : '');
1847  $tmp .= ($donetodo != 'done' && $donetodo != 'todo' ? ' / ' : '');
1848  $tmp .= ($donetodo != 'todo' ? $langs->trans("ActionsDoneShort") : '');
1849  //$out.=$langs->trans("ActionsToDoShort").' / '.$langs->trans("ActionsDoneShort");
1850  if (get_class($filterobj) == 'Societe') {
1851  $tmp .= '</a>';
1852  }
1853  $out .= getTitleFieldOfList($tmp);
1854  }
1855  $out .= getTitleFieldOfList("Ref", 0, $_SERVER["PHP_SELF"], 'a.id', '', $param, '', $sortfield, $sortorder);
1856  $out .= getTitleFieldOfList("Owner");
1857  $out .= getTitleFieldOfList("Type");
1858  $out .= getTitleFieldOfList("Label", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
1859  $out .= getTitleFieldOfList("Date", 0, $_SERVER["PHP_SELF"], 'a.datep,a.id', '', $param, '', $sortfield, $sortorder, 'center ');
1860  $out .= getTitleFieldOfList("RelatedObjects", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
1861  $out .= getTitleFieldOfList("ActionOnContact", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'tdoverflowmax125 ', 0, '', 0);
1862  $out .= getTitleFieldOfList("Status", 0, $_SERVER["PHP_SELF"], 'a.percent', '', $param, '', $sortfield, $sortorder, 'center ');
1863  $out .= getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'maxwidthsearch ');
1864  $out .= '</tr>';
1865 
1866  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
1867  $caction = new CActionComm($db);
1868  $arraylist = $caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : 0), '', 1);
1869 
1870  foreach ($histo as $key => $value) {
1871  $actionstatic->fetch($histo[$key]['id']); // TODO Do we need this, we already have a lot of data of line into $histo
1872 
1873  $actionstatic->type_picto = $histo[$key]['apicto'];
1874  $actionstatic->type_code = $histo[$key]['acode'];
1875 
1876  $out .= '<tr class="oddeven">';
1877 
1878  // Done or todo
1879  if ($donetodo) {
1880  $out .= '<td class="nowrap">';
1881  $out .= '</td>';
1882  }
1883 
1884  // Ref
1885  $out .= '<td class="nowraponall">';
1886  if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
1887  $out .= '<a href="'.DOL_URL_ROOT.'/comm/mailing/card.php?id='.$histo[$key]['id'].'">'.img_object($langs->trans("ShowEMailing"), "email").' ';
1888  $out .= $histo[$key]['id'];
1889  $out .= '</a>';
1890  } else {
1891  $out .= $actionstatic->getNomUrl(1, -1);
1892  }
1893  $out .= '</td>';
1894 
1895  // Author of event
1896  $out .= '<td class="tdoverflowmax150">';
1897  //$userstatic->id=$histo[$key]['userid'];
1898  //$userstatic->login=$histo[$key]['login'];
1899  //$out.=$userstatic->getLoginUrl(1);
1900  if ($histo[$key]['userid'] > 0) {
1901  if (isset($userlinkcache[$histo[$key]['userid']])) {
1902  $link = $userlinkcache[$histo[$key]['userid']];
1903  } else {
1904  $userstatic->fetch($histo[$key]['userid']);
1905  $link = $userstatic->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
1906  $userlinkcache[$histo[$key]['userid']] = $link;
1907  }
1908  $out .= $link;
1909  }
1910  $out .= '</td>';
1911 
1912  // Type
1913  $labeltype = $actionstatic->type_code;
1914  if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) {
1915  $labeltype = 'AC_OTH';
1916  }
1917  if (preg_match('/^TICKET_MSG/', $actionstatic->code)) {
1918  $labeltype = $langs->trans("Message");
1919  } else {
1920  if (!empty($arraylist[$labeltype])) {
1921  $labeltype = $arraylist[$labeltype];
1922  }
1923  if ($actionstatic->type_code == 'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
1924  $labeltype .= ' - '.$arraylist[$actionstatic->code]; // Use code in priority on type_code
1925  }
1926  }
1927  $out .= '<td class="tdoverflowmax150" title="'.$labeltype.'">';
1928  $out .= $actionstatic->getTypePicto();
1929  $out .= $labeltype;
1930  $out .= '</td>';
1931 
1932  // Title/Label of event
1933  $out .= '<td class="tdoverflowmax300"';
1934  if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'action') {
1935  $transcode = $langs->trans("Action".$histo[$key]['acode']);
1936  $libelle = ($transcode != "Action".$histo[$key]['acode'] ? $transcode : $histo[$key]['alabel']);
1937  //$actionstatic->libelle=$libelle;
1938  $libelle = $histo[$key]['note'];
1939  $actionstatic->id = $histo[$key]['id'];
1940  $out .= ' title="'.dol_escape_htmltag($libelle).'">';
1941  $out .= dol_trunc($libelle, 120);
1942  }
1943  if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
1944  $out .= '<a href="'.DOL_URL_ROOT.'/comm/mailing/card.php?id='.$histo[$key]['id'].'">'.img_object($langs->trans("ShowEMailing"), "email").' ';
1945  $transcode = $langs->trans("Action".$histo[$key]['acode']);
1946  $libelle = ($transcode != "Action".$histo[$key]['acode'] ? $transcode : 'Send mass mailing');
1947  $out .= ' title="'.dol_escape_htmltag($libelle).'">';
1948  $out .= dol_trunc($libelle, 120);
1949  }
1950  $out .= '</td>';
1951 
1952  // Date
1953  $out .= '<td class="center nowraponall">';
1954  $out .= dol_print_date($histo[$key]['datestart'], 'dayhour', 'tzuserrel');
1955  if ($histo[$key]['dateend'] && $histo[$key]['dateend'] != $histo[$key]['datestart']) {
1956  $tmpa = dol_getdate($histo[$key]['datestart'], true);
1957  $tmpb = dol_getdate($histo[$key]['dateend'], true);
1958  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1959  $out .= '-'.dol_print_date($histo[$key]['dateend'], 'hour', 'tzuserrel');
1960  } else {
1961  $out .= '-'.dol_print_date($histo[$key]['dateend'], 'dayhour', 'tzuserrel');
1962  }
1963  }
1964  $late = 0;
1965  if ($histo[$key]['percent'] == 0 && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
1966  $late = 1;
1967  }
1968  if ($histo[$key]['percent'] == 0 && !$histo[$key]['datestart'] && $histo[$key]['dateend'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
1969  $late = 1;
1970  }
1971  if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && $histo[$key]['dateend'] && $histo[$key]['dateend'] < ($now - $delay_warning)) {
1972  $late = 1;
1973  }
1974  if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && !$histo[$key]['dateend'] && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
1975  $late = 1;
1976  }
1977  if ($late) {
1978  $out .= img_warning($langs->trans("Late")).' ';
1979  }
1980  $out .= "</td>\n";
1981 
1982  // Title of event
1983  //$out.='<td>'.dol_trunc($histo[$key]['note'], 40).'</td>';
1984 
1985  // Linked object
1986  $out .= '<td class="nowraponall">';
1987  if (isset($histo[$key]['elementtype']) && !empty($histo[$key]['fk_element'])) {
1988  if (isset($elementlinkcache[$histo[$key]['elementtype']]) && isset($elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']])) {
1989  $link = $elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']];
1990  } else {
1991  if (!isset($elementlinkcache[$histo[$key]['elementtype']])) {
1992  $elementlinkcache[$histo[$key]['elementtype']] = array();
1993  }
1994  $link = dolGetElementUrl($histo[$key]['fk_element'], $histo[$key]['elementtype'], 1);
1995  $elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']] = $link;
1996  }
1997  $out .= $link;
1998  } else {
1999  $out .= '&nbsp;';
2000  }
2001  $out .= '</td>';
2002 
2003  // Contact(s) for action
2004  if (isset($histo[$key]['socpeopleassigned']) && is_array($histo[$key]['socpeopleassigned']) && count($histo[$key]['socpeopleassigned']) > 0) {
2005  $out .= '<td class="valignmiddle">';
2006  $contact = new Contact($db);
2007  foreach ($histo[$key]['socpeopleassigned'] as $cid => $value) {
2008  $result = $contact->fetch($cid);
2009 
2010  if ($result < 0) {
2011  dol_print_error($db, $contact->error);
2012  }
2013 
2014  if ($result > 0) {
2015  $out .= $contact->getNomUrl(-3, '', 10, '', -1, 0, 'paddingright');
2016  if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
2017  if (!empty($contact->phone_pro)) {
2018  $out .= '('.dol_print_phone($contact->phone_pro).')';
2019  }
2020  }
2021  $out .= '<div class="paddingright"></div>';
2022  }
2023  }
2024  $out .= '</td>';
2025  } elseif (empty($objcon->id) && isset($histo[$key]['contact_id']) && $histo[$key]['contact_id'] > 0) {
2026  $contactstatic->lastname = $histo[$key]['lastname'];
2027  $contactstatic->firstname = $histo[$key]['firstname'];
2028  $contactstatic->id = $histo[$key]['contact_id'];
2029  $contactstatic->photo = $histo[$key]['contact_photo'];
2030  $out .= '<td width="120">'.$contactstatic->getNomUrl(-1, '', 10).'</td>';
2031  } else {
2032  $out .= '<td>&nbsp;</td>';
2033  }
2034 
2035  // Status
2036  $out .= '<td class="nowrap center">'.$actionstatic->LibStatut($histo[$key]['percent'], 2, 0, $histo[$key]['datestart']).'</td>';
2037 
2038  // Actions
2039  $out .= '<td></td>';
2040 
2041  $out .= "</tr>\n";
2042  $i++;
2043  }
2044  if (empty($histo)) {
2045  $colspan = 9;
2046  $out .= '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2047  }
2048 
2049  $out .= "</table>\n";
2050  $out .= "</div>\n";
2051 
2052  $out .= '</form>';
2053  }
2054 
2055  if ($noprint) {
2056  return $out;
2057  } else {
2058  print $out;
2059  }
2060 }
2061 
2071 function show_subsidiaries($conf, $langs, $db, $object)
2072 {
2073  global $user;
2074 
2075  $i = -1;
2076 
2077  $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";
2078  $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
2079  $sql .= " WHERE s.parent = ".((int) $object->id);
2080  $sql .= " AND s.entity IN (".getEntity('societe').")";
2081  $sql .= " ORDER BY s.nom";
2082 
2083  $result = $db->query($sql);
2084  $num = $db->num_rows($result);
2085 
2086  if ($num) {
2087  $socstatic = new Societe($db);
2088 
2089  print load_fiche_titre($langs->trans("Subsidiaries"), '', '');
2090 
2091  print "\n".'<div class="div-table-responsive-no-min">'."\n";
2092  print '<table class="noborder centpercent">'."\n";
2093 
2094  print '<tr class="liste_titre"><td>'.$langs->trans("Company").'</td>';
2095  print '<td>'.$langs->trans("Address").'</td><td>'.$langs->trans("Zip").'</td>';
2096  print '<td>'.$langs->trans("Town").'</td><td>'.$langs->trans("CustomerCode").'</td>';
2097  print "<td>&nbsp;</td>";
2098  print "</tr>";
2099 
2100  $i = 0;
2101 
2102  while ($i < $num) {
2103  $obj = $db->fetch_object($result);
2104 
2105  $socstatic->id = $obj->rowid;
2106  $socstatic->name = $obj->name;
2107  $socstatic->name_alias = $obj->name_alias;
2108  $socstatic->email = $obj->email;
2109  $socstatic->code_client = $obj->code_client;
2110  $socstatic->code_fournisseur = $obj->code_client;
2111  $socstatic->code_compta = $obj->code_compta;
2112  $socstatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
2113  $socstatic->email = $obj->email;
2114  $socstatic->canvas = $obj->canvas;
2115  $socstatic->client = $obj->client;
2116  $socstatic->fournisseur = $obj->fournisseur;
2117 
2118  print '<tr class="oddeven">';
2119 
2120  print '<td class="tdoverflowmax150">';
2121  print $socstatic->getNomUrl(1);
2122  print '</td>';
2123 
2124  print '<td class="tdoverflowmax400" title="'.dol_escape_htmltag($obj->address).'">'.dol_escape_htmltag($obj->address).'</td>';
2125  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->zip).'">'.$obj->zip.'</td>';
2126  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->town).'">'.$obj->town.'</td>';
2127  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->code_client).'">'.$obj->code_client.'</td>';
2128 
2129  print '<td class="center">';
2130  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/societe/card.php?socid='.((int) $obj->rowid).'&action=edit&token='.newToken().'">';
2131  print img_edit();
2132  print '</a></td>';
2133 
2134  print "</tr>\n";
2135  $i++;
2136  }
2137  print "\n</table>\n";
2138  print '</div>'."\n";
2139  }
2140 
2141  print "<br>\n";
2142 
2143  return $i;
2144 }
2153 function addEventTypeSQL(&$sql, $actioncode, $sqlANDOR = "AND")
2154 {
2155  global $conf, $db;
2156  // Condition on actioncode
2157 
2158  if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
2159  if ($actioncode == 'AC_NON_AUTO') {
2160  $sql .= " $sqlANDOR c.type != 'systemauto'";
2161  } elseif ($actioncode == 'AC_ALL_AUTO') {
2162  $sql .= " $sqlANDOR c.type = 'systemauto'";
2163  } else {
2164  if ($actioncode == 'AC_OTH') {
2165  $sql .= " $sqlANDOR c.type != 'systemauto'";
2166  } elseif ($actioncode == 'AC_OTH_AUTO') {
2167  $sql .= " $sqlANDOR c.type = 'systemauto'";
2168  }
2169  }
2170  } else {
2171  if ($actioncode == 'AC_NON_AUTO') {
2172  $sql .= " $sqlANDOR c.type != 'systemauto'";
2173  } elseif ($actioncode == 'AC_ALL_AUTO') {
2174  $sql .= " $sqlANDOR c.type = 'systemauto'";
2175  } else {
2176  $sql .= " $sqlANDOR c.code = '".$db->escape($actioncode)."'";
2177  }
2178  }
2179 
2180  return $sql;
2181 }
2182 
2192 function addOtherFilterSQL(&$sql, $donetodo, $now, $filters)
2193 {
2194  global $conf, $db;
2195  // Condition on actioncode
2196 
2197  if ($donetodo == 'todo') {
2198  $sql .= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
2199  } elseif ($donetodo == 'done') {
2200  $sql .= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
2201  }
2202  if (is_array($filters) && $filters['search_agenda_label']) {
2203  $sql .= natural_search('a.label', $filters['search_agenda_label']);
2204  }
2205  if (is_array($filters) && $filters['search_rowid']) {
2206  $sql .= natural_search('a.id', $filters['search_rowid'], 1);
2207  }
2208 
2209  return $sql;
2210 }
2211 
2220 function addMailingEventTypeSQL($actioncode, $objcon, $filterobj)
2221 {
2222  global $conf, $langs, $db;
2223  // Add also event from emailings. TODO This should be replaced by an automatic event ? May be it's too much for very large emailing.
2224  if (isModEnabled('mailing') && !empty($objcon->email)
2225  && (empty($actioncode) || $actioncode == 'AC_OTH_AUTO' || $actioncode == 'AC_EMAILING')) {
2226  $langs->load("mails");
2227 
2228  $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";
2229  $sql2 .= ", null as fk_element, '' as elementtype, null as contact_id";
2230  $sql2 .= ", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
2231  $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
2232  if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
2233  $sql2 .= ", '' as lastname, '' as firstname";
2234  } elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
2235  $sql2 .= ", '' as lastname, '' as firstname";
2236  } elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
2237  $sql2 .= ", '' as ref";
2238  } elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
2239  $sql2 .= ", '' as ref";
2240  } elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
2241  $sql2 .= ", '' as ref";
2242  }
2243  $sql2 .= " FROM ".MAIN_DB_PREFIX."mailing as m, ".MAIN_DB_PREFIX."mailing_cibles as mc, ".MAIN_DB_PREFIX."user as u";
2244  $sql2 .= " WHERE mc.email = '".$db->escape($objcon->email)."'"; // Search is done on email.
2245  $sql2 .= " AND mc.statut = 1";
2246  $sql2 .= " AND u.rowid = m.fk_user_valid";
2247  $sql2 .= " AND mc.fk_mailing=m.rowid";
2248  return $sql2;
2249  }
2250 }
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:47
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:140