2020-08-27 09:11:53 +00:00
< ? php
/* Copyright ( C ) 2012 - 2014 Charles - François BENKE < charles . fr @ benke . fr >
* Copyright ( C ) 2014 Marcos García < marcosgdf @ gmail . com >
* Copyright ( C ) 2015 Frederic France < frederic . france @ free . fr >
* Copyright ( C ) 2016 Juan José Menent < jmenent @ 2 byte . es >
* Copyright ( C ) 2020 Pierre Ardoin < mapiolca @ me . 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 />.
*/
/**
2020-08-27 15:23:53 +00:00
* \file htdocs / core / boxes / box_validated_projects . php
2020-08-27 09:11:53 +00:00
* \ingroup projet
2020-08-27 15:23:53 +00:00
* \brief Module to show validated projects whose tasks are assigned to the connected person , without any time entered by the connected person
2020-08-27 09:11:53 +00:00
*/
include_once DOL_DOCUMENT_ROOT . " /core/boxes/modules_boxes.php " ;
2022-01-21 18:16:29 +00:00
2020-08-27 09:11:53 +00:00
/**
* Class to manage the box to show last projet
*/
2020-08-27 15:23:53 +00:00
class box_validated_projects extends ModeleBoxes
2020-08-27 09:11:53 +00:00
{
2020-10-31 17:51:30 +00:00
public $boxcode = " validated_project " ;
public $boximg = " object_projectpub " ;
2020-10-31 13:32:18 +00:00
public $boxlabel ;
//var $depends = array("projet");
2020-08-27 09:11:53 +00:00
2020-10-31 13:32:18 +00:00
/**
* @ var DoliDB Database handler .
*/
public $db ;
2020-08-27 09:11:53 +00:00
2020-10-31 13:32:18 +00:00
public $param ;
2020-08-27 09:11:53 +00:00
2020-10-31 13:32:18 +00:00
public $info_box_head = array ();
public $info_box_contents = array ();
2020-08-27 09:11:53 +00:00
2020-10-31 13:32:18 +00:00
public $enabled = 1 ;
2020-10-09 14:49:23 +00:00
2020-10-31 13:32:18 +00:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
* @ param string $param More parameters
*/
public function __construct ( $db , $param = '' )
{
global $conf , $user , $langs ;
2020-08-27 09:11:53 +00:00
2020-10-31 13:32:18 +00:00
// Load translation files required by the page
$langs -> loadLangs ( array ( 'boxes' , 'projects' ));
2020-08-27 09:11:53 +00:00
2020-10-31 13:32:18 +00:00
$this -> db = $db ;
2022-01-21 18:16:29 +00:00
$this -> boxlabel = " ProjectTasksWithoutTimeSpent " ;
2020-08-27 09:11:53 +00:00
2020-10-31 17:51:30 +00:00
$this -> hidden = ! ( $user -> rights -> projet -> lire );
2020-10-09 14:49:23 +00:00
2021-02-23 21:03:23 +00:00
if ( $conf -> global -> MAIN_FEATURES_LEVEL < 2 ) {
$this -> enabled = 0 ;
}
2020-10-31 13:32:18 +00:00
}
/**
* Load data for box to show them later
*
* @ param int $max Maximum number of records to load
* @ return void
*/
public function loadBox ( $max = 5 )
{
global $conf , $user , $langs ;
2020-10-31 17:51:30 +00:00
$this -> max = $max ;
2020-10-31 13:32:18 +00:00
$totalMnt = 0 ;
$totalnb = 0 ;
2020-10-31 17:51:30 +00:00
$totalnbTask = 0 ;
2020-10-31 13:32:18 +00:00
$textHead = $langs -> trans ( " ProjectTasksWithoutTimeSpent " );
$this -> info_box_head = array ( 'text' => $textHead , 'limit' => dol_strlen ( $textHead ));
// list the summary of the orders
if ( $user -> rights -> projet -> lire ) {
include_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php' ;
$projectstatic = new Project ( $this -> db );
2020-10-31 17:51:30 +00:00
$socid = 0 ;
2020-10-31 13:32:18 +00:00
//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.
// Get list of project id allowed to user (in a string list separated by coma)
2020-10-31 17:51:30 +00:00
$projectsListId = '' ;
2021-10-24 08:02:12 +00:00
if ( empty ( $user -> rights -> projet -> all -> lire )) {
2021-02-23 21:03:23 +00:00
$projectsListId = $projectstatic -> getProjectsAuthorizedForUser ( $user , 0 , 1 , $socid );
}
2020-10-31 13:32:18 +00:00
// I tried to solve sql error and performance problem, rewriting sql request but it is not clear what we want.
// Count of tasks without time spent for tasks we are assigned too or
// Count of tasks without time spent for all tasks of projects we are allowed to read (what it does) ?
$sql = " SELECT p.rowid, p.ref, p.fk_soc, p.dateo as startdate, " ;
2020-10-31 17:51:30 +00:00
$sql .= " COUNT(DISTINCT t.rowid) as tasknumber " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " projet AS p " ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " projet_task AS t ON p.rowid = t.fk_projet " ;
2021-09-21 01:08:43 +00:00
// TODO Replace -1, -2, -3 with ID used for type of contact project_task into llx_c_type_contact. Once done, we can switch widget as stable.
2020-10-31 17:51:30 +00:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " element_contact as ec ON ec.element_id = t.rowid AND fk_c_type_contact IN (-1, -2, -3) " ;
$sql .= " WHERE p.fk_statut = 1 " ; // Only open projects
2021-02-23 21:03:23 +00:00
if ( $projectsListId ) {
2022-01-21 18:16:29 +00:00
$sql .= ' AND p.rowid IN (' . $this -> db -> sanitize ( $projectsListId ) . ')' ; // Only projects that are allowed
2021-02-23 21:03:23 +00:00
}
2021-08-23 16:56:46 +00:00
$sql .= " AND t.rowid NOT IN (SELECT fk_task FROM " . MAIN_DB_PREFIX . " projet_task_time WHERE fk_user = " . (( int ) $user -> id ) . " ) " ;
2020-10-31 17:51:30 +00:00
$sql .= " GROUP BY p.rowid, p.ref, p.fk_soc, p.dateo " ;
$sql .= " ORDER BY p.dateo ASC " ;
2020-08-28 12:07:35 +00:00
2020-10-31 13:32:18 +00:00
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
2020-08-28 12:07:35 +00:00
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="nowraponall"' ,
'text' => " Reference projet " ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="center"' ,
'text' => 'Client' ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="center"' ,
'text' => 'Date debut de projet' ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="center"' ,
'text' => 'Nombre de mes tâches sans temps saisi' ,
);
$i ++ ;
2020-10-31 17:51:30 +00:00
while ( $i < min ( $num + 1 , $max + 1 )) {
2020-10-31 13:32:18 +00:00
$objp = $this -> db -> fetch_object ( $result );
$projectstatic -> id = $objp -> rowid ;
$projectstatic -> ref = $objp -> ref ;
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="nowraponall"' ,
'text' => $projectstatic -> getNomUrl ( 1 ),
'asis' => 1
);
if ( $objp -> fk_soc > 0 ) {
2021-09-30 13:59:47 +00:00
$sql = " SELECT rowid, nom as name FROM " . MAIN_DB_PREFIX . " societe WHERE rowid = " . (( int ) $objp -> fk_soc );
2020-10-31 13:32:18 +00:00
$resql = $this -> db -> query ( $sql );
//$socstatic = new Societe($this->db);
$obj2 = $this -> db -> fetch_object ( $resql );
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="tdoverflowmax150 maxwidth200onsmartphone"' ,
'text' => $obj2 -> name ,
'asis' => 1 ,
2021-08-27 22:55:51 +00:00
'url' => DOL_URL_ROOT . '/societe/card.php?socid=' . urlencode ( $obj2 -> rowid )
2020-10-31 13:32:18 +00:00
);
2021-02-23 21:03:23 +00:00
} else {
2020-10-31 13:32:18 +00:00
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="tdoverflowmax150 maxwidth200onsmartphone"' ,
'text' => '' ,
'asis' => 1 ,
'url' => ''
);
}
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="center"' ,
'text' => $objp -> startDate ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="center"' ,
'text' => $objp -> tasknumber . " " . $langs -> trans ( " Tasks " ),
2020-08-28 13:45:10 +00:00
'asis' => 1 ,
2020-10-31 13:32:18 +00:00
);
$i ++ ;
}
2020-10-31 17:51:30 +00:00
} else {
2020-10-31 13:32:18 +00:00
dol_print_error ( $this -> db );
2020-08-28 12:07:35 +00:00
}
2020-10-31 13:32:18 +00:00
}
}
/**
* 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 );
}
2020-08-27 09:11:53 +00:00
}