2015-06-30 14:32:17 +02:00
< ? php
/* Lead
* Copyright ( C ) 2014 - 2015 Florian HENRY < florian . henry @ open - concept . pro >
2025-02-10 21:20:09 +01:00
* Copyright ( C ) 2024 - 2025 MDW < mdeweerd @ users . noreply . github . com >
2015-06-30 14:32:17 +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 />.
2015-06-30 14:32:17 +02:00
*/
2020-04-10 10:59:32 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/class/stats.class.php' ;
include_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php' ;
2015-06-30 14:32:17 +02:00
2015-07-10 10:42:42 +02:00
/**
* Class to manage statistics on projects
*/
2015-06-30 14:32:17 +02:00
class ProjectStats extends Stats
{
2024-11-06 23:57:45 +01:00
/**
* @ var Project
*/
2020-10-31 14:32:18 +01:00
private $project ;
2024-11-06 23:57:45 +01:00
/**
* @ var int
*/
2020-10-31 14:32:18 +01:00
public $userid ;
2024-11-06 23:57:45 +01:00
/**
* @ var int
*/
2020-10-31 14:32:18 +01:00
public $socid ;
2024-11-06 23:57:45 +01:00
/**
* @ var int
*/
2022-05-16 10:45:42 +02:00
public $status ;
2024-11-06 23:57:45 +01:00
/**
* @ var string
*/
2022-05-16 10:45:42 +02:00
public $opp_status ;
2022-09-09 11:09:53 +02:00
//SQL stat
2024-11-06 23:57:45 +01:00
/**
* @ var string
*/
2022-09-09 11:09:53 +02:00
public $field ;
2024-11-06 23:57:45 +01:00
/**
* @ var string
*/
2022-09-09 11:09:53 +02:00
public $from ;
2024-11-06 23:57:45 +01:00
/**
* @ var string
*/
2022-09-09 11:09:53 +02:00
public $where ;
2017-06-02 19:36:03 +02:00
2020-10-31 14:32:18 +01:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
*/
public function __construct ( $db )
{
global $conf , $user ;
2015-06-30 14:32:17 +02:00
2020-10-31 14:32:18 +01:00
$this -> db = $db ;
2015-06-30 14:32:17 +02:00
2020-10-31 14:32:18 +01:00
require_once 'project.class.php' ;
$this -> project = new Project ( $this -> db );
2022-09-09 11:09:53 +02:00
$this -> from = MAIN_DB_PREFIX . $this -> project -> table_element ;
$this -> field = 'opp_amount' ;
$this -> where = " entity = " . $conf -> entity ;
if ( $this -> socid > 0 ) {
$this -> where .= " AND fk_soc = " . (( int ) $this -> socid );
}
if ( is_array ( $this -> userid ) && count ( $this -> userid ) > 0 ) {
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 21:46:12 +01:00
$this -> where .= ' AND fk_user IN (' . $this -> db -> sanitize ( implode ( ',' , $this -> userid )) . ')' ;
2022-09-09 11:09:53 +02:00
} elseif ( $this -> userid > 0 ) {
$this -> where .= " AND fk_user = " . (( int ) $this -> userid );
}
2020-10-31 14:32:18 +01:00
}
2015-06-30 14:32:17 +02:00
/**
2017-06-02 19:36:03 +02:00
* Return all leads grouped by opportunity status .
2016-07-08 10:59:13 +02:00
* Warning : There is no filter on WON / LOST because we want this for statistics .
2015-06-30 14:32:17 +02:00
*
2015-09-01 16:52:20 +02:00
* @ param int $limit Limit results
2024-11-06 23:57:45 +01:00
* @ return array < array { 0 : string , 1 : float } >| int <- 1 , - 1 > Array with value or - 1 if error
2015-06-30 14:32:17 +02:00
* @ throws Exception
*/
2019-02-24 23:32:09 +01:00
public function getAllProjectByStatus ( $limit = 5 )
2015-06-30 14:32:17 +02:00
{
global $conf , $user , $langs ;
2020-04-10 10:59:32 +02:00
$datay = array ();
2015-06-30 14:32:17 +02:00
$sql = " SELECT " ;
2015-09-01 16:52:20 +02:00
$sql .= " SUM(t.opp_amount), t.fk_opp_status, cls.code, cls.label " ;
2020-04-10 10:59:32 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t " ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:52:06 +02:00
//if (! $user->rights->societe->client->voir && ! $user->socid)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2017-06-02 19:36:03 +02:00
$sql .= " , " . MAIN_DB_PREFIX . " c_lead_status as cls " ;
2015-06-30 14:32:17 +02:00
$sql .= $this -> buildWhere ();
2024-01-12 17:55:52 +01:00
// For external user, no check is done on company permission because readability is managed by public status of project and assignment.
2021-06-09 15:36:47 +02:00
//if ($socid > 0) $sql.= " AND t.fk_soc = ".((int) $socid);
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2021-08-23 18:56:46 +02:00
//if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND ((s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id).") OR (s.rowid IS NULL))";
2016-01-18 16:43:15 +01:00
$sql .= " AND t.fk_opp_status = cls.rowid " ;
2020-04-10 10:59:32 +02:00
$sql .= " AND t.fk_statut <> 0 " ; // We want historic also, so all projects not draft
2015-09-01 16:52:20 +02:00
$sql .= " GROUP BY t.fk_opp_status, cls.code, cls.label " ;
2015-06-30 14:32:17 +02:00
2020-04-10 10:59:32 +02:00
$result = array ();
2015-06-30 14:32:17 +02:00
2022-12-28 16:40:03 +01:00
dol_syslog ( get_class ( $this ) . '::' . __METHOD__ , LOG_DEBUG );
2015-06-30 14:32:17 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
$other = 0 ;
2020-04-10 10:59:32 +02:00
while ( $i < $num ) {
2015-06-30 14:32:17 +02:00
$row = $this -> db -> fetch_row ( $resql );
2021-02-26 18:49:22 +01:00
if ( $i < $limit || $num == $limit ) {
2018-06-20 21:31:37 +02:00
$label = (( $langs -> trans ( " OppStatus " . $row [ 2 ]) != " OppStatus " . $row [ 2 ]) ? $langs -> trans ( " OppStatus " . $row [ 2 ]) : $row [ 2 ]);
2015-09-01 16:52:20 +02:00
$result [ $i ] = array (
2020-04-10 10:59:32 +02:00
$label . ' (' . price ( price2num ( $row [ 0 ], 'MT' ), 1 , $langs , 1 , - 1 , - 1 , $conf -> currency ) . ')' ,
2018-06-20 21:31:37 +02:00
$row [ 0 ]
2015-06-30 14:32:17 +02:00
);
2021-02-26 18:49:22 +01:00
} else {
$other += $row [ 1 ];
}
2023-12-04 13:49:31 +01:00
$i ++ ;
2015-06-30 14:32:17 +02:00
}
2021-02-26 18:49:22 +01:00
if ( $num > $limit ) {
2020-04-10 10:59:32 +02:00
$result [ $i ] = array (
2018-06-20 21:31:37 +02:00
$langs -> transnoentitiesnoconv ( " Other " ),
$other
2015-06-30 14:32:17 +02:00
);
2021-02-26 18:49:22 +01:00
}
2023-12-04 13:49:31 +01:00
$this -> db -> free ( $resql );
2015-06-30 14:32:17 +02:00
} else {
2020-04-10 10:59:32 +02:00
$this -> error = " Error " . $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . '::' . __METHOD__ . ' ' . $this -> error , LOG_ERR );
2015-09-01 16:52:20 +02:00
return - 1 ;
2015-06-30 14:32:17 +02:00
}
return $result ;
}
/**
* Return count , and sum of products
*
2024-10-14 01:59:44 +02:00
* @ return array < array { year : string , nb : string , nb_diff : float , total ? : float , avg ? : float , weighted ? : float , total_diff ? : float , avg_diff ? : float , avg_weighted ? : float } > Array of values
2015-06-30 14:32:17 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getAllByYear ()
2015-06-30 14:32:17 +02:00
{
global $conf , $user , $langs ;
2020-04-10 10:59:32 +02:00
$datay = array ();
2015-06-30 14:32:17 +02:00
2020-04-10 10:59:32 +02:00
$wonlostfilter = 0 ; // No filter on status WON/LOST
2017-06-02 19:36:03 +02:00
2016-07-08 10:59:13 +02:00
$sql = " SELECT date_format(t.datec,'%Y') as year, COUNT(t.rowid) as nb, SUM(t.opp_amount) as total, AVG(t.opp_amount) as avg, " ;
2020-04-10 10:59:32 +02:00
$sql .= " SUM(t.opp_amount * " . $this -> db -> ifsql ( " t.opp_percent IS NULL " . ( $wonlostfilter ? " OR cls.code IN ('WON','LOST') " : " " ), '0' , 't.opp_percent' ) . " / 100) as weighted " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t LEFT JOIN " . MAIN_DB_PREFIX . " c_lead_status as cls ON cls.rowid = t.fk_opp_status " ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:31:37 +02:00
//if (! $user->rights->societe->client->voir && ! $user->soc_id)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2020-04-10 10:59:32 +02:00
$sql .= $this -> buildWhere ();
2024-01-12 17:55:52 +01:00
// For external user, no check is done on company permission because readability is managed by public status of project and assignment.
2021-06-09 15:36:47 +02:00
//if ($socid > 0) $sql.= " AND t.fk_soc = ".((int) $socid);
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2021-08-23 18:56:46 +02:00
//if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND ((s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id).") OR (s.rowid IS NULL))";
2020-04-10 10:59:32 +02:00
$sql .= " GROUP BY year " ;
$sql .= $this -> db -> order ( 'year' , 'DESC' );
2015-06-30 14:32:17 +02:00
return $this -> _getAllByYear ( $sql );
}
2017-06-02 19:36:03 +02:00
2015-06-30 14:32:17 +02:00
/**
2015-07-10 10:42:42 +02:00
* Build the where part
2017-06-02 19:36:03 +02:00
*
2015-06-30 14:32:17 +02:00
* @ return string
*/
2017-06-02 19:36:03 +02:00
public function buildWhere ()
2015-07-10 10:42:42 +02:00
{
2018-06-20 21:52:06 +02:00
global $user ;
2015-06-30 14:32:17 +02:00
$sqlwhere_str = '' ;
2015-07-05 22:04:30 +02:00
$sqlwhere = array ();
2015-06-30 14:32:17 +02:00
2018-06-20 21:52:06 +02:00
// Get list of project id allowed to user (in a string list separated by coma)
$object = new Project ( $this -> db );
2020-04-10 10:59:32 +02:00
$projectsListId = '' ;
2023-10-15 18:39:13 +02:00
if ( ! $user -> hasRight ( 'projet' , 'all' , 'lire' )) {
2021-02-26 18:49:22 +01:00
$projectsListId = $object -> getProjectsAuthorizedForUser ( $user , 0 , 1 , $user -> socid );
}
2018-06-20 21:52:06 +02:00
2020-04-10 10:59:32 +02:00
$sqlwhere [] = ' t.entity IN (' . getEntity ( 'project' ) . ')' ;
2015-06-30 14:32:17 +02:00
2021-02-26 18:49:22 +01:00
if ( ! empty ( $this -> userid )) {
2021-08-28 03:09:18 +02:00
$sqlwhere [] = ' t.fk_user_resp = ' . (( int ) $this -> userid );
2021-02-26 18:49:22 +01:00
}
2018-06-20 21:31:37 +02:00
2024-01-12 17:55:52 +01:00
// Forced filter on socid is similar to forced filter on project. TODO Use project assignment to allow to not use filter on project
2021-02-26 18:49:22 +01:00
if ( ! empty ( $this -> socid )) {
2021-08-28 03:09:18 +02:00
$sqlwhere [] = ' t.fk_soc = ' . (( int ) $this -> socid );
2021-02-26 18:49:22 +01:00
}
2023-07-01 12:49:54 +02:00
if ( ! empty ( $this -> year ) && empty ( $this -> month )) {
$sqlwhere [] = " t.datec BETWEEN ' " . $this -> db -> idate ( dol_get_first_day ( $this -> year , 1 )) . " ' AND ' " . $this -> db -> idate ( dol_get_last_day ( $this -> year , 12 )) . " ' " ;
2021-02-26 18:49:22 +01:00
}
2023-07-01 12:49:54 +02:00
if ( ! empty ( $this -> year ) && ! empty ( $this -> month )) {
$sqlwhere [] = " t.datec BETWEEN ' " . $this -> db -> idate ( dol_get_first_day ( $this -> year , $this -> month )) . " ' AND ' " . $this -> db -> idate ( dol_get_last_day ( $this -> year , $this -> month )) . " ' " ;
2021-02-26 18:49:22 +01:00
}
2015-06-30 14:32:17 +02:00
2021-02-26 18:49:22 +01:00
if ( ! empty ( $this -> status )) {
2025-02-10 21:20:09 +01:00
$sqlwhere [] = " t.fk_statut IN ( " . $this -> db -> sanitize (( string ) $this -> status ) . " ) " ;
2022-05-16 10:45:42 +02:00
}
if ( ! empty ( $this -> opp_status )) {
if ( is_numeric ( $this -> opp_status ) && $this -> opp_status > 0 ) {
$sqlwhere [] = " t.fk_opp_status = " . (( int ) $this -> opp_status );
}
if ( $this -> opp_status == 'all' ) {
$sqlwhere [] = " (t.fk_opp_status IS NOT NULL AND t.fk_opp_status <> -1) " ;
}
if ( $this -> opp_status == 'openedopp' ) {
$sqlwhere [] = " (t.fk_opp_status IS NOT NULL AND t.fk_opp_status <> -1 AND t.fk_opp_status NOT IN (SELECT rowid FROM " . MAIN_DB_PREFIX . " c_lead_status WHERE code IN ('WON','LOST'))) " ;
}
if ( $this -> opp_status == 'notopenedopp' ) {
$sqlwhere [] = " (t.fk_opp_status IS NULL OR t.fk_opp_status = -1 OR t.fk_opp_status IN (SELECT rowid FROM " . MAIN_DB_PREFIX . " c_lead_status WHERE code = 'WON')) " ;
}
if ( $this -> opp_status == 'none' ) {
$sqlwhere [] = " (t.fk_opp_status IS NULL OR t.fk_opp_status = -1) " ;
}
2021-02-26 18:49:22 +01:00
}
2015-06-30 14:32:17 +02:00
2023-10-15 18:39:13 +02:00
if ( ! $user -> hasRight ( 'projet' , 'all' , 'lire' )) {
2021-03-22 11:30:18 +01:00
$sqlwhere [] = " t.rowid IN ( " . $this -> db -> sanitize ( $projectsListId ) . " ) " ; // public and assigned to, or restricted to company for external users
2021-02-26 18:49:22 +01:00
}
2018-06-20 21:52:06 +02:00
2015-06-30 14:32:17 +02:00
if ( count ( $sqlwhere ) > 0 ) {
2020-04-10 10:59:32 +02:00
$sqlwhere_str = ' WHERE ' . implode ( ' AND ' , $sqlwhere );
2015-06-30 14:32:17 +02:00
}
return $sqlwhere_str ;
}
/**
* Return Project number by month for a year
*
2017-12-08 16:15:41 +01:00
* @ param int $year Year to scan
2019-09-23 21:45:23 +02:00
* @ param int $format 0 = Label of abscissa is a translated text , 1 = Label of abscissa is month number , 2 = Label of abscissa is first letter of month
2024-10-14 01:59:44 +02:00
* @ return array < int < 0 , 11 > , array { 0 : int < 1 , 12 > , 1 : int } > Array with number by month
2015-06-30 14:32:17 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getNbByMonth ( $year , $format = 0 )
2015-07-10 10:42:42 +02:00
{
2023-07-01 12:49:54 +02:00
$this -> year = $year ;
2015-06-30 14:32:17 +02:00
$sql = " SELECT date_format(t.datec,'%m') as dm, COUNT(*) as nb " ;
2020-04-10 10:59:32 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t " ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:52:06 +02:00
//if (! $user->rights->societe->client->voir && ! $user->soc_id)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2015-06-30 14:32:17 +02:00
$sql .= $this -> buildWhere ();
$sql .= " GROUP BY dm " ;
$sql .= $this -> db -> order ( 'dm' , 'DESC' );
2017-12-08 16:15:41 +01:00
$res = $this -> _getNbByMonth ( $year , $sql , $format );
2015-06-30 14:32:17 +02:00
// var_dump($res);print '<br>';
return $res ;
}
/**
* Return the Project amount by month for a year
*
2017-12-08 16:15:41 +01:00
* @ param int $year Year to scan
2019-09-23 21:45:23 +02:00
* @ param int $format 0 = Label of abscissa is a translated text , 1 = Label of abscissa is month number , 2 = Label of abscissa is first letter of month
2024-10-14 01:59:44 +02:00
* @ return array < int < 0 , 11 > , array { 0 : int < 1 , 12 > , 1 : int | float } > Array with amount by month
2015-06-30 14:32:17 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getAmountByMonth ( $year , $format = 0 )
2015-07-10 10:42:42 +02:00
{
2023-07-01 12:49:54 +02:00
$this -> year = $year ;
2015-06-30 14:32:17 +02:00
$sql = " SELECT date_format(t.datec,'%m') as dm, SUM(t.opp_amount) " ;
2020-04-10 10:59:32 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t " ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:52:06 +02:00
//if (! $user->rights->societe->client->voir && ! $user->soc_id)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2015-06-30 14:32:17 +02:00
$sql .= $this -> buildWhere ();
$sql .= " GROUP BY dm " ;
$sql .= $this -> db -> order ( 'dm' , 'DESC' );
2017-12-08 16:15:41 +01:00
$res = $this -> _getAmountByMonth ( $year , $sql , $format );
2015-06-30 14:32:17 +02:00
// var_dump($res);print '<br>';
return $res ;
}
2015-07-05 22:04:30 +02:00
/**
* Return amount of elements by month for several years
*
* @ param int $endyear Start year
* @ param int $startyear End year
* @ param int $cachedelay Delay we accept for cache file ( 0 = No read , no save of cache , - 1 = No read but save )
2016-07-08 10:59:13 +02:00
* @ param int $wonlostfilter Add a filter on status won / lost
2025-02-11 02:12:49 +01:00
* @ return int <- 1 , - 1 >| array < int < 0 , 11 > , array { 0 : string , 1 : int , 2 ? : int , 3 ? : int , 4 ? : int } > Array of values or < 0 if error
2015-07-05 22:04:30 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getWeightedAmountByMonthWithPrevYear ( $endyear , $startyear , $cachedelay = 0 , $wonlostfilter = 1 )
2015-07-05 22:04:30 +02:00
{
2020-04-10 10:59:32 +02:00
global $conf , $user , $langs ;
2015-07-05 22:04:30 +02:00
2021-02-26 18:49:22 +01:00
if ( $startyear > $endyear ) {
return - 1 ;
}
2018-06-20 21:31:37 +02:00
2020-04-10 10:59:32 +02:00
$datay = array ();
2018-06-20 21:31:37 +02:00
// Search into cache
2021-02-26 18:49:22 +01:00
if ( ! empty ( $cachedelay )) {
2018-06-20 21:31:37 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
}
2020-04-10 10:59:32 +02:00
$newpathofdestfile = $conf -> user -> dir_temp . '/' . get_class ( $this ) . '_' . __FUNCTION__ . '_' . ( empty ( $this -> cachefilesuffix ) ? '' : $this -> cachefilesuffix . '_' ) . $langs -> defaultlang . '_user' . $user -> id . '.cache' ;
$newmask = '0644' ;
2018-06-20 21:31:37 +02:00
$nowgmt = dol_now ();
2020-04-10 10:59:32 +02:00
$foundintocache = 0 ;
2024-11-06 23:57:45 +01:00
$filedate = 0 ;
2021-02-26 18:49:22 +01:00
if ( $cachedelay > 0 ) {
2020-04-10 10:59:32 +02:00
$filedate = dol_filemtime ( $newpathofdestfile );
2021-02-26 18:49:22 +01:00
if ( $filedate >= ( $nowgmt - $cachedelay )) {
2020-04-10 10:59:32 +02:00
$foundintocache = 1 ;
2018-06-20 21:31:37 +02:00
2020-04-10 10:59:32 +02:00
$this -> lastfetchdate [ get_class ( $this ) . '_' . __FUNCTION__ ] = $filedate ;
2020-05-21 15:05:19 +02:00
} else {
2018-06-20 21:31:37 +02:00
dol_syslog ( get_class ( $this ) . '::' . __FUNCTION__ . " cache file " . $newpathofdestfile . " is not found or older than now - cachedelay ( " . $nowgmt . " - " . $cachedelay . " ) so we can't use it. " );
}
}
// Load file into $data
2021-02-26 18:49:22 +01:00
if ( $foundintocache ) { // Cache file found and is not too old
2018-06-20 21:31:37 +02:00
dol_syslog ( get_class ( $this ) . '::' . __FUNCTION__ . " read data from cache file " . $newpathofdestfile . " " . $filedate . " . " );
$data = json_decode ( file_get_contents ( $newpathofdestfile ), true );
2024-03-20 19:12:15 +01:00
'@phan-var-force array $data' ; // Phan can not interpret json_decode
2020-05-21 15:05:19 +02:00
} else {
2020-04-10 10:59:32 +02:00
$year = $startyear ;
2021-02-26 18:49:22 +01:00
while ( $year <= $endyear ) {
2019-01-27 11:55:16 +01:00
$datay [ $year ] = $this -> getWeightedAmountByMonth ( $year , $wonlostfilter );
2015-07-05 22:04:30 +02:00
$year ++ ;
}
$data = array ();
// $data = array('xval'=>array(0=>xlabel,1=>yval1,2=>yval2...),...)
2021-02-26 18:49:22 +01:00
for ( $i = 0 ; $i < 12 ; $i ++ ) {
2020-04-10 10:59:32 +02:00
$data [ $i ][] = $datay [ $endyear ][ $i ][ 0 ]; // set label
$year = $startyear ;
2021-02-26 18:49:22 +01:00
while ( $year <= $endyear ) {
2020-04-10 10:59:32 +02:00
$data [ $i ][] = $datay [ $year ][ $i ][ 1 ]; // set yval for x=i
2015-07-05 22:04:30 +02:00
$year ++ ;
}
}
}
// Save cache file
2021-02-26 18:49:22 +01:00
if ( empty ( $foundintocache ) && ( $cachedelay > 0 || $cachedelay == - 1 )) {
2015-07-05 22:04:30 +02:00
dol_syslog ( get_class ( $this ) . '::' . __FUNCTION__ . " save cache file " . $newpathofdestfile . " onto disk. " );
2021-02-26 18:49:22 +01:00
if ( ! dol_is_dir ( $conf -> user -> dir_temp )) {
dol_mkdir ( $conf -> user -> dir_temp );
}
2015-07-05 22:04:30 +02:00
$fp = fopen ( $newpathofdestfile , 'w' );
2021-02-26 18:49:22 +01:00
if ( $fp ) {
2015-07-05 22:04:30 +02:00
fwrite ( $fp , json_encode ( $data ));
fclose ( $fp );
2023-02-17 19:30:50 +01:00
dolChmod ( $newpathofdestfile );
2021-02-26 18:49:22 +01:00
} else {
dol_syslog ( " Failed to write cache file " , LOG_ERR );
}
2020-04-10 10:59:32 +02:00
$this -> lastfetchdate [ get_class ( $this ) . '_' . __FUNCTION__ ] = $nowgmt ;
2015-07-05 22:04:30 +02:00
}
return $data ;
}
/**
2016-07-08 10:59:13 +02:00
* Return the Project weighted opp amount by month for a year .
2015-07-05 22:04:30 +02:00
*
2016-07-08 10:59:13 +02:00
* @ param int $year Year to scan
* @ param int $wonlostfilter Add a filter on status won / lost
2024-10-14 01:59:44 +02:00
* @ return array < int < 0 , 11 > , array { 0 : int < 1 , 12 > , 1 : int | float } > Array with amount by month
2015-07-05 22:04:30 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getWeightedAmountByMonth ( $year , $wonlostfilter = 1 )
2015-07-10 10:42:42 +02:00
{
2023-07-01 12:49:54 +02:00
$this -> year = $year ;
2015-07-05 22:04:30 +02:00
2020-04-10 10:59:32 +02:00
$sql = " SELECT date_format(t.datec,'%m') as dm, SUM(t.opp_amount * " . $this -> db -> ifsql ( " t.opp_percent IS NULL " . ( $wonlostfilter ? " OR cls.code IN ('WON','LOST') " : " " ), '0' , 't.opp_percent' ) . " / 100) " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t LEFT JOIN " . MAIN_DB_PREFIX . 'c_lead_status as cls ON t.fk_opp_status = cls.rowid' ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:52:06 +02:00
//if (! $user->rights->societe->client->voir && ! $user->soc_id)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2015-07-05 22:04:30 +02:00
$sql .= $this -> buildWhere ();
$sql .= " GROUP BY dm " ;
$sql .= $this -> db -> order ( 'dm' , 'DESC' );
$res = $this -> _getAmountByMonth ( $year , $sql );
// var_dump($res);print '<br>';
return $res ;
}
2015-06-30 14:32:17 +02:00
/**
* Return amount of elements by month for several years
*
2023-01-10 23:47:47 +01:00
* @ param int $endyear End year
* @ param int $startyear Start year
2024-11-06 23:57:45 +01:00
* @ param int $cachedelay accept for cache file ( 0 = No read , no save of cache , - 1 = No read but save )
* @ return array < int < 0 , 11 > , array < string | float >>| int <- 1 , - 1 > Array of values or < 0 if error
2015-06-30 14:32:17 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getTransformRateByMonthWithPrevYear ( $endyear , $startyear , $cachedelay = 0 )
2015-06-30 14:32:17 +02:00
{
global $conf , $user , $langs ;
2021-02-26 18:49:22 +01:00
if ( $startyear > $endyear ) {
return - 1 ;
}
2015-06-30 14:32:17 +02:00
$datay = array ();
// Search into cache
2021-02-26 18:49:22 +01:00
if ( ! empty ( $cachedelay )) {
2020-04-10 10:59:32 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2015-06-30 14:32:17 +02:00
}
2020-04-10 10:59:32 +02:00
$newpathofdestfile = $conf -> user -> dir_temp . '/' . get_class ( $this ) . '_' . __FUNCTION__ . '_' . ( empty ( $this -> cachefilesuffix ) ? '' : $this -> cachefilesuffix . '_' ) . $langs -> defaultlang . '_user' . $user -> id . '.cache' ;
2015-06-30 14:32:17 +02:00
$newmask = '0644' ;
$nowgmt = dol_now ();
$foundintocache = 0 ;
2024-11-06 23:57:45 +01:00
$filedate = 0 ;
2015-06-30 14:32:17 +02:00
if ( $cachedelay > 0 ) {
$filedate = dol_filemtime ( $newpathofdestfile );
if ( $filedate >= ( $nowgmt - $cachedelay )) {
$foundintocache = 1 ;
2020-04-10 10:59:32 +02:00
$this -> lastfetchdate [ get_class ( $this ) . '_' . __FUNCTION__ ] = $filedate ;
2015-06-30 14:32:17 +02:00
} else {
2020-04-10 10:59:32 +02:00
dol_syslog ( get_class ( $this ) . '::' . __FUNCTION__ . " cache file " . $newpathofdestfile . " is not found or older than now - cachedelay ( " . $nowgmt . " - " . $cachedelay . " ) so we can't use it. " );
2015-06-30 14:32:17 +02:00
}
}
// Load file into $data
2021-02-26 18:49:22 +01:00
if ( $foundintocache ) { // Cache file found and is not too old
2020-04-10 10:59:32 +02:00
dol_syslog ( get_class ( $this ) . '::' . __FUNCTION__ . " read data from cache file " . $newpathofdestfile . " " . $filedate . " . " );
2015-09-24 18:54:28 +02:00
$data = json_decode ( file_get_contents ( $newpathofdestfile ), true );
2024-03-20 19:12:15 +01:00
'@phan-var-force array $data' ; // Phan can not interpret json_decode
2015-06-30 14:32:17 +02:00
} else {
$year = $startyear ;
2020-04-10 10:59:32 +02:00
while ( $year <= $endyear ) {
2015-06-30 14:32:17 +02:00
$datay [ $year ] = $this -> getTransformRateByMonth ( $year );
2020-04-10 10:59:32 +02:00
$year ++ ;
2015-06-30 14:32:17 +02:00
}
2020-04-10 10:59:32 +02:00
$data = array ();
2015-06-30 14:32:17 +02:00
// $data = array('xval'=>array(0=>xlabel,1=>yval1,2=>yval2...),...)
2020-04-10 10:59:32 +02:00
for ( $i = 0 ; $i < 12 ; $i ++ ) {
2015-06-30 14:32:17 +02:00
$data [ $i ][] = $datay [ $endyear ][ $i ][ 0 ]; // set label
$year = $startyear ;
2020-04-10 10:59:32 +02:00
while ( $year <= $endyear ) {
2015-06-30 14:32:17 +02:00
$data [ $i ][] = $datay [ $year ][ $i ][ 1 ]; // set yval for x=i
2020-04-10 10:59:32 +02:00
$year ++ ;
2015-06-30 14:32:17 +02:00
}
}
}
// Save cache file
if ( empty ( $foundintocache ) && ( $cachedelay > 0 || $cachedelay == - 1 )) {
2020-04-10 10:59:32 +02:00
dol_syslog ( get_class ( $this ) . '::' . __FUNCTION__ . " save cache file " . $newpathofdestfile . " onto disk. " );
2021-02-26 18:49:22 +01:00
if ( ! dol_is_dir ( $conf -> user -> dir_temp )) {
2015-06-30 14:32:17 +02:00
dol_mkdir ( $conf -> user -> dir_temp );
2021-02-26 18:49:22 +01:00
}
2015-06-30 14:32:17 +02:00
$fp = fopen ( $newpathofdestfile , 'w' );
2023-02-17 19:30:50 +01:00
if ( $fp ) {
fwrite ( $fp , json_encode ( $data ));
fclose ( $fp );
dolChmod ( $newpathofdestfile );
2021-02-26 18:49:22 +01:00
}
2015-06-30 14:32:17 +02:00
2020-04-10 10:59:32 +02:00
$this -> lastfetchdate [ get_class ( $this ) . '_' . __FUNCTION__ ] = $nowgmt ;
2015-06-30 14:32:17 +02:00
}
return $data ;
}
/**
* Return the Project transformation rate by month for a year
*
2017-12-08 16:15:41 +01:00
* @ param int $year Year to scan
2019-09-23 21:45:23 +02:00
* @ param int $format 0 = Label of abscissa is a translated text , 1 = Label of abscissa is month number , 2 = Label of abscissa is first letter of month
2024-10-14 01:59:44 +02:00
* @ return array < int < 0 , 11 > , array { 0 : int < 1 , 12 > , 1 : int | float } > Array with amount by month
2015-06-30 14:32:17 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getTransformRateByMonth ( $year , $format = 0 )
2015-07-10 10:42:42 +02:00
{
2023-07-01 12:49:54 +02:00
$this -> year = $year ;
2015-06-30 14:32:17 +02:00
$sql = " SELECT date_format(t.datec,'%m') as dm, count(t.opp_amount) " ;
2020-04-10 10:59:32 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t " ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:52:06 +02:00
//if (! $user->rights->societe->client->voir && ! $user->soc_id)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2015-06-30 14:32:17 +02:00
$sql .= $this -> buildWhere ();
$sql .= " GROUP BY dm " ;
$sql .= $this -> db -> order ( 'dm' , 'DESC' );
2017-12-08 16:15:41 +01:00
$res_total = $this -> _getNbByMonth ( $year , $sql , $format );
2015-06-30 14:32:17 +02:00
2020-04-10 10:59:32 +02:00
$this -> status = 6 ;
2015-06-30 14:32:17 +02:00
$sql = " SELECT date_format(t.datec,'%m') as dm, count(t.opp_amount) " ;
2020-04-10 10:59:32 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as t " ;
2024-01-12 17:55:52 +01:00
// No check is done on company permission because readability is managed by public status of project and assignment.
2018-06-20 21:52:06 +02:00
//if (! $user->rights->societe->client->voir && ! $user->soc_id)
2021-08-23 18:56:46 +02:00
// $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user = ".((int) $user->id);
2015-06-30 14:32:17 +02:00
$sql .= $this -> buildWhere ();
$sql .= " GROUP BY dm " ;
$sql .= $this -> db -> order ( 'dm' , 'DESC' );
2020-04-10 10:59:32 +02:00
$this -> status = 0 ;
2015-06-30 14:32:17 +02:00
2017-12-08 16:15:41 +01:00
$res_only_wined = $this -> _getNbByMonth ( $year , $sql , $format );
2015-06-30 14:32:17 +02:00
2020-04-10 10:59:32 +02:00
$res = array ();
2015-06-30 14:32:17 +02:00
2021-02-26 18:49:22 +01:00
foreach ( $res_total as $key => $total_row ) {
2015-06-30 14:32:17 +02:00
//var_dump($total_row);
if ( ! empty ( $total_row [ 1 ])) {
2020-04-10 10:59:32 +02:00
$res [ $key ] = array ( $total_row [ 0 ], ( 100 * $res_only_wined [ $key ][ 1 ]) / $total_row [ 1 ]);
2015-06-30 14:32:17 +02:00
} else {
2020-04-10 10:59:32 +02:00
$res [ $key ] = array ( $total_row [ 0 ], 0 );
2015-06-30 14:32:17 +02:00
}
}
// var_dump($res);print '<br>';
return $res ;
}
2022-08-30 11:31:20 +02:00
/**
* Return average of entity by month
* @ param int $year year number
2024-10-14 01:59:44 +02:00
* @ return array < int < 0 , 11 > , array { 0 : int < 1 , 12 > , 1 : int | float } > Array with number by month
2022-08-30 11:31:20 +02:00
*/
protected function getAverageByMonth ( $year )
{
$sql = " SELECT date_format(datef,'%m') as dm, AVG(f. " . $this -> field . " ) " ;
$sql .= " FROM " . $this -> from ;
$sql .= " WHERE f.datef BETWEEN ' " . $this -> db -> idate ( dol_get_first_day ( $year )) . " ' AND ' " . $this -> db -> idate ( dol_get_last_day ( $year )) . " ' " ;
$sql .= " AND " . $this -> where ;
$sql .= " GROUP BY dm " ;
$sql .= $this -> db -> order ( 'dm' , 'DESC' );
return $this -> _getAverageByMonth ( $year , $sql );
}
2015-09-24 18:54:28 +02:00
}