* FIX phpstan: Societe::$client (int<0,3>) does not accept -1 (#39244) Societe::$client is annotated @var int<0,3> (domain 0=no customer, 1=customer, 2=prospect, 3=both) in societe.class.php, but the create form in societe/card.php pre-set it to -1 as a transient "nothing pre-selected" placeholder, tripping PHPStan level 10 on develop. The value is never persisted (save paths compute 0..3) and the only reader, the switch() building the form, treats -1 and 0 identically via its default case. Use 0 (the property's own default) so the assignment matches the declared type. No behavior change. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Qual: Fix entity handling in bonprelevement.class.php The variable name 'entities' was changed to 'entity' to better reflect the singular nature of the value being retrieved. It was also casted to an int instead of using an unquoted db->escape. * Qual: Improve SQL query construction in company.lib.php By escaping the concatenated string, injection verification does not identify a false positive. * Qual: Avoid void positive, sanitize instead of escape * Qual: Avoid false positive, sanitize instead of escape * Sec: Fix potential injection with cast to int (timespent_duration) * Qual: Avoid false positive, sanitize instead of escape * Qual: Avoid false positive, sanitize instead of escape * fix: Replace escape() with sanitize() in SQL queries # FIX: Replace escape() with sanitize() in SQL queries - Replace escape() with sanitize() in SQL queries to ensure proper SQL injection protection - Update SQL queries in multiple files to use sanitize() instead of escape() - Ensure consistent use of sanitize() across the codebase for better security * fix(sql): Replace escape with sanitize in SQL queries # FIX: Replace escape with sanitize in SQL queries - Replace `escape` with `sanitize` in SQL queries to ensure proper SQL injection prevention * Qual: Improve field escaping/quoting # Qual: Qual: Improve field escaping/quoting --------- Co-authored-by: Jam Balaya <jambalaya.pyoncafe@outlook.jp> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1160 lines
46 KiB
PHP
1160 lines
46 KiB
PHP
<?php
|
|
/* Copyright (C) 2007-2017 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2021 NextGestion <contact@nextgestion.com>
|
|
* Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
|
|
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file partnership_list.php
|
|
* \ingroup partnership
|
|
* \brief List page for partnership
|
|
*/
|
|
|
|
// Load Dolibarr environment
|
|
require '../main.inc.php';
|
|
/**
|
|
* @var Conf $conf
|
|
* @var DoliDB $db
|
|
* @var ExtraFields $extrafields
|
|
* @var HookManager $hookmanager
|
|
* @var Translate $langs
|
|
* @var User $user
|
|
*/
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/partnership/class/partnership.class.php';
|
|
|
|
// Load translation files required by the page
|
|
$langs->loadLangs(array("partnership", "members", "other"));
|
|
|
|
$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'create'/'add', 'edit'/'update', 'view', ...
|
|
$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
|
|
$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
|
|
$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
|
|
$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
|
|
$toselect = GETPOST('toselect', 'array:int'); // Array of ids of elements selected into a list
|
|
$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
|
|
$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
|
|
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
|
|
$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...)
|
|
|
|
$id = GETPOSTINT('id');
|
|
$socid = GETPOSTINT('socid');
|
|
$memberid = GETPOSTINT('rowid');
|
|
// Load variable for pagination
|
|
$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
|
|
$sortfield = GETPOST('sortfield', 'aZ09comma');
|
|
$sortorder = GETPOST('sortorder', 'aZ09comma');
|
|
$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
|
|
if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
|
|
// If $page is not defined, or '' or -1 or if we click on clear filters
|
|
$page = 0;
|
|
}
|
|
$offset = $limit * $page;
|
|
$pageprev = $page - 1;
|
|
$pagenext = $page + 1;
|
|
|
|
// Initialize technical objects
|
|
$object = new Partnership($db);
|
|
|
|
$adherent = new Adherent($db);
|
|
$diroutputmassaction = $conf->partnership->dir_output.'/temp/massgeneration/'.$user->id;
|
|
if ($socid > 0) {
|
|
$hookmanager->initHooks(array('thirdpartypartnership', 'globalcard'));
|
|
} elseif ($memberid > 0) {
|
|
$hookmanager->initHooks(array('memberpartnership', 'globalcard'));
|
|
} else {
|
|
$hookmanager->initHooks(array('partnershiplist')); // Note that conf->hooks_modules contains array
|
|
}
|
|
|
|
// Fetch optionals attributes and labels
|
|
$extrafields->fetch_name_optionals_label($object->table_element);
|
|
//$extrafields->fetch_name_optionals_label($object->table_element_line);
|
|
|
|
$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
|
|
|
|
$error = 0;
|
|
|
|
$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty');
|
|
|
|
if ($sortfield == 'd.datefin') {
|
|
if ($managedfor != 'member' && !isModEnabled('member')) {
|
|
$sortfield = '';
|
|
}
|
|
}
|
|
|
|
// Add non object fields to fields for list
|
|
$non_object_fields = array(
|
|
'town' => array('type' => 'varchar(128)', 'label' => 'Town', 'enabled' => 1, 'position' => 51, 'notnull' => 0, 'visible' => -1, 'alwayseditable' => 1, 'searchall' => 1,),
|
|
'country' => array('type' => 'integer', 'label' => 'Country', 'enabled' => 1, 'position' => 52, 'notnull' => 0, 'visible' => -1, 'alwayseditable' => 1, 'css' => 'maxwidth500 widthcentpercentminusxx', 'searchall' => 1,),
|
|
// Field to add member when link is through thirdparty membership then member link
|
|
'fk_soc_member' => array('type' => 'custom', 'label' => 'Member', 'visible' => -1, 'enabled' => ($managedfor != 'member' && isModEnabled('member')), 'picto' => 'member', 'csslist' => 'tdoverflowmax125', 'position' => 54),
|
|
// Field to show when partnership linked to member or thirdparty
|
|
'fk_soc_dateend' => array('type' => 'custom', 'label' => 'DateEndSubscription', 'visible' => -1, 'enabled' => ($managedfor == 'member' || isModEnabled('member')), 'picto' => 'member', 'csslist' => 'center', 'position' => 55)
|
|
);
|
|
//$arrayfields['fk_soc_member'] = array('type' => 'varchar', 'label' => 'Member', 'checked' => -1, 'enabled' => 1, 'picto' => 'member', 'csslist' => 'tdoverflowmax125', 'position' => 51);
|
|
//var_dump($arrayfields);
|
|
|
|
|
|
// All fields in list
|
|
$all_fields_list = array_merge($object->fields, $non_object_fields);
|
|
|
|
// Default sort order (if not yet defined by previous GETPOST)
|
|
if (!$sortfield) {
|
|
reset($all_fields_list); // Reset is required to avoid key() to return null.
|
|
$sortfield = "t.".key($all_fields_list); // Set here default search field. By default 1st field in definition.
|
|
}
|
|
if (!$sortorder) {
|
|
$sortorder = "ASC";
|
|
}
|
|
|
|
// Initialize array of search criteria
|
|
$search_all = trim(GETPOST('search_all', 'alphanohtml'));
|
|
$search = array();
|
|
foreach ($all_fields_list as $key => $val) {
|
|
if (GETPOST('search_'.$key, 'alpha') !== '') {
|
|
$search[$key] = GETPOST('search_'.$key, 'alpha');
|
|
}
|
|
if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
|
|
$search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_'.$key.'_dtstartmonth'), GETPOSTINT('search_'.$key.'_dtstartday'), GETPOSTINT('search_'.$key.'_dtstartyear'));
|
|
$search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_'.$key.'_dtendmonth'), GETPOSTINT('search_'.$key.'_dtendday'), GETPOSTINT('search_'.$key.'_dtendyear'));
|
|
}
|
|
}
|
|
$search_filter = GETPOST("search_filter", 'alpha');
|
|
$filter = GETPOST("filter", 'alpha');
|
|
if ($filter) {
|
|
$search_filter = $filter; // For backward compatibility
|
|
}
|
|
|
|
// List of fields to search into when doing a "search in all"
|
|
$fieldstosearchall = array();
|
|
foreach ($non_object_fields as $key => $val) {
|
|
if (!empty($val['searchall'])) {
|
|
$fieldstosearchall['t.'.$key] = $val['label'];
|
|
}
|
|
}
|
|
|
|
// Definition of array of fields for columns from ->fields
|
|
$tableprefix = 't';
|
|
$arrayfields = array();
|
|
foreach ($all_fields_list as $key => $val) {
|
|
// If $val['visible']==0, then we never show the field
|
|
if (!empty($val['visible'])) {
|
|
$visible = (int) dol_eval((string) $val['visible'], 1);
|
|
$arrayfields[$tableprefix.'.'.$key] = array(
|
|
'label' => $val['label'],
|
|
'checked' => (($visible < 0) ? '0' : '1'),
|
|
'enabled' => (string) (int) (abs($visible) != 3 && (bool) dol_eval((string) $val['enabled'], 1)),
|
|
'position' => $val['position'],
|
|
'help' => isset($val['help']) ? $val['help'] : ''
|
|
);
|
|
}
|
|
}
|
|
// Extra fields
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
|
|
|
|
$object->fields = dol_sort_array($object->fields, 'position');
|
|
$arrayfields = dol_sort_array($arrayfields, 'position');
|
|
$all_fields_list = dol_sort_array($all_fields_list, 'position');
|
|
|
|
$permissiontoread = $user->hasRight('partnership', 'read');
|
|
$permissiontoadd = $user->hasRight('partnership', 'write');
|
|
$permissiontodelete = $user->hasRight('partnership', 'delete');
|
|
|
|
// Security check - Protection if external user
|
|
//if ($user->socid > 0) accessforbidden();
|
|
//if ($user->socid > 0) $socid = $user->socid;
|
|
//restrictedArea($user, 'partnership', $object->id);
|
|
if (empty($conf->partnership->enabled)) {
|
|
accessforbidden();
|
|
}
|
|
if (empty($permissiontoread)) {
|
|
accessforbidden();
|
|
}
|
|
if ($object->id > 0 && !($object->fk_member > 0) && $managedfor == 'member') {
|
|
accessforbidden();
|
|
}
|
|
if ($object->id > 0 && !($object->fk_soc > 0) && $managedfor == 'thirdparty') {
|
|
accessforbidden();
|
|
}
|
|
|
|
|
|
/*
|
|
* Actions
|
|
*/
|
|
|
|
if (GETPOST('cancel', 'alpha')) {
|
|
$action = 'list';
|
|
$massaction = '';
|
|
}
|
|
if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
|
|
$massaction = '';
|
|
}
|
|
|
|
$parameters = array('socid' => $socid);
|
|
$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
|
|
if ($reshook < 0) {
|
|
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
|
|
}
|
|
|
|
if (empty($reshook)) {
|
|
// Selection of new fields
|
|
include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
|
|
|
|
// Purge search criteria
|
|
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
|
|
foreach ($all_fields_list as $key => $val) {
|
|
$search[$key] = '';
|
|
if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
|
|
$search[$key.'_dtstart'] = '';
|
|
$search[$key.'_dtend'] = '';
|
|
}
|
|
}
|
|
$toselect = array();
|
|
$search_array_options = array();
|
|
}
|
|
if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
|
|
|| GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
|
|
$massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
|
|
}
|
|
|
|
// Mass actions
|
|
$objectclass = 'Partnership';
|
|
$objectlabel = 'Partnership';
|
|
$uploaddir = $conf->partnership->dir_output;
|
|
include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
|
|
|
|
// Validate and approve
|
|
if (!$error && $massaction == 'approve' && $permissiontoadd) {
|
|
$objecttmp = new Partnership($db);
|
|
|
|
$db->begin();
|
|
$error = 0;
|
|
$result = 0;
|
|
|
|
foreach ($toselect as $checked) {
|
|
if ($objecttmp->fetch($checked)) {
|
|
if ($objecttmp->status == $objecttmp::STATUS_DRAFT) {
|
|
//$objecttmp->date = dol_now();
|
|
$result = $objecttmp->validate($user);
|
|
}
|
|
|
|
if ($result >= 0 && $objecttmp->status == $objecttmp::STATUS_VALIDATED) {
|
|
$result = $objecttmp->approve($user);
|
|
if ($result > 0) {
|
|
setEventMessages($langs->trans("PartnershipRefApproved", $objecttmp->ref), null);
|
|
} else {
|
|
setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
|
|
$error++;
|
|
}
|
|
} else {
|
|
setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
|
|
$error++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$error) {
|
|
$db->commit();
|
|
} else {
|
|
$db->rollback();
|
|
}
|
|
}
|
|
|
|
// Cancel partnership
|
|
if ($massaction == 'cancel' && $permissiontoadd) {
|
|
$db->begin();
|
|
|
|
$objecttmp = new $objectclass($db);
|
|
$nbok = 0;
|
|
foreach ($toselect as $toselectid) {
|
|
$result = $objecttmp->fetch($toselectid);
|
|
if ($result > 0) {
|
|
$result = $objecttmp->cancel($user, 0);
|
|
if ($result == 0) {
|
|
setEventMessages($langs->trans('StatusOfRefMustBe', $objecttmp->ref, $objecttmp->LibStatut($objecttmp::STATUS_APPROVED)), null, 'warnings');
|
|
$error++;
|
|
} elseif ($result <= 0) {
|
|
setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
|
|
$error++;
|
|
break;
|
|
} else {
|
|
$nbok++;
|
|
}
|
|
} else {
|
|
setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
|
|
$error++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!$error) {
|
|
setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
|
|
$db->commit();
|
|
} else {
|
|
$db->rollback();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* View
|
|
*/
|
|
|
|
$form = new Form($db);
|
|
$companystatic = new Societe($db);
|
|
|
|
$now = dol_now();
|
|
|
|
//$help_url="EN:Module_Partnership|FR:Module_Partnership_FR|ES:Módulo_Partnership";
|
|
$help_url = '';
|
|
$title = $langs->trans("Partnerships");
|
|
$morejs = array();
|
|
$morecss = array();
|
|
|
|
|
|
// Build and execute select
|
|
// --------------------------------------------------------------------
|
|
$sql = 'SELECT ';
|
|
$sql .= $object->getFieldList('t');
|
|
if ($managedfor == 'member') {
|
|
$sql .= ', d.rowid as memberid, d.lastname, d.firstname, d.datefin, d.fk_adherent_type, dty.subscription';
|
|
}
|
|
if ($managedfor == 'thirdparty' && isModEnabled('member')) {
|
|
$sql .= ', d.rowid as memberid, d.lastname, d.firstname, d.datefin, d.fk_adherent_type, dty.subscription';
|
|
}
|
|
// Add fields from extrafields
|
|
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
|
|
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
|
|
$sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
|
|
}
|
|
}
|
|
// Add fields from hooks
|
|
$parameters = array();
|
|
$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
$sql .= $hookmanager->resPrint;
|
|
$sql = preg_replace('/,\s*$/', '', $sql);
|
|
|
|
$sqlfields = $sql; // $sql fields to remove for count total
|
|
|
|
$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
|
|
if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
|
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
|
|
}
|
|
if ($managedfor == 'member') {
|
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent as d on (d.rowid = t.fk_member)";
|
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent_type as dty on (dty.rowid = d.fk_adherent_type)";
|
|
} else {
|
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on (s.rowid = t.fk_soc)";
|
|
if ($managedfor == 'thirdparty' && isModEnabled('member')) {
|
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent as d on (d.fk_soc = s.rowid)";
|
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent_type as dty on (dty.rowid = d.fk_adherent_type)";
|
|
}
|
|
}
|
|
|
|
// Add table from hooks
|
|
$parameters = array();
|
|
$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
$sql .= $hookmanager->resPrint;
|
|
if ($object->ismultientitymanaged == 1) {
|
|
$sql .= " WHERE t.entity IN (".getEntity($object->element).")";
|
|
} else {
|
|
$sql .= " WHERE 1 = 1";
|
|
}
|
|
if ($managedfor == 'member') {
|
|
if ($memberid > 0) {
|
|
$sql .= " AND t.fk_member = ".((int) $memberid);
|
|
} else {
|
|
$sql .= " AND t.fk_member > 0";
|
|
}
|
|
} else {
|
|
if ($socid > 0) {
|
|
$sql .= " AND t.fk_soc = ".((int) $socid);
|
|
} else {
|
|
$sql .= " AND t.fk_soc > 0";
|
|
}
|
|
}
|
|
foreach ($search as $key => $val) {
|
|
if (array_key_exists($key, $object->fields)) {
|
|
if ($key == 'status' && $search[$key] == -1) {
|
|
continue;
|
|
}
|
|
$mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
|
|
if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
|
|
if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
|
|
$search[$key] = '';
|
|
}
|
|
$mode_search = 2;
|
|
}
|
|
if ($search[$key] != '') {
|
|
$sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
|
|
}
|
|
} else {
|
|
if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
|
|
$columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
|
|
if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
|
|
if (preg_match('/_dtstart$/', $key)) {
|
|
$sql .= " AND t.".$db->sanitize($columnName)." >= '".$db->idate($search[$key])."'";
|
|
}
|
|
if (preg_match('/_dtend$/', $key)) {
|
|
$sql .= " AND t.".$db->sanitize($columnName)." <= '".$db->idate($search[$key])."'";
|
|
}
|
|
}
|
|
}
|
|
if ($key == 'country' && $search[$key] != '') {
|
|
if ($managedfor == 'member') {
|
|
$sql .= " AND d.country = '".$db->escape($val)."'";
|
|
} else {
|
|
$sql .= " AND s.fk_pays = '".$db->escape($val)."'";
|
|
}
|
|
}
|
|
if ($key == 'town' && $search[$key] != '') {
|
|
if ($managedfor == 'member') {
|
|
$sql .= natural_search("d.town", $val);
|
|
} else {
|
|
$sql .= natural_search("s.town", $val);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($managedfor == 'member' || ($managedfor == 'thirdparty' && isModEnabled('member'))) {
|
|
if ($search_filter == 'withoutsubscription') {
|
|
$sql .= " AND (d.datefin IS NULL)";
|
|
}
|
|
if ($search_filter == 'waitingsubscription') {
|
|
$sql .= " AND (d.datefin IS NULL AND t.subscription = '1')";
|
|
}
|
|
if ($search_filter == 'uptodate') {
|
|
$sql .= " AND (d.datefin >= '".$db->idate($now)."' OR dty.subscription = '0')";
|
|
}
|
|
if ($search_filter == 'outofdate') {
|
|
$sql .= " AND (d.datefin < '".$db->idate($now)."' AND dty.subscription = '1')";
|
|
}
|
|
}
|
|
if ($search_all) {
|
|
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);
|
|
}
|
|
//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
|
|
// Add where from extra fields
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
|
|
// Add where from hooks
|
|
$parameters = array();
|
|
$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
$sql .= $hookmanager->resPrint;
|
|
|
|
/* If a group by is required
|
|
$sql.= " GROUP BY ";
|
|
foreach($object->fields as $key => $val) {
|
|
$sql .= "t.".$db->escape($key).", ";
|
|
}
|
|
// Add fields from extrafields
|
|
if (!empty($extrafields->attributes[$object->table_element]['label'])) {
|
|
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
|
|
$sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
|
|
}
|
|
}
|
|
// Add where from hooks
|
|
$parameters=array();
|
|
$reshook=$hookmanager->executeHooks('printFieldListGroupBy',$parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
$sql.=$hookmanager->resPrint;
|
|
$sql=preg_replace('/,\s*$/','', $sql);
|
|
*/
|
|
|
|
// Count total nb of records
|
|
$nbtotalofrecords = '';
|
|
if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
|
|
/* The fast and low memory method to get and count full list converts the sql into a sql count */
|
|
$sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
|
|
$sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
|
|
$resql = $db->query($sqlforcount);
|
|
if ($resql) {
|
|
$objforcount = $db->fetch_object($resql);
|
|
$nbtotalofrecords = $objforcount->nbtotalofrecords;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
|
|
if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
|
|
$page = 0;
|
|
$offset = 0;
|
|
}
|
|
$db->free($resql);
|
|
}
|
|
|
|
// Complete request and execute it with limit
|
|
$sql .= $db->order($sortfield, $sortorder);
|
|
if ($limit) {
|
|
$sql .= $db->plimit($limit + 1, $offset);
|
|
}
|
|
|
|
$resql = $db->query($sql);
|
|
if (!$resql) {
|
|
dol_print_error($db);
|
|
exit;
|
|
}
|
|
|
|
$num = $db->num_rows($resql);
|
|
|
|
|
|
// Direct jump if only one record found
|
|
if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
|
|
$obj = $db->fetch_object($resql);
|
|
$id = $obj->rowid;
|
|
header("Location: ".dol_buildpath('/partnership/partnership_card.php', 1).'?id='.$id);
|
|
exit;
|
|
}
|
|
|
|
|
|
// Output page
|
|
// --------------------------------------------------------------------
|
|
|
|
llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist mod-partnership page-list');
|
|
|
|
if ($managedfor == "member") {
|
|
if ($memberid > 0 && $user->hasRight('adherent', 'lire')) {
|
|
$langs->load("members");
|
|
|
|
$adhstat = new Adherent($db);
|
|
$adht = new AdherentType($db);
|
|
$result = $adhstat->fetch($memberid);
|
|
|
|
$adht->fetch($adhstat->typeid);
|
|
|
|
$head = member_prepare_head($adhstat);
|
|
|
|
print dol_get_fiche_head($head, 'partnerships', $langs->trans("ThirdParty"), -1, 'user');
|
|
|
|
$linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
|
|
|
|
dol_banner_tab($object, 'rowid', $linkback);
|
|
|
|
print '<div class="fichecenter">';
|
|
|
|
print '<div class="underbanner clearboth"></div>';
|
|
print '<table class="border centpercent tableforfield">';
|
|
|
|
// Login
|
|
if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
|
|
print '<tr><td class="titlefield">'.$langs->trans("Login").' / '.$langs->trans("Id").'</td><td class="valeur">'.$object->login.' </td></tr>';
|
|
}
|
|
|
|
// Type
|
|
print '<tr><td class="titlefield">'.$langs->trans("Type").'</td><td class="valeur">'.$adht->getNomUrl(1)."</td></tr>\n";
|
|
|
|
// Morphy
|
|
print '<tr><td>'.$langs->trans("MemberNature").'</td><td class="valeur" >'.$adhstat->getmorphylib().'</td>';
|
|
print '</tr>';
|
|
|
|
// Company
|
|
print '<tr><td>'.$langs->trans("Company").'</td><td class="valeur">'.$adhstat->company.'</td></tr>';
|
|
|
|
// Civility
|
|
print '<tr><td>'.$langs->trans("UserTitle").'</td><td class="valeur">'.$adhstat->getCivilityLabel().' </td>';
|
|
print '</tr>';
|
|
|
|
print '</table>';
|
|
|
|
print '</div>';
|
|
|
|
print dol_get_fiche_end();
|
|
}
|
|
} elseif ($managedfor == "thirdparty") {
|
|
if ($socid && $user->hasRight('societe', 'lire')) {
|
|
$socstat = new Societe($db);
|
|
$res = $socstat->fetch($socid);
|
|
if ($res > 0) {
|
|
$tmpobject = $object;
|
|
$object = $socstat; // $object must be of type Societe when calling societe_prepare_head
|
|
$head = societe_prepare_head($socstat);
|
|
$object = $tmpobject;
|
|
|
|
print dol_get_fiche_head($head, 'partnerships', $langs->trans("ThirdParty"), -1, 'company');
|
|
|
|
dol_banner_tab($socstat, 'socid', '', ($user->socid ? 0 : 1), 'rowid', 'nom');
|
|
|
|
print '<div class="fichecenter">';
|
|
|
|
print '<div class="underbanner clearboth"></div>';
|
|
print '<table class="border centpercent tableforfield">';
|
|
|
|
// Type Prospect/Customer/Supplier
|
|
print '<tr><td class="titlefield">'.$langs->trans('NatureOfThirdParty').'</td><td>';
|
|
print $socstat->getTypeUrl(1);
|
|
print '</td></tr>';
|
|
|
|
// Customer code
|
|
if ($socstat->client && !empty($socstat->code_client)) {
|
|
print '<tr><td class="titlefield">';
|
|
print $langs->trans('CustomerCode').'</td><td>';
|
|
print showValueWithClipboardCPButton(dol_escape_htmltag($socstat->code_client));
|
|
$tmpcheck = $socstat->check_codeclient();
|
|
if ($tmpcheck != 0 && $tmpcheck != -5) {
|
|
print ' <span class="error">('.$langs->trans("WrongCustomerCode").')</span>';
|
|
}
|
|
print '</td>';
|
|
print '</tr>';
|
|
}
|
|
// Supplier code
|
|
if ($socstat->fournisseur && !empty($socstat->code_fournisseur)) {
|
|
print '<tr><td class="titlefield">';
|
|
print $langs->trans('SupplierCode').'</td><td>';
|
|
print showValueWithClipboardCPButton(dol_escape_htmltag($socstat->code_fournisseur));
|
|
$tmpcheck = $socstat->check_codefournisseur();
|
|
if ($tmpcheck != 0 && $tmpcheck != -5) {
|
|
print ' <span class="error">('.$langs->trans("WrongSupplierCode").')</span>';
|
|
}
|
|
print '</td>';
|
|
print '</tr>';
|
|
}
|
|
|
|
print '</table>';
|
|
print '</div>';
|
|
print dol_get_fiche_end();
|
|
|
|
print '<br>';
|
|
}
|
|
}
|
|
}
|
|
|
|
$arrayofselected = is_array($toselect) ? $toselect : array();
|
|
|
|
$param = '';
|
|
if (!empty($mode)) {
|
|
$param .= '&mode='.urlencode($mode);
|
|
}
|
|
if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
|
|
$param .= '&contextpage='.urlencode($contextpage);
|
|
}
|
|
if ($limit > 0 && $limit != $conf->liste_limit) {
|
|
$param .= '&limit='.((int) $limit);
|
|
}
|
|
if ($optioncss != '') {
|
|
$param .= '&optioncss='.urlencode($optioncss);
|
|
}
|
|
if ($socid) {
|
|
$param .= '&socid='.urlencode((string) ($socid));
|
|
}
|
|
if ($memberid) {
|
|
$param .= '&rowid='.urlencode((string) ($memberid));
|
|
}
|
|
foreach ($search as $key => $val) {
|
|
if (is_array($search[$key])) {
|
|
foreach ($search[$key] as $skey) {
|
|
if ($skey != '') {
|
|
$param .= '&search_'.$key.'[]='.urlencode($skey);
|
|
}
|
|
}
|
|
} elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
|
|
$param .= '&search_'.$key.'month='.(GETPOSTINT('search_'.$key.'month'));
|
|
$param .= '&search_'.$key.'day='.(GETPOSTINT('search_'.$key.'day'));
|
|
$param .= '&search_'.$key.'year='.(GETPOSTINT('search_'.$key.'year'));
|
|
} elseif ($search[$key] != '') {
|
|
$param .= '&search_'.$key.'='.urlencode($search[$key]);
|
|
}
|
|
}
|
|
if ($search_filter && $search_filter != '-1') {
|
|
$param .= "&search_filter=".urlencode($search_filter);
|
|
}
|
|
// Add $param from extra fields
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
|
|
// Add $param from hooks
|
|
$parameters = array('param' => &$param);
|
|
$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
$param .= $hookmanager->resPrint;
|
|
|
|
// List of mass actions available
|
|
$arrayofmassactions = array(
|
|
//'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
|
|
'approve' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ValidateAndApprove"),
|
|
'cancel' => img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Cancel"),
|
|
//'generate_doc'=>img_picto('', 'pdf').$langs->trans("ReGeneratePDF"),
|
|
//'builddoc'=>img_picto('', 'pdf').$langs->trans("PDFMerge"),
|
|
'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendMail"),
|
|
);
|
|
if ($permissiontodelete) {
|
|
$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
|
|
}
|
|
if (GETPOSTINT('nomassaction') || in_array($massaction, array('prevalidate', 'presend', 'predelete'))) {
|
|
$arrayofmassactions = array();
|
|
}
|
|
$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
|
|
|
|
print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
|
|
if ($optioncss != '') {
|
|
print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
|
|
}
|
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
|
print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
|
|
print '<input type="hidden" name="action" value="list">';
|
|
print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
|
|
print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
|
|
print '<input type="hidden" name="page" value="'.$page.'">';
|
|
print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
|
|
print '<input type="hidden" name="page_y" value="">';
|
|
print '<input type="hidden" name="mode" value="'.$mode.'">';
|
|
if ($socid) {
|
|
print '<input type="hidden" name="socid" value="'.$socid.'" >';
|
|
} elseif ($memberid) {
|
|
print '<input type="hidden" name="rowid" value="'.$memberid.'" >';
|
|
}
|
|
|
|
|
|
$newcardbutton = '';
|
|
$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'));
|
|
$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'));
|
|
$newcardbutton .= dolGetButtonTitleSeparator();
|
|
$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/partnership/partnership_card.php', 1).'?action=create'.($socid > 0 ? '&fk_soc='.$socid : '').'&backtopage='.urlencode($_SERVER['PHP_SELF'].($socid > 0 ? '?socid='.$socid : '')), '', $permissiontoadd);
|
|
|
|
|
|
print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
|
|
|
|
// Add code for pre mass action (confirmation or email presend form)
|
|
$topicmail = "SendPartnershipRef";
|
|
$modelmail = "partnership_send";
|
|
$objecttmp = new Partnership($db);
|
|
$trackid = 'pship'.$object->id;
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
|
|
|
|
if ($search_all) {
|
|
$setupstring = '';
|
|
foreach ($fieldstosearchall as $key => $val) {
|
|
$fieldstosearchall[$key] = $langs->trans($val);
|
|
$setupstring .= $key."=".$val.";";
|
|
}
|
|
print '<!-- Search done like if PARTNERSHIP_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
|
|
print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
|
|
}
|
|
|
|
$moreforfilter = '';
|
|
/*$moreforfilter.='<div class="divsearchfield">';
|
|
$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
|
|
$moreforfilter.= '</div>';*/
|
|
|
|
$parameters = array();
|
|
$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if (empty($reshook)) {
|
|
$moreforfilter .= $hookmanager->resPrint;
|
|
} else {
|
|
$moreforfilter = $hookmanager->resPrint;
|
|
}
|
|
|
|
if (!empty($moreforfilter)) {
|
|
print '<div class="liste_titre liste_titre_bydiv centpercent">';
|
|
print $moreforfilter;
|
|
print '</div>';
|
|
}
|
|
|
|
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
|
|
$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields with user setup
|
|
$selectedfields = (($mode != 'kanban' && $mode != 'kanbangroupby') ? $htmlofselectarray : '');
|
|
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
|
|
|
|
print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
|
|
print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
|
|
|
|
|
|
if ($managedfor == 'member') {
|
|
$arrayfields['t.fk_member']['checked'] = 1;
|
|
} else {
|
|
$arrayfields['t.fk_soc']['checked'] = 1;
|
|
}
|
|
|
|
|
|
// Fields title search
|
|
// --------------------------------------------------------------------
|
|
print '<tr class="liste_titre_filter">';
|
|
// Action column
|
|
if ($conf->main_checkbox_left_column) {
|
|
print '<td class="liste_titre center maxwidthsearch">';
|
|
$searchpicto = $form->showFilterButtons('left');
|
|
print $searchpicto;
|
|
print '</td>';
|
|
}
|
|
foreach ($all_fields_list as $key => $val) {
|
|
$searchkey = empty($search[$key]) ? '' : $search[$key];
|
|
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
|
|
if ($key == 'status') {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'center';
|
|
} elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'center';
|
|
} elseif (in_array($val['type'], array('timestamp'))) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
|
|
} 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'])) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'right';
|
|
}
|
|
if (!empty($arrayfields['t.'.$key]['checked'])) {
|
|
print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
|
|
if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
|
|
if (empty($val['searchmulti'])) {
|
|
print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 1, 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
|
|
} else {
|
|
print $form->multiselectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 0, 0, 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
|
|
}
|
|
} elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
|
|
print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
|
|
} elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
|
|
print '<div class="nowrap">';
|
|
print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
|
|
print '</div>';
|
|
print '<div class="nowrap">';
|
|
print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
|
|
print '</div>';
|
|
} elseif ($key == 'lang') {
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
|
|
$formadmin = new FormAdmin($db);
|
|
print $formadmin->select_language((isset($search[$key]) ? $search[$key] : ''), 'search_lang', 0, array(), 1, 0, 0, 'minwidth100imp maxwidth125', 2);
|
|
} elseif ($val['type'] === 'boolean') {
|
|
print $form->selectyesno('search_' . $key, $search[$key] ?? '', 1, false, 1);
|
|
} elseif ($key == 'country') {
|
|
print $form->select_country(in_array($key, $search) ? $search[$key] : 0, 'search_country', '', 0, 'minwidth100imp maxwidth100');
|
|
} elseif ($key == 'fk_soc_member') {
|
|
print '';
|
|
} elseif ($key == 'fk_soc_dateend') { // End of subscription date
|
|
$selectarray = array('-1' => '', 'withoutsubscription' => $langs->trans("WithoutSubscription"), 'uptodate' => $langs->trans("UpToDate"), 'outofdate' => $langs->trans("OutOfDate"));
|
|
print $form->selectarray('search_filter', $selectarray, $search_filter);
|
|
} else {
|
|
print '<input type="text" class="flat maxwidth'.(in_array($val['type'], array('integer', 'price')) ? '50' : '75').'" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
|
|
}
|
|
print '</td>';
|
|
}
|
|
}
|
|
// Extra fields
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
|
|
|
|
// Fields from hook
|
|
$parameters = array('arrayfields' => $arrayfields);
|
|
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
// Action column
|
|
if (!$conf->main_checkbox_left_column) {
|
|
print '<td class="liste_titre maxwidthsearch">';
|
|
$searchpicto = $form->showFilterButtons();
|
|
print $searchpicto;
|
|
print '</td>';
|
|
}
|
|
print '</tr>'."\n";
|
|
|
|
$totalarray = array();
|
|
$totalarray['nbfield'] = 0;
|
|
|
|
// Fields title label
|
|
// --------------------------------------------------------------------
|
|
print '<tr class="liste_titre">';
|
|
if ($conf->main_checkbox_left_column) {
|
|
print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
|
|
$totalarray['nbfield']++; // For the column action
|
|
}
|
|
foreach ($all_fields_list as $key => $val) {
|
|
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
|
|
if ($key == 'status') {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'center';
|
|
} elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'center';
|
|
} elseif (in_array($val['type'], array('timestamp'))) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
|
|
} 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'])) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'right';
|
|
}
|
|
$cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
|
|
if (!empty($arrayfields['t.'.$key]['checked'])) {
|
|
$tmpfield = 't.'.$key;
|
|
if ($key == 'fk_soc_member') {
|
|
$tmpfield = '';
|
|
} elseif ($key == 'fk_soc_dateend') { // End of subscription date
|
|
$tmpfield = 'd.datefin';
|
|
$cssforfield = 'center';
|
|
}
|
|
print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], $tmpfield, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''), 0, (empty($val['helplist']) ? '' : $val['helplist']))."\n";
|
|
$totalarray['nbfield']++;
|
|
}
|
|
}
|
|
// Extra fields
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
|
|
// Hook fields
|
|
$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
|
|
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
// Action column
|
|
if (!$conf->main_checkbox_left_column) {
|
|
print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
|
|
$totalarray['nbfield']++;
|
|
}
|
|
print '</tr>'."\n";
|
|
|
|
|
|
// Detect if we need a fetch on each output line
|
|
$needToFetchEachLine = 0;
|
|
if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
|
|
foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
|
|
if (!is_null($val) && preg_match('/\$object/', $val)) {
|
|
$needToFetchEachLine++; // There is at least one compute field that use $object
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Loop on record
|
|
// --------------------------------------------------------------------
|
|
$i = 0;
|
|
$savnbfield = $totalarray['nbfield'];
|
|
$totalarray = array();
|
|
$totalarray['nbfield'] = 0;
|
|
$imaxinloop = ($limit ? min($num, $limit) : $num);
|
|
$textlate = '';
|
|
while ($i < $imaxinloop) {
|
|
$obj = $db->fetch_object($resql);
|
|
if (empty($obj)) {
|
|
break; // Should not happen
|
|
}
|
|
|
|
// Store properties in $object
|
|
$object->setVarsFromFetchObj($obj);
|
|
|
|
$object->thirdparty = null;
|
|
if ($obj->fk_soc > 0) {
|
|
if (!empty($conf->cache['thirdparty'][$obj->fk_soc])) {
|
|
$companyobj = $conf->cache['thirdparty'][$obj->fk_soc];
|
|
} else {
|
|
$companyobj = new Societe($db);
|
|
$companyobj->fetch($obj->fk_soc);
|
|
$conf->cache['thirdparty'][$obj->fk_soc] = $companyobj;
|
|
}
|
|
|
|
$object->thirdparty = $companyobj;
|
|
}
|
|
|
|
$adherent->id = 0;
|
|
if ($managedfor == 'member' && $obj->fk_member > 0) {
|
|
$result = $adherent->fetch($obj->fk_member);
|
|
}
|
|
if ($managedfor == 'thirdparty' && isModEnabled('member') && $obj->fk_soc) {
|
|
$result = $adherent->fetch(0, '', $obj->fk_soc);
|
|
}
|
|
|
|
if ($mode == 'kanban' || $mode == 'kanbangroupby') {
|
|
if ($i == 0) {
|
|
print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
|
|
print '<div class="box-flex-container kanban">';
|
|
}
|
|
// Output Kanban
|
|
$selected = -1;
|
|
if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
|
|
$selected = 0;
|
|
if (in_array($object->id, $arrayofselected)) {
|
|
$selected = 1;
|
|
}
|
|
}
|
|
print $object->getKanbanView('', array('thirdparty' => $object->thirdparty, 'selected' => $selected));
|
|
if ($i == ($imaxinloop - 1)) {
|
|
print '</div>';
|
|
print '</td></tr>';
|
|
}
|
|
} else {
|
|
// Show line of result
|
|
$j = 0;
|
|
print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
|
|
// Action column
|
|
if ($conf->main_checkbox_left_column) {
|
|
print '<td class="nowrap center">';
|
|
if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
|
|
$selected = 0;
|
|
if (in_array($object->id, $arrayofselected)) {
|
|
$selected = 1;
|
|
}
|
|
print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
|
|
}
|
|
print '</td>';
|
|
if (!$i) {
|
|
$totalarray['nbfield']++;
|
|
}
|
|
}
|
|
// Fields
|
|
foreach ($all_fields_list as $key => $val) {
|
|
$cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
|
|
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'center';
|
|
} elseif ($key == 'status') {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'center';
|
|
}
|
|
|
|
if (in_array($val['type'], array('timestamp'))) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
|
|
} elseif ($key == 'ref') {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
|
|
}
|
|
|
|
if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && empty($val['arrayofkeyval'])) {
|
|
$cssforfield .= ($cssforfield ? ' ' : '').'right';
|
|
}
|
|
//if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
|
|
|
|
if (!empty($arrayfields['t.'.$key]['checked'])) {
|
|
print '<td'.($cssforfield ? ' class="'.$cssforfield.((preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key)) ? ' classfortooltip' : '').'"' : '');
|
|
if (preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key) && !in_array($key, array('ref'))) {
|
|
print ' title="'.dol_escape_htmltag((string) $object->$key).'"';
|
|
}
|
|
print '>';
|
|
if ($key == 'status') {
|
|
print $object->getLibStatut(5);
|
|
} elseif ($key == 'rowid') {
|
|
print $object->showOutputField($val, $key, (string) $object->id, '');
|
|
} elseif ($key == 'country') {
|
|
if ($managedfor == 'member') {
|
|
if (!empty($adherent->country_code)) {
|
|
print $langs->trans("Country".$adherent->country_code);
|
|
}
|
|
} else {
|
|
if (!empty($object->thirdparty->country_code)) {
|
|
print $langs->trans("Country".$object->thirdparty->country_code);
|
|
}
|
|
}
|
|
} elseif ($key == 'town') {
|
|
if ($managedfor == 'member') {
|
|
print $adherent->town;
|
|
} else {
|
|
print $object->thirdparty->town;
|
|
}
|
|
} elseif ($key == 'fk_soc_member' && $adherent->id > 0) { // @phpstan-ignore greater.alwaysFalse,booleanAnd.alwaysFalse
|
|
print $adherent->getNomUrl(1);
|
|
} elseif ($key == 'fk_soc_dateend') {
|
|
if ($adherent->id > 0) { // @phpstan-ignore greater.alwaysFalse
|
|
$datefin = $adherent->datefin;
|
|
if ($datefin) {
|
|
print dol_print_date($datefin, 'day');
|
|
if ($adherent->hasDelay()) {
|
|
$textlate .= ' ('.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($conf->member->subscription->warning_delay / 60 / 60 / 24) >= 0 ? '+' : '').ceil($conf->member->subscription->warning_delay / 60 / 60 / 24).' '.$langs->trans("days").')';
|
|
print " ".img_warning($langs->trans("SubscriptionLate").$textlate);
|
|
}
|
|
} else {
|
|
if ($adherent->subscription == 'yes') {
|
|
print $langs->trans("SubscriptionNotReceived");
|
|
if ($adherent->status > 0) {
|
|
print " ".img_warning();
|
|
}
|
|
} else {
|
|
print ' ';
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
print $object->showOutputField($val, $key, $object->$key, '');
|
|
}
|
|
print '</td>';
|
|
if (!$i) {
|
|
$totalarray['nbfield']++;
|
|
}
|
|
if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
|
|
if (!$i) {
|
|
$totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
|
|
}
|
|
if (!isset($totalarray['val'])) {
|
|
$totalarray['val'] = array();
|
|
}
|
|
if (!isset($totalarray['val']['t.'.$key])) {
|
|
$totalarray['val']['t.'.$key] = 0;
|
|
}
|
|
$totalarray['val']['t.'.$key] += $object->$key;
|
|
}
|
|
}
|
|
}
|
|
// Extra fields
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
|
|
// Fields from hook
|
|
$parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
|
|
$reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
// Action column
|
|
if (!$conf->main_checkbox_left_column) {
|
|
print '<td class="nowrap center">';
|
|
if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
|
|
$selected = 0;
|
|
if (in_array($object->id, $arrayofselected)) {
|
|
$selected = 1;
|
|
}
|
|
print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
|
|
}
|
|
print '</td>';
|
|
if (!$i) {
|
|
$totalarray['nbfield']++;
|
|
}
|
|
}
|
|
|
|
print '</tr>'."\n";
|
|
}
|
|
|
|
$i++;
|
|
}
|
|
|
|
// Show total line
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
|
|
|
|
// If no record found
|
|
if ($num == 0) {
|
|
$colspan = 1;
|
|
foreach ($arrayfields as $key => $val) {
|
|
if (!empty($val['checked'])) {
|
|
$colspan++;
|
|
}
|
|
}
|
|
if ($managedfor == 'member' || ($managedfor == 'thirdparty' && isModEnabled('member'))) {
|
|
$colspan++; // End of subscription date
|
|
}
|
|
print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
|
|
}
|
|
|
|
|
|
$db->free($resql);
|
|
|
|
$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
|
|
$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
|
|
print '</table>'."\n";
|
|
print '</div>'."\n";
|
|
|
|
print '</form>'."\n";
|
|
|
|
if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
|
|
$hidegeneratedfilelistifempty = 1;
|
|
if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
|
|
$hidegeneratedfilelistifempty = 0;
|
|
}
|
|
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
|
|
$formfile = new FormFile($db);
|
|
|
|
// Show list of available documents
|
|
$urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
|
|
$urlsource .= str_replace('&', '&', $param);
|
|
|
|
$filedir = $diroutputmassaction;
|
|
$genallowed = $permissiontoread;
|
|
$delallowed = $permissiontoadd;
|
|
|
|
print $formfile->showdocuments('massfilesarea_partnership', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
|
|
}
|
|
|
|
// End of page
|
|
llxFooter();
|
|
$db->close();
|