diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php
index aa9f86c8efe..7b4d2f6bba9 100644
--- a/htdocs/adherents/index.php
+++ b/htdocs/adherents/index.php
@@ -318,8 +318,8 @@ print "";
print " \n";
-
print $resultboxes['boxlista'];
+
print ''."\n";
print '
';
diff --git a/htdocs/admin/boxes.php b/htdocs/admin/boxes.php
index 4cb24cc62df..b28c81a25b1 100644
--- a/htdocs/admin/boxes.php
+++ b/htdocs/admin/boxes.php
@@ -40,7 +40,7 @@ $action = GETPOST('action', 'aZ09');
// Define possible position of boxes
-$pos_name = InfoBox::getListOfPagesForBoxes();
+$arrayofhomepages = InfoBox::getListOfPagesForBoxes();
$boxes = array();
@@ -348,7 +348,7 @@ foreach ($boxtoadd as $box) {
// For each possible position, an activation link is displayed if the box is not already active for that position
print '
';
- print $form->selectarray("boxid[".$box->box_id."][pos]", $pos_name, -1, 1, 0, 0, '', 1)."\n";
+ print $form->selectarray("boxid[".$box->box_id."][pos]", $arrayofhomepages, -1, 1, 0, 0, '', 1)."\n";
print ' '."\n";
print ' ';
@@ -406,7 +406,7 @@ foreach ($boxactivated as $key => $box) {
print ($box->note ? $box->note : ' ');
}
print '';
- print '
'.(empty($pos_name[$box->position]) ? '' : $langs->trans($pos_name[$box->position])).' ';
+ print '
'.(empty($arrayofhomepages[$box->position]) ? '' : $langs->trans($arrayofhomepages[$box->position])).' ';
$hasnext = ($key < (count($boxactivated) - 1));
$hasprevious = ($key != 0);
print '
'.($key + 1).' ';
diff --git a/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php b/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php
new file mode 100644
index 00000000000..9595d264ee4
--- /dev/null
+++ b/htdocs/core/boxes/box_graph_nb_ticket_last_x_days.php
@@ -0,0 +1,221 @@
+
+ * 2016 Christophe Battarel
+ * Copyright (C) 2019 Frédéric France
+ *
+ * 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 .
+ */
+
+/**
+ * \file core/boxes/box_nb_ticket_last_x_days.php
+ * \ingroup ticket
+ * \brief This box shows the number of new daily tickets the last X days
+ */
+require_once DOL_DOCUMENT_ROOT."/core/boxes/modules_boxes.php";
+
+/**
+ * Class to manage the box
+ */
+class box_nb_ticket_last_x_days extends ModeleBoxes
+{
+
+ public $boxcode = "box_nb_ticket_last_x_days";
+ public $boximg = "ticket";
+ public $boxlabel;
+ public $depends = array("ticket");
+
+ /**
+ * @var DoliDB Database handler.
+ */
+
+ public $param;
+ public $info_box_head = array();
+ public $info_box_contents = array();
+
+ /**
+ * Constructor
+ * @param DoliDB $db Database handler
+ * @param string $param More parameters
+ */
+ public function __construct($db, $param = '')
+ {
+ global $langs;
+ $langs->load("boxes");
+ $this->db = $db;
+
+ $this->boxlabel = $langs->transnoentitiesnoconv("BoxNumberOfTicketByDay");
+ }
+
+ /**
+ * Load data into info_box_contents array to show array later.
+ *
+ * @param int $max Maximum number of records to load
+ * @return void
+ */
+ public function loadBox($max = 5)
+ {
+ global $conf, $user, $langs;
+
+ $badgeStatus0 = '#cbd3d3'; // draft
+ $badgeStatus1 = '#bc9526'; // validated
+ $badgeStatus1b = '#bc9526'; // validated
+ $badgeStatus2 = '#9c9c26'; // approved
+ $badgeStatus3 = '#bca52b';
+ $badgeStatus4 = '#25a580'; // Color ok
+ $badgeStatus4b = '#25a580'; // Color ok
+ $badgeStatus5 = '#cad2d2';
+ $badgeStatus6 = '#cad2d2';
+ $badgeStatus7 = '#baa32b';
+ $badgeStatus8 = '#993013';
+ $badgeStatus9 = '#e7f0f0';
+ if (file_exists(DOL_DOCUMENT_ROOT . '/theme/' . $conf->theme . '/theme_vars.inc.php')) {
+ include DOL_DOCUMENT_ROOT . '/theme/' . $conf->theme . '/theme_vars.inc.php';
+ }
+ $this->max = $max;
+
+
+ $param_day = 'DOLUSERCOOKIE_ticket_last_days';
+ if ($_POST[$param_day]) {
+ if ($_POST[$param_day] >= 15) {
+ $days = 14;
+ } else {
+ $days = $_POST[$param_day];
+ }
+ } else {
+ $days = 7;
+ }
+ require_once DOL_DOCUMENT_ROOT."/ticket/class/ticket.class.php";
+ $text = $langs->trans("BoxTicketLastXDays", $days).' ' . img_picto('', 'filter.png', 'id="idsubimgDOLUSERCOOKIE_ticket_last_days" class="linkobject"');
+ $this->info_box_head = array(
+ 'text' => $text,
+ 'limit' => dol_strlen($text)
+ );
+ $today = date_time_set(date_create(), 0, 0);
+ $todayformat = date('Y-m-d', date_timestamp_get($today));
+ $intervaltosub = new DateInterval('P' . dol_escape_htmltag($days - 1) . 'D');
+ $intervaltoadd = new DateInterval('P1D');
+ $minimumdatec = date_sub($today, $intervaltosub);
+ $minimumdatecformated = date('Y-m-d', date_timestamp_get($minimumdatec));
+
+ if ($user->rights->ticket->read) {
+ $sql = "SELECT CAST(t.datec AS DATE) as datec, COUNT(t.datec) as nb";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t";
+ $sql .= " WHERE CAST(t.datec AS DATE) > DATE_SUB(CURRENT_DATE, INTERVAL " . $days . " DAY)";
+ $sql .= " GROUP BY CAST(t.datec AS DATE)";
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ $dataseries = array();
+ while ($i < $num) {
+ $objp = $this->db->fetch_object($resql);
+ while ($minimumdatecformated < $objp->datec) {
+ $dataseries[] = array('label' => dol_print_date($minimumdatecformated, 'day'), 'data' => 0);
+ $minimumdatec = date_add($minimumdatec, $intervaltoadd);
+ $minimumdatecformated = date('Y-m-d', date_timestamp_get($minimumdatec));
+ }
+ $dataseries[] = array('label' => dol_print_date($objp->datec, 'day'), 'data' => $objp->nb);
+ $minimumdatec = date_add($minimumdatec, $intervaltoadd);
+ $minimumdatecformated = date('Y-m-d', date_timestamp_get($minimumdatec));
+ $i++;
+ }
+ while (count($dataseries) < $days) {
+ $dataseries[] = array('label' => dol_print_date($minimumdatecformated, 'day'), 'data' => 0);
+ $minimumdatec = date_add($minimumdatec, $intervaltoadd);
+ $minimumdatecformated = date('Y-m-d', date_timestamp_get($minimumdatec));
+ $i++;
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+ $stringtoshow = '';
+ $stringtoshow .= '';
+ $stringtoshow .= '
'; // hideobject is to start hidden
+ $stringtoshow .= '';
+ $stringtoshow .= '
';
+
+ include_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
+ $px1 = new DolGraph();
+
+ $mesg = $px1->isGraphKo();
+ $totalnb = 0;
+ if (!$mesg) {
+ $data = array();
+ foreach ($dataseries as $value) {
+ $data[] = array($value['label'], $value['data']);
+ $totalnb += $value['data'];
+ }
+ $px1->SetData($data);
+ $px1->setShowLegend(2);
+ $px1->SetType(array('bar'));
+ $px1->SetLegend(array($langs->trans('BoxNumberOfTicketByDay')));
+ $px1->SetMaxValue($px1->GetCeilMaxValue());
+ $px1->SetHeight(192);
+ $px1->SetShading(3);
+ $px1->SetHorizTickIncrement(1);
+ $px1->SetCssPrefix("cssboxes");
+ $px1->mode = 'depth';
+
+ $px1->draw('idgraphticketlastxdays');
+ $graphtoshow= $px1->show($totalnb ? 0 : 1);
+ }
+ if ($totalnb) {
+ $stringtoshow .= $graphtoshow;
+ }
+ $stringtoshow .= '
';
+ if ($totalnb) {
+ $this->info_box_contents[][]=array(
+ 'td' => 'center',
+ 'text' => $stringtoshow
+ );
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="center opacitymedium"',
+ 'text' => $stringtoshow . $langs->trans("BoxNoTicketLastXDays", $days)
+ );
+ }
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="left"',
+ 'text' => $langs->trans("ReadPermissionNotAllowed"),
+ );
+ }
+ }
+
+ /**
+ * Method to show box
+ *
+ * @param array $head Array with properties of box title
+ * @param array $contents Array with properties of box lines
+ * @param int $nooutput No print, only return string
+ * @return string
+ */
+ public function showBox($head = null, $contents = null, $nooutput = 0)
+ {
+ return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput);
+ }
+}
diff --git a/htdocs/core/boxes/box_graph_nb_tickets_type.php b/htdocs/core/boxes/box_graph_nb_tickets_type.php
new file mode 100644
index 00000000000..10eebc05b06
--- /dev/null
+++ b/htdocs/core/boxes/box_graph_nb_tickets_type.php
@@ -0,0 +1,210 @@
+
+ * 2016 Christophe Battarel
+ * Copyright (C) 2019 Frédéric France
+ *
+ * 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 .
+ */
+
+/**
+ * \file core/boxes/box_nb_ticket_last_x_days.php
+ * \ingroup ticket
+ * \brief This box shows the number of new daily tickets the last X days
+ */
+require_once DOL_DOCUMENT_ROOT."/core/boxes/modules_boxes.php";
+
+/**
+ * Class to manage the box
+ */
+class box_nb_tickets_type extends ModeleBoxes
+{
+
+ public $boxcode = "box_nb_tickets_type";
+ public $boximg = "ticket";
+ public $boxlabel;
+ public $depends = array("ticket");
+
+ /**
+ * @var DoliDB Database handler.
+ */
+
+ public $param;
+ public $info_box_head = array();
+ public $info_box_contents = array();
+
+ /**
+ * Constructor
+ * @param DoliDB $db Database handler
+ * @param string $param More parameters
+ */
+ public function __construct($db, $param = '')
+ {
+ global $langs;
+ $langs->load("boxes");
+ $this->db = $db;
+
+ $this->boxlabel = $langs->transnoentitiesnoconv("BoxTicketType");
+ }
+
+ /**
+ * Load data into info_box_contents array to show array later.
+ *
+ * @param int $max Maximum number of records to load
+ * @return void
+ */
+ public function loadBox($max = 5)
+ {
+ global $conf, $user, $langs;
+
+ $badgeStatus0 = '#cbd3d3'; // draft
+ $badgeStatus1 = '#bc9526'; // validated
+ $badgeStatus1b = '#bc9526'; // validated
+ $badgeStatus2 = '#9c9c26'; // approved
+ $badgeStatus3 = '#bca52b';
+ $badgeStatus4 = '#25a580'; // Color ok
+ $badgeStatus4b = '#25a580'; // Color ok
+ $badgeStatus5 = '#cad2d2';
+ $badgeStatus6 = '#cad2d2';
+ $badgeStatus7 = '#baa32b';
+ $badgeStatus8 = '#993013';
+ $badgeStatus9 = '#e7f0f0';
+ $text = $langs->trans("BoxTicketType");
+ $this->info_box_head = array(
+ 'text' => $text,
+ 'limit' => dol_strlen($text)
+ );
+
+ $listofopplabel = array();
+ $listofoppcode = array();
+ $colorseriesstat = array();
+ if ($user->rights->ticket->read) {
+ $sql = "SELECT ctt.rowid, ctt.label, ctt.code";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "c_ticket_type as ctt";
+ $sql .= " WHERE ctt.active = 1";
+ $sql .= $this->db->order('ctt.rowid', 'ASC');
+ $resql = $this->db->query($sql);
+
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num) {
+ $objp = $this->db->fetch_object($resql);
+ $listofoppcode[$objp->rowid] = $objp->code;
+ $listofopplabel[$objp->rowid] = $objp->label;
+ switch ($objp->code) {
+ case 'COM':
+ $colorseriesstat[$objp->rowid] = $badgeStatus1;
+ break;
+ case 'HELP':
+ $colorseriesstat[$objp->rowid] = $badgeStatus2;
+ break;
+ case 'ISSUE':
+ $colorseriesstat[$objp->rowid] = $badgeStatus3;
+ break;
+ case 'REQUEST':
+ $colorseriesstat[$objp->rowid] = $badgeStatus4;
+ break;
+ case 'OTHER':
+ $colorseriesstat[$objp->rowid] = $badgeStatus5;
+ break;
+ default:
+ break;
+ }
+ $i++;
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+ $dataseries = array();
+ $data = array();
+ $sql = "SELECT t.type_code, COUNT(t.type_code) as nb";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t";
+ $sql .= " WHERE t.fk_statut <> 8";
+ $sql .= " GROUP BY t.type_code";
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num) {
+ $objp = $this->db->fetch_object($resql);
+ $data[$objp->type_code] = $objp->nb;
+ $i++;
+ }
+ foreach ($listofoppcode as $rowid => $code) {
+ $dataseries[] = array('label' => $langs->getLabelFromKey($this->db, 'TicketTypeShort' . $code, 'c_ticket_category', 'code', 'label', $code), 'data' => $data[$code]);
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+ $stringtoprint = '';
+ $stringtoprint .= '';
+ if (!empty($dataseries) && count($dataseries) > 0) {
+ include_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
+ $px1 = new DolGraph();
+
+ $mesg = $px1->isGraphKo();
+ $totalnb = 0;
+ if (!$mesg) {
+ $px1->SetDataColor(array_values($colorseriesstat));
+ $data = array();
+ $legend = array();
+ foreach ($dataseries as $value) {
+ $data[] = array($value['label'], $value['data']);
+ $totalnb += $value['data'];
+ }
+ $px1->SetData($data);
+ $px1->setShowLegend(2);
+ $px1->SetType(array('pie'));
+ $px1->SetLegend($legend);
+ $px1->SetMaxValue($px1->GetCeilMaxValue());
+ $px1->SetShading(3);
+ $px1->SetHorizTickIncrement(1);
+ $px1->SetCssPrefix("cssboxes");
+ $px1->mode = 'depth';
+ $px1->draw('idgraphtickettype');
+ $stringtoprint .= $px1->show($totalnb ? 0 : 1);
+ }
+ $stringtoprint .= '
';
+ $this->info_box_contents[][]=array(
+ 'td' => 'center',
+ 'text' => $stringtoprint
+ );
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="center opacitymedium"',
+ 'text' => $langs->trans("BoxNoTicketSeverity"),
+ );
+ }
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="left"',
+ 'text' => $langs->trans("ReadPermissionNotAllowed"),
+ );
+ }
+ }
+
+ /**
+ * Method to show box
+ *
+ * @param array $head Array with properties of box title
+ * @param array $contents Array with properties of box lines
+ * @param int $nooutput No print, only return string
+ * @return string
+ */
+ public function showBox($head = null, $contents = null, $nooutput = 0)
+ {
+ return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput);
+ }
+}
diff --git a/htdocs/core/boxes/box_graph_new_vs_close_ticket.php b/htdocs/core/boxes/box_graph_new_vs_close_ticket.php
new file mode 100644
index 00000000000..32eb82984e7
--- /dev/null
+++ b/htdocs/core/boxes/box_graph_new_vs_close_ticket.php
@@ -0,0 +1,182 @@
+
+ * 2016 Christophe Battarel
+ * Copyright (C) 2019 Frédéric France
+ *
+ * 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 .
+ */
+
+/**
+ * \file core/boxes/box_nb_ticket_last_x_days.php
+ * \ingroup ticket
+ * \brief This box shows the number of new daily tickets the last X days
+ */
+require_once DOL_DOCUMENT_ROOT."/core/boxes/modules_boxes.php";
+
+/**
+ * Class to manage the box
+ */
+class box_new_vs_close_ticket extends ModeleBoxes
+{
+
+ public $boxcode = "box_nb_tickets_type";
+ public $boximg = "ticket";
+ public $boxlabel;
+ public $depends = array("ticket");
+
+ /**
+ * @var DoliDB Database handler.
+ */
+
+ public $param;
+ public $info_box_head = array();
+ public $info_box_contents = array();
+
+ /**
+ * Constructor
+ * @param DoliDB $db Database handler
+ * @param string $param More parameters
+ */
+ public function __construct($db, $param = '')
+ {
+ global $langs;
+ $langs->load("boxes");
+ $this->db = $db;
+
+ $this->boxlabel = $langs->transnoentitiesnoconv("BoxNewTicketVSClose");
+ }
+
+ /**
+ * Load data into info_box_contents array to show array later.
+ *
+ * @param int $max Maximum number of records to load
+ * @return void
+ */
+ public function loadBox($max = 5)
+ {
+ global $conf, $user, $langs;
+
+ $badgeStatus0 = '#cbd3d3'; // draft
+ $badgeStatus1 = '#bc9526'; // validated
+ $badgeStatus1b = '#bc9526'; // validated
+ $badgeStatus2 = '#9c9c26'; // approved
+ $badgeStatus3 = '#bca52b';
+ $badgeStatus4 = '#25a580'; // Color ok
+ $badgeStatus4b = '#25a580'; // Color ok
+ $badgeStatus5 = '#cad2d2';
+ $badgeStatus6 = '#cad2d2';
+ $badgeStatus7 = '#baa32b';
+ $badgeStatus8 = '#993013';
+ $badgeStatus9 = '#e7f0f0';
+ $text = $langs->trans("BoxNewTicketVSClose");
+ $this->info_box_head = array(
+ 'text' => $text,
+ 'limit' => dol_strlen($text)
+ );
+
+ if ($user->rights->ticket->read) {
+ $data = array();
+ $totalnb = 0;
+ $sql = "SELECT COUNT(t.datec) as nb";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t";
+ $sql .= " WHERE CAST(t.datec AS DATE) = CURRENT_DATE";
+ $sql .= " AND t.fk_statut <> 8";
+ $sql .= " GROUP BY CAST(t.datec AS DATE)";
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ if ($num > 0) {
+ $objp = $this->db->fetch_object($resql);
+ $data[] = array($langs->trans('TicketCreatedToday'), $objp->nb);
+ $totalnb += $objp->nb;
+ } else {
+ $data[] = array($langs->trans('TicketCreatedToday'), 0);
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+ $sql = "SELECT COUNT(t.date_close) as nb";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t";
+ $sql .= " WHERE CAST(t.date_close AS DATE) = CURRENT_DATE";
+ $sql .= " AND t.fk_statut = 8";
+ $sql .= " GROUP BY CAST(t.date_close AS DATE)";
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ if ($num > 0) {
+ $objp = $this->db->fetch_object($resql);
+ $data[] = array($langs->trans('TicketClosedToday'), $objp->nb);
+ $totalnb += $objp->nb;
+ } else {
+ $data[] = array($langs->trans('TicketClosedToday'), 0);
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+ $colorseries = array();
+ $colorseries[] = $badgeStatus8;
+ $colorseries[] = $badgeStatus2;
+ $stringtoprint = '';
+ $stringtoprint .= '';
+ if (!empty($data) && count($data) > 0) {
+ include_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
+ $px1 = new DolGraph();
+ $mesg = $px1->isGraphKo();
+ if (!$mesg) {
+ $px1->SetDataColor(array_values($colorseries));
+ $px1->SetData($data);
+ $px1->setShowLegend(2);
+ $px1->SetType(array('pie'));
+ $px1->SetMaxValue($px1->GetCeilMaxValue());
+ $px1->SetShading(3);
+ $px1->SetHorizTickIncrement(1);
+ $px1->SetCssPrefix("cssboxes");
+ $px1->mode = 'depth';
+
+ $px1->draw('idgraphticketnewvsclosetoday');
+ $stringtoprint .= $px1->show($totalnb ? 0 : 1);
+ }
+ $stringtoprint .= '
';
+ $this->info_box_contents[][]=array(
+ 'td' => 'center',
+ 'text' => $stringtoprint
+ );
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="center opacitymedium"',
+ 'text' => $langs->trans("BoxNoTicketSeverity"),
+ );
+ }
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="left"',
+ 'text' => $langs->trans("ReadPermissionNotAllowed"),
+ );
+ }
+ }
+
+ /**
+ * Method to show box
+ *
+ * @param array $head Array with properties of box title
+ * @param array $contents Array with properties of box lines
+ * @param int $nooutput No print, only return string
+ * @return string
+ */
+ public function showBox($head = null, $contents = null, $nooutput = 0)
+ {
+ return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput);
+ }
+}
diff --git a/htdocs/core/boxes/box_graph_ticket_by_severity.php b/htdocs/core/boxes/box_graph_ticket_by_severity.php
new file mode 100644
index 00000000000..52c3e938798
--- /dev/null
+++ b/htdocs/core/boxes/box_graph_ticket_by_severity.php
@@ -0,0 +1,217 @@
+
+ * 2016 Christophe Battarel
+ * Copyright (C) 2019 Frédéric France
+ *
+ * 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 .
+ */
+
+/**
+ * \file core/boxes/box_ticket_by_severity.php
+ * \ingroup ticket
+ * \brief This box shows open tickets by severity
+ */
+require_once DOL_DOCUMENT_ROOT."/core/boxes/modules_boxes.php";
+
+/**
+ * Class to manage the box
+ */
+class box_ticket_by_severity extends ModeleBoxes
+{
+
+ public $boxcode = "box_ticket_by_severity";
+ public $boximg = "ticket";
+ public $boxlabel;
+ public $depends = array("ticket");
+
+ /**
+ * @var DoliDB Database handler.
+ */
+ public $db;
+
+ public $param;
+ public $info_box_head = array();
+ public $info_box_contents = array();
+
+ /**
+ * Constructor
+ * @param DoliDB $db Database handler
+ * @param string $param More parameters
+ */
+ public function __construct($db, $param = '')
+ {
+ global $langs;
+ $langs->load("boxes");
+ $this->db = $db;
+
+ $this->boxlabel = $langs->transnoentitiesnoconv("BoxTicketSeverity");
+ }
+
+ /**
+ * Load data into info_box_contents array to show array later.
+ *
+ * @param int $max Maximum number of records to load
+ * @return void
+ */
+ public function loadBox($max = 5)
+ {
+ global $conf, $user, $langs;
+
+ $badgeStatus0 = '#cbd3d3'; // draft
+ $badgeStatus1 = '#bc9526'; // validated
+ $badgeStatus1b = '#bc9526'; // validated
+ $badgeStatus2 = '#9c9c26'; // approved
+ $badgeStatus3 = '#bca52b';
+ $badgeStatus4 = '#25a580'; // Color ok
+ $badgeStatus4b = '#25a580'; // Color ok
+ $badgeStatus5 = '#cad2d2';
+ $badgeStatus6 = '#cad2d2';
+ $badgeStatus7 = '#baa32b';
+ $badgeStatus8 = '#993013';
+ $badgeStatus9 = '#e7f0f0';
+ if (file_exists(DOL_DOCUMENT_ROOT . '/theme/' . $conf->theme . '/theme_vars.inc.php')) {
+ include DOL_DOCUMENT_ROOT . '/theme/' . $conf->theme . '/theme_vars.inc.php';
+ }
+ $this->max = $max;
+
+ require_once DOL_DOCUMENT_ROOT."/ticket/class/ticket.class.php";
+
+ $text = $langs->trans("BoxTicketSeverity", $max);
+ $this->info_box_head = array(
+ 'text' => $text,
+ 'limit' => dol_strlen($text)
+ );
+
+ $listofopplabel = array();
+ $listofoppcode = array();
+ $colorseriesstat = array();
+ if ($user->rights->ticket->read) {
+ $sql = "SELECT cts.rowid, cts.label, cts.code";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "c_ticket_severity as cts";
+ $sql .= " WHERE cts.active = 1";
+ $sql .= $this->db->order('cts.rowid', 'ASC');
+ $resql = $this->db->query($sql);
+
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num) {
+ $objp = $this->db->fetch_object($resql);
+ $listofoppcode[$objp->rowid] = $objp->code;
+ $listofopplabel[$objp->rowid] = $objp->label;
+ switch ($objp->code) {
+ case 'LOW':
+ $colorseriesstat[$objp->rowid] = $badgeStatus4;
+ break;
+ case 'NORMAL':
+ $colorseriesstat[$objp->rowid] = $badgeStatus2;
+ break;
+ case 'HIGH':
+ $colorseriesstat[$objp->rowid] = $badgeStatus1;
+ break;
+ case 'BLOCKING':
+ $colorseriesstat[$objp->rowid] = $badgeStatus8;
+ break;
+ default:
+ break;
+ }
+ $i++;
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+
+ $dataseries = array();
+ $data = array();
+ $sql = "SELECT t.severity_code, COUNT(t.severity_code) as nb";
+ $sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t";
+ $sql .= " WHERE t.fk_statut <> 8";
+ $sql .= " GROUP BY t.severity_code";
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num) {
+ $objp = $this->db->fetch_object($resql);
+ $data[$objp->severity_code] = $objp->nb;
+ $i++;
+ }
+ foreach ($listofoppcode as $rowid => $code) {
+ $dataseries[] = array('label' => $langs->getLabelFromKey($this->db, 'TicketSeverityShort' . $code, 'c_ticket_category', 'code', 'label', $code), 'data' => $data[$code]);
+ }
+ } else {
+ dol_print_error($this->db);
+ }
+ $stringtoprint = '';
+ $stringtoprint .= '';
+ if (!empty($dataseries) && count($dataseries) > 0) {
+ include_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
+ $px1 = new DolGraph();
+ $mesg = $px1->isGraphKo();
+ $totalnb = 0;
+ if (!$mesg) {
+ $px1->SetDataColor(array_values($colorseriesstat));
+ $data = array();
+ $legend = array();
+ foreach ($dataseries as $value) {
+ $data[] = array($value['label'], $value['data']);
+ $totalnb += $value['data'];
+ }
+ $px1->SetData($data);
+ $px1->setShowLegend(2);
+ $px1->SetType(array('pie'));
+ $px1->SetLegend($legend);
+ $px1->SetMaxValue($px1->GetCeilMaxValue());
+ //$px1->SetHeight($HEIGHT);
+ $px1->SetShading(3);
+ $px1->SetHorizTickIncrement(1);
+ $px1->SetCssPrefix("cssboxes");
+ $px1->mode = 'depth';
+
+ $px1->draw('idgraphticketseverity');
+ $stringtoprint .= $px1->show($totalnb ? 0 : 1);
+ }
+ $stringtoprint .= '
';
+ $this->info_box_contents[][]=array(
+ 'td' => 'center',
+ 'text' => $stringtoprint
+ );
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="center opacitymedium"',
+ 'text' => $langs->trans("BoxNoTicketSeverity")
+ );
+ }
+ } else {
+ $this->info_box_contents[0][0] = array(
+ 'td' => 'class="left"',
+ 'text' => $langs->trans("ReadPermissionNotAllowed"),
+ );
+ }
+ }
+
+ /**
+ * Method to show box
+ *
+ * @param array $head Array with properties of box title
+ * @param array $contents Array with properties of box lines
+ * @param int $nooutput No print, only return string
+ * @return string
+ */
+ public function showBox($head = null, $contents = null, $nooutput = 0)
+ {
+ return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput);
+ }
+}
diff --git a/htdocs/core/class/infobox.class.php b/htdocs/core/class/infobox.class.php
index e18689e3c2f..076dace54f0 100644
--- a/htdocs/core/class/infobox.class.php
+++ b/htdocs/core/class/infobox.class.php
@@ -40,17 +40,18 @@ class InfoBox
if (empty($conf->global->MAIN_FEATURES_LEVEL) || $conf->global->MAIN_FEATURES_LEVEL < 2) {
return array(
0 => 'Home',
- 1 => 'userhome',
- 2 => 'membersindex',
- 3 => 'thirdpartiesindex',
+ 1 => 'UsersHome',
+ 2 => 'MembersHome',
+ 3 => 'ThirdpartiesHome',
+ 11 => 'TicketsHome',
27 => 'AccountancyHome'
);
} else {
return array(
0 => 'Home',
- 1 => 'userhome',
- 2 => 'membersindex',
- 3 => 'thirdpartiesindex',
+ 1 => 'UsersHome',
+ 2 => 'MembersHome',
+ 3 => 'ThirdpartiesHome',
4 => 'productindex',
5 => 'productindex',
6 => 'mrpindex',
@@ -58,7 +59,7 @@ class InfoBox
8 => 'projectsindex',
9 => 'invoiceindex',
10 => 'hrmindex',
- 11 => 'ticketsindex',
+ 11 => 'TicketsHome',
12 => 'stockindex',
13 => 'sendingindex',
14 => 'receptionindex',
diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php
index 6ba5c4ae972..2db99938778 100644
--- a/htdocs/core/modules/modTicket.class.php
+++ b/htdocs/core/modules/modTicket.class.php
@@ -143,7 +143,11 @@ class modTicket extends DolibarrModules
// Add here list of php file(s) stored in core/boxes that contains class to show a box.
$this->boxes = array(
0=>array('file'=>'box_last_ticket.php', 'enabledbydefaulton'=>'Home'),
- 1=>array('file'=>'box_last_modified_ticket.php', 'enabledbydefaulton'=>'Home')
+ 1=>array('file'=>'box_last_modified_ticket.php', 'enabledbydefaulton'=>'Home'),
+ 2=>array('file'=>'box_ticket_by_severity.php', 'enabledbydefaulton'=>'ticketindex'),
+ 3=>array('file'=>'box_nb_ticket_last_x_days.php', 'enabledbydefaulton'=>'ticketindex'),
+ 4=>array('file'=>'box_nb_tickets_type.php', 'enabledbydefaulton'=>'ticketindex'),
+ 5=>array('file'=>'box_new_vs_close_ticket.php', 'enabledbydefaulton'=>'ticketindex')
); // Boxes list
// Permissions
diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql
index 7f8f3c9aba7..31f0aa738d6 100644
--- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql
+++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql
@@ -256,3 +256,12 @@ UPDATE llx_payment_salary as ps SET ps.fk_salary = ps.rowid WHERE ps.fk_salary I
UPDATE llx_payment_salary as ps SET ps.ref = ps.rowid WHERE ps.ref IS NULL;
ALTER TABLE llx_salary CHANGE paye paye smallint default 0 NOT NULL;
+
+
+DELETE FROM llx_boxes WHERE box_id IN (SELECT rowid FROM llx_boxes_def WHERE file IN ('box_ticket_by_severity.php', 'box_nb_ticket_last_x_days.php', 'box_nb_tickets_type.php', 'box_new_vs_close_ticket.php'));
+DELETE FROM llx_boxes_def WHERE file IN ('box_ticket_by_severity.php', 'box_nb_ticket_last_x_days.php', 'box_nb_tickets_type.php', 'box_new_vs_close_ticket.php');
+
+-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_graph_ticket_by_severity.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_graph_ticket_by_severity.php' AND entity = 1);
+-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_graph_nb_ticket_last_x_days.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_graph_nb_ticket_last_x_days.php' AND entity = 1);
+-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_graph_nb_tickets_type.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_graph_nb_tickets_type.php' AND entity = 1);
+-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_graph_new_vs_close_ticket.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_graph_new_vs_close_ticket.php' AND entity = 1);
diff --git a/htdocs/langs/en_US/boxes.lang b/htdocs/langs/en_US/boxes.lang
index 6e70999fd77..981b63500ac 100644
--- a/htdocs/langs/en_US/boxes.lang
+++ b/htdocs/langs/en_US/boxes.lang
@@ -111,5 +111,9 @@ BoxTitleLastCustomerShipments=Latest %s customer shipments
NoRecordedShipments=No recorded customer shipment
BoxCustomersOutstandingBillReached=Customers with oustanding limit reached
# Pages
-AccountancyHome=Accountancy
+UsersHome=Home users and groups
+MembersHome=Home Membership
+ThirdpartiesHome=Home Thirdparties
+TicketsHome=Home Tickets
+AccountancyHome=Home Accountancy
ValidatedProjects=Validated projects
diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang
index 3ca908e86d8..93f55289351 100644
--- a/htdocs/langs/en_US/ticket.lang
+++ b/htdocs/langs/en_US/ticket.lang
@@ -302,3 +302,13 @@ BoxLastModifiedTicket=Latest modified tickets
BoxLastModifiedTicketDescription=Latest %s modified tickets
BoxLastModifiedTicketContent=
BoxLastModifiedTicketNoRecordedTickets=No recent modified tickets
+BoxTicketType=Number of open tickets by type
+BoxTicketSeverity=Number of open tickets by severity
+BoxNoTicketSeverity=No tickets opened
+BoxTicketLastXDays=Number of new tickets by days the last %s days
+BoxTicketLastXDayswidget = Number of new tickets by days the last X days
+BoxNoTicketLastXDays=No new tickets the last %s days
+BoxNumberOfTicketByDay=Number of new tickets by day
+BoxNewTicketVSClose=Number of today's new tickets versus today's closed tickets
+TicketCreatedToday=Ticket created today
+TicketClosedToday=Ticket closed today
\ No newline at end of file
diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php
index f4a1569c8ce..f9559ecf7a9 100644
--- a/htdocs/theme/eldy/global.inc.php
+++ b/htdocs/theme/eldy/global.inc.php
@@ -1845,12 +1845,15 @@ div.fichehalfright {
print "margin-top: 10px;\n";
} ?>
}
-div.firstcolumn div.box {
+
+/*div.firstcolumn div.box {
padding-right: 10px;
}
div.secondcolumn div.box {
padding-left: 10px;
-}
+}*/
+
+
/* Force values on one colum for small screen */
@media only screen and (max-width: 1000px)
{
diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php
index e602cadb6a6..4d58c4423d4 100644
--- a/htdocs/theme/md/style.css.php
+++ b/htdocs/theme/md/style.css.php
@@ -1846,12 +1846,14 @@ div.fichehalfright {
print "margin-top: 10px;\n";
} ?>
}
-div.firstcolumn div.box {
+
+/*div.firstcolumn div.box {
padding-right: 10px;
}
div.secondcolumn div.box {
padding-left: 10px;
-}
+}*/
+
/* Force values on one colum for small screen */
@media only screen and (max-width: 900px)
{
diff --git a/htdocs/ticket/index.php b/htdocs/ticket/index.php
index f871fafa893..31a1efe2481 100644
--- a/htdocs/ticket/index.php
+++ b/htdocs/ticket/index.php
@@ -26,6 +26,7 @@ require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticketstats.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
$hookmanager = new HookManager($db);
@@ -70,6 +71,7 @@ $object = new Ticket($db);
/*
* View
*/
+$resultboxes = FormOther::getBoxesArea($user, "11"); // Load $resultboxes (selectboxlist + boxactivated + boxlista + boxlistb)
$form = new Form($db);
$tickesupstatic = new Ticket($db);
@@ -77,7 +79,7 @@ $tickesupstatic = new Ticket($db);
llxHeader('', $langs->trans('TicketsIndex'), '');
$linkback = '';
-print load_fiche_titre($langs->trans('TicketsIndex'), $linkback, 'ticket');
+print load_fiche_titre($langs->trans('TicketsIndex'), $resultboxes['selectboxlist'], 'ticket');
$dir = '';
@@ -112,7 +114,12 @@ $startyear = $endyear - 1;
$WIDTH = (($shownb && $showtot) || !empty($conf->dol_optimize_smallscreen)) ? '100%' : '80%';
$HEIGHT = '200';
-print '';
+print '
';
+print '
';
+
+print '
';
+
+print '
';
/*
* Statistics area
@@ -181,7 +188,7 @@ if ($result) {
}
}
- include_once DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/theme_vars.inc.php';
+ include DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/theme_vars.inc.php';
$dataseries = array();
$colorseries = array();
@@ -279,8 +286,13 @@ print '
';
// Build graphic number of object
$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear);
-print '
';
+print ' '."\n";
+print $resultboxes['boxlista'];
+
+print '
'."\n";
+
+print '
';
/*
* Latest tickets
@@ -398,12 +410,20 @@ if ($result) {
dol_print_error($db);
}
-print '
';
+print $resultboxes['boxlistb'];
+
+print '
';
+print '
';
+print ' ';
+
+
print '