1<?php
2/* Copyright (C) 2003-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2015 Laurent Destailleur  <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin        <regis.houssin@inodbox.com>
5 * Copyright (C) 2015	   Charlie Benke        <charlie@patas-monkey.com>
6 * Copyright (C) 2019      Nicolas ZABOURI      <info@inovea-conseil.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22/**
23 *	\file       htdocs/fichinter/index.php
24 *	\ingroup    commande
25 *	\brief      Home page of interventional module
26 */
27
28require '../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
31require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
32
33if (!$user->rights->ficheinter->lire) accessforbidden();
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('interventionindex'));
39
40// Load translation files required by the page
41$langs->load("interventions");
42
43// Security check
44$socid = GETPOST('socid', 'int');
45if ($user->socid > 0)
46{
47	$action = '';
48	$socid = $user->socid;
49}
50
51
52
53/*
54 * View
55 */
56
57$fichinterstatic = new Fichinter($db);
58$form = new Form($db);
59$formfile = new FormFile($db);
60
61$help_url = "EN:ModuleFichinters|FR:Module_Fiche_Interventions|ES:Módulo_FichaInterventiones";
62
63llxHeader("", $langs->trans("Interventions"), $help_url);
64
65print load_fiche_titre($langs->trans("InterventionsArea"), '', 'intervention');
66
67print '<div class="fichecenter"><div class="fichethirdleft">';
68
69if (!empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS))     // This is useless due to the global search combo
70{
71	// Search ficheinter
72	$var = false;
73	print '<form method="post" action="'.DOL_URL_ROOT.'/fichinter/list.php">';
74	print '<input type="hidden" name="token" value="'.newToken().'">';
75	print '<div class="div-table-responsive-no-min">';
76	print '<table class="noborder nohover centpercent">';
77	print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("Search").'</td></tr>';
78	print '<tr class="oddeven"><td>';
79	print $langs->trans("Intervention").':</td><td><input type="text" class="flat" name="sall" size="18"></td><td><input type="submit" value="'.$langs->trans("Search").'" class="button"></td></tr>';
80	print "</table></div></form><br>\n";
81}
82
83
84/*
85 * Statistics
86 */
87
88$sql = "SELECT count(f.rowid), f.fk_statut";
89$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
90$sql .= ", ".MAIN_DB_PREFIX."fichinter as f";
91if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
92$sql .= " WHERE f.entity IN (".getEntity('intervention').")";
93$sql .= " AND f.fk_soc = s.rowid";
94if ($user->socid) $sql .= ' AND f.fk_soc = '.$user->socid;
95if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".$user->id;
96$sql .= " GROUP BY f.fk_statut";
97$resql = $db->query($sql);
98if ($resql)
99{
100	$num = $db->num_rows($resql);
101	$i = 0;
102
103	$total = 0;
104	$totalinprocess = 0;
105	$dataseries = array();
106	$vals = array();
107	$bool = false;
108	// -1=Canceled, 0=Draft, 1=Validated, 2=Accepted/On process, 3=Closed (Sent/Received, billed or not)
109	while ($i < $num)
110	{
111		$row = $db->fetch_row($resql);
112		if ($row)
113		{
114			//if ($row[1]!=-1 && ($row[1]!=3 || $row[2]!=1))
115			{
116				$bool = (!empty($row[2]) ?true:false);
117				if (!isset($vals[$row[1].$bool])) $vals[$row[1].$bool] = 0;
118				$vals[$row[1].$bool] += $row[0];
119				$totalinprocess += $row[0];
120			}
121			$total += $row[0];
122		}
123		$i++;
124	}
125	$db->free($resql);
126
127	include_once DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/theme_vars.inc.php';
128
129	print '<div class="div-table-responsive-no-min">';
130	print '<table class="noborder nohover centpercent">';
131	print '<tr class="liste_titre"><th colspan="2">'.$langs->trans("Statistics").' - '.$langs->trans("Interventions").'</th></tr>'."\n";
132	$listofstatus = array(0, 1, 3);
133	$bool = false;
134	foreach ($listofstatus as $status)
135	{
136		$dataseries[] = array($fichinterstatic->LibStatut($status, $bool, 1), (isset($vals[$status.$bool]) ? (int) $vals[$status.$bool] : 0));
137		if ($status == 3 && !$bool) $bool = true;
138		else $bool = false;
139
140		if ($status == Fichinter::STATUS_DRAFT) $colorseries[$status] = '-'.$badgeStatus0;
141		if ($status == Fichinter::STATUS_VALIDATED) $colorseries[$status] = $badgeStatus1;
142		if ($status == Fichinter::STATUS_BILLED) $colorseries[$status] = $badgeStatus4;
143		if ($status == Fichinter::STATUS_CLOSED) $colorseries[$status] = $badgeStatus6;
144	}
145	if ($conf->use_javascript_ajax)
146	{
147		print '<tr class="impair"><td class="center" colspan="2">';
148
149		include_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
150		$dolgraph = new DolGraph();
151		$dolgraph->SetData($dataseries);
152		$dolgraph->SetDataColor(array_values($colorseries));
153		$dolgraph->setShowLegend(2);
154		$dolgraph->setShowPercent(1);
155		$dolgraph->SetType(array('pie'));
156		$dolgraph->setHeight('200');
157		$dolgraph->draw('idgraphstatus');
158		print $dolgraph->show($total ? 0 : 1);
159
160		print '</td></tr>';
161	}
162	$bool = false;
163	foreach ($listofstatus as $status)
164	{
165		if (!$conf->use_javascript_ajax)
166		{
167			print '<tr class="oddeven">';
168			print '<td>'.$fichinterstatic->LibStatut($status, $bool, 0).'</td>';
169			print '<td class="right"><a href="list.php?search_status='.$status.'">'.(isset($vals[$status.$bool]) ? $vals[$status.$bool] : 0).' ';
170			print $fichinterstatic->LibStatut($status, $bool, 3);
171			print '</a>';
172			print '</td>';
173			print "</tr>\n";
174			if ($status == 3 && !$bool) $bool = true;
175			else $bool = false;
176		}
177	}
178	//if ($totalinprocess != $total)
179	//print '<tr class="liste_total"><td>'.$langs->trans("Total").' ('.$langs->trans("CustomersOrdersRunning").')</td><td class="right">'.$totalinprocess.'</td></tr>';
180	print '<tr class="liste_total"><td>'.$langs->trans("Total").'</td><td class="right">'.$total.'</td></tr>';
181	print "</table></div><br>";
182} else {
183	dol_print_error($db);
184}
185
186
187/*
188 * Draft orders
189 */
190if (!empty($conf->ficheinter->enabled))
191{
192	$sql = "SELECT f.rowid, f.ref, s.nom as name, s.rowid as socid";
193	$sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
194	$sql .= ", ".MAIN_DB_PREFIX."societe as s";
195	if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
196	$sql .= " WHERE f.entity IN (".getEntity('intervention').")";
197	$sql .= " AND f.fk_soc = s.rowid";
198	$sql .= " AND f.fk_statut = 0";
199	if ($socid) $sql .= " AND f.fk_soc = ".$socid;
200	if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".$user->id;
201
202	$resql = $db->query($sql);
203	if ($resql)
204	{
205		print '<div class="div-table-responsive-no-min">';
206		print '<table class="noborder centpercent">';
207		print '<tr class="liste_titre">';
208		print '<th colspan="2">'.$langs->trans("DraftFichinter").'</th></tr>';
209		$langs->load("fichinter");
210		$num = $db->num_rows($resql);
211		if ($num)
212		{
213			$i = 0;
214			while ($i < $num)
215			{
216				$obj = $db->fetch_object($resql);
217				print '<tr class="oddeven">';
218				print '<td class="nowrap">';
219				print "<a href=\"card.php?id=".$obj->rowid."\">".img_object($langs->trans("ShowFichinter"), "intervention").' '.$obj->ref."</a></td>";
220				print '<td><a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid.'">'.img_object($langs->trans("ShowCompany"), "company").' '.dol_trunc($obj->name, 24).'</a></td></tr>';
221				$i++;
222			}
223		}
224		print "</table></div><br>";
225	}
226}
227
228
229print '</div><div class="fichetwothirdright"><div class="ficheaddleft">';
230
231
232$max = 5;
233
234/*
235 * Last modified interventions
236 */
237
238$sql = "SELECT f.rowid, f.ref, f.fk_statut, f.date_valid as datec, f.tms as datem,";
239$sql .= " s.nom as name, s.rowid as socid";
240$sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f,";
241$sql .= " ".MAIN_DB_PREFIX."societe as s";
242if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
243$sql .= " WHERE f.entity IN (".getEntity('intervention').")";
244$sql .= " AND f.fk_soc = s.rowid";
245//$sql.= " AND c.fk_statut > 2";
246if ($socid) $sql .= " AND f.fk_soc = ".$socid;
247if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".$user->id;
248$sql .= " ORDER BY f.tms DESC";
249$sql .= $db->plimit($max, 0);
250
251$resql = $db->query($sql);
252if ($resql)
253{
254	print '<div class="div-table-responsive-no-min">';
255	print '<table class="noborder centpercent">';
256	print '<tr class="liste_titre">';
257	print '<th colspan="4">'.$langs->trans("LastModifiedInterventions", $max).'</th></tr>';
258
259	$num = $db->num_rows($resql);
260	if ($num)
261	{
262		$i = 0;
263		while ($i < $num)
264		{
265			$obj = $db->fetch_object($resql);
266
267			print '<tr class="oddeven">';
268			print '<td width="20%" class="nowrap">';
269
270			$fichinterstatic->id = $obj->rowid;
271			$fichinterstatic->ref = $obj->ref;
272
273			print '<table class="nobordernopadding"><tr class="nocellnopadd">';
274			print '<td width="96" class="nobordernopadding nowrap">';
275			print $fichinterstatic->getNomUrl(1);
276			print '</td>';
277
278			print '<td width="16" class="nobordernopadding nowrap">';
279			print '&nbsp;';
280			print '</td>';
281
282			print '<td width="16" class="right nobordernopadding hideonsmartphone">';
283			$filename = dol_sanitizeFileName($obj->ref);
284			$filedir = $conf->commande->dir_output.'/'.dol_sanitizeFileName($obj->ref);
285			$urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
286			print $formfile->getDocumentsLink($fichinterstatic->element, $filename, $filedir);
287			print '</td></tr></table>';
288
289			print '</td>';
290
291			print '<td><a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid.'">'.img_object($langs->trans("ShowCompany"), "company").' '.$obj->name.'</a></td>';
292			print '<td>'.dol_print_date($db->jdate($obj->datem), 'day').'</td>';
293			print '<td class="right">'.$fichinterstatic->LibStatut($obj->fk_statut, 5).'</td>';
294			print '</tr>';
295			$i++;
296		}
297	}
298	print "</table></div><br>";
299} else dol_print_error($db);
300
301
302/*
303 * interventions to process
304 */
305
306if (!empty($conf->ficheinter->enabled))
307{
308	$sql = "SELECT f.rowid, f.ref, f.fk_statut, s.nom as name, s.rowid as socid";
309	$sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
310	$sql .= ", ".MAIN_DB_PREFIX."societe as s";
311	if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
312	$sql .= " WHERE f.entity IN (".getEntity('intervention').")";
313	$sql .= " AND f.fk_soc = s.rowid";
314	$sql .= " AND f.fk_statut = 1";
315	if ($socid) $sql .= " AND f.fk_soc = ".$socid;
316	if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".$user->id;
317	$sql .= " ORDER BY f.rowid DESC";
318
319	$resql = $db->query($sql);
320	if ($resql)
321	{
322		$num = $db->num_rows($resql);
323
324		print '<div class="div-table-responsive-no-min">';
325		print '<table class="noborder centpercent">';
326		print '<tr class="liste_titre">';
327		print '<th colspan="3">'.$langs->trans("FichinterToProcess").' <a href="'.DOL_URL_ROOT.'/fichinter/list.php?search_status=1"><span class="badge">'.$num.'</span></a></th></tr>';
328
329		if ($num)
330		{
331			$i = 0;
332			while ($i < $num)
333			{
334				$obj = $db->fetch_object($resql);
335				print '<tr class="oddeven">';
336				print '<td class="nowrap" width="20%">';
337
338				$fichinterstatic->id = $obj->rowid;
339				$fichinterstatic->ref = $obj->ref;
340
341				print '<table class="nobordernopadding"><tr class="nocellnopadd">';
342				print '<td width="96" class="nobordernopadding nowrap">';
343				print $fichinterstatic->getNomUrl(1);
344				print '</td>';
345
346				print '<td width="16" class="nobordernopadding nowrap">';
347				print '&nbsp;';
348				print '</td>';
349
350				print '<td width="16" class="right nobordernopadding hideonsmartphone">';
351				$filename = dol_sanitizeFileName($obj->ref);
352				$filedir = $conf->commande->dir_output.'/'.dol_sanitizeFileName($obj->ref);
353				$urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
354				print $formfile->getDocumentsLink($fichinterstatic->element, $filename, $filedir);
355				print '</td></tr></table>';
356
357				print '</td>';
358
359				print '<td><a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid.'">'.img_object($langs->trans("ShowCompany"), "company").' '.dol_trunc($obj->name, 24).'</a></td>';
360
361				print '<td class="right">'.$fichinterstatic->LibStatut($obj->fk_statut, 5).'</td>';
362
363				print '</tr>';
364				$i++;
365			}
366		}
367
368		print "</table></div><br>";
369	} else dol_print_error($db);
370}
371
372print '</div></div></div>';
373
374$parameters = array('user' => $user);
375$reshook = $hookmanager->executeHooks('dashboardInterventions', $parameters, $object); // Note that $action and $object may have been modified by hook
376
377llxFooter();
378
379$db->close();
380