2014-06-18 21:36:00 +02:00
< ? php
/* Copyright ( C ) 2012 - 2014 Charles - François BENKE < charles . fr @ benke . fr >
2014-12-23 16:37:53 +01:00
* Copyright ( C ) 2014 Marcos García < marcosgdf @ gmail . com >
2015-01-25 01:20:58 +01:00
* Copyright ( C ) 2015 Frederic France < frederic . france @ free . fr >
2016-10-04 16:51:44 +02:00
* Copyright ( C ) 2016 Juan José Menent < jmenent @ 2 byte . es >
2020-02-04 09:17:02 +01:00
* Copyright ( C ) 2020 Pierre Ardoin < mapiolca @ me . com >
2024-08-18 18:16:08 +02:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2015-01-25 01:20:58 +01:00
*
2014-06-18 21:36:00 +02:00
* 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
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2014-06-18 21:36:00 +02:00
*/
/**
2019-12-12 08:17:14 +01:00
* \file htdocs / core / boxes / box_project . php
2023-05-05 14:22:32 +02:00
* \ingroup project
2023-07-23 22:50:05 +02:00
* \brief Module to show Project activity of the current Year
2014-06-18 21:36:00 +02:00
*/
2018-07-26 11:57:25 +02:00
include_once DOL_DOCUMENT_ROOT . " /core/boxes/modules_boxes.php " ;
2014-06-18 21:36:00 +02:00
2014-06-20 23:19:57 +02:00
/**
2023-07-23 22:50:05 +02:00
* Class to manage the box to show last project
2014-06-20 23:19:57 +02:00
*/
2014-06-20 23:56:03 +02:00
class box_project extends ModeleBoxes
2014-06-20 23:19:57 +02:00
{
2020-10-31 14:32:18 +01:00
public $boxcode = " project " ;
2023-07-23 22:50:05 +02:00
public $boximg = " object_projectpub " ;
2024-12-04 23:16:16 +01:00
/**
* @ var string
*/
2020-10-31 14:32:18 +01:00
public $boxlabel ;
2024-01-07 16:57:14 +01:00
// var $depends = array("projet");
2020-10-31 14:32:18 +01:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
* @ param string $param More parameters
*/
public function __construct ( $db , $param = '' )
{
global $user , $langs ;
// Load translation files required by the page
$langs -> loadLangs ( array ( 'boxes' , 'projects' ));
$this -> db = $db ;
$this -> boxlabel = " OpenedProjects " ;
2024-02-09 15:58:49 +01:00
$this -> hidden = ! $user -> hasRight ( 'projet' , 'lire' );
2024-10-14 11:56:59 +02:00
$this -> urltoaddentry = DOL_URL_ROOT . '/projet/card.php?action=create' ;
$this -> msgNoRecords = 'NoOpenedProjects' ;
2020-10-31 14:32:18 +01: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 ;
$this -> max = $max ;
$totalMnt = 0 ;
$totalnb = 0 ;
$totalnbTask = 0 ;
2024-12-04 23:16:16 +01:00
$num = 0 ;
2020-10-31 14:32:18 +01:00
$textHead = $langs -> trans ( " OpenedProjects " );
2024-08-18 18:16:08 +02:00
$this -> info_box_head = array ( 'text' => $textHead , 'limit' => dol_strlen ( $textHead ));
2020-10-31 14:32:18 +01:00
2022-06-13 16:10:45 +02:00
$i = 0 ;
2020-10-31 14:32:18 +01:00
// list the summary of the orders
2023-10-11 19:32:04 +02:00
if ( $user -> hasRight ( 'projet' , 'lire' )) {
2020-10-31 14:32:18 +01:00
include_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php' ;
2023-05-05 15:10:52 +02:00
include_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php' ;
2020-10-31 14:32:18 +01:00
$projectstatic = new Project ( $this -> db );
2023-05-05 15:10:52 +02:00
$companystatic = new Societe ( $this -> db );
2020-10-31 14:32:18 +01:00
$socid = 0 ;
2024-01-13 19:48:20 +01: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 assignment.
2020-10-31 14:32:18 +01:00
// Get list of project id allowed to user (in a string list separated by coma)
$projectsListId = '' ;
2023-10-11 19:32:04 +02:00
if ( ! $user -> hasRight ( 'projet' , 'all' , 'lire' )) {
2021-02-23 22:03:23 +01:00
$projectsListId = $projectstatic -> getProjectsAuthorizedForUser ( $user , 0 , 1 , $socid );
}
2020-10-31 14:32:18 +01:00
2023-05-05 15:10:52 +02:00
$sql = " SELECT p.rowid, p.ref, p.title, p.fk_statut as status, p.public, p.fk_soc, " ;
$sql .= " s.nom as name, s.name_alias " ;
2020-10-31 14:32:18 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as p " ;
2023-05-05 15:10:52 +02:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s on p.fk_soc = s.rowid " ;
2020-10-31 14:32:18 +01:00
$sql .= " WHERE p.entity IN ( " . getEntity ( 'project' ) . " ) " ; // Only current entity or severals if permission ok
2023-05-06 11:46:11 +02:00
$sql .= " AND p.fk_statut = " . (( int ) $projectstatic :: STATUS_VALIDATED ); // Only open projects
2023-10-11 19:32:04 +02:00
if ( ! $user -> hasRight ( 'projet' , 'all' , 'lire' )) {
2021-03-22 11:30:18 +01:00
$sql .= " AND p.rowid IN ( " . $this -> db -> sanitize ( $projectsListId ) . " ) " ; // public and assigned to, or restricted to company for external users
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY p.datec DESC " ;
//$sql.= $this->db->plimit($max, 0);
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
while ( $i < min ( $num , $max )) {
$objp = $this -> db -> fetch_object ( $result );
$projectstatic -> id = $objp -> rowid ;
$projectstatic -> ref = $objp -> ref ;
$projectstatic -> title = $objp -> title ;
$projectstatic -> public = $objp -> public ;
$projectstatic -> statut = $objp -> status ;
2023-05-05 15:10:52 +02:00
$companystatic -> id = $objp -> fk_soc ;
$companystatic -> name = $objp -> name ;
$companystatic -> name_alias = $objp -> name_alias ;
2020-10-31 14:32:18 +01:00
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="nowraponall"' ,
'text' => $projectstatic -> getNomUrl ( 1 ),
'asis' => 1
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="tdoverflowmax150 maxwidth200onsmartphone"' ,
'text' => $objp -> title ,
);
2023-05-05 15:10:52 +02:00
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="tdoverflowmax100"' ,
'text' => ( $objp -> fk_soc > 0 ? $companystatic -> getNomUrl ( 1 ) : '' ),
'asis' => 1
);
2020-10-31 14:32:18 +01:00
$sql = " SELECT count(*) as nb, sum(progress) as totprogress " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as p LEFT JOIN " . MAIN_DB_PREFIX . " projet_task as pt on pt.fk_projet = p.rowid " ;
2021-08-23 18:56:46 +02:00
$sql .= " WHERE p.entity IN ( " . getEntity ( 'project' ) . ')' ;
$sql .= " AND p.rowid = " . (( int ) $objp -> rowid );
2020-10-31 14:32:18 +01:00
$resultTask = $this -> db -> query ( $sql );
if ( $resultTask ) {
$objTask = $this -> db -> fetch_object ( $resultTask );
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="right"' ,
'text' => $objTask -> nb . " " . $langs -> trans ( " Tasks " ),
);
2021-02-23 22:03:23 +01:00
if ( $objTask -> nb > 0 ) {
2020-10-31 14:32:18 +01:00
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="right"' ,
'text' => round ( $objTask -> totprogress / $objTask -> nb , 0 ) . " % " ,
);
2021-02-23 22:03:23 +01:00
} else {
$this -> info_box_contents [ $i ][] = array ( 'td' => 'class="right"' , 'text' => " N/A " );
}
2020-10-31 14:32:18 +01:00
$totalnbTask += $objTask -> nb ;
} else {
$this -> info_box_contents [ $i ][] = array ( 'td' => 'class="right"' , 'text' => round ( 0 ));
$this -> info_box_contents [ $i ][] = array ( 'td' => 'class="right"' , 'text' => " N/A " );
}
$this -> info_box_contents [ $i ][] = array ( 'td' => 'class="right"' , 'text' => $projectstatic -> getLibStatut ( 3 ));
$i ++ ;
}
2021-02-23 22:03:23 +01:00
if ( $max < $num ) {
2023-05-12 21:37:55 +02:00
$this -> info_box_contents [ $i ][] = array ( 'td' => 'colspan="6"' , 'text' => '...' );
2020-10-31 14:32:18 +01:00
$i ++ ;
}
}
}
2024-10-14 11:56:59 +02:00
if ( $num > 0 ) {
// Add the sum à the bottom of the boxes
$this -> info_box_contents [ $i ][] = array (
'tr' => 'class="liste_total_wrap"' ,
'td' => 'class="liste_total"' ,
'text' => $langs -> trans ( " Total " ) . " " . $textHead ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="right liste_total" ' ,
'text' => round ( $num , 0 ) . " " . $langs -> trans ( " Projects " ),
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="right liste_total" ' ,
'text' => (( $max < $num ) ? '' : ( round ( $totalnbTask , 0 ) . " " . $langs -> trans ( " Tasks " ))),
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="liste_total"' ,
'text' => " " ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="liste_total"' ,
'text' => " " ,
);
$this -> info_box_contents [ $i ][] = array (
'td' => 'class="liste_total"' ,
'text' => " " ,
);
}
2020-10-31 14:32:18 +01:00
}
2024-09-28 12:09:35 +02:00
2020-10-31 14:32:18 +01:00
/**
2024-09-28 12:09:35 +02:00
* Method to show box . Called when the box needs to be displayed .
2020-10-31 14:32:18 +01:00
*
2024-09-28 12:09:35 +02:00
* @ param ? array < array { text ? : string , sublink ? : string , subtext ? : string , subpicto ? : ? string , picto ? : string , nbcol ? : int , limit ? : int , subclass ? : string , graph ? : int < 0 , 1 > , target ? : string } > $head Array with properties of box title
* @ param ? array < array { tr ? : string , td ? : string , target ? : string , text ? : string , text2 ? : string , textnoformat ? : string , tooltip ? : string , logo ? : string , url ? : string , maxlength ? : int , asis ? : int < 0 , 1 > } > $contents Array with properties of box lines
2024-08-18 18:16:08 +02:00
* @ param int < 0 , 1 > $nooutput No print , only return string
2020-10-31 14:32:18 +01:00
* @ return string
*/
public function showBox ( $head = null , $contents = null , $nooutput = 0 )
{
return parent :: showBox ( $this -> info_box_head , $this -> info_box_contents , $nooutput );
}
2014-06-18 21:36:00 +02:00
}