dolibarr  x.y.z
index.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2022 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
27 // Load Dolibarr environment
28 require '../main.inc.php';
29 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
30 require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
34 
35 $hookmanager = new HookManager($db);
36 
37 // Initialize technical object to manage hooks. Note that conf->hooks_modules contains array
38 $hookmanager->initHooks(array('projectsindex'));
39 
40 // Load translation files required by the page
41 $langs->loadLangs(array('projects', 'companies'));
42 
43 $action = GETPOST('action', 'aZ09');
44 $search_project_user = GETPOST('search_project_user', 'int');
45 $mine = GETPOST('mode', 'aZ09') == 'mine' ? 1 : 0;
46 if ($mine == 0 && $search_project_user === '') {
47  $search_project_user = (empty($user->conf->MAIN_SEARCH_PROJECT_USER_PROJECTSINDEX) ? '' : $user->conf->MAIN_SEARCH_PROJECT_USER_PROJECTSINDEX);
48 }
49 if ($search_project_user == $user->id) {
50  $mine = 1;
51 }
52 
53 // Security check
54 $socid = 0;
55 //if ($user->socid > 0) $socid = $user->socid; // For external user, no check is done on company because readability is managed by public status of project and assignement.
56 if (!$user->rights->projet->lire) {
58 }
59 
60 $sortfield = GETPOST('sortfield', 'aZ09comma');
61 $sortorder = GETPOST('sortorder', 'aZ09comma');
62 
63 $max = $conf->global->MAIN_SIZE_SHORTLIST_LIMIT;
64 
65 
66 /*
67  * Actions
68  */
69 
70 $parameters = array();
71 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
72 if ($reshook < 0) {
73  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
74 }
75 if (empty($reshook)) {
76  if ($action == 'refresh_search_project_user') {
77  $search_project_user = GETPOST('search_project_user', 'int');
78  $tabparam = array("MAIN_SEARCH_PROJECT_USER_PROJECTSINDEX" => $search_project_user);
79 
80  include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
81  $result = dol_set_user_param($db, $conf, $user, $tabparam);
82  }
83 }
84 
85 
86 /*
87  * View
88  */
89 
90 $companystatic = new Societe($db);
91 $projectstatic = new Project($db);
92 $form = new Form($db);
93 $formfile = new FormFile($db);
94 
95 $projectset = ($mine ? $mine : (empty($user->rights->projet->all->lire) ? 0 : 2));
96 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, $projectset, 1);
97 //var_dump($projectsListId);
98 
99 
100 $title = $langs->trans('ProjectsArea');
101 
102 $help_url = 'EN:Module_Projects|FR:Module_Projets|ES:M&oacute;dulo_Proyectos|DE:Modul_Projekte';
103 
104 llxHeader('', $title, $help_url);
105 
106 
107 //if ($mine) $title=$langs->trans("MyProjectsArea");
108 
109 
110 // Title for combo list see all projects
111 $titleall = $langs->trans("AllAllowedProjects");
112 if (!empty($user->rights->projet->all->lire) && !$socid) {
113  $titleall = $langs->trans("AllProjects");
114 } else {
115  $titleall = $langs->trans("AllAllowedProjects").'<br><br>';
116 }
117 
118 $morehtml = '';
119 $morehtml .= '<form name="projectform" method="POST">';
120 $morehtml .= '<input type="hidden" name="token" value="'.newToken().'">';
121 $morehtml .= '<input type="hidden" name="action" value="refresh_search_project_user">';
122 $morehtml .= '<SELECT name="search_project_user">';
123 $morehtml .= '<option name="all" value="0"'.($mine ? '' : ' selected').'>'.$titleall.'</option>';
124 $morehtml .= '<option name="mine" value="'.$user->id.'"'.(($search_project_user == $user->id) ? ' selected' : '').'>'.$langs->trans("ProjectsImContactFor").'</option>';
125 $morehtml .= '</SELECT>';
126 $morehtml .= '<input type="submit" class="button smallpaddingimp" name="refresh" value="'.$langs->trans("Refresh").'">';
127 $morehtml .= '</form>';
128 
129 if ($mine) {
130  $tooltiphelp = $langs->trans("MyProjectsDesc");
131 } else {
132  if (!empty($user->rights->projet->all->lire) && !$socid) {
133  $tooltiphelp = $langs->trans("ProjectsDesc");
134  } else {
135  $tooltiphelp = $langs->trans("ProjectsPublicDesc");
136  }
137 }
138 
139 print_barre_liste($form->textwithpicto($title, $tooltiphelp), 0, $_SERVER["PHP_SELF"], '', '', '', '', 0, -1, 'project', 0, $morehtml);
140 
141 
142 // Get list of ponderated percent and colors for each status
143 include DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/theme_vars.inc.php';
144 $listofoppstatus = array(); $listofopplabel = array(); $listofoppcode = array(); $colorseries = array();
145 $sql = "SELECT cls.rowid, cls.code, cls.percent, cls.label";
146 $sql .= " FROM ".MAIN_DB_PREFIX."c_lead_status as cls";
147 $sql .= " WHERE active=1";
148 $resql = $db->query($sql);
149 if ($resql) {
150  $num = $db->num_rows($resql);
151  $i = 0;
152 
153  while ($i < $num) {
154  $objp = $db->fetch_object($resql);
155  $listofoppstatus[$objp->rowid] = $objp->percent;
156  $listofopplabel[$objp->rowid] = $objp->label; // default label if translation from "OppStatus".code not found.
157  $listofoppcode[$objp->rowid] = $objp->code;
158  switch ($objp->code) {
159  case 'PROSP':
160  $colorseries[$objp->rowid] = "-".$badgeStatus0;
161  break;
162  case 'QUAL':
163  $colorseries[$objp->rowid] = "-".$badgeStatus1;
164  break;
165  case 'PROPO':
166  $colorseries[$objp->rowid] = $badgeStatus1;
167  break;
168  case 'NEGO':
169  $colorseries[$objp->rowid] = $badgeStatus4;
170  break;
171  case 'LOST':
172  $colorseries[$objp->rowid] = $badgeStatus9;
173  break;
174  case 'WON':
175  $colorseries[$objp->rowid] = $badgeStatus6;
176  break;
177  default:
178  $colorseries[$objp->rowid] = $badgeStatus2;
179  break;
180  }
181  $i++;
182  }
183 } else {
184  dol_print_error($db);
185 }
186 //var_dump($listofoppcode);
187 
188 
189 print '<div class="fichecenter"><div class="fichethirdleft">';
190 
191 /*
192  * Statistics
193  */
194 include DOL_DOCUMENT_ROOT.'/projet/graph_opportunities.inc.php';
195 
196 
197 // List of draft projects
198 print_projecttasks_array($db, $form, $socid, $projectsListId, 0, 0, $listofoppstatus, array('projectlabel', 'plannedworkload', 'declaredprogress', 'prospectionstatus', 'projectstatus'));
199 
200 
201 print '</div><div class="fichetwothirdright">';
202 
203 // Latest modified projects
204 $sql = "SELECT p.rowid, p.ref, p.title, p.dateo, p.datee, p.fk_statut as status, p.tms as datem";
205 $sql .= ", s.rowid as socid, s.nom as name, s.name_alias";
206 $sql .= ", s.code_client, s.code_compta, s.client";
207 $sql .= ", s.code_fournisseur, s.code_compta_fournisseur, s.fournisseur";
208 $sql .= ", s.logo, s.email, s.entity";
209 $sql .= ", s.canvas, s.status as thirdpartystatus";
210 $sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
211 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid";
212 $sql .= " WHERE p.entity IN (".getEntity('project').")";
213 if ($mine || empty($user->rights->projet->all->lire)) {
214  $sql .= " AND p.rowid IN (".$db->sanitize($projectsListId).")"; // If we have this test true, it also means projectset is not 2
215 }
216 if ($socid) {
217  $sql .= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".((int) $socid).")";
218 }
219 $sql .= " ORDER BY p.tms DESC";
220 $sql .= $db->plimit($max, 0);
221 
222 $resql = $db->query($sql);
223 if ($resql) {
224  print '<div class="div-table-responsive-no-min">';
225  print '<table class="noborder centpercent">';
226  print '<tr class="liste_titre">';
227  print '<th colspan="5">'.$langs->trans("LatestModifiedProjects", $max).'</th>';
228  print '</tr>';
229 
230  $num = $db->num_rows($resql);
231 
232  if ($num) {
233  $i = 0;
234  while ($i < $num) {
235  $obj = $db->fetch_object($resql);
236 
237  print '<tr class="oddeven">';
238  print '<td class="nowrap">';
239 
240  $projectstatic->id = $obj->rowid;
241  $projectstatic->ref = $obj->ref;
242  $projectstatic->title = $obj->title;
243  $projectstatic->thirdparty_name = $obj->name;
244  $projectstatic->status = $obj->status;
245 
246  $companystatic->id = $obj->socid;
247  $companystatic->name = $obj->name;
248  //$companystatic->name_alias = $obj->name_alias;
249  //$companystatic->code_client = $obj->code_client;
250  $companystatic->code_compta = $obj->code_compta;
251  $companystatic->client = $obj->client;
252  //$companystatic->code_fournisseur = $obj->code_fournisseur;
253  $companystatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
254  $companystatic->fournisseur = $obj->fournisseur;
255  $companystatic->logo = $obj->logo;
256  $companystatic->email = $obj->email;
257  $companystatic->entity = $obj->entity;
258  $companystatic->canvas = $obj->canvas;
259  $companystatic->status = $obj->thirdpartystatus;
260 
261  print '<table class="nobordernopadding"><tr class="nocellnopadd">';
262  print '<td width="96" class="nobordernopadding nowraponall">';
263  print $projectstatic->getNomUrl(1);
264  print '</td>';
265 
266  print '<td width="16" class="nobordernopadding nowrap">';
267  print '&nbsp;';
268  print '</td>';
269 
270  print '<td width="16" class="right nobordernopadding hideonsmartphone">';
271  $filename = dol_sanitizeFileName($obj->ref);
272  $filedir = $conf->commande->dir_output.'/'.dol_sanitizeFileName($obj->ref);
273  $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
274  print $formfile->getDocumentsLink($projectstatic->element, $filename, $filedir);
275  print '</td></tr></table>';
276 
277  print '</td>';
278 
279  // Label
280  print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->title).'">';
281  print $projectstatic->title;
282  print '</td>';
283 
284  // Thirdparty
285  print '<td class="nowrap">';
286  if ($companystatic->id > 0) {
287  print $companystatic->getNomUrl(1, 'company', 16);
288  }
289  print '</td>';
290 
291  // Date
292  $datem = $db->jdate($obj->datem);
293  print '<td class="center" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'">';
294  print dol_print_date($datem, 'day', 'tzuserrel');
295  print '</td>';
296 
297  // Status
298  print '<td class="right">'.$projectstatic->LibStatut($obj->status, 3).'</td>';
299  print '</tr>';
300  $i++;
301  }
302  } else {
303  print '<tr><td colspan="4"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
304  }
305  print "</table></div>";
306 } else {
307  dol_print_error($db);
308 }
309 
310 
311 $companystatic = new Societe($db); // We need a clean new object for next loop because current one has some properties set.
312 
313 // List of open projects per thirdparty
314 $sql = "SELECT COUNT(p.rowid) as nb, SUM(p.opp_amount)";
315 $sql .= ", s.rowid as socid, s.nom as name, s.name_alias";
316 $sql .= ", s.code_client, s.code_compta, s.client";
317 $sql .= ", s.code_fournisseur, s.code_compta_fournisseur, s.fournisseur";
318 $sql .= ", s.logo, s.email, s.entity";
319 $sql .= ", s.canvas, s.status";
320 $sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
321 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid";
322 $sql .= " WHERE p.entity IN (".getEntity('project').")";
323 $sql .= " AND p.fk_statut = 1";
324 if ($mine || empty($user->rights->projet->all->lire)) {
325  $sql .= " AND p.rowid IN (".$db->sanitize($projectsListId).")"; // If we have this test true, it also means projectset is not 2
326 }
327 if ($socid > 0) {
328  $sql .= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".((int) $socid).")";
329 }
330 $sql .= " GROUP BY s.rowid, s.nom, s.name_alias, s.code_client, s.code_compta, s.client, s.code_fournisseur, s.code_compta_fournisseur, s.fournisseur, s.logo, s.email, s.entity, s.canvas, s.status";
331 $sql .= $db->order($sortfield, $sortorder);
332 //$sql .= $db->plimit($max + 1, 0);
333 
334 $resql = $db->query($sql);
335 if ($resql) {
336  $num = $db->num_rows($resql);
337  $i = 0;
338  $othernb = 0;
339 
340  if ($num) {
341  print '<br>';
342 
343  // Open project per thirdparty
344  print '<div class="div-table-responsive-no-min">';
345  print '<table class="noborder centpercent">';
346  print '<tr class="liste_titre">';
347  print_liste_field_titre("OpenedProjectsByThirdparties", $_SERVER["PHP_SELF"], "", "", "", '', $sortfield, $sortorder);
348  print_liste_field_titre("NbOfProjects", $_SERVER["PHP_SELF"], "nb", "", "", '', $sortfield, $sortorder, 'right ');
349  print "</tr>\n";
350  }
351 
352  while ($i < $num) {
353  $obj = $db->fetch_object($resql);
354 
355  if ($i >= $max) {
356  $othernb += $obj->nb;
357  $i++;
358  continue;
359  }
360 
361  print '<tr class="oddeven">';
362  print '<td class="nowraponall tdoverflowmax100">';
363  if ($obj->socid > 0) {
364  $companystatic->id = $obj->socid;
365  $companystatic->name = $obj->name;
366  $companystatic->name_alias = $obj->name_alias;
367  $companystatic->code_client = $obj->code_client;
368  $companystatic->code_compta = $obj->code_compta;
369  $companystatic->client = $obj->client;
370  $companystatic->code_fournisseur = $obj->code_fournisseur;
371  $companystatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
372  $companystatic->fournisseur = $obj->fournisseur;
373  $companystatic->logo = $obj->logo;
374  $companystatic->email = $obj->email;
375  $companystatic->entity = $obj->entity;
376  $companystatic->canvas = $obj->canvas;
377  $companystatic->status = $obj->status;
378 
379  print $companystatic->getNomUrl(1);
380  } else {
381  print $langs->trans("OthersNotLinkedToThirdParty");
382  }
383  print '</td>';
384  print '<td class="right">';
385  if ($obj->socid) {
386  print '<a href="'.DOL_URL_ROOT.'/projet/list.php?socid='.$obj->socid.'&search_status=1">'.$obj->nb.'</a>';
387  } else {
388  print '<a href="'.DOL_URL_ROOT.'/projet/list.php?search_societe='.urlencode('^$').'&search_status=1">'.$obj->nb.'</a>';
389  }
390  print '</td>';
391  print "</tr>\n";
392 
393  $i++;
394  }
395  if ($othernb) {
396  print '<tr class="oddeven">';
397  print '<td class="nowrap">';
398  print '<span class="opacitymedium">...</span>';
399  print '</td>';
400  print '<td class="nowrap right">';
401  print $othernb;
402  print '</td>';
403  print "</tr>\n";
404  }
405 
406  if ($num) {
407  print "</table>";
408  print '</div>';
409  }
410 
411  $db->free($resql);
412 } else {
413  dol_print_error($db);
414 }
415 
416 if (empty($conf->global->PROJECT_HIDE_PROJECT_LIST_ON_PROJECT_AREA)) {
417  // This list can be very long, so we allow to hide it to prefer to use the list page.
418  // Add constant PROJECT_HIDE_PROJECT_LIST_ON_PROJECT_AREA to hide this list
419 
420  print '<br>';
421 
422  print_projecttasks_array($db, $form, $socid, $projectsListId, 0, 1, $listofoppstatus, array());
423 }
424 
425 print '</div></div>';
426 
427 $parameters = array('user' => $user);
428 $reshook = $hookmanager->executeHooks('dashboardProjects', $parameters, $projectstatic); // Note that $action and $object may have been modified by hook
429 
430 // End of page
431 llxFooter();
432 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage hooks.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_set_user_param($db, $conf, &$user, $tab)
Save personnal parameter.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=0, $status=-1, $listofoppstatus=array(), $hiddenfields=array())
Return HTML table with list of projects and number of opened tasks.
llxFooter()
Footer empty.
Definition: index.php:71
if(!defined('NOTOKENRENEWAL')) if(!defined('NOLOGIN')) if(!defined('NOCSRFCHECK')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) if(!defined('NOIPCHECK')) if(!defined('NOBROWSERNOTIF')) llxHeader()
Header empty.
Definition: index.php:63
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.