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