dolibarr  17.0.3
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 }
dol_getdate
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
Definition: functions.lib.php:2820
dol_setcache
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
Societe
Class to manage third parties objects (customers, suppliers, prospects...)
Definition: societe.class.php:49
dol_escape_htmltag
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.
Definition: functions.lib.php:1493
dolGetElementUrl
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
Definition: functions2.lib.php:2119
dol_trunc
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.
Definition: functions.lib.php:3949
Project
Class to manage projects.
Definition: project.class.php:35
ActionComm
Class to manage agenda events (actions)
Definition: actioncomm.class.php:38
dol_getcache
dol_getcache($memoryid)
Read a memory area shared by all users, all sessions on server.
Definition: memory.lib.php:140
getTitleFieldOfList
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
Definition: functions.lib.php:5201
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5360
GETPOST
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
Definition: functions.lib.php:520
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:4993
dol_sort_array
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...
Definition: functions.lib.php:8714
SocieteAccount
Class for SocieteAccount.
Definition: societeaccount.class.php:35
FormActions
Class to manage building of HTML components.
Definition: html.formactions.class.php:30
dol_include_once
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
Definition: functions.lib.php:1032
dol_dir_list
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
img_warning
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
Definition: functions.lib.php:4670
show_actions_todo
show_actions_todo($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='')
Show html area with actions to do.
Definition: company.lib.php:1427
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
img_edit
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
Definition: functions.lib.php:4538
getArrayOfSocialNetworks
getArrayOfSocialNetworks()
Get array of social network dictionary.
Definition: functions.lib.php:3132
dol_print_date
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
Definition: functions.lib.php:2550
FormCompany
Class to build HTML component for third parties management Only common components are here.
Definition: html.formcompany.class.php:40
getState
getState($id, $withcode='', $dbtouse=0, $withregion=0, $outputlangs='', $entconv=1)
Return state translated from an id.
Definition: company.lib.php:596
show_subsidiaries
show_subsidiaries($conf, $langs, $db, $object)
Show html area for list of subsidiaries.
Definition: company.lib.php:2071
addOtherFilterSQL
addOtherFilterSQL(&$sql, $donetodo, $now, $filters)
Add Event Type SQL.
Definition: company.lib.php:2192
getCountriesInEEC
getCountriesInEEC()
Return list of countries that are inside the EEC (European Economic Community) Note: Try to keep this...
Definition: company.lib.php:743
$formactions
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.
Definition: agenda_other.php:179
CActionComm
Class to manage different types of events.
Definition: cactioncomm.class.php:29
complete_head_from_modules
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).
Definition: functions.lib.php:9395
currency_name
currency_name($code_iso, $withcode='', $outputlangs=null)
Return label of currency or code+label.
Definition: company.lib.php:666
$resql
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
dolGetButtonTitle
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.
Definition: functions.lib.php:11022
show_actions_done
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).
Definition: company.lib.php:1458
dol_string_nohtmltag
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
Definition: functions.lib.php:6880
show_contacts
show_contacts($conf, $langs, $db, $object, $backtopage='', $showuserlogin=0)
Show html area for list of contacts.
Definition: company.lib.php:934
dol_syslog
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Definition: functions.lib.php:1628
setEventMessage
setEventMessage($mesgs, $style='mesgs')
Set event message in dol_events session object.
Definition: functions.lib.php:8437
Contact
Class to manage contact/addresses.
Definition: contact.class.php:40
show_projects
show_projects($conf, $langs, $db, $object, $backtopage='', $nocreatelink=0, $morehtmlright='')
Show html area for list of projects.
Definition: company.lib.php:805
addMailingEventTypeSQL
addMailingEventTypeSQL($actioncode, $objcon, $filterobj)
Add Mailing Event Type SQL.
Definition: company.lib.php:2220
getFormeJuridiqueLabel
getFormeJuridiqueLabel($code)
Retourne le nom traduit de la forme juridique.
Definition: company.lib.php:710
getDolGlobalString
if(!function_exists('utf8_encode')) if(!function_exists('utf8_decode')) getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
Definition: functions.lib.php:82
societe_prepare_head2
societe_prepare_head2($object)
Return array of tabs to used on page.
Definition: company.lib.php:428
societe_prepare_head
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
Definition: company.lib.php:42
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11295
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:137
User
Class to manage Dolibarr users.
Definition: user.class.php:46
societe_admin_prepare_head
societe_admin_prepare_head()
Return array head with list of tabs to view object informations.
Definition: company.lib.php:454
GETPOSTISSET
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
Definition: functions.lib.php:421
natural_search
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...
Definition: functions.lib.php:9802
ExtraFields
Class to manage standard extra fields.
Definition: extrafields.class.php:39
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:53
img_object
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
Definition: functions.lib.php:4360
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2951
price
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.
Definition: functions.lib.php:5697
getCountry
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
Definition: company.lib.php:516
setEventMessages
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
Definition: functions.lib.php:8466
dol_mktime
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...
Definition: functions.lib.php:2863
getDolGlobalInt
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
Definition: functions.lib.php:96
addEventTypeSQL
addEventTypeSQL(&$sql, $actioncode, $sqlANDOR="AND")
Add Event Type SQL.
Definition: company.lib.php:2153
HookManager
Class to manage hooks.
Definition: hookmanager.class.php:30
isInEEC
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
Definition: company.lib.php:780