dolibarr  19.0.0-dev
partnership_list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2007-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2021 NextGestion <contact@nextgestion.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
25 // Load Dolibarr environment
26 require '../main.inc.php';
27 
28 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
29 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
32 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/partnership/class/partnership.class.php';
35 
36 // for other modules
37 //dol_include_once('/othermodule/class/otherobject.class.php');
38 
39 // Load translation files required by the page
40 $langs->loadLangs(array("partnership", "members", "other"));
41 
42 $action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'create'/'add', 'edit'/'update', 'view', ...
43 $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
44 $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
45 $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
46 $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
47 $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
48 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
49 $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
50 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
51 $mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...)
52 
53 $id = GETPOST('id', 'int');
54 $socid = GETPOST('socid', 'int');
55 $memberid = GETPOST('rowid', 'int');
56 // Load variable for pagination
57 $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
58 $sortfield = GETPOST('sortfield', 'aZ09comma');
59 $sortorder = GETPOST('sortorder', 'aZ09comma');
60 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
61 if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
62  // If $page is not defined, or '' or -1 or if we click on clear filters
63  $page = 0;
64 }
65 $offset = $limit * $page;
66 $pageprev = $page - 1;
67 $pagenext = $page + 1;
68 
69 // Initialize technical objects
70 $object = new Partnership($db);
71 $extrafields = new ExtraFields($db);
72 $adherent = new Adherent($db);
73 $diroutputmassaction = $conf->partnership->dir_output.'/temp/massgeneration/'.$user->id;
74 if ($socid > 0) {
75  $hookmanager->initHooks(array('thirdpartypartnership', 'globalcard'));
76 } elseif ($memberid > 0) {
77  $hookmanager->initHooks(array('memberpartnership', 'globalcard'));
78 } else {
79  $hookmanager->initHooks(array('partnershiplist')); // Note that conf->hooks_modules contains array
80 }
81 
82 // Fetch optionals attributes and labels
83 $extrafields->fetch_name_optionals_label($object->table_element);
84 //$extrafields->fetch_name_optionals_label($object->table_element_line);
85 
86 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
87 
88 $error = 0;
89 
90 $managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty');
91 
92 if ($managedfor != 'member' && $sortfield == 'd.datefin') $sortfield = '';
93 
94 // Default sort order (if not yet defined by previous GETPOST)
95 if (!$sortfield) {
96  reset($object->fields); // Reset is required to avoid key() to return null.
97  $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
98 }
99 if (!$sortorder) {
100  $sortorder = "ASC";
101 }
102 
103 // Initialize array of search criterias
104 $search_all = GETPOST('search_all', 'alphanohtml');
105 $search = array();
106 foreach ($object->fields as $key => $val) {
107  if (GETPOST('search_'.$key, 'alpha') !== '') {
108  $search[$key] = GETPOST('search_'.$key, 'alpha');
109  }
110  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
111  $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
112  $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
113  }
114 }
115 $search_filter = GETPOST("search_filter", 'alpha');
116 $filter = GETPOST("filter", 'alpha');
117 if ($filter) {
118  $search_filter = $filter; // For backward compatibility
119 }
120 
121 // List of fields to search into when doing a "search in all"
122 $fieldstosearchall = array();
123 foreach ($object->fields as $key => $val) {
124  if (!empty($val['searchall'])) {
125  $fieldstosearchall['t.'.$key] = $val['label'];
126  }
127 }
128 
129 // Definition of array of fields for columns
130 $arrayfields = array();
131 foreach ($object->fields as $key => $val) {
132  // If $val['visible']==0, then we never show the field
133  if (!empty($val['visible'])) {
134  $visible = (int) dol_eval($val['visible'], 1);
135  $arrayfields['t.'.$key] = array(
136  'label'=>$val['label'],
137  'checked'=>(($visible < 0) ? 0 : 1),
138  'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)),
139  'position'=>$val['position'],
140  'help'=> isset($val['help']) ? $val['help'] : ''
141  );
142  }
143 }
144 // Extra fields
145 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
146 
147 $object->fields = dol_sort_array($object->fields, 'position');
148 $arrayfields = dol_sort_array($arrayfields, 'position');
149 
150 $permissiontoread = $user->rights->partnership->read;
151 $permissiontoadd = $user->rights->partnership->write;
152 $permissiontodelete = $user->rights->partnership->delete;
153 
154 // Security check - Protection if external user
155 //if ($user->socid > 0) accessforbidden();
156 //if ($user->socid > 0) $socid = $user->socid;
157 //$result = restrictedArea($user, 'partnership', $object->id);
158 if (empty($conf->partnership->enabled)) accessforbidden();
159 if (empty($permissiontoread)) accessforbidden();
160 if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') accessforbidden();
161 if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') accessforbidden();
162 
163 
164 /*
165  * Actions
166  */
167 
168 if (GETPOST('cancel', 'alpha')) {
169  $action = 'list';
170  $massaction = '';
171 }
172 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
173  $massaction = '';
174 }
175 
176 $parameters = array();
177 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
178 if ($reshook < 0) {
179  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
180 }
181 
182 if (empty($reshook)) {
183  // Selection of new fields
184  include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
185 
186  // Purge search criteria
187  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
188  foreach ($object->fields as $key => $val) {
189  $search[$key] = '';
190  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
191  $search[$key.'_dtstart'] = '';
192  $search[$key.'_dtend'] = '';
193  }
194  }
195  $toselect = array();
196  $search_array_options = array();
197  }
198  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
199  || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
200  $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
201  }
202 
203  // Mass actions
204  $objectclass = 'Partnership';
205  $objectlabel = 'Partnership';
206  $uploaddir = $conf->partnership->dir_output;
207  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
208 
209  // Validate and approve
210  if (!$error && $massaction == 'approve' && $permissiontoadd) {
211  $objecttmp = new Partnership($db);
212 
213  $db->begin();
214  $error = 0;
215  $result = 0;
216 
217  foreach ($toselect as $checked) {
218  if ($objecttmp->fetch($checked)) {
219  if ($objecttmp->status == $objecttmp::STATUS_DRAFT) {
220  //$objecttmp->date = dol_now();
221  $result = $objecttmp->validate($user);
222  }
223 
224  if ($result >= 0 && $objecttmp->status == $objecttmp::STATUS_VALIDATED) {
225  $result = $objecttmp->approve($user);
226  if ($result > 0) {
227  setEventMessages($langs->trans("PartnershipRefApproved", $objecttmp->ref), null);
228  } else {
229  setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
230  $error++;
231  }
232  } else {
233  setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
234  $error++;
235  }
236  }
237  }
238 
239  if (!$error) {
240  $db->commit();
241  } else {
242  $db->rollback();
243  }
244  }
245 
246  // Cancel partnership
247  if ($massaction == 'cancel' && $permissiontoadd) {
248  $db->begin();
249 
250  $objecttmp = new $objectclass($db);
251  $nbok = 0;
252  foreach ($toselect as $toselectid) {
253  $result = $objecttmp->fetch($toselectid);
254  if ($result > 0) {
255  $result = $objecttmp->cancel($user, 0);
256  if ($result == 0) {
257  setEventMessages($langs->trans('StatusOfRefMustBe', $objecttmp->ref, $objecttmp->LibStatut($objecttmp::STATUS_APPROVED)), null, 'warnings');
258  $error++;
259  } elseif ($result <= 0) {
260  setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
261  $error++;
262  break;
263  } else {
264  $nbok++;
265  }
266  } else {
267  setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
268  $error++;
269  break;
270  }
271  }
272 
273  if (!$error) {
274  setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
275  $db->commit();
276  } else {
277  $db->rollback();
278  }
279  }
280 }
281 
282 
283 
284 /*
285  * View
286  */
287 
288 $form = new Form($db);
289 
290 $now = dol_now();
291 
292 //$help_url="EN:Module_Partnership|FR:Module_Partnership_FR|ES:Módulo_Partnership";
293 $help_url = '';
294 $title = $langs->trans("Partnerships");
295 $morejs = array();
296 $morecss = array();
297 
298 
299 // Build and execute select
300 // --------------------------------------------------------------------
301 $sql = 'SELECT ';
302 $sql .= $object->getFieldList('t');
303 if ($managedfor == 'member') {
304  $sql .= ', d.datefin, d.fk_adherent_type, dty.subscription';
305 }
306 // Add fields from extrafields
307 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
308  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
309  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
310  }
311 }
312 // Add fields from hooks
313 $parameters = array();
314 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
315 $sql .= $hookmanager->resPrint;
316 $sql = preg_replace('/,\s*$/', '', $sql);
317 
318 $sqlfields = $sql; // $sql fields to remove for count total
319 
320 $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
321 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
322  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
323 }
324 if ($managedfor == 'member') {
325  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent as d on (d.rowid = t.fk_member)";
326  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent_type as dty on (dty.rowid = d.fk_adherent_type)";
327 }
328 // Add table from hooks
329 $parameters = array();
330 $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
331 $sql .= $hookmanager->resPrint;
332 if ($object->ismultientitymanaged == 1) {
333  $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
334 } else {
335  $sql .= " WHERE 1 = 1";
336 }
337 if ($managedfor == 'member') {
338  if ($memberid > 0) {
339  $sql .= " AND t.fk_member = ".((int) $memberid);
340  } else {
341  $sql .= " AND fk_member > 0";
342  }
343 } else {
344  if ($socid > 0) {
345  $sql .= " AND t.fk_soc = ".((int) $socid);
346  } else {
347  $sql .= " AND fk_soc > 0";
348  }
349 }
350 foreach ($search as $key => $val) {
351  if (array_key_exists($key, $object->fields)) {
352  if ($key == 'status' && $search[$key] == -1) {
353  continue;
354  }
355  $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
356  if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
357  if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
358  $search[$key] = '';
359  }
360  $mode_search = 2;
361  }
362  if ($search[$key] != '') {
363  $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
364  }
365  } else {
366  if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
367  $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
368  if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
369  if (preg_match('/_dtstart$/', $key)) {
370  $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
371  }
372  if (preg_match('/_dtend$/', $key)) {
373  $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
374  }
375  }
376  }
377  }
378 }
379 if ($managedfor == 'member') {
380  if ($search_filter == 'withoutsubscription') {
381  $sql .= " AND (d.datefin IS NULL)";
382  }
383  if ($search_filter == 'waitingsubscription') {
384  $sql .= " AND (d.datefin IS NULL AND t.subscription = '1')";
385  }
386  if ($search_filter == 'uptodate') {
387  $sql .= " AND (d.datefin >= '".$db->idate($now)."' OR dty.subscription = '0')";
388  }
389  if ($search_filter == 'outofdate') {
390  $sql .= " AND (d.datefin < '".$db->idate($now)."' AND dty.subscription = '1')";
391  }
392 }
393 if ($search_all) {
394  $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
395 }
396 //$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
397 // Add where from extra fields
398 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
399 // Add where from hooks
400 $parameters = array();
401 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
402 $sql .= $hookmanager->resPrint;
403 
404 /* If a group by is required
405 $sql.= " GROUP BY ";
406 foreach($object->fields as $key => $val) {
407  $sql .= "t.".$db->escape($key).", ";
408 }
409 // Add fields from extrafields
410 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
411  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
412  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
413  }
414 }
415 // Add where from hooks
416 $parameters=array();
417 $reshook=$hookmanager->executeHooks('printFieldListGroupBy',$parameters, $object); // Note that $action and $object may have been modified by hook
418 $sql.=$hookmanager->resPrint;
419 $sql=preg_replace('/,\s*$/','', $sql);
420 */
421 
422 // Count total nb of records
423 $nbtotalofrecords = '';
424 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
425  /* The fast and low memory method to get and count full list converts the sql into a sql count */
426  $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
427  $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
428  $resql = $db->query($sqlforcount);
429  if ($resql) {
430  $objforcount = $db->fetch_object($resql);
431  $nbtotalofrecords = $objforcount->nbtotalofrecords;
432  } else {
433  dol_print_error($db);
434  }
435 
436  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
437  $page = 0;
438  $offset = 0;
439  }
440  $db->free($resql);
441 }
442 
443 // Complete request and execute it with limit
444 $sql .= $db->order($sortfield, $sortorder);
445 if ($limit) {
446  $sql .= $db->plimit($limit + 1, $offset);
447 }
448 
449 $resql = $db->query($sql);
450 if (!$resql) {
451  dol_print_error($db);
452  exit;
453 }
454 
455 $num = $db->num_rows($resql);
456 
457 
458 // Direct jump if only one record found
459 if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
460  $obj = $db->fetch_object($resql);
461  $id = $obj->rowid;
462  header("Location: ".dol_buildpath('/partnership/partnership_card.php', 1).'?id='.$id);
463  exit;
464 }
465 
466 
467 // Output page
468 // --------------------------------------------------------------------
469 
470 llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', '');
471 
472 if ($managedfor == "member") {
473  if ($memberid > 0 && $user->hasRight('adherent', 'lire')) {
474  $langs->load("members");
475 
476  $adhstat = new Adherent($db);
477  $adht = new AdherentType($db);
478  $result = $adhstat->fetch($memberid);
479 
480  if (isModEnabled('notification')) {
481  $langs->load("mails");
482  }
483 
484  $adht->fetch($adhstat->typeid);
485 
486  $head = member_prepare_head($adhstat);
487 
488  print dol_get_fiche_head($head, 'partnerships', $langs->trans("ThirdParty"), -1, 'user');
489 
490  $linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
491 
492  dol_banner_tab($object, 'rowid', $linkback);
493 
494  print '<div class="fichecenter">';
495 
496  print '<div class="underbanner clearboth"></div>';
497  print '<table class="border centpercent tableforfield">';
498 
499  // Login
500  if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) {
501  print '<tr><td class="titlefield">'.$langs->trans("Login").' / '.$langs->trans("Id").'</td><td class="valeur">'.$object->login.'&nbsp;</td></tr>';
502  }
503 
504  // Type
505  print '<tr><td class="titlefield">'.$langs->trans("Type").'</td><td class="valeur">'.$adht->getNomUrl(1)."</td></tr>\n";
506 
507  // Morphy
508  print '<tr><td>'.$langs->trans("MemberNature").'</td><td class="valeur" >'.$adhstat->getmorphylib().'</td>';
509  print '</tr>';
510 
511  // Company
512  print '<tr><td>'.$langs->trans("Company").'</td><td class="valeur">'.$adhstat->company.'</td></tr>';
513 
514  // Civility
515  print '<tr><td>'.$langs->trans("UserTitle").'</td><td class="valeur">'.$adhstat->getCivilityLabel().'&nbsp;</td>';
516  print '</tr>';
517 
518  print '</table>';
519 
520  print '</div>';
521 
522  print dol_get_fiche_end();
523  }
524 } elseif ($managedfor == "thirdparty") {
525  if ($socid && $user->hasRight('societe', 'lire')) {
526  $socstat = new Societe($db);
527  $res = $socstat->fetch($socid);
528  if ($res > 0) {
529  $tmpobject = $object;
530  $object = $socstat; // $object must be of type Societe when calling societe_prepare_head
531  $head = societe_prepare_head($socstat);
532  $object = $tmpobject;
533 
534  print dol_get_fiche_head($head, 'partnerships', $langs->trans("ThirdParty"), -1, 'company');
535 
536  dol_banner_tab($socstat, 'socid', '', ($user->socid ? 0 : 1), 'rowid', 'nom');
537 
538  print '<div class="fichecenter">';
539 
540  print '<div class="underbanner clearboth"></div>';
541  print '<table class="border centpercent tableforfield">';
542 
543  // Type Prospect/Customer/Supplier
544  print '<tr><td class="titlefield">'.$langs->trans('NatureOfThirdParty').'</td><td>';
545  print $socstat->getTypeUrl(1);
546  print '</td></tr>';
547 
548  // Customer code
549  if ($socstat->client && !empty($socstat->code_client)) {
550  print '<tr><td class="titlefield">';
551  print $langs->trans('CustomerCode').'</td><td>';
552  print showValueWithClipboardCPButton(dol_escape_htmltag($socstat->code_client));
553  $tmpcheck = $socstat->check_codeclient();
554  if ($tmpcheck != 0 && $tmpcheck != -5) {
555  print ' <span class="error">('.$langs->trans("WrongCustomerCode").')</span>';
556  }
557  print '</td>';
558  print '</tr>';
559  }
560  // Supplier code
561  if ($socstat->fournisseur && !empty($socstat->code_fournisseur)) {
562  print '<tr><td class="titlefield">';
563  print $langs->trans('SupplierCode').'</td><td>';
564  print showValueWithClipboardCPButton(dol_escape_htmltag($socstat->code_fournisseur));
565  $tmpcheck = $socstat->check_codefournisseur();
566  if ($tmpcheck != 0 && $tmpcheck != -5) {
567  print ' <span class="error">('.$langs->trans("WrongSupplierCode").')</span>';
568  }
569  print '</td>';
570  print '</tr>';
571  }
572 
573  print '</table>';
574  print '</div>';
575  print dol_get_fiche_end();
576  }
577  }
578 }
579 
580 $arrayofselected = is_array($toselect) ? $toselect : array();
581 
582 $param = '';
583 if (!empty($mode)) {
584  $param .= '&mode='.urlencode($mode);
585 }
586 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
587  $param .= '&contextpage='.urlencode($contextpage);
588 }
589 if ($limit > 0 && $limit != $conf->liste_limit) {
590  $param .= '&limit='.((int) $limit);
591 }
592 if ($socid) {
593  $param .= '&socid='.urlencode($socid);
594 }
595 if ($memberid) {
596  $param .= '&rowid='.urlencode($memberid);
597 }
598 foreach ($search as $key => $val) {
599  if (is_array($search[$key])) {
600  foreach ($search[$key] as $skey) {
601  if ($skey != '') {
602  $param .= '&search_'.$key.'[]='.urlencode($skey);
603  }
604  }
605  } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
606  $param .= '&search_'.$key.'month='.((int) GETPOST('search_'.$key.'month', 'int'));
607  $param .= '&search_'.$key.'day='.((int) GETPOST('search_'.$key.'day', 'int'));
608  $param .= '&search_'.$key.'year='.((int) GETPOST('search_'.$key.'year', 'int'));
609  } elseif ($search[$key] != '') {
610  $param .= '&search_'.$key.'='.urlencode($search[$key]);
611  }
612 }
613 if ($optioncss != '') {
614  $param .= '&optioncss='.urlencode($optioncss);
615 }
616 if ($search_filter && $search_filter != '-1') {
617  $param .= "&search_filter=".urlencode($search_filter);
618 }
619 // Add $param from extra fields
620 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
621 // Add $param from hooks
622 $parameters = array();
623 $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
624 $param .= $hookmanager->resPrint;
625 
626 // List of mass actions available
627 $arrayofmassactions = array(
628  //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
629  'approve'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ValidateAndApprove"),
630  'cancel'=>img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Cancel"),
631  //'generate_doc'=>img_picto('', 'pdf').$langs->trans("ReGeneratePDF"),
632  //'builddoc'=>img_picto('', 'pdf').$langs->trans("PDFMerge"),
633  'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendMail"),
634 );
635 if ($permissiontodelete) {
636  $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
637 }
638 if (GETPOST('nomassaction', 'int') || in_array($massaction, array('prevalidate', 'presend', 'predelete'))) {
639  $arrayofmassactions = array();
640 }
641 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
642 
643 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
644 if ($optioncss != '') {
645  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
646 }
647 print '<input type="hidden" name="token" value="'.newToken().'">';
648 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
649 print '<input type="hidden" name="action" value="list">';
650 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
651 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
652 print '<input type="hidden" name="page" value="'.$page.'">';
653 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
654 print '<input type="hidden" name="page_y" value="">';
655 print '<input type="hidden" name="mode" value="'.$mode.'">';
656 if ($socid) {
657  print '<input type="hidden" name="socid" value="'.$socid.'" >';
658 } elseif ($memberid) {
659  print '<input type="hidden" name="rowid" value="'.$memberid.'" >';
660 }
661 
662 
663 $newcardbutton = '';
664 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
665 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
666 $newcardbutton .= dolGetButtonTitleSeparator();
667 $newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/partnership/partnership_card.php', 1).'?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
668 
669 
670 print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
671 
672 // Add code for pre mass action (confirmation or email presend form)
673 $topicmail = "SendPartnershipRef";
674 $modelmail = "partnership_send";
675 $objecttmp = new Partnership($db);
676 $trackid = 'pship'.$object->id;
677 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
678 
679 if ($search_all) {
680  $setupstring = '';
681  foreach ($fieldstosearchall as $key => $val) {
682  $fieldstosearchall[$key] = $langs->trans($val);
683  $setupstring .= $key."=".$val.";";
684  }
685  print '<!-- Search done like if PARTNERSHIP_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
686  print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'</div>'."\n";
687 }
688 
689 $moreforfilter = '';
690 /*$moreforfilter.='<div class="divsearchfield">';
691 $moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
692 $moreforfilter.= '</div>';*/
693 
694 $parameters = array();
695 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
696 if (empty($reshook)) {
697  $moreforfilter .= $hookmanager->resPrint;
698 } else {
699  $moreforfilter = $hookmanager->resPrint;
700 }
701 
702 if (!empty($moreforfilter)) {
703  print '<div class="liste_titre liste_titre_bydiv centpercent">';
704  print $moreforfilter;
705  $parameters = array('type'=>$type);
706  $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
707  print $hookmanager->resPrint;
708  print '</div>';
709 }
710 
711 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
712 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
713 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
714 
715 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
716 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
717 
718 
719 if ($managedfor == 'member') {
720  $arrayfields['t.fk_member']['checked'] = 1;
721 } else {
722  $arrayfields['t.fk_soc']['checked'] = 1;
723 }
724 // Fields title search
725 // --------------------------------------------------------------------
726 print '<tr class="liste_titre_filter">';
727 // Action column
728 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
729  print '<td class="liste_titre maxwidthsearch">';
730  $searchpicto = $form->showFilterButtons('left');
731  print $searchpicto;
732  print '</td>';
733 }
734 foreach ($object->fields as $key => $val) {
735  $searchkey = empty($search[$key]) ? '' : $search[$key];
736  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
737  if ($key == 'status') {
738  $cssforfield .= ($cssforfield ? ' ' : '').'center';
739  } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
740  $cssforfield .= ($cssforfield ? ' ' : '').'center';
741  } elseif (in_array($val['type'], array('timestamp'))) {
742  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
743  } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
744  $cssforfield .= ($cssforfield ? ' ' : '').'right';
745  }
746  if (!empty($arrayfields['t.'.$key]['checked'])) {
747  print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
748  if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
749  print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
750  } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
751  print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
752  } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
753  print '<div class="nowrap">';
754  print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
755  print '</div>';
756  print '<div class="nowrap">';
757  print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
758  print '</div>';
759  } elseif ($key == 'lang') {
760  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
761  $formadmin = new FormAdmin($db);
762  print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2);
763  } else {
764  print '<input type="text" class="flat maxwidth75" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
765  }
766  print '</td>';
767  }
768 }
769 // End of subscription date
770 if ($managedfor == 'member') {
771  print '<td class="liste_titre center">';
772  $selectarray = array('-1'=>'', 'withoutsubscription'=>$langs->trans("WithoutSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
773  print $form->selectarray('search_filter', $selectarray, $search_filter);
774  print '</td>';
775 }
776 // Extra fields
777 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
778 
779 // Fields from hook
780 $parameters = array('arrayfields'=>$arrayfields);
781 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
782 print $hookmanager->resPrint;
783 // Action column
784 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
785  print '<td class="liste_titre maxwidthsearch">';
786  $searchpicto = $form->showFilterButtons();
787  print $searchpicto;
788  print '</td>';
789 }
790 print '</tr>'."\n";
791 
792 $totalarray = array();
793 $totalarray['nbfield'] = 0;
794 
795 // Fields title label
796 // --------------------------------------------------------------------
797 print '<tr class="liste_titre">';
798 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
799  print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
800  $totalarray['nbfield']++; // For the column action
801 }
802 foreach ($object->fields as $key => $val) {
803  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
804  if ($key == 'status') {
805  $cssforfield .= ($cssforfield ? ' ' : '').'center';
806  } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
807  $cssforfield .= ($cssforfield ? ' ' : '').'center';
808  } elseif (in_array($val['type'], array('timestamp'))) {
809  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
810  } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
811  $cssforfield .= ($cssforfield ? ' ' : '').'right';
812  }
813  $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
814  if (!empty($arrayfields['t.'.$key]['checked'])) {
815  print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''), 0, (empty($val['helplist']) ? '' : $val['helplist']))."\n";
816  $totalarray['nbfield']++;
817  }
818 }
819 // End of subscription date
820 if ($managedfor == 'member') {
821  $key = 'datefin';
822  $cssforfield = 'center';
823  print getTitleFieldOfList('SubscriptionEndDate', 0, $_SERVER['PHP_SELF'], 'd.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
824 }
825 // Extra fields
826 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
827 // Hook fields
828 $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
829 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
830 print $hookmanager->resPrint;
831 // Action column
832 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
833  print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
834  $totalarray['nbfield']++; // For the column action
835 }
836 print '</tr>'."\n";
837 
838 
839 // Detect if we need a fetch on each output line
840 $needToFetchEachLine = 0;
841 if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
842  foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
843  if (!is_null($val) && preg_match('/\$object/', $val)) {
844  $needToFetchEachLine++; // There is at least one compute field that use $object
845  }
846  }
847 }
848 
849 
850 // Loop on record
851 // --------------------------------------------------------------------
852 $i = 0;
853 $savnbfield = $totalarray['nbfield'];
854 $totalarray = array();
855 $totalarray['nbfield'] = 0;
856 $imaxinloop = ($limit ? min($num, $limit) : $num);
857 while ($i < $imaxinloop) {
858  $obj = $db->fetch_object($resql);
859  if (empty($obj)) {
860  break; // Should not happen
861  }
862 
863  // Store properties in $object
864  $object->setVarsFromFetchObj($obj);
865 
866  if ($mode == 'kanban') {
867  if ($i == 0) {
868  print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
869  print '<div class="box-flex-container kanban">';
870  }
871  // Output Kanban
872  print $object->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
873  if ($i == ($imaxinloop - 1)) {
874  print '</div>';
875  print '</td></tr>';
876  }
877  } else {
878  // Show here line of result
879  $j = 0;
880  print '<tr data-rowid="'.$object->id.'" class="oddeven">';
881  // Action column
882  if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
883  print '<td class="nowrap center">';
884  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
885  $selected = 0;
886  if (in_array($object->id, $arrayofselected)) {
887  $selected = 1;
888  }
889  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
890  }
891  print '</td>';
892  if (!$i) {
893  $totalarray['nbfield']++;
894  }
895  }
896  foreach ($object->fields as $key => $val) {
897  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
898  if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
899  $cssforfield .= ($cssforfield ? ' ' : '').'center';
900  } elseif ($key == 'status') {
901  $cssforfield .= ($cssforfield ? ' ' : '').'center';
902  }
903 
904  if (in_array($val['type'], array('timestamp'))) {
905  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
906  } elseif ($key == 'ref') {
907  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
908  }
909 
910  if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
911  $cssforfield .= ($cssforfield ? ' ' : '').'right';
912  }
913  //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
914 
915  if (!empty($arrayfields['t.'.$key]['checked'])) {
916  print '<td'.($cssforfield ? ' class="'.$cssforfield.(preg_match('/tdoverflow/', $cssforfield) ? ' classfortooltip' : '').'"' : '');
917  if (preg_match('/tdoverflow/', $cssforfield) && !is_numeric($object->$key)) {
918  print ' title="'.dol_escape_htmltag($object->$key).'"';
919  }
920  print '>';
921  if ($key == 'status') {
922  print $object->getLibStatut(5);
923  } elseif ($key == 'rowid') {
924  print $object->showOutputField($val, $key, $object->id, '');
925  } else {
926  print $object->showOutputField($val, $key, $object->$key, '');
927  }
928  print '</td>';
929  if (!$i) {
930  $totalarray['nbfield']++;
931  }
932  if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
933  if (!$i) {
934  $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
935  }
936  if (!isset($totalarray['val'])) {
937  $totalarray['val'] = array();
938  }
939  if (!isset($totalarray['val']['t.'.$key])) {
940  $totalarray['val']['t.'.$key] = 0;
941  }
942  $totalarray['val']['t.'.$key] += $object->$key;
943  }
944  }
945  }
946  // End of subscription date
947  if ($managedfor == 'member') {
948  print '<td class="nowrap center endofsubscriptiondate">';
949  $result = $adherent->fetch($object->fk_member);
950  if ($result) {
951  $datefin = $adherent->datefin;
952  if ($datefin) {
953  print dol_print_date($datefin, 'day');
954  if ($adherent->hasDelay()) {
955  $textlate .= ' ('.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24) >= 0 ? '+' : '').ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24).' '.$langs->trans("days").')';
956  print " ".img_warning($langs->trans("SubscriptionLate").$textlate);
957  }
958  } else {
959  if ($adherent->subscription == 'yes') {
960  print $langs->trans("SubscriptionNotReceived");
961  if ($adherent->statut > 0) {
962  print " ".img_warning();
963  }
964  } else {
965  print '&nbsp;';
966  }
967  }
968  }
969  print '</td>';
970  }
971  // Extra fields
972  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
973  // Fields from hook
974  $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
975  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
976  print $hookmanager->resPrint;
977  // Action column
978  if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
979  print '<td class="nowrap center">';
980  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
981  $selected = 0;
982  if (in_array($object->id, $arrayofselected)) {
983  $selected = 1;
984  }
985  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
986  }
987  print '</td>';
988  if (!$i) {
989  $totalarray['nbfield']++;
990  }
991  }
992 
993  print '</tr>'."\n";
994  }
995 
996  $i++;
997 }
998 if ($managedfor != 'member') {
999  $totalarray['nbfield']++; // End of subscription date
1000 }
1001 
1002 // Show total line
1003 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1004 
1005 // If no record found
1006 if ($num == 0) {
1007  $colspan = 1;
1008  foreach ($arrayfields as $key => $val) {
1009  if (!empty($val['checked'])) {
1010  $colspan++;
1011  }
1012  }
1013  if ($managedfor != 'member') {
1014  $colspan++; // End of subscription date
1015  }
1016  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1017 }
1018 
1019 
1020 $db->free($resql);
1021 
1022 $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
1023 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1024 print $hookmanager->resPrint;
1025 
1026 print '</table>'."\n";
1027 print '</div>'."\n";
1028 
1029 print '</form>'."\n";
1030 
1031 if (in_array('builddoc', $arrayofmassactions) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
1032  $hidegeneratedfilelistifempty = 1;
1033  if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1034  $hidegeneratedfilelistifempty = 0;
1035  }
1036 
1037  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
1038  $formfile = new FormFile($db);
1039 
1040  // Show list of available documents
1041  $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1042  $urlsource .= str_replace('&amp;', '&', $param);
1043 
1044  $filedir = $diroutputmassaction;
1045  $genallowed = $permissiontoread;
1046  $delallowed = $permissiontoadd;
1047 
1048  print $formfile->showdocuments('massfilesarea_partnership', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1049 }
1050 
1051 // End of page
1052 llxFooter();
1053 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage members of a foundation.
Class to manage members type.
Class to manage standard extra fields.
Class to generate html code for admin pages.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class for Partnership.
Class to manage third parties objects (customers, suppliers, prospects...)
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') && $user->hasRight('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') && $user->hasRight('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)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
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...
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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...
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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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...
dol_eval($s, $returnvalue=0, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
member_prepare_head(Adherent $object)
Return array head with list of tabs to view object informations.
Definition: member.lib.php:33
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.