mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-12-06 01:28:19 +01:00
3030 lines
119 KiB
PHP
3030 lines
119 KiB
PHP
<?php
|
|
/* Copyright (C) 2006-2011 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
|
* Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
|
|
* Copyright (C) 2010-2012 Regis Houssin <regis.houssin@inodbox.com>
|
|
* Copyright (C) 2013-2014 Florian Henry <florian.henry@open-concept.pro>
|
|
* Copyright (C) 2013-2014 Juanjo Menent <jmenent@2byte.es>
|
|
* Copyright (C) 2013 Christophe Battarel <contact@altairis.fr>
|
|
* Copyright (C) 2013-2018 Alexandre Spangaro <aspangaro@open-dsi.fr>
|
|
* Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
|
|
* Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
|
|
* Copyright (C) 2017 Rui Strecht <rui.strecht@aliartalentos.com>
|
|
* Copyright (C) 2018-2024 Ferran Marcet <fmarcet@2byte.es>
|
|
* Copyright (C) 2024-2025 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/>.
|
|
* or see https://www.gnu.org/
|
|
*/
|
|
|
|
/**
|
|
* \file htdocs/core/lib/company.lib.php
|
|
* \brief Ensemble de functions de base pour le module societe
|
|
* \ingroup societe
|
|
*/
|
|
|
|
/**
|
|
* Return array of tabs to used on pages for third parties cards.
|
|
*
|
|
* @param Societe $object Object company shown
|
|
* @return array<array{0:string,1:string,2:string}> Array of tabs to show
|
|
*/
|
|
function societe_prepare_head(Societe $object)
|
|
{
|
|
global $db, $langs, $conf, $user;
|
|
global $hookmanager;
|
|
|
|
$h = 0;
|
|
$head = array();
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/card.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("ThirdParty");
|
|
$head[$h][2] = 'card';
|
|
$h++;
|
|
|
|
|
|
if (!getDolGlobalString('MAIN_DISABLE_CONTACTS_TAB') && $user->hasRight('societe', 'contact', 'lire')) {
|
|
//$nbContact = count($object->liste_contact(-1,'internal')) + count($object->liste_contact(-1,'external'));
|
|
$nbContact = 0;
|
|
// Enable caching of thirdrparty count Contacts
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php';
|
|
$cachekey = 'count_contacts_thirdparty_' . $object->id;
|
|
$dataretrieved = dol_getcache($cachekey);
|
|
|
|
if (!is_null($dataretrieved)) {
|
|
$nbContact = $dataretrieved;
|
|
} else {
|
|
$sql = "SELECT COUNT(p.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "socpeople as p";
|
|
// Add table from hooks
|
|
$parameters = array('contacttab' => true);
|
|
$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
$sql .= $hookmanager->resPrint;
|
|
$sql .= " WHERE p.fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND p.entity IN (" . getEntity($object->element) . ")";
|
|
// Add where from hooks
|
|
$parameters = array('contacttab' => true);
|
|
$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
$sql .= $hookmanager->resPrint;
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbContact = $obj->nb;
|
|
}
|
|
|
|
dol_setcache($cachekey, $nbContact, 120); // If setting cache fails, this is not a problem, so we do not test result.
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/contact.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans('ContactsAddresses');
|
|
if ($nbContact > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbContact . '</span>';
|
|
}
|
|
$head[$h][2] = 'contact';
|
|
$h++;
|
|
}
|
|
if (getDolGlobalString('MAIN_SUPPORT_SHARED_CONTACT_BETWEEN_THIRDPARTIES')) {
|
|
// Some features may be unstable with this option, like permissions rules, import contact, ...
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/societecontact.php?socid=' . $object->id;
|
|
$nbContact = count($object->liste_contact(-1, 'internal')) + count($object->liste_contact(-1, 'external'));
|
|
$head[$h][1] = $langs->trans("ContactsAddressesExt");
|
|
if ($nbContact > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbContact . '</span>';
|
|
}
|
|
$head[$h][2] = 'contactext';
|
|
$h++;
|
|
}
|
|
|
|
if ($object->client == 1 || $object->client == 2 || $object->client == 3) {
|
|
$head[$h][0] = DOL_URL_ROOT . '/comm/card.php?socid=' . $object->id;
|
|
$head[$h][1] = '';
|
|
if (!getDolGlobalString('SOCIETE_DISABLE_PROSPECTS') && ($object->client == 2 || $object->client == 3)) {
|
|
$head[$h][1] .= $langs->trans("Prospect");
|
|
}
|
|
if (!getDolGlobalString('SOCIETE_DISABLE_PROSPECTS') && !getDolGlobalString('SOCIETE_DISABLE_CUSTOMERS') && $object->client == 3) {
|
|
$head[$h][1] .= ' | ';
|
|
}
|
|
if (!getDolGlobalString('SOCIETE_DISABLE_CUSTOMERS') && ($object->client == 1 || $object->client == 3)) {
|
|
$head[$h][1] .= $langs->trans("Customer");
|
|
}
|
|
$head[$h][2] = 'customer';
|
|
$h++;
|
|
|
|
if (getDolGlobalString('PRODUIT_CUSTOMER_PRICES') || getDolGlobalString('PRODUIT_CUSTOMER_PRICES_AND_MULTIPRICES')) {
|
|
$langs->load("products");
|
|
// price
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/price.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("CustomerPrices");
|
|
$head[$h][2] = 'price';
|
|
$h++;
|
|
}
|
|
}
|
|
$supplier_module_enabled = 0;
|
|
if (isModEnabled('supplier_proposal') || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) {
|
|
$supplier_module_enabled = 1;
|
|
}
|
|
if ($supplier_module_enabled == 1 && $object->fournisseur && $user->hasRight('fournisseur', 'lire')) {
|
|
$head[$h][0] = DOL_URL_ROOT . '/fourn/card.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Supplier");
|
|
$head[$h][2] = 'supplier';
|
|
$h++;
|
|
}
|
|
|
|
if (isModEnabled('accounting') && getDolGlobalString('ACCOUNTING_ENABLE_TABONTHIRDPARTY') && ($user->hasRight('accounting', 'mouvements', 'lire'))) {
|
|
// link to customer account by default
|
|
if (!empty($object->code_compta_client)) {
|
|
$subledger_start_account = $subledger_end_account = $object->code_compta_client;
|
|
$mode = 'customer';
|
|
} elseif (!empty($object->code_compta_fournisseur)) {
|
|
$subledger_start_account = $subledger_end_account = $object->code_compta_fournisseur;
|
|
$mode = 'supplier';
|
|
} else {
|
|
$subledger_start_account = $subledger_end_account = '';
|
|
$mode = 'customer';
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?socid=' . $object->id . '&mode=' . $mode . '&type=sub&search_accountancy_code_start=' . $subledger_start_account . '&search_accountancy_code_end=' . $subledger_end_account;
|
|
$head[$h][1] = $langs->trans("Accounting");
|
|
$head[$h][2] = 'accounting';
|
|
$h++;
|
|
}
|
|
|
|
if (isModEnabled('project') && ($user->hasRight('projet', 'lire'))) {
|
|
$nbProject = 0;
|
|
// Enable caching of thirdrparty count projects
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php';
|
|
$cachekey = 'count_projects_thirdparty_' . $object->id;
|
|
$dataretrieved = dol_getcache($cachekey);
|
|
|
|
if (!is_null($dataretrieved)) {
|
|
$nbProject = $dataretrieved;
|
|
} else {
|
|
$sql = "SELECT COUNT(n.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "projet as n";
|
|
$sql .= " WHERE fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND entity IN (" . getEntity('project') . ")";
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbProject = $obj->nb;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
dol_setcache($cachekey, $nbProject, 120); // If setting cache fails, this is not a problem, so we do not test result.
|
|
}
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/project.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Projects");
|
|
if ($nbProject > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbProject . '</span>';
|
|
}
|
|
$head[$h][2] = 'project';
|
|
$h++;
|
|
}
|
|
|
|
// Tab to link resources
|
|
if (isModEnabled('resource') && getDolGlobalString('RESOURCE_ON_THIRDPARTIES')) {
|
|
$head[$h][0] = DOL_URL_ROOT . '/resource/element_resource.php?element=societe&element_id=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Resources");
|
|
$head[$h][2] = 'resources';
|
|
$h++;
|
|
}
|
|
|
|
// Related items
|
|
if ((isModEnabled('order') || isModEnabled('propal') || isModEnabled('invoice') || isModEnabled('intervention') || isModEnabled("supplier_proposal") || isModEnabled("supplier_order") || isModEnabled("supplier_invoice"))
|
|
&& !getDolGlobalString('THIRDPARTIES_DISABLE_RELATED_OBJECT_TAB')
|
|
) {
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/consumption.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Referers");
|
|
$head[$h][2] = 'consumption';
|
|
$h++;
|
|
}
|
|
|
|
// Bank accounts
|
|
if (!getDolGlobalInt('SOCIETE_DISABLE_BANKACCOUNT')) {
|
|
$nbBankAccount = 0;
|
|
$foundonexternalonlinesystem = 0;
|
|
$langs->load("bills");
|
|
|
|
$title = $langs->trans("PaymentModes");
|
|
|
|
$servicestatus = 0;
|
|
if (isModEnabled('stripe')) {
|
|
if (getDolGlobalString('STRIPE_LIVE')/* && !GETPOST('forcesandbox', 'alpha')*/) {
|
|
$servicestatus = 1;
|
|
}
|
|
|
|
include_once DOL_DOCUMENT_ROOT . '/societe/class/societeaccount.class.php';
|
|
$societeaccount = new SocieteAccount($db);
|
|
$stripecu = $societeaccount->getCustomerAccount($object->id, 'stripe', $servicestatus); // Get thirdparty cu_...
|
|
if ($stripecu) {
|
|
$foundonexternalonlinesystem++;
|
|
}
|
|
}
|
|
|
|
$sql = "SELECT COUNT(n.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "societe_rib as n";
|
|
$sql .= " WHERE n.fk_soc = " . ((int) $object->id);
|
|
if (!isModEnabled('stripe')) {
|
|
$sql .= " AND (n.stripe_card_ref IS NULL OR n.stripe_card_ref ='')";
|
|
} else {
|
|
$sql .= " AND (n.stripe_card_ref IS NULL OR (n.stripe_card_ref IS NOT NULL AND n.status = " . ((int) $servicestatus) . "))";
|
|
}
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbBankAccount = $obj->nb;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
|
|
//if (isModEnabled('stripe') && $nbBankAccount > 0) $nbBankAccount = '...'; // No way to know exact number
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/paymentmodes.php?socid=' . urlencode((string) ($object->id));
|
|
$head[$h][1] = $title;
|
|
if ($foundonexternalonlinesystem) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">...</span>';
|
|
} elseif ($nbBankAccount > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbBankAccount . '</span>';
|
|
}
|
|
$head[$h][2] = 'rib';
|
|
$h++;
|
|
}
|
|
|
|
if ((isModEnabled('website') || isModEnabled('webportal')) && $user->hasRight('societe', 'lire')) {
|
|
$site_filter_list = array();
|
|
if (isModEnabled('website')) {
|
|
$site_filter_list[] = 'dolibarr_website';
|
|
}
|
|
if (isModEnabled('webportal')) {
|
|
$site_filter_list[] = 'dolibarr_portal';
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/website.php?id=' . urlencode((string) ($object->id));
|
|
$head[$h][1] = $langs->trans("WebSiteAccounts");
|
|
$nbNote = 0;
|
|
$sql = "SELECT COUNT(n.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "societe_account as n";
|
|
$sql .= " WHERE fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND entity IN (" . getEntity('thirdpartyaccount') . ")";
|
|
if (!empty($site_filter_list)) {
|
|
$sql .= " AND n.site IN (" . $db->sanitize("'" . implode("','", $site_filter_list) . "'", 1) . ")";
|
|
}
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbNote = $obj->nb;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
if ($nbNote > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbNote . '</span>';
|
|
}
|
|
$head[$h][2] = 'website';
|
|
$h++;
|
|
}
|
|
|
|
if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty') {
|
|
if ($user->hasRight('partnership', 'read')) {
|
|
$langs->load("partnership");
|
|
$nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0;
|
|
$head[$h][0] = DOL_URL_ROOT . '/partnership/partnership_list.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Partnerships");
|
|
$nbNote = 0;
|
|
$sql = "SELECT COUNT(n.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "partnership as n";
|
|
$sql .= " WHERE fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND entity IN (" . getEntity('partnership') . ")";
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbNote = $obj->nb;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
if ($nbNote > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbNote . '</span>';
|
|
}
|
|
$head[$h][2] = 'partnerships';
|
|
if ($nbPartnership > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbPartnership . '</span>';
|
|
}
|
|
$h++;
|
|
}
|
|
}
|
|
|
|
// Notifications
|
|
if (isModEnabled('ticket') && $user->hasRight("ticket", "read")) {
|
|
//$langs->load('ticket');
|
|
$nbTicket = 0;
|
|
// Enable caching of thirdparty count notifications
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php';
|
|
$cachekey = 'count_ticket_thirdparty_' . $object->id;
|
|
$nbticketretreived = dol_getcache($cachekey);
|
|
if (!is_null($nbticketretreived)) {
|
|
$nbTicket = $nbticketretreived;
|
|
} else {
|
|
// List of notifications enabled for contacts of the third party
|
|
$sql = "SELECT COUNT(t.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t";
|
|
$sql .= " WHERE t.fk_soc = " . ((int) $object->id);
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbTicket = $obj->nb;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
dol_setcache($cachekey, $nbTicket, 120); // If setting cache fails, this is not a problem, so we do not test result.
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/ticket/list.php?socid=' . urlencode((string) ($object->id));
|
|
$head[$h][1] = $langs->trans("Tickets");
|
|
if ($nbTicket > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbTicket . '</span>';
|
|
}
|
|
$head[$h][2] = 'ticket';
|
|
$h++;
|
|
}
|
|
|
|
|
|
// Show more tabs from modules
|
|
// Entries must be declared in modules descriptor with line
|
|
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
|
|
// $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
|
|
complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'add', 'core');
|
|
|
|
if ($user->socid == 0) {
|
|
// Notifications
|
|
if (isModEnabled('notification')) {
|
|
$langs->load('mails');
|
|
$nbNotif = 0;
|
|
// Enable caching of thirdparty count notifications
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php';
|
|
$cachekey = 'count_notifications_thirdparty_' . $object->id;
|
|
$dataretrieved = dol_getcache($cachekey);
|
|
if (!is_null($dataretrieved)) {
|
|
$nbNotif = $dataretrieved;
|
|
} else {
|
|
// List of notifications enabled for contacts of the third party
|
|
$sql = "SELECT COUNT(n.rowid) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "c_action_trigger as a,";
|
|
$sql .= " " . MAIN_DB_PREFIX . "notify_def as n,";
|
|
$sql .= " " . MAIN_DB_PREFIX . "socpeople as c";
|
|
$sql .= " WHERE a.rowid = n.fk_action";
|
|
$sql .= " AND c.rowid = n.fk_contact";
|
|
$sql .= " AND c.fk_soc = " . ((int) $object->id);
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbNotif = $obj->nb;
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
dol_setcache($cachekey, $nbNotif, 120); // If setting cache fails, this is not a problem, so we do not test result.
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/notify/card.php?socid=' . urlencode((string) ($object->id));
|
|
$head[$h][1] = $langs->trans("Notifications");
|
|
if ($nbNotif > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbNotif . '</span>';
|
|
}
|
|
$head[$h][2] = 'notify';
|
|
$h++;
|
|
}
|
|
|
|
// Notes
|
|
$nbNote = 0;
|
|
if (!empty($object->note_private)) {
|
|
$nbNote++;
|
|
}
|
|
if (!empty($object->note_public)) {
|
|
$nbNote++;
|
|
}
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/note.php?id=' . urlencode((string) ($object->id));
|
|
$head[$h][1] = $langs->trans("Notes");
|
|
if ($nbNote > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbNote . '</span>';
|
|
}
|
|
$head[$h][2] = 'note';
|
|
$h++;
|
|
|
|
// Attached files and Links
|
|
$totalAttached = 0;
|
|
// Enable caching of thirdrparty count attached files and links
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php';
|
|
$cachekey = 'count_attached_thirdparty_' . $object->id;
|
|
$dataretrieved = dol_getcache($cachekey);
|
|
if (!is_null($dataretrieved)) {
|
|
$totalAttached = $dataretrieved;
|
|
} else {
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php';
|
|
$upload_dir = $conf->societe->multidir_output[$object->entity ?? $conf->entity] . "/" . $object->id;
|
|
$nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
|
|
$nbLinks = Link::count($db, $object->element, $object->id);
|
|
$totalAttached = $nbFiles + $nbLinks;
|
|
dol_setcache($cachekey, $totalAttached, 120); // If setting cache fails, this is not a problem, so we do not test result.
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/document.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Documents");
|
|
if (($totalAttached) > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . ($totalAttached) . '</span>';
|
|
}
|
|
$head[$h][2] = 'document';
|
|
$h++;
|
|
}
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/messaging.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("Events");
|
|
if (isModEnabled('agenda') && ($user->hasRight('agenda', 'myactions', 'read') || $user->hasRight('agenda', 'allactions', 'read'))) {
|
|
$nbEvent = 0;
|
|
// Enable caching of thirdparty count actioncomm
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php';
|
|
$cachekey = 'count_events_thirdparty_' . $object->id;
|
|
$dataretrieved = dol_getcache($cachekey);
|
|
if (!is_null($dataretrieved)) {
|
|
$nbEvent = $dataretrieved;
|
|
} else {
|
|
$sql = "SELECT COUNT(id) as nb";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "actioncomm";
|
|
$sql .= " WHERE fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND entity IN (" . getEntity('agenda') . ")";
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$obj = $db->fetch_object($resql);
|
|
$nbEvent = $obj->nb;
|
|
} else {
|
|
dol_syslog('Failed to count actioncomm ' . $db->lasterror(), LOG_ERR);
|
|
}
|
|
dol_setcache($cachekey, $nbEvent, 120); // If setting cache fails, this is not a problem, so we do not test result.
|
|
}
|
|
|
|
$head[$h][1] .= '/';
|
|
$head[$h][1] .= $langs->trans("Agenda");
|
|
if ($nbEvent > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbEvent . '</span>';
|
|
}
|
|
}
|
|
$head[$h][2] = 'agenda';
|
|
$h++;
|
|
|
|
// Show more tabs from modules
|
|
// Entries must be declared in modules descriptor with line
|
|
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
|
|
// $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
|
|
complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'add', 'external');
|
|
|
|
complete_head_from_modules($conf, $langs, $object, $head, $h, 'thirdparty', 'remove');
|
|
|
|
return $head;
|
|
}
|
|
|
|
|
|
/**
|
|
* Return array of tabs to used on page
|
|
*
|
|
* @param Object $object Object for tabs
|
|
* @return array<array{0:string,1:string,2:string}> Array of tabs to show
|
|
*/
|
|
function societe_prepare_head2($object)
|
|
{
|
|
global $langs;
|
|
$h = 0;
|
|
$head = array();
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/card.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("ThirdParty");
|
|
$head[$h][2] = 'company';
|
|
$h++;
|
|
|
|
$head[$h][0] = 'commerciaux.php?socid=' . $object->id;
|
|
$head[$h][1] = $langs->trans("SalesRepresentative");
|
|
$head[$h][2] = 'salesrepresentative';
|
|
$h++;
|
|
|
|
return $head;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Return array head with list of tabs to view object information.
|
|
*
|
|
* @return array<array{0:string,1:string,2:string}> Array of tabs to show
|
|
*/
|
|
function societe_admin_prepare_head()
|
|
{
|
|
global $langs, $conf, $db;
|
|
|
|
$extrafields = new ExtraFields($db);
|
|
$extrafields->fetch_name_optionals_label('societe');
|
|
$extrafields->fetch_name_optionals_label('socpeople');
|
|
|
|
$h = 0;
|
|
$head = array();
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/admin/societe.php';
|
|
$head[$h][1] = $langs->trans("Miscellaneous");
|
|
$head[$h][2] = 'general';
|
|
$h++;
|
|
|
|
// Show more tabs from modules
|
|
// Entries must be declared in modules descriptor with line
|
|
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
|
|
// $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab
|
|
complete_head_from_modules($conf, $langs, null, $head, $h, 'company_admin');
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/admin/societe_extrafields.php';
|
|
$head[$h][1] = $langs->trans("ExtraFieldsThirdParties");
|
|
$nbExtrafields = $extrafields->attributes['societe']['count'];
|
|
if ($nbExtrafields > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbExtrafields . '</span>';
|
|
}
|
|
$head[$h][2] = 'attributes';
|
|
$h++;
|
|
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/admin/contact_extrafields.php';
|
|
$head[$h][1] = $langs->trans("ExtraFieldsContacts");
|
|
$nbExtrafields = $extrafields->attributes['socpeople']['count'];
|
|
if ($nbExtrafields > 0) {
|
|
$head[$h][1] .= '<span class="badge marginleftonlyshort">' . $nbExtrafields . '</span>';
|
|
}
|
|
$head[$h][2] = 'attributes_contacts';
|
|
$h++;
|
|
|
|
if (getDolGlobalString('MAIN_FEATURES_LEVEL') >= 1) {
|
|
$head[$h][0] = DOL_URL_ROOT . '/societe/admin/public_interface.php';
|
|
$head[$h][1] = $langs->trans("PublicUrl");
|
|
$head[$h][2] = 'publicurl';
|
|
$h++;
|
|
}
|
|
|
|
complete_head_from_modules($conf, $langs, null, $head, $h, 'company_admin', 'remove');
|
|
|
|
return $head;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Return country label, code or id from an id, code or label
|
|
*
|
|
* @param int|string $searchkey Id or code of country to search
|
|
* @param ''|'0'|'1'|'2'|'3'|'all' $withcode '' or '0' = Return label,
|
|
* '1'=Return code + label,
|
|
* '2'=Return code from id,
|
|
* '3'=Return id from code,
|
|
* 'all'=Return array('id'=>,'code'=>,'label'=>)
|
|
* @param ?DoliDB $dbtouse Database handler (using in global way may fail because of conflicts with some autoload features)
|
|
* @param ?Translate $outputlangs Langs object for output translation
|
|
* @param int<0,1> $entconv 0=Return value without entities and not converted to output charset, 1=Ready for html output
|
|
* @param string $searchlabel Label of country to search (warning: searching on label is not reliable)
|
|
* @return int|string|array{id:int,code:string,label:string} Integer with country id or String with country code or translated country name or Array('id','code','label') or 'NotDefined'
|
|
*/
|
|
function getCountry($searchkey, $withcode = '', $dbtouse = null, $outputlangs = null, $entconv = 1, $searchlabel = '')
|
|
{
|
|
global $db, $langs;
|
|
|
|
$result = '';
|
|
|
|
// Check parameters
|
|
if (empty($searchkey) && empty($searchlabel)) {
|
|
if ($withcode === 'all') {
|
|
return array('id' => 0, 'code' => '', 'label' => '');
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
if (!is_object($dbtouse)) {
|
|
$dbtouse = $db;
|
|
}
|
|
if (!is_object($outputlangs)) {
|
|
$outputlangs = $langs;
|
|
}
|
|
|
|
$sql = "SELECT rowid, code, label FROM " . MAIN_DB_PREFIX . "c_country";
|
|
if (is_numeric($searchkey)) {
|
|
$sql .= " WHERE rowid = " . ((int) $searchkey);
|
|
} elseif (!empty($searchkey)) {
|
|
$sql .= " WHERE code = '" . $db->escape($searchkey) . "'";
|
|
} else {
|
|
$sql .= " WHERE label = '" . $db->escape($searchlabel) . "'";
|
|
}
|
|
|
|
$resql = $dbtouse->query($sql);
|
|
if ($resql) {
|
|
$obj = $dbtouse->fetch_object($resql);
|
|
if ($obj) {
|
|
$label = ((!empty($obj->label) && $obj->label != '-') ? $obj->label : '');
|
|
if (is_object($outputlangs)) {
|
|
$outputlangs->load("dict");
|
|
if ($entconv) {
|
|
$label = ($obj->code && ($outputlangs->trans("Country" . $obj->code) != "Country" . $obj->code)) ? $outputlangs->trans("Country" . $obj->code) : $label;
|
|
} else {
|
|
$label = ($obj->code && ($outputlangs->transnoentitiesnoconv("Country" . $obj->code) != "Country" . $obj->code)) ? $outputlangs->transnoentitiesnoconv("Country" . $obj->code) : $label;
|
|
}
|
|
}
|
|
if ($withcode == '1') {
|
|
$result = $label ? "$obj->code - $label" : "$obj->code";
|
|
} elseif ($withcode == '2') {
|
|
$result = $obj->code;
|
|
} elseif ($withcode == '3') {
|
|
$result = $obj->rowid;
|
|
} elseif ($withcode === 'all') {
|
|
$result = array('id' => $obj->rowid, 'code' => $obj->code, 'label' => $label);
|
|
} else {
|
|
$result = $label;
|
|
}
|
|
} else {
|
|
$result = 'NotDefined';
|
|
}
|
|
$dbtouse->free($resql);
|
|
return $result;
|
|
} else {
|
|
dol_print_error($dbtouse, '');
|
|
}
|
|
return 'Error';
|
|
}
|
|
|
|
/**
|
|
* Return state translated from an id. Return value is always utf8 encoded and without entities.
|
|
*
|
|
* @param int $id id of state (province/departement)
|
|
* @param '0'|'1'|'2'|'all' $withcode '0'=Return label,
|
|
* '1'=Return string code + label,
|
|
* '2'=Return code,
|
|
* 'all'=return array('id'=>,'code'=>,'label'=>)
|
|
* @param ?DoliDB $dbtouse Database handler (using in global way may fail because of conflicts with some autoload features)
|
|
* @param int<0,1> $withregion '0'=Ignores region,
|
|
* '1'=Add region name/code/id as needed to output,
|
|
* @param ?Translate $outputlangs Langs object for output translation, not fully implemented yet
|
|
* @param int<0,1> $entconv 0=Return value without entities and not converted to output charset, 1=Ready for html output
|
|
* @return string|array{id:int,code:string,label:string}|array{id:int,code:string,label:string,region_code:string,region:string} String with state code or state name or Array('id','code','label')/Array('id','code','label','region_code','region')
|
|
*/
|
|
function getState($id, $withcode = '0', $dbtouse = null, $withregion = 0, $outputlangs = null, $entconv = 1)
|
|
{
|
|
global $db, $langs;
|
|
|
|
if (!is_object($dbtouse)) {
|
|
$dbtouse = $db;
|
|
}
|
|
|
|
$sql = "SELECT d.rowid as id, d.code_departement as code, d.nom as name, d.active, c.label as country, c.code as country_code, r.code_region as region_code, r.nom as region_name FROM";
|
|
$sql .= " " . MAIN_DB_PREFIX . "c_departements as d, " . MAIN_DB_PREFIX . "c_regions as r," . MAIN_DB_PREFIX . "c_country as c";
|
|
$sql .= " WHERE d.fk_region=r.code_region and r.fk_pays=c.rowid and d.rowid=" . ((int) $id);
|
|
$sql .= " AND d.active = 1 AND r.active = 1 AND c.active = 1";
|
|
$sql .= " ORDER BY c.code, d.code_departement";
|
|
|
|
dol_syslog("Company.lib::getState", LOG_DEBUG);
|
|
$resql = $dbtouse->query($sql);
|
|
if ($resql) {
|
|
$obj = $dbtouse->fetch_object($resql);
|
|
if ($obj) {
|
|
$label = ((!empty($obj->name) && $obj->name != '-') ? $obj->name : '');
|
|
if (is_object($outputlangs)) {
|
|
$outputlangs->load("dict");
|
|
if ($entconv) {
|
|
$label = ($obj->code && ($outputlangs->trans("State" . $obj->code) != "State" . $obj->code)) ? $outputlangs->trans("State" . $obj->code) : $label;
|
|
} else {
|
|
$label = ($obj->code && ($outputlangs->transnoentitiesnoconv("State" . $obj->code) != "State" . $obj->code)) ? $outputlangs->transnoentitiesnoconv("State" . $obj->code) : $label;
|
|
}
|
|
}
|
|
|
|
if ($withcode == 1) {
|
|
if ($withregion == 1) {
|
|
return $label = $obj->region_name . ' - ' . $obj->code . ' - ' . ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
|
|
} else {
|
|
return $label = $obj->code . ' - ' . ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
|
|
}
|
|
} elseif ($withcode == 2) {
|
|
if ($withregion == 1) {
|
|
return $label = $obj->region_name . ' - ' . ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
|
|
} else {
|
|
return $label = ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
|
|
}
|
|
} elseif ($withcode === 'all') {
|
|
if ($withregion == 1) {
|
|
return array('id' => $obj->id, 'code' => $obj->code, 'label' => $label, 'region_code' => $obj->region_code, 'region' => $obj->region_name);
|
|
} else {
|
|
return array('id' => $obj->id, 'code' => $obj->code, 'label' => $label);
|
|
}
|
|
} else {
|
|
if ($withregion == 1) {
|
|
return $label = $obj->region_name . ' - ' . $label;
|
|
} else {
|
|
return $label;
|
|
}
|
|
}
|
|
} else {
|
|
return $langs->transnoentitiesnoconv("NotDefined");
|
|
}
|
|
} else {
|
|
dol_print_error($dbtouse, '');
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Return label of currency or code+label
|
|
*
|
|
* @param string $code_iso Code iso of currency
|
|
* @param int<0,1> $withcode '1'=show code + label
|
|
* @param ?Translate $outputlangs Output language
|
|
* @return string Label translated of currency
|
|
*/
|
|
function currency_name($code_iso, $withcode = 0, $outputlangs = null)
|
|
{
|
|
global $langs, $db;
|
|
|
|
if (empty($outputlangs)) {
|
|
$outputlangs = $langs;
|
|
}
|
|
|
|
$outputlangs->load("dict");
|
|
|
|
// If there is a translation, we can send immediately the label
|
|
if ($outputlangs->trans("Currency" . $code_iso) != "Currency" . $code_iso) {
|
|
return ($withcode ? $code_iso . ' - ' : '') . $outputlangs->trans("Currency" . $code_iso);
|
|
}
|
|
|
|
// If no translation, we read table to get label by default
|
|
$sql = "SELECT label FROM " . MAIN_DB_PREFIX . "c_currencies";
|
|
$sql .= " WHERE code_iso='" . $db->escape($code_iso) . "'";
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$num = $db->num_rows($resql);
|
|
|
|
if ($num) {
|
|
$obj = $db->fetch_object($resql);
|
|
$label = ($obj->label != '-' ? $obj->label : '');
|
|
if ($withcode) {
|
|
return ($label == $code_iso) ? "$code_iso" : "$code_iso - $label";
|
|
} else {
|
|
return $label;
|
|
}
|
|
} else {
|
|
return $code_iso;
|
|
}
|
|
}
|
|
return 'ErrorWhenReadingCurrencyLabel';
|
|
}
|
|
|
|
/**
|
|
* Return the name translated of juridical status.
|
|
* This method include a cache.
|
|
*
|
|
* @param string $code Code of juridical status
|
|
* @return string Value of the juridical status
|
|
*/
|
|
function getFormeJuridiqueLabel($code)
|
|
{
|
|
global $conf, $db, $langs;
|
|
|
|
if (!$code) {
|
|
return '';
|
|
}
|
|
|
|
if (!empty($conf->cache["legalform_" . $langs->defaultlang . '_' . $code])) {
|
|
return $conf->cache["legalform_" . $langs->defaultlang . '_' . $code];
|
|
}
|
|
|
|
$sql = "SELECT libelle as label FROM " . MAIN_DB_PREFIX . "c_forme_juridique";
|
|
$sql .= " WHERE code = '" . $db->escape($code) . "'";
|
|
|
|
dol_syslog("Company.lib::getFormeJuridiqueLabel", LOG_DEBUG);
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$num = $db->num_rows($resql);
|
|
if ($num) {
|
|
$obj = $db->fetch_object($resql);
|
|
|
|
$label = ($obj->label != '-' ? $obj->label : '');
|
|
|
|
$conf->cache["legalform_" . $langs->defaultlang . '_' . $code] = $label;
|
|
|
|
return $langs->trans($label);
|
|
} else {
|
|
return $langs->trans("NotDefined");
|
|
}
|
|
} else {
|
|
return 'Error ' . $db->lasterror();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Return list of countries that are inside the EEC (European Economic Community)
|
|
* Note: Try to keep this function as a "memory only" function for performance reasons.
|
|
*
|
|
* @return string[] Array of country codes in EEC
|
|
*/
|
|
function getCountriesInEEC()
|
|
{
|
|
// List of all country codes that are in europe for european vat rules
|
|
// List found on https://ec.europa.eu/taxation_customs/territorial-status-eu-countries-and-certain-territories_en
|
|
global $conf, $db;
|
|
$country_code_in_EEC = array();
|
|
|
|
if (!empty($conf->cache['country_code_in_EEC'])) {
|
|
// Use of cache to reduce number of database requests
|
|
$country_code_in_EEC = $conf->cache['country_code_in_EEC'];
|
|
} else {
|
|
$sql = "SELECT cc.code FROM " . MAIN_DB_PREFIX . "c_country as cc";
|
|
$sql .= " WHERE cc.eec = 1";
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$num = $db->num_rows($resql);
|
|
$i = 0;
|
|
while ($i < $num) {
|
|
$objp = $db->fetch_object($resql);
|
|
$country_code_in_EEC[] = $objp->code;
|
|
$i++;
|
|
}
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
$conf->cache['country_code_in_EEC'] = $country_code_in_EEC;
|
|
}
|
|
return $country_code_in_EEC;
|
|
}
|
|
|
|
/**
|
|
* Return if a country of an object is inside the EEC (European Economic Community)
|
|
*
|
|
* @param Object $object Object
|
|
* @return boolean true = country inside EEC, false = country outside EEC
|
|
*/
|
|
function isInEEC($object)
|
|
{
|
|
if (empty($object->country_code)) {
|
|
return false;
|
|
}
|
|
|
|
$country_code_in_EEC = getCountriesInEEC(); // This make a database call but there is a cache done into $conf->cache['country_code_in_EEC']
|
|
|
|
//print "dd".$object->country_code;
|
|
return in_array($object->country_code, $country_code_in_EEC);
|
|
}
|
|
|
|
/**
|
|
* Return list of countries that are inside the SEPA zone (Single Euro Payment Area)
|
|
* Note: Try to keep this function as a "memory only" function for performance reasons.
|
|
*
|
|
* @return string[] Array of country codes in SEPA
|
|
*/
|
|
function getCountriesInSEPA()
|
|
{
|
|
// List of all country codes that are in Europe agreement for bank transferts
|
|
// List found on https://www.ecb.europa.eu/paym/integration/retail/sepa/html/index.en.html
|
|
global $conf, $db;
|
|
$country_code_in_SEPA = array();
|
|
|
|
if (!empty($conf->cache['country_code_in_SEPA'])) {
|
|
// Use of cache to reduce number of database requests
|
|
$country_code_in_SEPA = $conf->cache['country_code_in_SEPA'];
|
|
} else {
|
|
$sql = "SELECT cc.code FROM " . MAIN_DB_PREFIX . "c_country as cc";
|
|
$sql .= " WHERE cc.sepa = 1";
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$num = $db->num_rows($resql);
|
|
$i = 0;
|
|
while ($i < $num) {
|
|
$objp = $db->fetch_object($resql);
|
|
$country_code_in_SEPA[] = $objp->code;
|
|
$i++;
|
|
}
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
$conf->cache['country_code_in_SEPA'] = $country_code_in_SEPA;
|
|
}
|
|
return $country_code_in_SEPA;
|
|
}
|
|
|
|
/**
|
|
* Return if a country of an object is inside the SEPA zone (Single Euro Payment Area)
|
|
*
|
|
* @param Object $object Object
|
|
* @return boolean true = ccountry inside SEPA, false = country outside SEPA
|
|
*/
|
|
function isInSEPA($object)
|
|
{
|
|
if (empty($object->country_code)) {
|
|
return false;
|
|
}
|
|
|
|
$country_code_in_SEPA = getCountriesInSEPA(); // This make a database call but there is a cache done into $conf->cache['country_code_in_SEPA']
|
|
|
|
//print "dd".$object->country_code;
|
|
return in_array($object->country_code, $country_code_in_SEPA);
|
|
}
|
|
|
|
|
|
/**
|
|
* Show html area for list of projects
|
|
*
|
|
* @param Conf $conf Object conf
|
|
* @param Translate $langs Object langs
|
|
* @param DoliDB $db Database handler
|
|
* @param Societe $object Third party object
|
|
* @param string $backtopage Url to go once contact is created
|
|
* @param int<0,1> $nocreatelink 1=Hide create project link
|
|
* @param string $morehtmlright More html on right of title
|
|
* @return int
|
|
*/
|
|
function show_projects($conf, $langs, $db, $object, $backtopage = '', $nocreatelink = 0, $morehtmlright = '')
|
|
{
|
|
global $user, $action, $hookmanager, $form, $massactionbutton, $massaction, $arrayofselected, $arrayofmassactions;
|
|
|
|
$i = -1;
|
|
|
|
if (isModEnabled('project') && $user->hasRight('projet', 'lire')) {
|
|
$langs->load("projects");
|
|
|
|
$newcardbutton = '';
|
|
if ($user->hasRight('projet', 'creer') && empty($nocreatelink)) {
|
|
$newcardbutton .= dolGetButtonTitle($langs->trans('AddProject'), '', 'fa fa-plus-circle', DOL_URL_ROOT . '/projet/card.php?socid=' . $object->id . '&action=create&backtopage=' . urlencode($backtopage));
|
|
}
|
|
|
|
print "\n";
|
|
print load_fiche_titre($langs->trans("ProjectsDedicatedToThisThirdParty"), $newcardbutton . $morehtmlright, '');
|
|
|
|
print '<div class="div-table-responsive">' . "\n";
|
|
print '<table class="noborder centpercent">';
|
|
|
|
$sql = "SELECT p.rowid as id, p.entity, p.title, p.ref, p.public, p.dateo as do, p.datee as de, p.fk_statut as status, p.fk_opp_status, p.opp_amount, p.opp_percent, p.tms as date_modification, p.budget_amount";
|
|
$sql .= ", cls.code as opp_status_code";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "projet as p";
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_lead_status as cls on p.fk_opp_status = cls.rowid";
|
|
$sql .= " WHERE p.fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND p.entity IN (" . getEntity('project') . ")";
|
|
$sql .= " ORDER BY p.dateo DESC";
|
|
|
|
$result = $db->query($sql);
|
|
if ($result) {
|
|
$num = $db->num_rows($result);
|
|
|
|
print '<tr class="liste_titre">';
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="center">';
|
|
$selectedfields = (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
|
|
print $selectedfields;
|
|
print '</td>';
|
|
}
|
|
print '<td>' . $langs->trans("Ref") . '</td>';
|
|
print '<td>' . $langs->trans("Name") . '</td>';
|
|
print '<td class="center">' . $langs->trans("DateStart") . '</td>';
|
|
print '<td class="center">' . $langs->trans("DateEnd") . '</td>';
|
|
print '<td class="right">' . $langs->trans("OpportunityAmountShort") . '</td>';
|
|
print '<td class="center">' . $langs->trans("OpportunityStatusShort") . '</td>';
|
|
print '<td class="right">' . $langs->trans("OpportunityProbabilityShort") . '</td>';
|
|
print '<td class="right">' . $langs->trans("Status") . '</td>';
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="center">';
|
|
$selectedfields = (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
|
|
print $selectedfields;
|
|
print '</td>';
|
|
}
|
|
print '</tr>';
|
|
|
|
if ($num > 0) {
|
|
require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php';
|
|
|
|
$projecttmp = new Project($db);
|
|
|
|
$i = 0;
|
|
|
|
while ($i < $num) {
|
|
$obj = $db->fetch_object($result);
|
|
$projecttmp->fetch($obj->id);
|
|
|
|
// To verify role of users
|
|
$userAccess = $projecttmp->restrictedProjectArea($user);
|
|
|
|
if ($user->hasRight('projet', 'lire') && $userAccess > 0) {
|
|
print '<tr class="oddeven">';
|
|
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="nowrap center actioncolumn">';
|
|
if ($massactionbutton || $massaction) {
|
|
$selected = 0;
|
|
if (in_array($obj->id, $arrayofselected)) {
|
|
$selected = 1;
|
|
}
|
|
print '<input id="cb' . $obj->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $obj->id . '"' . ($selected ? ' checked="checked"' : '') . '>';
|
|
}
|
|
print '</td>';
|
|
}
|
|
// Ref
|
|
print '<td class="nowraponall">';
|
|
print $projecttmp->getNomUrl(1, '', 0, '', '-', 0, 1, '', 'project:' . $_SERVER["PHP_SELF"] . '?socid=__SOCID__');
|
|
print '</td>';
|
|
|
|
// Label
|
|
print '<td class="tdoverflowmax200" title="' . dol_escape_htmltag($obj->title) . '">' . dol_escape_htmltag($obj->title) . '</td>';
|
|
// Date start
|
|
print '<td class="center">' . dol_print_date($db->jdate($obj->do), "day") . '</td>';
|
|
// Date end
|
|
print '<td class="center">' . dol_print_date($db->jdate($obj->de), "day") . '</td>';
|
|
// Opp amount
|
|
print '<td class="right">';
|
|
if ($obj->opp_status_code) {
|
|
print '<span class="amount">' . price($obj->opp_amount, 1, '', 1, -1, -1, '') . '</span>';
|
|
}
|
|
print '</td>';
|
|
// Opp status
|
|
print '<td class="center">';
|
|
if ($obj->opp_status_code) {
|
|
print $langs->trans("OppStatus" . $obj->opp_status_code);
|
|
}
|
|
print '</td>';
|
|
// Opp percent
|
|
print '<td class="right">';
|
|
if ($obj->opp_percent) {
|
|
print price($obj->opp_percent, 1, '', 1, 0) . '%';
|
|
}
|
|
print '</td>';
|
|
// Status
|
|
print '<td class="right">' . $projecttmp->getLibStatut(5) . '</td>';
|
|
|
|
// Action column
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="nowrap center actioncolumn">';
|
|
if ($massactionbutton || $massaction) {
|
|
$selected = 0;
|
|
if (in_array($obj->id, $arrayofselected)) {
|
|
$selected = 1;
|
|
}
|
|
print '<input id="cb' . $obj->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $obj->id . '"' . ($selected ? ' checked="checked"' : '') . '>';
|
|
}
|
|
print '</td>';
|
|
}
|
|
print '</tr>';
|
|
}
|
|
$i++;
|
|
}
|
|
} else {
|
|
print '<tr class="oddeven"><td colspan="9"><span class="opacitymedium">' . $langs->trans("None") . '</span></td></tr>';
|
|
}
|
|
$db->free($result);
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
|
|
//projects linked to that thirdpart because of a people of that company is linked to a project
|
|
if (getDolGlobalString('PROJECT_DISPLAY_LINKED_BY_CONTACT')) {
|
|
print "\n";
|
|
print load_fiche_titre($langs->trans("ProjectsLinkedToThisThirdParty"), '', '');
|
|
|
|
|
|
print '<div class="div-table-responsive">' . "\n";
|
|
print '<table class="noborder centpercent">';
|
|
|
|
$sql = "SELECT p.rowid as id, p.entity, p.title, p.ref, p.public, p.dateo as do, p.datee as de, p.fk_statut as status, p.fk_opp_status, p.opp_amount, p.opp_percent, p.tms as date_update, p.budget_amount";
|
|
$sql .= ", cls.code as opp_status_code";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "projet as p";
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_lead_status as cls on p.fk_opp_status = cls.rowid";
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "element_contact as ec on p.rowid = ec.element_id";
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "socpeople as sc on ec.fk_socpeople = sc.rowid";
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_type_contact as tc on ec.fk_c_type_contact = tc.rowid";
|
|
$sql .= " WHERE sc.fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND p.entity IN (" . getEntity('project') . ")";
|
|
$sql .= " AND tc.element = 'project' AND tc.source = 'external'";
|
|
$sql .= " ORDER BY p.dateo DESC";
|
|
|
|
$result = $db->query($sql);
|
|
if ($result) {
|
|
$num = $db->num_rows($result);
|
|
|
|
print '<tr class="liste_titre">';
|
|
print '<td>' . $langs->trans("Ref") . '</td>';
|
|
print '<td>' . $langs->trans("Name") . '</td>';
|
|
print '<td class="center">' . $langs->trans("DateStart") . '</td>';
|
|
print '<td class="center">' . $langs->trans("DateEnd") . '</td>';
|
|
print '<td class="right">' . $langs->trans("OpportunityAmountShort") . '</td>';
|
|
print '<td class="center">' . $langs->trans("OpportunityStatusShort") . '</td>';
|
|
print '<td class="right">' . $langs->trans("OpportunityProbabilityShort") . '</td>';
|
|
print '<td class="right">' . $langs->trans("Status") . '</td>';
|
|
print '</tr>';
|
|
|
|
if ($num > 0) {
|
|
require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php';
|
|
|
|
$projecttmp = new Project($db);
|
|
|
|
$i = 0;
|
|
|
|
while ($i < $num) {
|
|
$obj = $db->fetch_object($result);
|
|
$projecttmp->fetch($obj->id);
|
|
|
|
// To verify role of users
|
|
$userAccess = $projecttmp->restrictedProjectArea($user);
|
|
|
|
if ($userAccess > 0) {
|
|
print '<tr class="oddeven">';
|
|
|
|
// Ref
|
|
print '<td class="nowraponall">';
|
|
print $projecttmp->getNomUrl(1, '', 0, '', '-', 0, 1, '', 'project:' . $_SERVER["PHP_SELF"] . '?socid=__SOCID__');
|
|
print '</td>';
|
|
|
|
// Label
|
|
print '<td class="tdoverflowmax200" title="' . dol_escape_htmltag($obj->title) . '">' . dol_escape_htmltag($obj->title) . '</td>';
|
|
// Date start
|
|
print '<td class="center">' . dol_print_date($db->jdate($obj->do), "day") . '</td>';
|
|
// Date end
|
|
print '<td class="center">' . dol_print_date($db->jdate($obj->de), "day") . '</td>';
|
|
// Opp amount
|
|
print '<td class="right">';
|
|
if ($obj->opp_status_code) {
|
|
print '<span class="amount">' . price($obj->opp_amount, 1, '', 1, -1, -1, '') . '</span>';
|
|
}
|
|
print '</td>';
|
|
// Opp status
|
|
print '<td class="center">';
|
|
if ($obj->opp_status_code) {
|
|
print $langs->trans("OppStatus" . $obj->opp_status_code);
|
|
}
|
|
print '</td>';
|
|
// Opp percent
|
|
print '<td class="right">';
|
|
if ($obj->opp_percent) {
|
|
print price($obj->opp_percent, 1, '', 1, 0) . '%';
|
|
}
|
|
print '</td>';
|
|
// Status
|
|
print '<td class="right">' . $projecttmp->getLibStatut(5) . '</td>';
|
|
|
|
print '</tr>';
|
|
}
|
|
$i++;
|
|
}
|
|
} else {
|
|
print '<tr class="oddeven"><td colspan="8"><span class="opacitymedium">' . $langs->trans("None") . '</span></td></tr>';
|
|
}
|
|
$db->free($result);
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
}
|
|
|
|
$parameters = array('sql' => $sql, 'function' => 'show_projects');
|
|
$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
|
|
print "</table>";
|
|
print '</div>';
|
|
|
|
print "<br>\n";
|
|
}
|
|
|
|
return $i;
|
|
}
|
|
|
|
|
|
/**
|
|
* Show html area for list of contacts
|
|
*
|
|
* @param Conf $conf Object conf
|
|
* @param Translate $langs Object langs
|
|
* @param DoliDB $db Database handler
|
|
* @param Societe $object Third party object
|
|
* @param string $backtopage Url to go once contact is created
|
|
* @param int<0,1> $showuserlogin 1=Show also user login if it exists
|
|
* @return int
|
|
*/
|
|
function show_contacts($conf, $langs, $db, $object, $backtopage = '', $showuserlogin = 0)
|
|
{
|
|
global $user, $extrafields, $hookmanager;
|
|
global $contextpage;
|
|
|
|
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
|
|
$formcompany = new FormCompany($db);
|
|
$form = new Form($db);
|
|
|
|
$optioncss = GETPOST('optioncss', 'alpha');
|
|
$sortfield = GETPOST('sortfield', 'aZ09comma');
|
|
$sortorder = GETPOST('sortorder', 'aZ09comma');
|
|
$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
|
|
|
|
$search_status = GETPOST("search_status", "intcomma");
|
|
if ($search_status == '') {
|
|
$search_status = 1; // always display active customer first
|
|
}
|
|
|
|
$search_rowid = GETPOST("search_rowid", "intcomma");
|
|
$search_name = GETPOST("search_name", 'alpha');
|
|
$search_address = GETPOST("search_address", 'alpha');
|
|
$search_poste = GETPOST("search_poste", 'alpha');
|
|
$search_note_private = GETPOST('search_note_private', 'alphanohtml');
|
|
$search_roles = GETPOST("search_roles", 'array');
|
|
$search_birthday_dtstart = GETPOST("search_birthday_dtstart", 'alpha');
|
|
$search_birthday_dtend = GETPOST("search_birthday_dtend", 'alpha');
|
|
|
|
if ($search_birthday_dtstart != '' || $search_birthday_dtend != '') {
|
|
$search_birthday_dtstart = dol_mktime(0, 0, 0, GETPOSTINT('search_birthday_dtstartmonth'), GETPOSTINT('search_birthday_dtstartday'), GETPOSTINT('search_birthday_dtstartyear'));
|
|
$search_birthday_dtend = dol_mktime(23, 59, 59, GETPOSTINT('search_birthday_dtendmonth'), GETPOSTINT('search_birthday_dtendday'), GETPOSTINT('search_birthday_dtendyear'));
|
|
}
|
|
$socialnetworks = getArrayOfSocialNetworks();
|
|
|
|
$searchAddressPhoneDBFields = array(
|
|
//Address
|
|
't.address',
|
|
't.zip',
|
|
't.town',
|
|
|
|
//Phone
|
|
't.phone',
|
|
't.phone_perso',
|
|
't.phone_mobile',
|
|
|
|
//Fax
|
|
't.fax',
|
|
|
|
//E-mail
|
|
't.email',
|
|
);
|
|
//Social media
|
|
// foreach ($socialnetworks as $key => $value) {
|
|
// if ($value['active']) {
|
|
// $searchAddressPhoneDBFields['t.'.$key] = "t.socialnetworks->'$.".$key."'";
|
|
// }
|
|
// }
|
|
|
|
if (!$sortorder) {
|
|
$sortorder = "ASC";
|
|
}
|
|
if (!$sortfield) {
|
|
$sortfield = "t.lastname";
|
|
}
|
|
|
|
if (isModEnabled('clicktodial')) {
|
|
$user->fetch_clicktodial(); // lecture des infos de clicktodial du user
|
|
}
|
|
|
|
|
|
$contactstatic = new Contact($db);
|
|
|
|
$extrafields->fetch_name_optionals_label($contactstatic->table_element);
|
|
|
|
$contactstatic->fields = array(
|
|
'rowid' => array('type' => 'integer', 'label' => "TechnicalID", 'enabled' => (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') ? '1' : '0'), 'visible' => (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') ? 1 : 0), 'position' => 1),
|
|
'name' => array('type' => 'varchar(128)', 'label' => 'Name', 'enabled' => '1', 'visible' => 1, 'notnull' => 1, 'showoncombobox' => 1, 'index' => 1, 'position' => 10, 'searchall' => 1),
|
|
'poste' => array('type' => 'varchar(128)', 'label' => 'PostOrFunction', 'enabled' => '1', 'visible' => 1, 'notnull' => 1, 'showoncombobox' => 2, 'index' => 1, 'position' => 20),
|
|
'address' => array('type' => 'varchar(128)', 'label' => 'Address', 'enabled' => '1', 'visible' => 1, 'notnull' => 1, 'showoncombobox' => 3, 'index' => 1, 'position' => 30),
|
|
'note_private' => array('type' => 'html', 'label' => 'NotePrivate', 'enabled' => (string) ((int) !getDolGlobalBool('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'visible' => 3, 'position' => 35),
|
|
'role' => array('type' => 'checkbox', 'label' => 'Role', 'enabled' => '1', 'visible' => 1, 'notnull' => 1, 'showoncombobox' => 4, 'index' => 1, 'position' => 40),
|
|
'birthday' => array('type' => 'date', 'label' => 'Birthday', 'enabled' => '1', 'visible' => -1, 'notnull' => 0, 'position' => 45),
|
|
'statut' => array('type' => 'integer', 'label' => 'Status', 'enabled' => '1', 'visible' => 1, 'notnull' => 1, 'default' => '0', 'index' => 1, 'position' => 50, 'arrayofkeyval' => array(0 => $contactstatic->LibStatut(0, 1), 1 => $contactstatic->LibStatut(1, 1))),
|
|
);
|
|
|
|
// Definition of fields for list
|
|
$arrayfields = array(
|
|
't.rowid' => array('label' => "TechnicalID", 'checked' => (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') ? '1' : '0'), 'enabled' => (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') ? '1' : '0'), 'position' => 1),
|
|
't.name' => array('label' => "Name", 'checked' => '1', 'position' => 10),
|
|
't.poste' => array('label' => "PostOrFunction", 'checked' => '1', 'position' => 20),
|
|
't.address' => array('label' => (empty($conf->dol_optimize_smallscreen) ? $langs->trans("Address") . ' / ' . $langs->trans("Phone") . ' / ' . $langs->trans("Email") : $langs->trans("Address")), 'checked' => '1', 'position' => 30),
|
|
't.note_private' => array('label' => 'NotePrivate', 'checked' => '0', 'position' => 35),
|
|
'sc.role' => array('label' => "ContactByDefaultFor", 'checked' => '1', 'position' => 40),
|
|
't.birthday' => array('label' => "Birthday", 'checked' => '0', 'position' => 45),
|
|
't.statut' => array('label' => "Status", 'checked' => '1', 'position' => 50, 'class' => 'center'),
|
|
'u.user' => array('label' => "DolibarrLogin", 'checked' => '1', 'position' => 50, 'class' => 'center'),
|
|
);
|
|
// Extra fields
|
|
$extrafieldsobjectkey = $contactstatic->table_element;
|
|
$extrafieldsobjectprefix = 'ef.';
|
|
$extrafieldspositionoffset = 1000;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_array_fields.tpl.php';
|
|
|
|
// Initialize array of search criteria
|
|
$search = array();
|
|
foreach ($arrayfields as $key => $val) {
|
|
$queryName = 'search_' . substr($key, 2);
|
|
if (GETPOST($queryName, 'alpha')) {
|
|
$search[substr($key, 2)] = GETPOST($queryName, 'alpha');
|
|
}
|
|
}
|
|
$search_array_options = $extrafields->getOptionalsFromPost($contactstatic->table_element, '', 'search_');
|
|
|
|
// 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
|
|
$search_rowid = '';
|
|
$search_status = '';
|
|
$search_name = '';
|
|
$search_roles = array();
|
|
$search_address = '';
|
|
$search_poste = '';
|
|
$search_note_private = '';
|
|
$search_birthday_dtstart = '';
|
|
$search_birthday_dtend = '';
|
|
$search = array();
|
|
$search_array_options = array();
|
|
|
|
foreach ($contactstatic->fields as $key => $val) {
|
|
$search[$key] = '';
|
|
}
|
|
}
|
|
|
|
$contactstatic->fields = dol_sort_array($contactstatic->fields, 'position');
|
|
$arrayfields = dol_sort_array($arrayfields, 'position');
|
|
|
|
$newcardbutton = '';
|
|
$parameters = array('socid' => $object->id);
|
|
$reshook = $hookmanager->executeHooks('printNewCardButton', $parameters, $object);
|
|
if (empty($reshook)) {
|
|
if ($user->hasRight('societe', 'contact', 'creer')) {
|
|
$addcontact = (getDolGlobalString('SOCIETE_ADDRESSES_MANAGEMENT') ? $langs->trans("AddContact") : $langs->trans("AddContactAddress"));
|
|
$newcardbutton .= dolGetButtonTitle($addcontact, '', 'fa fa-plus-circle', DOL_URL_ROOT . '/contact/card.php?socid=' . $object->id . '&action=create&backtopage=' . urlencode($backtopage));
|
|
}
|
|
} else {
|
|
$newcardbutton = $hookmanager->resPrint;
|
|
}
|
|
|
|
print "\n";
|
|
|
|
$title = (getDolGlobalString('SOCIETE_ADDRESSES_MANAGEMENT') ? $langs->trans("ContactsForCompany") : $langs->trans("ContactsAddressesForCompany"));
|
|
print load_fiche_titre($title, $newcardbutton, 'contact');
|
|
|
|
print '<form method="POST" id="searchFormList" action="' . $_SERVER["PHP_SELF"] . '" name="formfilter">';
|
|
print '<input type="hidden" name="token" value="' . newToken() . '">';
|
|
print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
|
|
print '<input type="hidden" name="socid" value="' . $object->id . '">';
|
|
print '<input type="hidden" name="sortorder" value="' . $sortorder . '">';
|
|
print '<input type="hidden" name="sortfield" value="' . $sortfield . '">';
|
|
print '<input type="hidden" name="page" value="' . $page . '">';
|
|
|
|
$arrayofmassactions = array();
|
|
$mode = 'view';
|
|
|
|
$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
|
|
$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
|
|
$selectedfields = ($mode != 'kanban' ? $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 "\n" . '<table class="tagtable liste noborder">' . "\n";
|
|
|
|
$param = "socid=" . urlencode((string) ($object->id));
|
|
if ($search_rowid != '') {
|
|
$param .= '&search_rowid=' . urlencode((string) ($search_rowid));
|
|
}
|
|
if ($search_status != '') {
|
|
$param .= '&search_status=' . urlencode((string) ($search_status));
|
|
}
|
|
if (count($search_roles) > 0) {
|
|
$param .= implode('&search_roles[]=', $search_roles);
|
|
}
|
|
if ($search_name != '') {
|
|
$param .= '&search_name=' . urlencode($search_name);
|
|
}
|
|
if ($search_poste != '') {
|
|
$param .= '&search_poste=' . urlencode($search_poste);
|
|
}
|
|
if ($search_address != '') {
|
|
$param .= '&search_address=' . urlencode($search_address);
|
|
}
|
|
if ($search_note_private != '') {
|
|
$param .= '&search_note_private=' . urlencode($search_note_private);
|
|
}
|
|
if ($search_birthday_dtstart != '') {
|
|
$param .= '&search_birthday_dtstart=' . urlencode((string) $search_birthday_dtstart);
|
|
}
|
|
if ($search_birthday_dtend != '') {
|
|
$param .= '&search_birthday_dtend=' . urlencode((string) $search_birthday_dtend);
|
|
}
|
|
if ($optioncss != '') {
|
|
$param .= '&optioncss=' . urlencode($optioncss);
|
|
}
|
|
|
|
// Add $param from extra fields
|
|
$extrafieldsobjectkey = $contactstatic->table_element;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_param.tpl.php';
|
|
|
|
$sql = "SELECT t.rowid, t.entity, t.lastname, t.firstname, t.fk_pays as country_id, t.civility, t.poste,";
|
|
$sql .= " t.phone as phone_pro, t.phone_mobile, t.phone_perso, t.fax, t.email, t.socialnetworks, t.statut, t.photo, t.fk_soc,";
|
|
$sql .= " t.civility as civility_id, t.address, t.zip, t.town, t.birthday,";
|
|
$sql .= " t.note_private";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "socpeople as t";
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "socpeople_extrafields as ef on (t.rowid = ef.fk_object)";
|
|
$sql .= " WHERE t.fk_soc = " . ((int) $object->id);
|
|
$sql .= " AND t.entity IN (" . getEntity('socpeople') . ")";
|
|
$sql .= " AND ((t.fk_user_creat = " . ((int) $user->id) . " AND t.priv = 1) OR t.priv = 0)";
|
|
if ($search_rowid) {
|
|
$sql .= natural_search('t.rowid', $search_rowid);
|
|
}
|
|
if ($search_status != '' && $search_status != '-1') {
|
|
$sql .= " AND t.statut = " . ((int) $search_status);
|
|
}
|
|
if ($search_name) {
|
|
$sql .= natural_search(array('t.lastname', 't.firstname'), $search_name);
|
|
}
|
|
if ($search_poste) {
|
|
$sql .= natural_search('t.poste', $search_poste);
|
|
}
|
|
if ($search_address) {
|
|
$sql .= natural_search($searchAddressPhoneDBFields, $search_address);
|
|
}
|
|
if ($search_note_private) {
|
|
$sql .= natural_search('t.note_private', $search_note_private);
|
|
}
|
|
if ($search_birthday_dtstart != '') {
|
|
$sql .= " AND t.birthday >= '" . $db->idate($search_birthday_dtstart) . "'";
|
|
}
|
|
if ($search_birthday_dtend != '') {
|
|
$sql .= " AND t.birthday <= '" . $db->idate($search_birthday_dtend) . "'";
|
|
}
|
|
if (count($search_roles) > 0) {
|
|
$sql .= " AND t.rowid IN (SELECT sc.fk_socpeople FROM " . MAIN_DB_PREFIX . "societe_contacts as sc WHERE sc.fk_c_type_contact IN (" . $db->sanitize(implode(',', $search_roles)) . "))";
|
|
}
|
|
// Add where from extra fields
|
|
$extrafieldsobjectkey = $contactstatic->table_element;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_sql.tpl.php';
|
|
// Add where from hooks
|
|
$parameters = array('socid' => $object->id);
|
|
$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
$sql .= $hookmanager->resPrint;
|
|
if ($sortfield == "t.name") {
|
|
$sql .= " ORDER BY t.lastname $sortorder, t.firstname $sortorder";
|
|
} else {
|
|
$sql .= " ORDER BY $sortfield $sortorder";
|
|
}
|
|
|
|
dol_syslog('core/lib/company.lib.php :: show_contacts', LOG_DEBUG);
|
|
$result = $db->query($sql);
|
|
if (!$result) {
|
|
dol_print_error($db);
|
|
}
|
|
|
|
$num = $db->num_rows($result);
|
|
|
|
// Fields title search
|
|
// --------------------------------------------------------------------
|
|
print '<tr class="liste_titre">';
|
|
// Action column
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="liste_titre right">';
|
|
print $form->showFilterButtons();
|
|
print '</td>';
|
|
}
|
|
foreach ($contactstatic->fields as $key => $val) {
|
|
$align = '';
|
|
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
|
|
$align .= ($align ? ' ' : '') . 'center';
|
|
}
|
|
if (in_array($val['type'], array('timestamp'))) {
|
|
$align .= ($align ? ' ' : '') . 'nowrap';
|
|
}
|
|
if ($key == 'status' || $key == 'statut') {
|
|
$align .= ($align ? ' ' : '') . 'center';
|
|
}
|
|
if (!empty($arrayfields['t.' . $key]['checked']) || !empty($arrayfields['sc.' . $key]['checked'])) {
|
|
print '<td class="liste_titre' . ($align ? ' ' . $align : '') . '">';
|
|
if (in_array($key, array('statut'))) {
|
|
print $form->selectarray('search_status', array('-1' => '', '0' => $contactstatic->LibStatut(0, 1), '1' => $contactstatic->LibStatut(1, 1)), $search_status, 0, 0, 0, '', 0, 0, 0, '', 'onrightofpage');
|
|
} elseif (in_array($key, array('role'))) {
|
|
print $formcompany->showRoles("search_roles", $contactstatic, 'edit', $search_roles, 'minwidth200 maxwidth300');
|
|
} elseif (in_array($key, array('birthday'))) {
|
|
print '<div class="nowrap">';
|
|
print $form->selectDate($search_birthday_dtstart ? $search_birthday_dtstart : '', "search_birthday_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
|
|
print '</div>';
|
|
print '<div class="nowrap">';
|
|
print $form->selectDate($search_birthday_dtend ? $search_birthday_dtend : '', "search_birthday_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
|
|
print '</div>';
|
|
} else {
|
|
print '<input type="text" class="flat maxwidth75" name="search_' . $key . '" value="' . (!empty($search[$key]) ? dol_escape_htmltag($search[$key]) : '') . '">';
|
|
}
|
|
print '</td>';
|
|
}
|
|
}
|
|
if ($showuserlogin) {
|
|
print '<td class="liste_titre"></td>';
|
|
}
|
|
// Extra fields
|
|
$extrafieldsobjectkey = $contactstatic->table_element;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_input.tpl.php';
|
|
|
|
// Fields from hook
|
|
$parameters = array('arrayfields' => $arrayfields);
|
|
$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $contactstatic); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
// Action column
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="liste_titre right">';
|
|
print $form->showFilterButtons();
|
|
print '</td>';
|
|
}
|
|
print '</tr>' . "\n";
|
|
|
|
|
|
// Fields title label
|
|
// --------------------------------------------------------------------
|
|
print '<tr class="liste_titre">';
|
|
// Action column
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ') . "\n";
|
|
}
|
|
foreach ($contactstatic->fields as $key => $val) {
|
|
$align = '';
|
|
if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
|
|
$align .= ($align ? ' ' : '') . 'center';
|
|
}
|
|
if (in_array($val['type'], array('timestamp'))) {
|
|
$align .= ($align ? ' ' : '') . 'nowrap';
|
|
}
|
|
if ($key == 'status' || $key == 'statut') {
|
|
$align .= ($align ? ' ' : '') . 'center';
|
|
}
|
|
if (!empty($arrayfields['t.' . $key]['checked'])) {
|
|
print getTitleFieldOfList($val['label'], 0, $_SERVER['PHP_SELF'], 't.' . $key, '', $param, ($align ? 'class="' . $align . '"' : ''), $sortfield, $sortorder, $align . ' ') . "\n";
|
|
}
|
|
if ($key == 'role') {
|
|
$align .= ($align ? ' ' : '') . 'left';
|
|
}
|
|
if (!empty($arrayfields['sc.' . $key]['checked'])) {
|
|
print getTitleFieldOfList($arrayfields['sc.' . $key]['label'], 0, $_SERVER['PHP_SELF'], '', '', $param, ($align ? 'class="' . $align . '"' : ''), $sortfield, $sortorder, $align . ' ') . "\n";
|
|
}
|
|
}
|
|
if ($showuserlogin) {
|
|
print '<th class="wrapcolumntitle liste_titre">' . $langs->trans("DolibarrLogin") . '</th>';
|
|
}
|
|
// Extra fields
|
|
$extrafieldsobjectkey = $contactstatic->table_element;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_title.tpl.php';
|
|
// Hook fields
|
|
$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
|
|
$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
// Action column
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ') . "\n";
|
|
}
|
|
print '</tr>' . "\n";
|
|
|
|
$i = -1;
|
|
|
|
if ($num || (GETPOST('button_search') || GETPOST('button_search.x') || GETPOST('button_search_x'))) {
|
|
$i = 0;
|
|
|
|
while ($i < $num) {
|
|
$obj = $db->fetch_object($result);
|
|
|
|
$contactstatic->id = $obj->rowid;
|
|
$contactstatic->ref = $obj->rowid;
|
|
$contactstatic->status = $obj->statut;
|
|
$contactstatic->statut = $obj->statut;
|
|
$contactstatic->lastname = $obj->lastname;
|
|
$contactstatic->firstname = $obj->firstname;
|
|
$contactstatic->civility_id = $obj->civility_id;
|
|
$contactstatic->civility_code = $obj->civility_id;
|
|
$contactstatic->poste = $obj->poste;
|
|
$contactstatic->address = $obj->address;
|
|
$contactstatic->zip = $obj->zip;
|
|
$contactstatic->town = $obj->town;
|
|
$contactstatic->phone_pro = $obj->phone_pro;
|
|
$contactstatic->phone_mobile = $obj->phone_mobile;
|
|
$contactstatic->phone_perso = $obj->phone_perso;
|
|
$contactstatic->email = $obj->email;
|
|
$contactstatic->socialnetworks = $obj->socialnetworks;
|
|
$contactstatic->photo = $obj->photo;
|
|
$contactstatic->fk_soc = $obj->fk_soc;
|
|
$contactstatic->entity = $obj->entity;
|
|
|
|
$country_code = getCountry($obj->country_id, '2');
|
|
$contactstatic->country_code = $country_code;
|
|
|
|
$contactstatic->setGenderFromCivility();
|
|
$contactstatic->fetch_optionals();
|
|
|
|
$resultRole = $contactstatic->fetchRoles();
|
|
if ($resultRole < 0) {
|
|
setEventMessages(null, $contactstatic->errors, 'errors');
|
|
}
|
|
|
|
if (is_array($contactstatic->array_options)) {
|
|
foreach ($contactstatic->array_options as $key => $val) {
|
|
$obj->$key = $val;
|
|
}
|
|
}
|
|
|
|
print '<tr class="oddeven">';
|
|
|
|
// Actions
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="nowrap center">';
|
|
|
|
// Add to agenda
|
|
if (isModEnabled('agenda') && $user->hasRight('agenda', 'myactions', 'create')) {
|
|
print '<a href="' . DOL_URL_ROOT . '/comm/action/card.php?action=create&actioncode=&contactid=' . $obj->rowid . '&socid=' . $object->id . '&backtopage=' . urlencode($backtopage) . '">';
|
|
print img_object($langs->trans("Event"), "action");
|
|
print '</a> ';
|
|
}
|
|
|
|
// Edit
|
|
if ($user->hasRight('societe', 'contact', 'creer')) {
|
|
print '<a class="editfielda paddingleft" href="' . DOL_URL_ROOT . '/contact/card.php?action=edit&token=' . newToken() . '&id=' . $obj->rowid . '&backtopage=' . urlencode($backtopage) . '">';
|
|
print img_edit();
|
|
print '</a>';
|
|
}
|
|
|
|
// Delete
|
|
if ($user->hasRight('societe', 'contact', 'delete')) {
|
|
print '<a class="marginleftonly right" href="' . DOL_URL_ROOT . '/societe/contact.php?action=delete&token=' . newToken() . '&id=' . $obj->rowid . '&socid=' . $object->id . '&backtopage=' . urlencode($backtopage) . '">';
|
|
print img_delete();
|
|
print '</a>';
|
|
}
|
|
|
|
print '</td>';
|
|
}
|
|
|
|
// ID
|
|
if (!empty($arrayfields['t.rowid']['checked'])) {
|
|
print '<td>';
|
|
print $contactstatic->id;
|
|
print '</td>';
|
|
}
|
|
|
|
// Photo - Name
|
|
if (!empty($arrayfields['t.name']['checked'])) {
|
|
print '<td class="tdoverflowmax150">';
|
|
print $form->showphoto('contact', $contactstatic, 0, 0, 0, 'photorefnoborder valignmiddle marginrightonly', 'small', 1, 0, 'user');
|
|
print $contactstatic->getNomUrl(0, '', 0, '&backtopage=' . urlencode($backtopage));
|
|
print '</td>';
|
|
}
|
|
|
|
// Job position
|
|
if (!empty($arrayfields['t.poste']['checked'])) {
|
|
print '<td class="tdoverflowmax100" title="' . dol_escape_htmltag($obj->poste) . '">';
|
|
if ($obj->poste) {
|
|
print dol_escape_htmltag($obj->poste);
|
|
}
|
|
print '</td>';
|
|
}
|
|
|
|
// Address - Phone - Email
|
|
if (!empty($arrayfields['t.address']['checked'])) {
|
|
$addresstoshow = $contactstatic->getBannerAddress('contact', $object);
|
|
print '<td class="tdoverflowmax150 classfortooltip" title="'.dolPrintHTMLForAttribute($addresstoshow).'">';
|
|
print $addresstoshow;
|
|
print '</td>';
|
|
}
|
|
|
|
// Note private
|
|
if (!empty($arrayfields['t.note_private']['checked'])) {
|
|
print '<td class="center">';
|
|
print dolPrintHTML($obj->note_private);
|
|
print '</td>';
|
|
}
|
|
|
|
// Role
|
|
if (!empty($arrayfields['sc.role']['checked'])) {
|
|
print '<td class="tdoverflowmax150">';
|
|
print $formcompany->showRoles("roles", $contactstatic, 'view');
|
|
print '</td>';
|
|
}
|
|
|
|
// Birthday
|
|
if (!empty($arrayfields['t.birthday']['checked'])) {
|
|
print '<td class="nowraponall">';
|
|
print dol_print_date($db->jdate($obj->birthday));
|
|
print '</td>';
|
|
}
|
|
|
|
// Status
|
|
if (!empty($arrayfields['t.statut']['checked'])) {
|
|
print '<td class="center">' . $contactstatic->getLibStatut(5) . '</td>';
|
|
}
|
|
|
|
if ($showuserlogin) {
|
|
print '<td class="tdoverflowmax125">';
|
|
$tmpuser = new User($db);
|
|
// @phan-suppress-next-line PhanPluginSuspiciousParamPosition
|
|
$resfetch = $tmpuser->fetch(0, '', '', 0, -1, '', $contactstatic->id);
|
|
if ($resfetch > 0) {
|
|
print $tmpuser->getNomUrl(-1, '', 0, 0, 24, 1);
|
|
}
|
|
print '</td>';
|
|
}
|
|
|
|
// Extra fields
|
|
$extrafieldsobjectkey = $contactstatic->table_element;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_print_fields.tpl.php';
|
|
|
|
// Actions
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
print '<td class="nowrap center">';
|
|
|
|
// Add to agenda
|
|
if (isModEnabled('agenda') && $user->hasRight('agenda', 'myactions', 'create')) {
|
|
print '<a href="' . DOL_URL_ROOT . '/comm/action/card.php?action=create&actioncode=&contactid=' . $obj->rowid . '&socid=' . $object->id . '&backtopage=' . urlencode($backtopage) . '">';
|
|
print img_object($langs->trans("Event"), "action");
|
|
print '</a> ';
|
|
}
|
|
|
|
// Edit
|
|
if ($user->hasRight('societe', 'contact', 'creer')) {
|
|
print '<a class="editfielda paddingleft" href="' . DOL_URL_ROOT . '/contact/card.php?action=edit&token=' . newToken() . '&id=' . $obj->rowid . '&backtopage=' . urlencode($backtopage) . '">';
|
|
print img_edit();
|
|
print '</a>';
|
|
}
|
|
|
|
// Delete
|
|
if ($user->hasRight('societe', 'contact', 'delete')) {
|
|
print '<a class="marginleftonly right" href="' . DOL_URL_ROOT . '/societe/contact.php?action=delete&token=' . newToken() . '&id=' . $obj->rowid . '&socid=' . $object->id . '&backtopage=' . urlencode($backtopage) . '">';
|
|
print img_delete();
|
|
print '</a>';
|
|
}
|
|
|
|
print '</td>';
|
|
}
|
|
|
|
print "</tr>\n";
|
|
$i++;
|
|
}
|
|
|
|
if ($num == 0) {
|
|
$colspan = 1 + ($showuserlogin ? 1 : 0);
|
|
foreach ($arrayfields as $key => $val) {
|
|
if (!empty($val['checked'])) {
|
|
$colspan++;
|
|
}
|
|
}
|
|
print '<tr><td colspan="' . $colspan . '"><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
|
|
}
|
|
} else {
|
|
$colspan = 1 + ($showuserlogin ? 1 : 0);
|
|
foreach ($arrayfields as $key => $val) {
|
|
if (!empty($val['checked'])) {
|
|
$colspan++;
|
|
}
|
|
}
|
|
print '<tr><td colspan="' . $colspan . '"><span class="opacitymedium">' . $langs->trans("None") . '</span></td></tr>';
|
|
}
|
|
print "\n</table>\n";
|
|
print '</div>';
|
|
|
|
print '</form>' . "\n";
|
|
|
|
return $i;
|
|
}
|
|
|
|
|
|
/**
|
|
* Show html area with actions to do
|
|
*
|
|
* @param Conf $conf Object conf
|
|
* @param Translate $langs Object langs
|
|
* @param DoliDB $db Object db
|
|
* @param Adherent|Societe $filterobj Object thirdparty or member
|
|
* @param ?Contact $objcon Object contact
|
|
* @param int<0,1> $noprint Return string but does not output it
|
|
* @param string|string[] $actioncode Filter on actioncode
|
|
* @return ?string Return html part or null if noprint is 1
|
|
*/
|
|
function show_actions_todo($conf, $langs, $db, $filterobj, $objcon = null, $noprint = 0, $actioncode = '')
|
|
{
|
|
$out = show_actions_done($conf, $langs, $db, $filterobj, $objcon, 1, $actioncode, 'todo');
|
|
|
|
if ($noprint) {
|
|
return $out;
|
|
} else {
|
|
print $out;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Show html area with actions (done or not, ignore the name of function).
|
|
* Note: Global parameter $param must be defined.
|
|
*
|
|
* @param Conf $conf Object conf
|
|
* @param Translate $langs Object langs
|
|
* @param DoliDB $db Object db
|
|
* @param ?CommonObject $filterobj Filter on object Adherent|Societe|Project|Product|CommandeFournisseur|Dolresource|Ticket... to list events linked to an object
|
|
* @param ?Contact $objcon Filter on object contact to filter events on a contact
|
|
* @param int<0,1> $noprint Return string but does not output it
|
|
* @param string|string[] $actioncode Filter on actioncode
|
|
* @param 'done'|'todo'|'' $donetodo Filter on event 'done' or 'todo' or ''=nofilter (all).
|
|
* @param array<string,string|string[]> $filters Filter on other fields
|
|
* @param string $sortfield Sort field
|
|
* @param string $sortorder Sort order
|
|
* @param string $module You can add module name here if elementtype in table llx_actioncomm is objectkey@module
|
|
* @return ?string Return html part or void if noprint is 1
|
|
*/
|
|
function show_actions_done($conf, $langs, $db, $filterobj, $objcon = null, $noprint = 0, $actioncode = '', $donetodo = 'done', $filters = array(), $sortfield = 'a.datep,a.id', $sortorder = 'DESC', $module = '')
|
|
{
|
|
global $hookmanager;
|
|
global $form;
|
|
global $param, $massactionbutton;
|
|
|
|
$start_year = GETPOSTINT('dateevent_startyear');
|
|
$start_month = GETPOSTINT('dateevent_startmonth');
|
|
$start_day = GETPOSTINT('dateevent_startday');
|
|
$end_year = GETPOSTINT('dateevent_endyear');
|
|
$end_month = GETPOSTINT('dateevent_endmonth');
|
|
$end_day = GETPOSTINT('dateevent_endday');
|
|
$tms_start = '';
|
|
$tms_end = '';
|
|
|
|
if (!empty($start_year) && !empty($start_month) && !empty($start_day)) {
|
|
$tms_start = dol_mktime(0, 0, 0, $start_month, $start_day, $start_year, 'tzuserrel');
|
|
}
|
|
if (!empty($end_year) && !empty($end_month) && !empty($end_day)) {
|
|
$tms_end = dol_mktime(23, 59, 59, $end_month, $end_day, $end_year, 'tzuserrel');
|
|
}
|
|
if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
|
|
$tms_start = '';
|
|
$tms_end = '';
|
|
}
|
|
require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php';
|
|
|
|
// Check parameters
|
|
if (!is_object($filterobj) && !is_object($objcon)) {
|
|
dol_print_error(null, 'BadParameter');
|
|
}
|
|
|
|
$out = '';
|
|
$histo = array();
|
|
$numaction = 0;
|
|
$now = dol_now('tzuser');
|
|
|
|
// Open DSI -- Fix order by -- Begin
|
|
$sortfield_list = explode(',', $sortfield);
|
|
$sortfield_label_list = array('a.id' => 'id', 'a.datep' => 'dp', 'a.percent' => 'percent');
|
|
$sortfield_new_list = array();
|
|
foreach ($sortfield_list as $sortfield_value) {
|
|
$sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
|
|
}
|
|
$sortfield_new = implode(',', $sortfield_new_list);
|
|
|
|
$complete = (string) $filters['search_complete']; // Can be 'na', '0', '50', '100'
|
|
$percent = $complete !== '' ? $complete : -1;
|
|
if ((string) $complete == '0') {
|
|
$percent = '0';
|
|
} elseif ((int) $complete == 100) {
|
|
$percent = '100';
|
|
}
|
|
|
|
$sql = '';
|
|
|
|
if (isModEnabled('agenda')) {
|
|
// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
|
|
$hookmanager->initHooks(array('agendadao'));
|
|
|
|
$sql = "SELECT a.id, a.label as label,";
|
|
$sql .= " a.datep as dp,";
|
|
$sql .= " a.datep2 as dp2,";
|
|
$sql .= " a.percent as percent, 'action' as type,";
|
|
$sql .= " a.fk_element, a.elementtype,";
|
|
$sql .= " a.fk_contact,";
|
|
$sql .= " a.code,";
|
|
$sql .= " c.code as acode, c.libelle as alabel, c.picto as apicto,";
|
|
$sql .= " u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname";
|
|
if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
|
|
$sql .= ", sp.lastname, sp.firstname";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
|
|
/* Nothing */
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Project') {
|
|
/* Nothing */
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
|
|
$sql .= ", m.lastname, m.firstname";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
|
|
$sql .= ", o.ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
|
|
$sql .= ", o.ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
|
|
$sql .= ", o.ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
|
|
$sql .= ", o.ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
|
|
$sql .= ", o.ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Expedition') {
|
|
$sql .= ", s.ref";
|
|
} elseif (is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid']) && $filterobj->table_element && $filterobj->element) {
|
|
if (!empty($filterobj->fields['ref'])) {
|
|
$sql .= ", o.ref";
|
|
} elseif (!empty($filterobj->fields['label'])) {
|
|
$sql .= ", o.label";
|
|
}
|
|
}
|
|
|
|
// Fields from hook
|
|
$parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
|
|
$reshook = $hookmanager->executeHooks('showActionsDoneListSelect', $parameters); // Note that $action and $object may have been modified by hook
|
|
if (!empty($hookmanager->resPrint)) {
|
|
$sql .= $hookmanager->resPrint;
|
|
}
|
|
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "actioncomm as a";
|
|
// Link to the owner of action
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "user as u on u.rowid = a.fk_user_action";
|
|
// Link to action types
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_actioncomm as c ON a.fk_action = c.id";
|
|
|
|
// Set $force_filter_contact:
|
|
// - true for a filter on a user or a contact, so a link on table llx_actioncomm_resources or llx_actioncomm.fk_user_action
|
|
// - false for a link on table llx_element_resources
|
|
$force_filter_contact = false;
|
|
if (is_object($filterobj) && $filterobj->id > 0 && get_class($filterobj) == 'User') {
|
|
$force_filter_contact = true;
|
|
}
|
|
if (is_object($objcon) && $objcon->id > 0) {
|
|
$force_filter_contact = true;
|
|
}
|
|
|
|
// Fields from hook
|
|
$parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon);
|
|
$reshook = $hookmanager->executeHooks('showActionsDoneListFrom', $parameters); // Note that $action and $object may have been modified by hook
|
|
if (!empty($hookmanager->resPrint)) {
|
|
$sql .= $hookmanager->resPrint;
|
|
}
|
|
if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur'))) {
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "socpeople as sp ON a.fk_contact = sp.rowid";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
|
|
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . "element_resources as er";
|
|
$sql .= " ON er.resource_type = 'dolresource'";
|
|
$sql .= " AND er.element_type = 'action'";
|
|
$sql .= " AND er.element_id = a.id";
|
|
$sql .= " AND er.resource_id = " . ((int) $filterobj->id);
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Project') {
|
|
/* Nothing */
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
|
|
$sql .= ", " . MAIN_DB_PREFIX . "adherent as m";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
|
|
$sql .= ", " . MAIN_DB_PREFIX . "commande_fournisseur as o";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
|
|
$sql .= ", " . MAIN_DB_PREFIX . "product as o";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
|
|
$sql .= ", " . MAIN_DB_PREFIX . "ticket as o";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
|
|
$sql .= ", " . MAIN_DB_PREFIX . "bom_bom as o";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
|
|
$sql .= ", " . MAIN_DB_PREFIX . "contrat as o";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Expedition') {
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "expedition as s ON a.fk_element = s.rowid AND a.elementtype = 'shipping'"; // Jointure sur la table des expéditions avec condition ON
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Propal') {
|
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "propal as o ON a.fk_element = o.rowid AND a.elementtype = 'propal'";
|
|
} elseif (
|
|
is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid'])
|
|
&& ((!empty($filterobj->fields['ref']) && is_array($filterobj->fields['ref'])) || (!empty($filterobj->fields['label']) && is_array($filterobj->fields['label'])) || (!empty($filterobj->fields['titre']) && is_array($filterobj->fields['titre']))) // @phan-suppress-current-line PhanTypeInvalidDimOffset
|
|
&& $filterobj->table_element && $filterobj->element
|
|
) {
|
|
$sql .= ", " . MAIN_DB_PREFIX . $filterobj->table_element . " as o";
|
|
}
|
|
|
|
$sql .= " WHERE a.entity IN (" . getEntity('agenda') . ")";
|
|
if (!$force_filter_contact) {
|
|
if (is_object($filterobj) && in_array(get_class($filterobj), array('Societe', 'Client', 'Fournisseur')) && $filterobj->id) {
|
|
$sql .= " AND a.fk_soc = " . ((int) $filterobj->id);
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Dolresource') {
|
|
/* Nothing */
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Project' && $filterobj->id) {
|
|
$sql .= " AND a.fk_project = " . ((int) $filterobj->id);
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
|
|
$sql .= " AND a.fk_element = m.rowid AND a.elementtype = 'member'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Commande') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'order'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Facture') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'invoice'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'FactureFournisseur') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'invoice_supplier'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'product'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Contrat') {
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Expedition') {
|
|
$sql .= " AND a.fk_element = s.rowid AND a.elementtype = 'shipping'"; //expedition filter
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (
|
|
is_object($filterobj) && is_array($filterobj->fields) && is_array($filterobj->fields['rowid'])
|
|
&& ((!empty($filterobj->fields['ref']) && is_array($filterobj->fields['ref'])) || (!empty($filterobj->fields['label']) && is_array($filterobj->fields['label'])) || (!empty($filterobj->fields['titre']) && is_array($filterobj->fields['titre']))) // ref, titre, label do not exist on $fields - @phan-suppress-current-line PhanTypeInvalidDimOffset
|
|
&& $filterobj->table_element && $filterobj->element
|
|
) {
|
|
// Generic case (if there is a $filterobj and a field rowid and (ref or label) exists.
|
|
$sql .= " AND a.fk_element = o.rowid AND a.elementtype = '" . $db->escape($filterobj->element) . ($module ? "@" . $module : "") . "'";
|
|
if ($filterobj->id) {
|
|
$sql .= " AND a.fk_element = " . ((int) $filterobj->id);
|
|
}
|
|
} elseif (is_object($filterobj)) {
|
|
return 'Bad value for $filterobj';
|
|
}
|
|
} else {
|
|
if (is_object($filterobj) && $filterobj->id > 0 && get_class($filterobj) == 'User') {
|
|
$sql .= " AND (u.rowid = " . ((int) $filterobj->id) . ' OR ';
|
|
$sql .= " EXISTS (SELECT r.rowid FROM " . MAIN_DB_PREFIX . "actioncomm_resources as r WHERE a.id = r.fk_actioncomm";
|
|
$sql .= " AND r.element_type = '" . $db->escape($filterobj->table_element) . "' AND r.fk_element = " . ((int) $filterobj->id) . ')';
|
|
$sql .= ")";
|
|
}
|
|
if (is_object($objcon) && $objcon->id > 0) {
|
|
$sql .= " AND EXISTS (SELECT r.rowid FROM " . MAIN_DB_PREFIX . "actioncomm_resources as r WHERE a.id = r.fk_actioncomm";
|
|
$sql .= " AND r.element_type = '" . $db->escape($objcon->table_element) . "' AND r.fk_element = " . ((int) $objcon->id) . ')';
|
|
}
|
|
}
|
|
|
|
if (!empty($tms_start) && !empty($tms_end)) {
|
|
$sql .= " AND ((a.datep BETWEEN '" . $db->idate($tms_start) . "' AND '" . $db->idate($tms_end) . "') OR (a.datep2 BETWEEN '" . $db->idate($tms_start) . "' AND '" . $db->idate($tms_end) . "'))";
|
|
} elseif (empty($tms_start) && !empty($tms_end)) {
|
|
$sql .= " AND ((a.datep <= '" . $db->idate($tms_end) . "') OR (a.datep2 <= '" . $db->idate($tms_end) . "'))";
|
|
} elseif (!empty($tms_start) && empty($tms_end)) {
|
|
$sql .= " AND ((a.datep >= '" . $db->idate($tms_start) . "') OR (a.datep2 >= '" . $db->idate($tms_start) . "'))";
|
|
}
|
|
|
|
if (is_array($actioncode) && !empty($actioncode)) {
|
|
$tmpsql = '';
|
|
|
|
foreach ($actioncode as $key => $code) {
|
|
if ((string) $code === '-1' || (string) $code === '') {
|
|
continue;
|
|
}
|
|
if ($key != 0) {
|
|
$tmpsql .= " OR ";
|
|
}
|
|
if (!empty($code)) {
|
|
addEventTypeSQL($tmpsql, $code, "");
|
|
}
|
|
}
|
|
if ($tmpsql) {
|
|
$sql .= ' AND (';
|
|
$sql .= $tmpsql;
|
|
$sql .= ')';
|
|
}
|
|
} elseif (!empty($actioncode) && $actioncode != '-1') {
|
|
addEventTypeSQL($sql, $actioncode);
|
|
}
|
|
|
|
addOtherFilterSQL($sql, $donetodo, $now, $filters);
|
|
|
|
// Fields from hook
|
|
$parameters = array('sql' => &$sql, 'filterobj' => $filterobj, 'objcon' => $objcon, 'module' => $module);
|
|
$reshook = $hookmanager->executeHooks('showActionsDoneListWhere', $parameters); // Note that $action and $object may have been modified by hook
|
|
if (!empty($hookmanager->resPrint)) {
|
|
$sql .= $hookmanager->resPrint;
|
|
}
|
|
|
|
// Now add events of emailing module
|
|
if (is_array($actioncode) && $objcon !== null) {
|
|
foreach ($actioncode as $code) {
|
|
$sql2 = addMailingEventTypeSQL($code, $objcon, $filterobj);
|
|
if (!empty($sql2)) {
|
|
if (!empty($sql)) {
|
|
$sql = $sql . " UNION " . $sql2;
|
|
} elseif (empty($sql)) {
|
|
$sql = $sql2;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
$sql2 = addMailingEventTypeSQL($actioncode, $objcon, $filterobj);
|
|
if (!empty($sql) && !empty($sql2)) {
|
|
$sql = $sql . " UNION " . $sql2;
|
|
} elseif (empty($sql) && !empty($sql2)) {
|
|
$sql = $sql2;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($sql) {
|
|
//TODO Add navigation with this limits...
|
|
$offset = 0;
|
|
$limit = 1000;
|
|
|
|
// Complete request and execute it with limit
|
|
$sql .= $db->order($sortfield_new, $sortorder);
|
|
if ($limit) { // @phpstan-ignore-line
|
|
$sql .= $db->plimit($limit + 1, $offset);
|
|
}
|
|
|
|
dol_syslog("company.lib::show_actions_done", LOG_DEBUG);
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$i = 0;
|
|
$num = $db->num_rows($resql);
|
|
|
|
$imaxinloop = ($limit ? min($num, $limit) : $num);
|
|
while ($i < $imaxinloop) {
|
|
$obj = $db->fetch_object($resql);
|
|
if (empty($obj)) {
|
|
break;
|
|
}
|
|
|
|
if ($obj->type == 'action') {
|
|
$contactaction = new ActionComm($db);
|
|
$contactaction->id = $obj->id;
|
|
$result = $contactaction->fetchResources();
|
|
if ($result < 0) {
|
|
dol_print_error($db);
|
|
setEventMessage("company.lib::show_actions_done Error fetch resource", 'errors');
|
|
}
|
|
|
|
//if ($donetodo == 'todo') $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now)."'))";
|
|
//elseif ($donetodo == 'done') $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now)."'))";
|
|
$tododone = '';
|
|
if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && (!empty($obj->datep) && $obj->datep > $now))) {
|
|
$tododone = 'todo';
|
|
}
|
|
|
|
$histo[$numaction] = array(
|
|
'type' => $obj->type,
|
|
'tododone' => $tododone,
|
|
'id' => (int) $obj->id,
|
|
'datestart' => $db->jdate($obj->dp),
|
|
'dateend' => $db->jdate($obj->dp2),
|
|
'note' => $obj->label,
|
|
'percent' => (int) $obj->percent,
|
|
|
|
'userid' => (int) $obj->user_id,
|
|
'login' => $obj->user_login,
|
|
'userfirstname' => $obj->user_firstname,
|
|
'userlastname' => $obj->user_lastname,
|
|
'userphoto' => $obj->user_photo,
|
|
|
|
'contact_id' => (int) $obj->fk_contact,
|
|
'socpeopleassigned' => $contactaction->socpeopleassigned,
|
|
'lastname' => empty($obj->lastname) ? '' : $obj->lastname,
|
|
'firstname' => empty($obj->firstname) ? '' : $obj->firstname,
|
|
'fk_element' => (int) $obj->fk_element,
|
|
'elementtype' => $obj->elementtype,
|
|
|
|
'code' => $obj->code,
|
|
|
|
// Type of event
|
|
'acode' => $obj->acode,
|
|
'alabel' => $obj->alabel,
|
|
'libelle' => $obj->alabel, // deprecated
|
|
'apicto' => $obj->apicto
|
|
);
|
|
} else {
|
|
$histo[$numaction] = array(
|
|
'type' => $obj->type,
|
|
'tododone' => 'done',
|
|
'id' => (int) $obj->id,
|
|
'datestart' => $db->jdate($obj->dp),
|
|
'dateend' => $db->jdate($obj->dp2),
|
|
'note' => $obj->label,
|
|
'percent' => (int) $obj->percent,
|
|
|
|
'code' => $obj->code,
|
|
|
|
// Type of event
|
|
'acode' => $obj->acode,
|
|
|
|
'userid' => (int) $obj->user_id,
|
|
'login' => $obj->user_login,
|
|
'userfirstname' => $obj->user_firstname,
|
|
'userlastname' => $obj->user_lastname,
|
|
'userphoto' => $obj->user_photo
|
|
);
|
|
}
|
|
|
|
$numaction++;
|
|
$i++;
|
|
}
|
|
} else {
|
|
dol_print_error($db);
|
|
}
|
|
}
|
|
|
|
'@phan-var-force array<int,array{userid:int,type:string,tododone:string,apicto:string,acode:string,alabel:string,note:string,id:int,percent:int<0,100>,datestart:int,dateend:int,fk_element:string,elementtype:string,contact_id:int,lastname:string,firstname:string,contact_photo:string,socpeopleassigned:int[],login:string,userfirstname:string,userlastname:string,userphoto:string}> $histo';
|
|
|
|
if (isModEnabled('agenda') || (isModEnabled('mailing') && !empty($objcon->email))) {
|
|
$delay_warning = getDolGlobalInt('MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
|
|
|
|
require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php';
|
|
include_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php';
|
|
|
|
$formactions = new FormActions($db);
|
|
|
|
$actionstatic = new ActionComm($db);
|
|
$userstatic = new User($db);
|
|
$userlinkcache = array();
|
|
$contactstatic = new Contact($db);
|
|
$elementlinkcache = array();
|
|
|
|
$out .= '<form name="listactionsfilter" class="listactionsfilter" action="' . $_SERVER["PHP_SELF"] . '" method="POST">';
|
|
$out .= '<input type="hidden" name="token" value="' . newToken() . '">';
|
|
if (
|
|
$objcon && get_class($objcon) == 'Contact' &&
|
|
(is_null($filterobj) || get_class($filterobj) == 'Societe')
|
|
) {
|
|
$out .= '<input type="hidden" name="id" value="' . $objcon->id . '" />';
|
|
} else {
|
|
$out .= '<input type="hidden" name="id" value="' . $filterobj->id . '" />';
|
|
}
|
|
if ($filterobj && get_class($filterobj) == 'Societe') {
|
|
$out .= '<input type="hidden" name="socid" value="' . $filterobj->id . '" />';
|
|
} else {
|
|
$out .= '<input type="hidden" name="userid" value="' . $filterobj->id . '" />';
|
|
}
|
|
|
|
$out .= "\n";
|
|
|
|
$out .= '<div class="div-table-responsive-no-min">';
|
|
$out .= '<table class="noborder centpercent">';
|
|
|
|
$out .= '<tr class="liste_titre_filter">';
|
|
|
|
// Action column
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
$out .= '<th class="liste_titre width50 middle">';
|
|
$searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
|
|
$out .= $searchpicto;
|
|
$out .= '</th>';
|
|
}
|
|
|
|
if ($donetodo) {
|
|
$out .= '<td class="liste_titre"></td>';
|
|
}
|
|
|
|
// ID
|
|
$out .= '<td class="liste_titre"><input type="text" class="width50" name="search_rowid" value="' . (isset($filters['search_rowid']) ? $filters['search_rowid'] : '') . '"></td>';
|
|
// Date
|
|
$out .= '<td class="liste_titre center">';
|
|
$out .= $form->selectDateToDate($tms_start, $tms_end, 'dateevent', 1);
|
|
$out .= '</td>';
|
|
// Owner
|
|
$out .= '<td class="liste_titre"></td>';
|
|
// Type
|
|
$out .= '<td class="liste_titre">';
|
|
$out .= $formactions->select_type_actions($actioncode, "actioncode", '', getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, (getDolGlobalString('AGENDA_USE_MULTISELECT_TYPE') ? 1 : 0), 1, 'selecttype combolargeelem minwidth100 maxwidth150', 1);
|
|
$out .= '</td>';
|
|
// Label
|
|
$out .= '<td class="liste_titre maxwidth100onsmartphone"><input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="' . $filters['search_agenda_label'] . '"></td>';
|
|
$out .= '<td class="liste_titre"></td>';
|
|
$out .= '<td class="liste_titre"></td>';
|
|
// Status ($percent can be 'na'or < 100 or 100)
|
|
$out .= '<td class="liste_titre parentonrightofpage">';
|
|
$out .= $formactions->form_select_status_action('formaction', $percent, 1, 'search_complete', 1, 2, 'search_status width100 onrightofpage', 1);
|
|
$out .= '</td>';
|
|
// Action column
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
$out .= '<td class="liste_titre" align="middle">';
|
|
$searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
|
|
$out .= $searchpicto;
|
|
$out .= '</td>';
|
|
}
|
|
$out .= '</tr>';
|
|
|
|
$out .= '<tr class="liste_titre">';
|
|
// Action column
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
$out .= getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'maxwidthsearch ');
|
|
}
|
|
if ($donetodo && $filterobj !== null) {
|
|
$tmp = '';
|
|
if (get_class($filterobj) == 'Societe') {
|
|
$tmp .= '<a href="' . DOL_URL_ROOT . '/comm/action/list.php?mode=show_list&socid=' . $filterobj->id . '&status=done">';
|
|
}
|
|
if (get_class($filterobj) == 'User') {
|
|
$tmp .= '<a href="' . DOL_URL_ROOT . '/comm/action/list.php?mode=show_list&userid=' . $filterobj->id . '&status=done">';
|
|
}
|
|
$tmp .= ($donetodo != 'done' ? $langs->trans("ActionsToDoShort") : '');
|
|
$tmp .= ($donetodo != 'done' && $donetodo != 'todo' ? ' / ' : '');
|
|
$tmp .= ($donetodo != 'todo' ? $langs->trans("ActionsDoneShort") : '');
|
|
//$out.=$langs->trans("ActionsToDoShort").' / '.$langs->trans("ActionsDoneShort");
|
|
if (get_class($filterobj) == 'Societe') {
|
|
$tmp .= '</a>';
|
|
}
|
|
if (get_class($filterobj) == 'User') {
|
|
$tmp .= '</a>';
|
|
}
|
|
$out .= getTitleFieldOfList($tmp);
|
|
}
|
|
$out .= getTitleFieldOfList("Ref", 0, $_SERVER["PHP_SELF"], 'a.id', '', $param, '', $sortfield, $sortorder);
|
|
$out .= getTitleFieldOfList("Date", 0, $_SERVER["PHP_SELF"], 'a.datep,a.id', '', $param, '', $sortfield, $sortorder, 'center ');
|
|
$out .= getTitleFieldOfList("Owner");
|
|
$out .= getTitleFieldOfList("Type");
|
|
$out .= getTitleFieldOfList("Label", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
|
|
$out .= getTitleFieldOfList("RelatedObjects", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
|
|
$out .= getTitleFieldOfList("ActionOnContact", 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'tdoverflowmax125 ', 0, '', 0);
|
|
$out .= getTitleFieldOfList("Status", 0, $_SERVER["PHP_SELF"], 'a.percent', '', $param, '', $sortfield, $sortorder, 'center ');
|
|
// Action column
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
$out .= getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'maxwidthsearch ');
|
|
}
|
|
$out .= '</tr>';
|
|
|
|
require_once DOL_DOCUMENT_ROOT . '/comm/action/class/cactioncomm.class.php';
|
|
$caction = new CActionComm($db);
|
|
$arraylist = $caction->liste_array(1, 'code', '', (getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? 0 : 1), '', 1);
|
|
|
|
foreach ($histo as $key => $value) {
|
|
$actionstatic->fetch($histo[$key]['id']); // TODO Do we need this, we already have a lot of data of line into $histo
|
|
|
|
if (empty($actionstatic->code)) {
|
|
$actionstatic->code = $histo[$key]['acode'];
|
|
}
|
|
$actionstatic->type_picto = $histo[$key]['apicto'] ?? '';
|
|
$actionstatic->type_code = $histo[$key]['acode'];
|
|
|
|
$out .= '<tr class="oddeven">';
|
|
|
|
// Action column
|
|
if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
$out .= '<td></td>';
|
|
}
|
|
|
|
// Done or todo
|
|
if ($donetodo) {
|
|
$out .= '<td class="nowrap">';
|
|
$out .= '</td>';
|
|
}
|
|
|
|
// Ref
|
|
$out .= '<td class="nowraponall">';
|
|
if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
|
|
$out .= '<a href="' . DOL_URL_ROOT . '/comm/mailing/card.php?id=' . $histo[$key]['id'] . '">' . img_object($langs->trans("ShowEMailing"), "email") . ' ';
|
|
$out .= $histo[$key]['id'];
|
|
$out .= '</a>';
|
|
} else {
|
|
$out .= $actionstatic->getNomUrl(1, -1);
|
|
}
|
|
$out .= '</td>';
|
|
|
|
// Date
|
|
$out .= '<td class="center nowraponall nopaddingtopimp nopaddingbottomimp">';
|
|
if ($histo[$key]['dateend']) { // There is also a end date
|
|
$tmpa = dol_getdate($histo[$key]['datestart']);
|
|
$tmpb = dol_getdate($histo[$key]['dateend']);
|
|
if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
|
|
// The same day
|
|
if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes']) {
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'dayreduceformat', 'tzuserrel');
|
|
$out .= '<br><span class="small opacitymedium">';
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'hourreduceformat', 'tzuserrel');
|
|
$out .= '-'.dol_print_date($histo[$key]['dateend'], 'hourreduceformat', 'tzuserrel');
|
|
$out .= '</span>';
|
|
} else {
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'dayreduceformat', 'tzuserrel');
|
|
$out .= '<br><span class="small opacitymedium">';
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'hourreduceformat', 'tzuserrel');
|
|
$out .= '</span>';
|
|
}
|
|
} else {
|
|
// Not the same day
|
|
$out .= '<div class="center inline-block">';
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'dayreduceformat', 'tzuserrel');
|
|
$out .= '<br><span class="small opacitymedium">';
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'hourreduceformat', 'tzuserrel');
|
|
$out .= '</span>';
|
|
$out .= '</div>';
|
|
$out .= ' ';
|
|
$out .= '<div class="center inline-block">';
|
|
$out .= dol_print_date($histo[$key]['dateend'], 'dayreduceformat', 'tzuserrel');
|
|
$out .= '<br><span class="small opacitymedium">';
|
|
$out .= dol_print_date($histo[$key]['dateend'], 'hourreduceformat', 'tzuserrel');
|
|
$out .= '</span>';
|
|
$out .= '</div>';
|
|
}
|
|
}
|
|
// Add the late warning
|
|
$late = 0;
|
|
if ($histo[$key]['percent'] == 0 && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($histo[$key]['percent'] == 0 && !$histo[$key]['datestart'] && $histo[$key]['dateend'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && $histo[$key]['dateend'] && $histo[$key]['dateend'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && !$histo[$key]['dateend'] && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($late) {
|
|
$out .= img_warning($langs->trans("Late")) . ' ';
|
|
}
|
|
$out .= '</td>';
|
|
|
|
/*
|
|
$out .= '<td class="center nowraponall">';
|
|
$out .= dol_print_date($histo[$key]['datestart'], 'dayhour', 'tzuserrel');
|
|
if ($histo[$key]['dateend'] && $histo[$key]['dateend'] != $histo[$key]['datestart']) {
|
|
$tmpa = dol_getdate($histo[$key]['datestart'], true);
|
|
$tmpb = dol_getdate($histo[$key]['dateend'], true);
|
|
if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
|
|
$out .= '-' . dol_print_date($histo[$key]['dateend'], 'hour', 'tzuserrel');
|
|
} else {
|
|
$out .= '-' . dol_print_date($histo[$key]['dateend'], 'dayhour', 'tzuserrel');
|
|
}
|
|
}
|
|
// Add the late warning
|
|
$late = 0;
|
|
if ($histo[$key]['percent'] == 0 && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($histo[$key]['percent'] == 0 && !$histo[$key]['datestart'] && $histo[$key]['dateend'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && $histo[$key]['dateend'] && $histo[$key]['dateend'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($histo[$key]['percent'] > 0 && $histo[$key]['percent'] < 100 && !$histo[$key]['dateend'] && $histo[$key]['datestart'] && $histo[$key]['datestart'] < ($now - $delay_warning)) {
|
|
$late = 1;
|
|
}
|
|
if ($late) {
|
|
$out .= img_warning($langs->trans("Late")) . ' ';
|
|
}
|
|
$out .= "</td>\n";
|
|
*/
|
|
|
|
// Author of event
|
|
$out .= '<td class="tdoverflowmax125">';
|
|
if ($histo[$key]['userid'] > 0) {
|
|
if (isset($userlinkcache[$histo[$key]['userid']])) {
|
|
$link = $userlinkcache[$histo[$key]['userid']];
|
|
} else {
|
|
$userstatic->fetch($histo[$key]['userid']);
|
|
$link = $userstatic->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
|
|
$userlinkcache[$histo[$key]['userid']] = $link;
|
|
}
|
|
$out .= $link;
|
|
}
|
|
$out .= '</td>';
|
|
|
|
// type_code // column "acode" in the sql = code in type of actioncomm, example: AC_OTH_AUTO, AC_EMAILING
|
|
// code // columne code in the sql (not yet added), can be AC_CONTACT_SENTBYMAIL, ...
|
|
|
|
// Type
|
|
$labelOfTypeToShow = $actionstatic->type_code;
|
|
//$typelabel = $actionstatic->type_label;
|
|
$code = $actionstatic->code;
|
|
if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labelOfTypeToShow])) {
|
|
$labelOfTypeToShow = 'AC_OTH';
|
|
}
|
|
if (!empty($actionstatic->code) && preg_match('/^TICKET_MSG/', $actionstatic->code)) {
|
|
$labelOfTypeToShow = $langs->trans("Message");
|
|
} else {
|
|
if (!empty($arraylist[$labelOfTypeToShow])) {
|
|
$labelOfTypeToShow = $arraylist[$labelOfTypeToShow];
|
|
} elseif ($actionstatic->type_code == 'AC_EMAILING') {
|
|
$langs->load("mails");
|
|
$labelOfTypeToShow = $langs->trans("Emailing");
|
|
}
|
|
if ($actionstatic->type_code == 'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labelOfTypeToShow && !empty($arraylist[$actionstatic->code])) {
|
|
$labelOfTypeToShow .= ' - ' . $arraylist[$actionstatic->code]; // Show also detailed code
|
|
}
|
|
}
|
|
|
|
$labelOfTypeToShowLong = $labelOfTypeToShow;
|
|
if ($actionstatic->type_code == 'AC_OTH_AUTO') {
|
|
$labelOfTypeToShowLong .= ' (auto)';
|
|
}
|
|
|
|
$out .= '<td class="tdoverflowmax125" title="' . $labelOfTypeToShowLong . '">';
|
|
$out .= $actionstatic->getTypePicto();
|
|
$out .= $labelOfTypeToShow;
|
|
$out .= '</td>';
|
|
|
|
// Title/Label of event
|
|
$out .= '<td class="tdoverflowmax300"';
|
|
if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'action') {
|
|
$transcode = $langs->trans("Action" . $histo[$key]['acode']);
|
|
//$libelle = ($transcode != "Action".$histo[$key]['acode'] ? $transcode : $histo[$key]['alabel']);
|
|
$label = $histo[$key]['note'];
|
|
$actionstatic->id = $histo[$key]['id'];
|
|
$out .= ' title="' . dol_escape_htmltag($label) . '">';
|
|
$out .= dol_trunc($label, 120);
|
|
}
|
|
if (isset($histo[$key]['type']) && $histo[$key]['type'] == 'mailing') {
|
|
$transcode = $langs->trans("Action" . $histo[$key]['acode']);
|
|
$label = ($transcode != "Action" . $histo[$key]['acode'] ? $transcode : 'Send mass mailing');
|
|
$label .= ' - ' . $histo[$key]['note'];
|
|
$out .= '<a href="' . DOL_URL_ROOT . '/comm/mailing/card.php?id=' . $histo[$key]['id'] . '"';
|
|
$out .= ' title="' . dol_escape_htmltag($label) . '">';
|
|
//$out .= img_object($langs->trans("EMailing").'<br>'.$histo[$key]['note'], "email").' ';
|
|
$out .= dol_trunc($label, 120);
|
|
$out .= '</a>';
|
|
}
|
|
$out .= '</td>';
|
|
|
|
// Linked object
|
|
$out .= '<td class="tdoverflowmax200 nowraponall">';
|
|
if (isset($histo[$key]['elementtype']) && !empty($histo[$key]['fk_element'])) {
|
|
if (isset($elementlinkcache[$histo[$key]['elementtype']]) && isset($elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']])) {
|
|
$link = $elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']];
|
|
} else {
|
|
if (!isset($elementlinkcache[$histo[$key]['elementtype']])) {
|
|
$elementlinkcache[$histo[$key]['elementtype']] = array();
|
|
}
|
|
$link = dolGetElementUrl((int) $histo[$key]['fk_element'], $histo[$key]['elementtype'], 1);
|
|
$elementlinkcache[$histo[$key]['elementtype']][$histo[$key]['fk_element']] = $link;
|
|
}
|
|
$out .= $link;
|
|
}
|
|
$out .= '</td>';
|
|
|
|
// Contact(s) for action
|
|
if (isset($histo[$key]['socpeopleassigned']) && is_array($histo[$key]['socpeopleassigned']) && count($histo[$key]['socpeopleassigned']) > 0) {
|
|
$out .= '<td class="valignmiddle">';
|
|
$contact = new Contact($db);
|
|
foreach ($histo[$key]['socpeopleassigned'] as $cid => $cvalue) {
|
|
$result = $contact->fetch($cid);
|
|
|
|
if ($result < 0) {
|
|
dol_print_error($db, $contact->error);
|
|
}
|
|
|
|
if ($result > 0) {
|
|
$out .= $contact->getNomUrl(-3, '', 10, '', -1, 0, 'paddingright');
|
|
if (isset($histo[$key]['acode']) && $histo[$key]['acode'] == 'AC_TEL') {
|
|
if (!empty($contact->phone_pro)) {
|
|
$out .= '(' . dol_print_phone($contact->phone_pro) . ')';
|
|
}
|
|
}
|
|
$out .= '<div class="paddingright"></div>';
|
|
}
|
|
}
|
|
$out .= '</td>';
|
|
} elseif (empty($objcon->id) && isset($histo[$key]['contact_id']) && $histo[$key]['contact_id'] > 0) {
|
|
$contactstatic->lastname = $histo[$key]['lastname'];
|
|
$contactstatic->firstname = $histo[$key]['firstname'];
|
|
$contactstatic->id = $histo[$key]['contact_id'];
|
|
$contactstatic->photo = $histo[$key]['contact_photo'];
|
|
$out .= '<td width="120">' . $contactstatic->getNomUrl(-1, '', 10) . '</td>';
|
|
} else {
|
|
$out .= '<td> </td>';
|
|
}
|
|
|
|
// Status / Progression
|
|
$out .= '<td class="nowrap center">';
|
|
$out .= $actionstatic->LibStatut($histo[$key]['percent'], 2, 0, $histo[$key]['datestart']);
|
|
$out .= '</td>';
|
|
|
|
// Action column
|
|
if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
|
|
$out .= '<td></td>';
|
|
}
|
|
|
|
$out .= "</tr>\n";
|
|
}
|
|
if (empty($histo)) {
|
|
$colspan = 9;
|
|
$out .= '<tr><td colspan="' . $colspan . '"><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
|
|
}
|
|
|
|
$out .= "</table>\n";
|
|
$out .= "</div>\n";
|
|
|
|
$out .= '</form>';
|
|
}
|
|
|
|
if ($noprint) {
|
|
return $out;
|
|
} else {
|
|
print $out;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Show html area for list of subsidiaries
|
|
*
|
|
* @param Conf $conf Object conf
|
|
* @param Translate $langs Object langs
|
|
* @param DoliDB $db Database handler
|
|
* @param Societe $object Third party object
|
|
* @return int
|
|
*/
|
|
function show_subsidiaries($conf, $langs, $db, $object)
|
|
{
|
|
$i = -1;
|
|
|
|
$sql = "SELECT s.rowid, s.client, s.fournisseur, s.nom as name, s.name_alias, s.email, s.address, s.zip, s.town, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur, s.canvas, s.status";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s";
|
|
$sql .= " WHERE s.parent = " . ((int) $object->id);
|
|
$sql .= " AND s.entity IN (" . getEntity('societe') . ")";
|
|
$sql .= " ORDER BY s.nom";
|
|
|
|
$result = $db->query($sql);
|
|
$num = $db->num_rows($result);
|
|
|
|
if ($num) {
|
|
$socstatic = new Societe($db);
|
|
|
|
print load_fiche_titre($langs->trans("Subsidiaries"), '', '');
|
|
|
|
print "\n" . '<div class="div-table-responsive-no-min">' . "\n";
|
|
print '<table class="noborder centpercent">' . "\n";
|
|
|
|
print '<tr class="liste_titre"><td>' . $langs->trans("Company") . '</td>';
|
|
print '<td>' . $langs->trans("Address") . '</td><td>' . $langs->trans("Zip") . '</td>';
|
|
print '<td>' . $langs->trans("Town") . '</td><td>' . $langs->trans("CustomerCode") . '</td>';
|
|
print "<td> </td>";
|
|
print "</tr>";
|
|
|
|
$i = 0;
|
|
|
|
while ($i < $num) {
|
|
$obj = $db->fetch_object($result);
|
|
|
|
$socstatic->id = $obj->rowid;
|
|
$socstatic->name = $obj->name;
|
|
$socstatic->name_alias = $obj->name_alias;
|
|
$socstatic->email = $obj->email;
|
|
$socstatic->code_client = $obj->code_client;
|
|
$socstatic->code_fournisseur = $obj->code_fournisseur;
|
|
$socstatic->code_compta = $obj->code_compta;
|
|
$socstatic->code_compta_client = $obj->code_compta;
|
|
$socstatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
|
|
$socstatic->email = $obj->email;
|
|
$socstatic->canvas = $obj->canvas;
|
|
$socstatic->client = $obj->client;
|
|
$socstatic->fournisseur = $obj->fournisseur;
|
|
$socstatic->status = $obj->status;
|
|
|
|
print '<tr class="oddeven">';
|
|
|
|
print '<td class="tdoverflowmax150">';
|
|
print $socstatic->getNomUrl(1);
|
|
print '</td>';
|
|
|
|
print '<td class="tdoverflowmax400" title="' . dol_escape_htmltag($obj->address) . '">' . dol_escape_htmltag($obj->address) . '</td>';
|
|
print '<td class="tdoverflowmax100" title="' . dol_escape_htmltag($obj->zip) . '">' . $obj->zip . '</td>';
|
|
print '<td class="tdoverflowmax200" title="' . dol_escape_htmltag($obj->town) . '">' . $obj->town . '</td>';
|
|
print '<td class="tdoverflowmax200" title="' . dol_escape_htmltag($obj->code_client) . '">' . $obj->code_client . '</td>';
|
|
|
|
print '<td class="center">';
|
|
print '<a class="editfielda" href="' . DOL_URL_ROOT . '/societe/card.php?socid=' . ((int) $obj->rowid) . '&action=edit&token=' . newToken() . '">';
|
|
print img_edit();
|
|
print '</a></td>';
|
|
|
|
print "</tr>\n";
|
|
$i++;
|
|
}
|
|
print "\n</table>\n";
|
|
print '</div>' . "\n";
|
|
}
|
|
|
|
print "<br>\n";
|
|
|
|
return $i;
|
|
}
|
|
/**
|
|
* Add Event Type SQL
|
|
*
|
|
* @param string $sql $sql modified
|
|
* @param string $actioncode Action code
|
|
* @param 'AND'|'OR'|'' $sqlANDOR "AND", "OR" or "" sql condition
|
|
* @return string sql request
|
|
*/
|
|
function addEventTypeSQL(&$sql, $actioncode, $sqlANDOR = "AND")
|
|
{
|
|
global $db;
|
|
|
|
// Condition on actioncode
|
|
|
|
if ((string) $actioncode == '-1') {
|
|
return $sql;
|
|
}
|
|
|
|
if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
|
|
if ($actioncode == 'AC_NON_AUTO') {
|
|
$sql .= " $sqlANDOR c.type <> 'systemauto'";
|
|
} elseif ($actioncode == 'AC_ALL_AUTO') {
|
|
$sql .= " $sqlANDOR c.type = 'systemauto'";
|
|
} else {
|
|
if ($actioncode == 'AC_OTH') {
|
|
$sql .= " $sqlANDOR c.type <> 'systemauto'";
|
|
} elseif ($actioncode == 'AC_OTH_AUTO') {
|
|
$sql .= " $sqlANDOR c.type = 'systemauto'";
|
|
}
|
|
}
|
|
} else {
|
|
if ($actioncode == 'AC_NON_AUTO') {
|
|
$sql .= " $sqlANDOR c.type <> 'systemauto'";
|
|
} elseif ($actioncode == 'AC_ALL_AUTO') {
|
|
$sql .= " $sqlANDOR c.type = 'systemauto'";
|
|
} else {
|
|
$sql .= " $sqlANDOR c.code = '" . $db->escape($actioncode) . "'";
|
|
}
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
|
|
/**
|
|
* Add more SQL filters for event list
|
|
*
|
|
* @param string $sql $sql modified
|
|
* @param string $donetodo donetodo
|
|
* @param int $now now
|
|
* @param array<string,string|string[]> $filters array
|
|
* @return string SQL request
|
|
*/
|
|
function addOtherFilterSQL(&$sql, $donetodo, $now, $filters)
|
|
{
|
|
global $db;
|
|
|
|
if ($donetodo == 'todo') {
|
|
$sql .= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '" . $db->idate($now) . "'))";
|
|
} elseif ($donetodo == 'done') {
|
|
$sql .= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '" . $db->idate($now) . "'))";
|
|
}
|
|
if (is_array($filters) && isset($filters['search_complete']) && $filters['search_complete'] === 'na') {
|
|
$sql .= " AND a.percent = -1";
|
|
}
|
|
if (is_array($filters) && isset($filters['search_complete']) && $filters['search_complete'] === '0') {
|
|
$sql .= " AND a.percent = 0";
|
|
}
|
|
if (is_array($filters) && isset($filters['search_complete']) && $filters['search_complete'] === '50') {
|
|
$sql .= " AND a.percent > 0 AND a.percent < 100";
|
|
}
|
|
if (is_array($filters) && isset($filters['search_complete']) && $filters['search_complete'] === 'todo') {
|
|
$sql .= " AND a.percent >= 0 AND a.percent < 100";
|
|
}
|
|
if (is_array($filters) && isset($filters['search_complete']) && $filters['search_complete'] === '100') {
|
|
$sql .= " AND a.percent = 100";
|
|
}
|
|
if (is_array($filters) && !empty($filters['search_agenda_label'])) {
|
|
$sql .= natural_search('a.label', $filters['search_agenda_label']);
|
|
}
|
|
if (is_array($filters) && !empty($filters['search_rowid'])) {
|
|
$sql .= natural_search('a.id', $filters['search_rowid'], 1);
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
|
|
/**
|
|
* Add Mailing Event Type SQL
|
|
*
|
|
* @param string $actioncode Action code
|
|
* @param Object $objcon objcon
|
|
* @param ?Object $filterobj filterobj
|
|
* @return string
|
|
*/
|
|
function addMailingEventTypeSQL($actioncode, $objcon, $filterobj)
|
|
{
|
|
global $db;
|
|
|
|
// Add also event from emailings. TODO This should be replaced by an automatic event ? May be it's too much for very large emailing.
|
|
if (isModEnabled('mailing') && !empty($objcon->email) && (empty($actioncode) || $actioncode == 'AC_OTH_AUTO' || $actioncode == 'AC_EMAILING')) {
|
|
$sql2 = "SELECT m.rowid as id, m.titre as label, mc.date_envoi as dp, mc.date_envoi as dp2, '100' as percent, 'mailing' as type";
|
|
$sql2 .= ", null as fk_element, '' as elementtype, null as contact_id";
|
|
$sql2 .= ", 'AC_EMAILING' as code, 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
|
|
$sql2 .= ", u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname"; // User that valid action
|
|
if (is_object($filterobj) && get_class($filterobj) == 'Societe') {
|
|
$sql2 .= ", '' as lastname, '' as firstname";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Adherent') {
|
|
$sql2 .= ", '' as lastname, '' as firstname";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') {
|
|
$sql2 .= ", '' as ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Product') {
|
|
$sql2 .= ", '' as ref";
|
|
} elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') {
|
|
$sql2 .= ", '' as ref";
|
|
}
|
|
$sql2 .= " FROM " . MAIN_DB_PREFIX . "mailing as m, " . MAIN_DB_PREFIX . "mailing_cibles as mc, " . MAIN_DB_PREFIX . "user as u";
|
|
$sql2 .= " WHERE mc.email = '" . $db->escape($objcon->email) . "'"; // Search is done on email.
|
|
$sql2 .= " AND mc.statut = 1";
|
|
$sql2 .= " AND u.rowid = m.fk_user_valid";
|
|
$sql2 .= " AND mc.fk_mailing=m.rowid";
|
|
|
|
return $sql2;
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Show the header of a company in HTML public pages
|
|
*
|
|
* @param Societe $mysoc Third party
|
|
* @param Translate $langs Output language
|
|
* @param int|string $showlogo '1'=Show logo or 'url' for click on logo
|
|
* @param string $alttext Text to show in header
|
|
* @param string $subimageconst Constant to check if we must add image under the main header
|
|
* @param string $altlogo1 To use an alternative logo defined into setup (instead of company logo)
|
|
* @param string $altlogo2 To use an alternative logo defined into setup (instead of company logo)
|
|
* @return void
|
|
*/
|
|
function htmlPrintOnlineHeader($mysoc, $langs, $showlogo = 1, $alttext = '', $subimageconst = '', $altlogo1 = '', $altlogo2 = '')
|
|
{
|
|
global $conf, $dolibarr_main_url_root;
|
|
|
|
// Set logo of company by default
|
|
$logosmall = $mysoc->logo_small;
|
|
$logo = $mysoc->logo;
|
|
|
|
if ($altlogo1 && getDolGlobalString($altlogo1)) {
|
|
$logosmall = getDolGlobalString($altlogo1);
|
|
} elseif ($altlogo2 && getDolGlobalString($altlogo2)) {
|
|
$logosmall = getDolGlobalString($altlogo2);
|
|
}
|
|
|
|
// Define $urllogo and $urllogopublic
|
|
//$urllogo = '';
|
|
$urllogopublic = '';
|
|
if ($showlogo) {
|
|
if (!empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output . '/logos/thumbs/' . $logosmall)) {
|
|
//$urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('logos/thumbs/'.$logosmall);
|
|
$urllogopublic = $dolibarr_main_url_root . '/viewimage.php?modulepart=mycompany&entity=' . $conf->entity . '&file=' . urlencode('logos/thumbs/' . $logosmall);
|
|
} elseif (!empty($mysoc->logo) && is_readable($conf->mycompany->dir_output . '/logos/' . $logo)) {
|
|
//$urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('logos/'.$logo);
|
|
$urllogopublic = $dolibarr_main_url_root . '/viewimage.php?modulepart=mycompany&entity=' . $conf->entity . '&file=' . urlencode('logos/' . $logo);
|
|
} elseif (is_readable(DOL_DOCUMENT_ROOT . '/theme/dolibarr_logo.svg')) {
|
|
//$urllogo = DOL_URL_ROOT.'/theme/dolibarr_logo.svg';
|
|
$urllogopublic = $dolibarr_main_url_root . '/theme/dolibarr_logo.svg';
|
|
}
|
|
}
|
|
|
|
print '<header class="center">';
|
|
|
|
// Output html code for logo
|
|
if ($urllogopublic || $alttext) {
|
|
print '<div class="backgreypublicpayment">';
|
|
print '<div class="logopublicpayment">';
|
|
if ($urllogopublic) {
|
|
if (!is_numeric($showlogo)) {
|
|
print '<a href="' . $showlogo . '">';
|
|
}
|
|
print '<img id="dolpaymentlogo" src="' . $urllogopublic . '">';
|
|
if (!is_numeric($showlogo)) {
|
|
print '</a>';
|
|
}
|
|
}
|
|
if ($alttext) {
|
|
print '<div class="clearboth"></div><strong>' . $alttext . '</strong>';
|
|
}
|
|
print '</div>';
|
|
if (!getDolGlobalString('MAIN_HIDE_POWERED_BY')) {
|
|
print '<div class="poweredbypublicpayment opacitymedium right hideonsmartphone"><a class="poweredbyhref" href="https://www.dolibarr.org?utm_medium=website&utm_source=poweredby" target="dolibarr" rel="noopener">' . $langs->trans("PoweredBy") . '<br><img class="poweredbyimg" src="' . DOL_URL_ROOT . '/theme/dolibarr_logo.svg" width="80px"></a></div>';
|
|
}
|
|
print '</div>';
|
|
}
|
|
|
|
// Add an optional image under the ban with logo/title
|
|
if (getDolGlobalString($subimageconst)) {
|
|
print '<div class="backimagepublicsubimage">';
|
|
print '<img id="id' . $subimageconst . '" src="' . getDolGlobalString($subimageconst) . '">';
|
|
print '</div>';
|
|
}
|
|
|
|
print '</header>';
|
|
}
|
|
|
|
|
|
/**
|
|
* Show footer of company in HTML public pages
|
|
*
|
|
* @param Societe $fromcompany Third party
|
|
* @param Translate $langs Output language
|
|
* @param int $addformmessage Add the payment form message
|
|
* @param string $suffix Suffix to use on constants
|
|
* @param null|CommonObject|CommonHookActions $object Object related to payment
|
|
* @return void
|
|
*/
|
|
function htmlPrintOnlineFooter($fromcompany, $langs, $addformmessage = 0, $suffix = '', $object = null)
|
|
{
|
|
global $conf;
|
|
|
|
$reg = array();
|
|
|
|
// Juridical status
|
|
$line1 = "";
|
|
if ($fromcompany->forme_juridique_code) {
|
|
$line1 .= ($line1 ? " - " : "") . getFormeJuridiqueLabel((string) $fromcompany->forme_juridique_code);
|
|
}
|
|
// Capital
|
|
if ($fromcompany->capital) {
|
|
$line1 .= ($line1 ? " - " : "") . $langs->transnoentities("CapitalOf", (string) $fromcompany->capital) . " " . $langs->transnoentities("Currency" . getDolCurrency());
|
|
}
|
|
// Prof Id 1
|
|
if ($fromcompany->idprof1 && ($fromcompany->country_code != 'FR' || !$fromcompany->idprof2)) {
|
|
$field = $langs->transcountrynoentities("ProfId1", $fromcompany->country_code);
|
|
if (preg_match('/\((.*)\)/i', $field, $reg)) {
|
|
$field = $reg[1];
|
|
}
|
|
$line1 .= ($line1 ? " - " : "") . $field . ": " . $fromcompany->idprof1;
|
|
}
|
|
// Prof Id 2
|
|
if ($fromcompany->idprof2) {
|
|
$field = $langs->transcountrynoentities("ProfId2", $fromcompany->country_code);
|
|
if (preg_match('/\((.*)\)/i', $field, $reg)) {
|
|
$field = $reg[1];
|
|
}
|
|
$line1 .= ($line1 ? " - " : "") . $field . ": " . $fromcompany->idprof2;
|
|
}
|
|
|
|
// Second line of company infos
|
|
$line2 = "";
|
|
// Prof Id 3
|
|
if ($fromcompany->idprof3) {
|
|
$field = $langs->transcountrynoentities("ProfId3", $fromcompany->country_code);
|
|
if (preg_match('/\((.*)\)/i', $field, $reg)) {
|
|
$field = $reg[1];
|
|
}
|
|
$line2 .= ($line2 ? " - " : "") . $field . ": " . $fromcompany->idprof3;
|
|
}
|
|
// Prof Id 4
|
|
if ($fromcompany->idprof4) {
|
|
$field = $langs->transcountrynoentities("ProfId4", $fromcompany->country_code);
|
|
if (preg_match('/\((.*)\)/i', $field, $reg)) {
|
|
$field = $reg[1];
|
|
}
|
|
$line2 .= ($line2 ? " - " : "") . $field . ": " . $fromcompany->idprof4;
|
|
}
|
|
// IntraCommunautary VAT
|
|
if ($fromcompany->tva_intra != '') {
|
|
$line2 .= ($line2 ? " - " : "") . $langs->transnoentities("VATIntraShort") . ": " . $fromcompany->tva_intra;
|
|
}
|
|
|
|
print '<!-- htmlPrintOnlineFooter -->' . "\n";
|
|
|
|
// css centpercent has been removed from class="..." because not compatible with paddingleft/right and there is an horizontal scroll appearring on payment page for example.
|
|
print '<footer class="center centpercent opacitymedium">' . "\n";
|
|
print '<br>';
|
|
if ($addformmessage) {
|
|
print '<!-- object = ' . (empty($object) ? 'undefined' : $object->element) . ' -->';
|
|
print '<br>';
|
|
|
|
$parammessageform = 'ONLINE_PAYMENT_MESSAGE_FORM_' . $suffix;
|
|
if (getDolGlobalString($parammessageform) !== '') {
|
|
print $langs->transnoentities(getDolGlobalString($parammessageform));
|
|
} elseif (getDolGlobalString('ONLINE_PAYMENT_MESSAGE_FORM') !== '') {
|
|
print $langs->transnoentities(getDolGlobalString('ONLINE_PAYMENT_MESSAGE_FORM'));
|
|
}
|
|
|
|
// Add other message if VAT exists
|
|
if (!empty($object->total_vat) || !empty($object->total_tva)) {
|
|
$parammessageform = 'ONLINE_PAYMENT_MESSAGE_FORMIFVAT_' . $suffix;
|
|
if (getDolGlobalString($parammessageform) !== '') {
|
|
print $langs->transnoentities(getDolGlobalString($parammessageform));
|
|
} elseif (getDolGlobalString('ONLINE_PAYMENT_MESSAGE_FORMIFVAT') !== '') {
|
|
print $langs->transnoentities(getDolGlobalString('ONLINE_PAYMENT_MESSAGE_FORMIFVAT'));
|
|
}
|
|
}
|
|
}
|
|
|
|
print '<span style="font-size: 10px;"><br><hr>' . "\n";
|
|
print $fromcompany->name . '<br>';
|
|
print $line1;
|
|
if (strlen($line1 . $line2) > 50) {
|
|
print '<br>';
|
|
} else {
|
|
print ' - ';
|
|
}
|
|
print $line2;
|
|
print '</span>';
|
|
print '</footer>' . "\n";
|
|
}
|